Click to Chat for WhatsApp Chat - Version 1.0

Version Description

Download this release

Release Info

Developer bhvreddy
Plugin Icon 128x128 Click to Chat for WhatsApp Chat
Version 1.0
Comparing to
See all releases

Version 1.0

admin/add_styles_scripts_admin.php ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * Register css styles, javascript files at admin side
4
+ * instead of register multiple styles - as using sass in dev env,
5
+ * import files and at final create less css files
6
+ */
7
+
8
+ if ( ! defined( 'ABSPATH' ) ) exit;
9
+
10
+ // Register css styles, javascript files only on 'click-to-chat' page
11
+ if( ! function_exists('ccw_register_files_admin') ) {
12
+
13
+ function ccw_register_files_admin($hook) {
14
+
15
+ // ?page=click-to-chat
16
+ if( 'toplevel_page_click-to-chat' == $hook || 'click-to-chat_page_ccw-edit-styles' == $hook ) {
17
+
18
+ wp_register_style('ccw_new_css_admin', plugins_url( 'assets/css/admin_main.css', dirname(__FILE__) ) , '', CCW_VERSION );
19
+
20
+
21
+ wp_enqueue_style('ccw_new_css_admin');
22
+
23
+ wp_enqueue_style( 'wp-color-picker' );
24
+
25
+
26
+ wp_enqueue_script( 'ccw_app_admin', plugins_url( 'assets/js/admin_app.js', dirname(__FILE__) ), array( 'wp-color-picker' ), CCW_VERSION, true );
27
+ // wp_enqueue_script( 'ccw_app_admin_dir', plugins_url( 'assets/js/dir.js', dirname(__FILE__) ), '', '', true );
28
+ // return;
29
+ } else {
30
+ return;
31
+ }
32
+
33
+
34
+ }
35
+
36
+ }
37
+
38
+
39
+ add_action('admin_enqueue_scripts', 'ccw_register_files_admin');
admin/admin.php ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * starting point for the admin side of this plugin.
4
+ *
5
+ * include other file here .. which need in admin side.
6
+ *
7
+ * In click-to-chat.php this file will be loaded as is_admin
8
+ */
9
+
10
+ if ( ! defined( 'ABSPATH' ) ) exit;
11
+
12
+ /*************** includes ***********/
13
+ require_once('add_styles_scripts_admin.php');
14
+
15
+
16
+ require_once('admin_menu.php');
17
+ require_once('admin_page.php');
18
+ require_once('admin_page_customize_styles.php');
19
+
20
+
21
+
22
+ /*************** hooks ***********/
admin/admin_menu.php ADDED
@@ -0,0 +1,73 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * Admin - menu page - add_menu_page for this plugin - top level menu
4
+ * calls settings_page.php ( ccw_settings_page - > require_once('settings_page.php') )
5
+ * and page content display at admin_menu.php
6
+ */
7
+
8
+ if ( ! defined( 'ABSPATH' ) ) exit;
9
+
10
+ if( ! function_exists('ccw_options_page') ) {
11
+
12
+ function ccw_options_page() {
13
+ add_menu_page(
14
+ 'Click to Chat for WhatsApp - Plugin Option Page',
15
+ 'Click to Chat',
16
+ 'manage_options',
17
+ 'click-to-chat',
18
+ 'ccw_settings_page',
19
+ 'dashicons-format-chat'
20
+ );
21
+ }
22
+ }
23
+
24
+ add_action('admin_menu', 'ccw_options_page');
25
+
26
+
27
+ if( ! function_exists('ccw_settings_page') ) {
28
+
29
+ function ccw_settings_page() {
30
+
31
+ if ( ! current_user_can('manage_options') ) {
32
+ return;
33
+ }
34
+
35
+ require_once('settings_page.php');
36
+
37
+ }
38
+ }
39
+
40
+
41
+
42
+
43
+ // second page
44
+ if( ! function_exists('ccw_options_page_two') ) {
45
+
46
+ function ccw_options_page_two() {
47
+ add_submenu_page(
48
+ 'click-to-chat',
49
+ 'Edit Styles',
50
+ 'Customize Styles',
51
+ 'manage_options',
52
+ 'ccw-edit-styles',
53
+ 'ccw_settings_page_two'
54
+ );
55
+
56
+ }
57
+ }
58
+
59
+ add_action('admin_menu', 'ccw_options_page_two');
60
+
61
+
62
+ if( ! function_exists('ccw_settings_page_two') ) {
63
+
64
+ function ccw_settings_page_two() {
65
+
66
+ if ( ! current_user_can('manage_options') ) {
67
+ return;
68
+ }
69
+
70
+ require_once('sp_customize_styles.php');
71
+
72
+ }
73
+ }
admin/admin_page.php ADDED
@@ -0,0 +1,571 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * content of the options page ..
4
+ * admin_menu.php -> settings_page.php -> admin_page.php
5
+ */
6
+
7
+ if ( ! defined( 'ABSPATH' ) ) exit;
8
+
9
+ function ccw_custom_settings() {
10
+
11
+ register_setting( 'ccw_settings_group', 'ccw_options' , 'ccw_options_sanitize' );
12
+
13
+ add_settings_section( 'ccw_settings', '', 'ccw_settings_section', 'ccw_options_settings' );
14
+
15
+ add_settings_field( 'ccw_enable', 'Enable Floating Styles', 'ccw_enable_cb', 'ccw_options_settings', 'ccw_settings' );
16
+ add_settings_field( 'ccw_enable_sc', 'Enable ShortCodes', 'ccw_enable_sc_cb', 'ccw_options_settings', 'ccw_settings' );
17
+ add_settings_field( 'ccw_return_type', 'Return Type', 'ccw_return_type_cb', 'ccw_options_settings', 'ccw_settings' );
18
+ add_settings_field( 'ccw_number', 'WhatsApp Number', 'ccw_number_input_cb', 'ccw_options_settings', 'ccw_settings' );
19
+ add_settings_field( 'ccw_group_id', 'Group Id', 'ccw_group_id_cb', 'ccw_options_settings', 'ccw_settings' );
20
+ add_settings_field( 'ccw_style', 'Style for Desktops', 'ccw_style_cb', 'ccw_options_settings', 'ccw_settings' );
21
+ add_settings_field( 'ccw_style_mobile', 'Style for Mobile Devices', 'ccw_style_mobile_cb', 'ccw_options_settings', 'ccw_settings' );
22
+ add_settings_field( 'ccw_position', 'Position to Place', 'ccw_position_input_cb', 'ccw_options_settings', 'ccw_settings' );
23
+ add_settings_field( 'ccw_placeholder', 'Text to Display', 'ccw_input_placeholder_cb', 'ccw_options_settings', 'ccw_settings' );
24
+ add_settings_field( 'ccw_checkbox', 'Show / Hide ', 'ccw_checkbox_cb', 'ccw_options_settings', 'ccw_settings' );
25
+ add_settings_field( 'ccw_list_id_tohide', 'Posts, Pages Id\'s to Hide', 'ccw_list_id_tohide_cb', 'ccw_options_settings', 'ccw_settings' );
26
+ add_settings_field( 'ccw_list_cat_tohide', 'Categorys to Hide', 'ccw_list_cat_tohide_cb', 'ccw_options_settings', 'ccw_settings' );
27
+ add_settings_field( 'ccw_custom_shortcode', 'Shortcode name', 'ccw_custom_shortcode_cb', 'ccw_options_settings', 'ccw_settings' );
28
+
29
+ }
30
+
31
+
32
+ add_action( 'admin_init', 'ccw_custom_settings' );
33
+
34
+
35
+ // heading
36
+ if( ! function_exists('ccw_settings_section') ) {
37
+
38
+ function ccw_settings_section() {
39
+ echo '<h1>Click to Chat For WhatsApp - Global Settings</h1>';
40
+ }
41
+ }
42
+
43
+
44
+ // enable / disable floating styles
45
+ if( ! function_exists('ccw_enable_cb') ) {
46
+
47
+ function ccw_enable_cb() {
48
+ $ccw_enable = get_option('ccw_options');
49
+ ?>
50
+ <div class="row">
51
+ <div class="input-field col s12">
52
+ <select name="ccw_options[enable]" class="select-1">
53
+ <option value="1">No</option>
54
+ <option value="2" <?php echo esc_attr( $ccw_enable['enable'] ) == 2 ? 'SELECTED' : ''; ?> >Yes</option>
55
+ </select>
56
+ <label>enable</label>
57
+ </div>
58
+ </div>
59
+ <?php
60
+ }
61
+ }
62
+
63
+ // enable / disable shortcodes
64
+ if( ! function_exists('ccw_enable_sc_cb') ) {
65
+
66
+ function ccw_enable_sc_cb() {
67
+ $ccw_enable_sc = get_option('ccw_options');
68
+ ?>
69
+ <div class="row">
70
+ <div class="input-field col s12 select-margin">
71
+ <select name="ccw_options[enable_sc]" class="select-1">
72
+ <option value="1">No</option>
73
+ <option value="2" <?php echo esc_attr( $ccw_enable_sc['enable_sc'] ) == 2 ? 'SELECTED' : ''; ?> >Yes</option>
74
+ </select>
75
+ <label>enable ShortCodes</label>
76
+ <p class="description"> If Selected - No - then Hides Shortcodes and its syntax - <a target="_blank" href="https://medium.com/clicktochat/enable-disable-styles-84293dca3fbd">more info</a> </p>
77
+ </div>
78
+ </div>
79
+ <?php
80
+ }
81
+ }
82
+
83
+ // Return type - chat or group chat
84
+ if( ! function_exists('ccw_return_type_cb') ) {
85
+
86
+ function ccw_return_type_cb() {
87
+ $ccw_return_type = get_option('ccw_options');
88
+ ?>
89
+ <div class="row">
90
+ <div class="input-field col s12 select-margin">
91
+ <select name="ccw_options[return_type]" class="select-1">
92
+ <option value="chat" <?php echo esc_attr( $ccw_return_type['return_type'] ) == 'chat' ? 'SELECTED' : ''; ?> >Chat</option>
93
+ <option value="group_chat" <?php echo esc_attr( $ccw_return_type['return_type'] ) == 'group_chat' ? 'SELECTED' : ''; ?> >Group chat - Invite</option>
94
+ </select>
95
+ <label>Default return type - Chat or Group Chat Invite</label>
96
+ <p class="description"> Default return type for Floating Style, shortcodes. But for shortcodes can change using shortcode attributes - <a target="_blank" href="https://medium.com/clicktochat/return-type-451635e320eb">more info</a> </p>
97
+ </div>
98
+ </div>
99
+ <?php
100
+ }
101
+ }
102
+
103
+
104
+ // Desktop - select style
105
+ if( ! function_exists('ccw_style_cb') ) {
106
+
107
+ function ccw_style_cb() {
108
+ $ccw_style = get_option('ccw_options');
109
+ $style_value = esc_attr( $ccw_style['style'] );
110
+ ?>
111
+ <div class="row">
112
+ <div class="input-field col s12">
113
+ <select name="ccw_options[style]" class="select-2">
114
+ <option value="1" <?php echo $style_value == 1 ? 'SELECTED' : ''; ?> >Style-1</option>
115
+ <option value="2" <?php echo $style_value == 2 ? 'SELECTED' : ''; ?> >Style-2</option>
116
+ <option value="3" <?php echo $style_value == 3 ? 'SELECTED' : ''; ?> >Style-3</option>
117
+ <option value="4" <?php echo $style_value == 4 ? 'SELECTED' : ''; ?> >Style-4</option>
118
+ <option value="5" <?php echo $style_value == 5 ? 'SELECTED' : ''; ?> >Style-5</option>
119
+ <option value="6" <?php echo $style_value == 6 ? 'SELECTED' : ''; ?> >Style-6</option>
120
+ <option value="7" <?php echo $style_value == 7 ? 'SELECTED' : ''; ?> >Style-7</option>
121
+ <option value="8" <?php echo $style_value == 8 ? 'SELECTED' : ''; ?> >Style-8</option>
122
+ <option value="0" <?php echo $style_value == 0 ? 'SELECTED' : ''; ?> >Hide on Desktop Devices</option>
123
+ </select>
124
+ <label>Select Style for Destops</label>
125
+ <p class="description"> - <a target="_blank" href="https://medium.com/clicktochat/select-styles-48527f73e697">List of syles with images</a> </p>
126
+ </div>
127
+ </div>
128
+ <?php
129
+ }
130
+ }
131
+
132
+ // Mobile - Select Style
133
+ if( ! function_exists('ccw_style_mobile_cb') ) {
134
+
135
+ function ccw_style_mobile_cb() {
136
+ $ccw_stylemobile = get_option('ccw_options');
137
+ $style_mobile_value = esc_attr( $ccw_stylemobile['stylemobile'] );
138
+ ?>
139
+ <div class="row">
140
+ <div class="input-field col s12">
141
+ <select name="ccw_options[stylemobile]" class="select-2_2">
142
+ <option value="1" <?php echo $style_mobile_value == 1 ? 'SELECTED' : ''; ?> >Style-1</option>
143
+ <option value="2" <?php echo $style_mobile_value == 2 ? 'SELECTED' : ''; ?> >Style-2</option>
144
+ <option value="3" <?php echo $style_mobile_value == 3 ? 'SELECTED' : ''; ?> >Style-3</option>
145
+ <option value="4" <?php echo $style_mobile_value == 4 ? 'SELECTED' : ''; ?> >Style-4</option>
146
+ <option value="5" <?php echo $style_mobile_value == 5 ? 'SELECTED' : ''; ?> >Style-5</option>
147
+ <option value="6" <?php echo $style_mobile_value == 6 ? 'SELECTED' : ''; ?> >Style-6</option>
148
+ <option value="7" <?php echo $style_mobile_value == 7 ? 'SELECTED' : ''; ?> >Style-7</option>
149
+ <option value="8" <?php echo $style_mobile_value == 8 ? 'SELECTED' : ''; ?> >Style-8</option>
150
+ <option value="0" <?php echo $style_mobile_value == 0 ? 'SELECTED' : ''; ?> >Hide on Mobile Devices</option>
151
+ </select>
152
+ <label>Select Style for Mobile Devices</label>
153
+ </div>
154
+ </div>
155
+ <?php
156
+ }
157
+ }
158
+
159
+ // number
160
+ if( ! function_exists('ccw_number_input_cb') ) {
161
+
162
+ function ccw_number_input_cb() {
163
+ $ccw_number = get_option('ccw_options');
164
+ ?>
165
+ <div class="row">
166
+ <div class="input-field col s12">
167
+ <input name="ccw_options[number]" value="<?php echo esc_attr( $ccw_number['number'] ) ?>" id="whatsapp_number" type="text" class="validate input-margin">
168
+ <label for="whatsapp_number">Enter whatsapp number </label>
169
+ <p class="description">Enter whatsapp number with country code ( e.g. 916123456789 ) please dont include +, ( here in e.g. 91 is country code 6123456789 is mobile number - <a target="_blank" href="https://medium.com/clicktochat/whatsapp-number-b155206825c8">more info</a> ) </p>
170
+ </div>
171
+ </div>
172
+ <?php
173
+ }
174
+ }
175
+
176
+ // Group ID
177
+ if( ! function_exists('ccw_group_id_cb') ) {
178
+
179
+ function ccw_group_id_cb() {
180
+ $ccw_group_id = get_option('ccw_options');
181
+ ?>
182
+ <div class="row">
183
+ <div class="input-field col s12">
184
+ <input name="ccw_options[group_id]" value="<?php echo esc_attr( $ccw_group_id['group_id'] ) ?>" id="whatsapp_group_id" type="text" class="validate input-margin">
185
+ <label for="whatsapp_group_id">whatsapp group ID Extenstion </label>
186
+ <p class="description">Enter whatsapp Group Id - <a target="_blank" href="https://medium.com/clicktochat/later">more info</a> ) </p>
187
+ </div>
188
+ </div>
189
+ <?php
190
+ }
191
+ }
192
+
193
+ // postion
194
+ if( ! function_exists('ccw_position_input_cb') ) {
195
+
196
+ function ccw_position_input_cb() {
197
+ $ccw_position = get_option('ccw_options');
198
+ $ccw_position_value = esc_attr( $ccw_position['position'] )
199
+ ?>
200
+ <div class="row">
201
+ <div class="input-field col s12">
202
+ <select name="ccw_options[position]" class="select">
203
+ <option value="1" <?php echo $ccw_position_value == 1 ? 'SELECTED' : ''; ?> >bottom right</option>
204
+ <option value="2" <?php echo $ccw_position_value == 2 ? 'SELECTED' : ''; ?> >bottom left</option>
205
+ <option value="3" <?php echo $ccw_position_value == 3 ? 'SELECTED' : ''; ?> >top left</option>
206
+ <option value="4" <?php echo $ccw_position_value == 4 ? 'SELECTED' : ''; ?> >top right</option>
207
+ </select>
208
+ <label>Fixed position to place</label>
209
+ <p class="description"> e.g. 10px - please add css units as suffix, e.g. 10px, 10%, 10rem, 10em .. <a target="_blank" href="https://medium.com/clicktochat/position-to-place-984ac32446e6">more info</a> </p>
210
+ </div>
211
+ </div>
212
+
213
+ <div class="row display-none position position-1 bottom-right">
214
+ <div class="input-field col s6">
215
+ <input name="ccw_options[position-1_bottom]" value="<?php echo esc_attr( $ccw_position['position-1_bottom'] ) ?>" id="position_bottom" type="text" class="validate">
216
+ <label for="position_bottom">position_bottom: </label>
217
+ </div>
218
+ <div class="input-field col s6">
219
+ <input name="ccw_options[position-1_right]" value="<?php echo esc_attr( $ccw_position['position-1_right'] ) ?>" id="position_right" type="text" class="validate">
220
+ <label for="position_right">position_right: </label>
221
+ </div>
222
+ </div>
223
+
224
+ <div class="row display-none position position-2 bottom-left">
225
+ <div class="input-field col s6">
226
+ <input name="ccw_options[position-2_bottom]" value="<?php echo esc_attr( $ccw_position['position-2_bottom'] ) ?>" id="position_bottom" type="text" class="validate">
227
+ <label for="position_bottom">position_bottom: </label>
228
+ </div>
229
+ <div class="input-field col s6">
230
+ <input name="ccw_options[position-2_left]" value="<?php echo esc_attr( $ccw_position['position-2_left'] ) ?>" id="position_left" type="text" class="validate">
231
+ <label for="position_left">position_left: </label>
232
+ </div>
233
+ </div>
234
+
235
+
236
+
237
+ <div class="row display-none position position-3 top-left">
238
+ <div class="input-field col s6">
239
+ <input name="ccw_options[position-3_top]" value="<?php echo esc_attr( $ccw_position['position-3_top'] ) ?>" id="position_top" type="text" class="validate">
240
+ <label for="position_top">position_top: </label>
241
+ </div>
242
+ <div class="input-field col s6">
243
+ <input name="ccw_options[position-3_left]" value="<?php echo esc_attr( $ccw_position['position-3_left'] ) ?>" id="position_left" type="text" class="validate">
244
+ <label for="position_left">position_left: </label>
245
+ </div>
246
+ </div>
247
+
248
+ <div class="row display-none position position-4 top-right">
249
+ <div class="input-field col s6">
250
+ <input name="ccw_options[position-4_top]" value="<?php echo esc_attr( $ccw_position['position-4_top'] ) ?>" id="position_top" type="text" class="validate">
251
+ <label for="position_top">position_top: </label>
252
+ </div>
253
+ <div class="input-field col s6">
254
+ <input name="ccw_options[position-4_right]" value="<?php echo esc_attr( $ccw_position['position-4_right'] ) ?>" id="position_right" type="text" class="validate">
255
+ <label for="position_right">position_right: </label>
256
+ </div>
257
+ </div>
258
+
259
+ <?php
260
+ }
261
+ }
262
+
263
+ // Text - placeholder
264
+ if( ! function_exists('ccw_input_placeholder_cb') ) {
265
+
266
+ function ccw_input_placeholder_cb() {
267
+ $ccw_placeholder = get_option('ccw_options');
268
+ ?>
269
+ <div class="row">
270
+ <div class="input-field col s12">
271
+ <input name="ccw_options[input_placeholder]" value="<?php echo esc_attr( $ccw_placeholder['input_placeholder'] ) ?>" id="input_placeholder" type="text" class="validate input-margin">
272
+ <label for="input_placeholder">placeholder value</label>
273
+ <p class="description"> - <a target="_blank" href="https://medium.com/clicktochat/text-to-display-59c478c87167">more info</a> </p>
274
+ </div>
275
+ </div>
276
+ <?php
277
+ }
278
+ }
279
+
280
+ // checkboxes - based on Type of posts ..
281
+ if( ! function_exists('ccw_checkbox_cb') ) {
282
+
283
+ function ccw_checkbox_cb() {
284
+ $ccw_checkbox = get_option('ccw_options');
285
+
286
+
287
+ // Single Posts
288
+ if ( isset( $ccw_checkbox['showon_posts'] ) ) {
289
+ ?>
290
+ <p>
291
+ <input name="ccw_options[showon_posts]" type="checkbox" value="1" <?php checked( $ccw_checkbox['showon_posts'], 1 ); ?> id="filled-in-box1" />
292
+ <label for="filled-in-box1">Posts</label>
293
+ </p>
294
+ <?php
295
+ } else {
296
+ ?>
297
+ <p>
298
+ <input name="ccw_options[showon_posts]" type="checkbox" value="1" id="filled-in-box1" />
299
+ <label for="filled-in-box1">Posts</label>
300
+ </p>
301
+ <?php
302
+ }
303
+
304
+
305
+ // Page
306
+ if ( isset( $ccw_checkbox['showon_page'] ) ) {
307
+ ?>
308
+ <p>
309
+ <input name="ccw_options[showon_page]" type="checkbox" value="1" <?php checked( $ccw_checkbox['showon_page'], 1 ); ?> id="filled-in-box2" />
310
+ <label for="filled-in-box2">Pages</label>
311
+ </p>
312
+ <?php
313
+ } else {
314
+ ?>
315
+ <p>
316
+ <input name="ccw_options[showon_page]" type="checkbox" value="1" id="filled-in-box2" />
317
+ <label for="filled-in-box2">Pages</label>
318
+ </p>
319
+ <?php
320
+ }
321
+
322
+
323
+ // Home Page
324
+ if ( isset( $ccw_checkbox['showon_homepage'] ) ) {
325
+ ?>
326
+ <p>
327
+ <input name="ccw_options[showon_homepage]" type="checkbox" value="1" <?php checked( $ccw_checkbox['showon_homepage'], 1 ); ?> id="filled-in-box3" />
328
+ <label for="filled-in-box3">Home Page</label>
329
+ </p>
330
+ <?php
331
+ } else {
332
+ ?>
333
+ <p>
334
+ <input name="ccw_options[showon_homepage]" type="checkbox" value="1" id="filled-in-box3" />
335
+ <label for="filled-in-box3">Home Page</label>
336
+ </p>
337
+ <?php
338
+ }
339
+
340
+ /* Front Page
341
+ A front page is also a home page, but home page is not a front page
342
+ if front page unchecked - it works on both homepage and fornt page
343
+ but if home page is unchecked - it works only on home page, not on front page */
344
+ if ( isset( $ccw_checkbox['showon_frontpage'] ) ) {
345
+ ?>
346
+ <p>
347
+ <input name="ccw_options[showon_frontpage]" type="checkbox" value="1" <?php checked( $ccw_checkbox['showon_frontpage'], 1 ); ?> id="filled-in-box4" />
348
+ <label for="filled-in-box4">Front Page</label>
349
+ </p>
350
+ <?php
351
+ } else {
352
+ ?>
353
+ <p>
354
+ <input name="ccw_options[showon_frontpage]" type="checkbox" value="1" id="filled-in-box4" />
355
+ <label for="filled-in-box4">Front Page</label>
356
+ </p>
357
+ <?php
358
+ }
359
+
360
+ // Category
361
+ if ( isset( $ccw_checkbox['showon_category'] ) ) {
362
+ ?>
363
+ <p>
364
+ <input name="ccw_options[showon_category]" type="checkbox" value="1" <?php checked( $ccw_checkbox['showon_category'], 1 ); ?> id="filled-in-box5" />
365
+ <label for="filled-in-box5">Category</label>
366
+ </p>
367
+ <?php
368
+ } else {
369
+ ?>
370
+ <p>
371
+ <input name="ccw_options[showon_category]" type="checkbox" value="1" id="filled-in-box5" />
372
+ <label for="filled-in-box5">Category</label>
373
+ </p>
374
+ <?php
375
+ }
376
+
377
+ // Archive
378
+ if ( isset( $ccw_checkbox['showon_archive'] ) ) {
379
+ ?>
380
+ <p>
381
+ <input name="ccw_options[showon_archive]" type="checkbox" value="1" <?php checked( $ccw_checkbox['showon_archive'], 1 ); ?> id="filled-in-box6" />
382
+ <label for="filled-in-box6">Archive</label>
383
+ </p>
384
+ <?php
385
+ } else {
386
+ ?>
387
+ <p>
388
+ <input name="ccw_options[showon_archive]" type="checkbox" value="1" id="filled-in-box6" />
389
+ <label for="filled-in-box6">Archive</label>
390
+ </p>
391
+ <?php
392
+ }
393
+
394
+
395
+ // 404 Page
396
+ if ( isset( $ccw_checkbox['showon_404'] ) ) {
397
+ ?>
398
+ <p>
399
+ <input name="ccw_options[showon_404]" type="checkbox" value="1" <?php checked( $ccw_checkbox['showon_404'], 1 ); ?> id="filled-in-box7" />
400
+ <label for="filled-in-box7">404 Page</label>
401
+ </p>
402
+ <?php
403
+ } else {
404
+ ?>
405
+ <p>
406
+ <input name="ccw_options[showon_404]" type="checkbox" value="1" id="filled-in-box7" />
407
+ <label for="filled-in-box7">404 Page</label>
408
+ </p>
409
+ <?php
410
+ }
411
+ ?>
412
+ <p class="description"> check to show, uncheck to hide - Show/ Hide - Styles - based on type of the page <a target="_blank" href="https://medium.com/clicktochat/show-hide-styles-based-on-type-of-the-page-4f0542a92909">more info</a> </p>
413
+ <?php
414
+ }
415
+ }
416
+
417
+ // ID 's list to hide styles
418
+ if( ! function_exists('ccw_list_id_tohide_cb') ) {
419
+
420
+ function ccw_list_id_tohide_cb() {
421
+ $ccw_list_id_tohide = get_option('ccw_options');
422
+ ?>
423
+ <div class="row">
424
+ <div class="input-field col s12">
425
+ <input name="ccw_options[list_hideon_pages]" value="<?php echo esc_attr( $ccw_list_id_tohide['list_hideon_pages'] ) ?>" id="ccw_list_id_tohide" type="text" class="validate input-margin">
426
+ <label for="ccw_list_id_tohide">Id's list to Hide - add ',' after each id </label>
427
+ <p class="description"> Add Post, Pages, Media - ID's to hide, can add multiple id's separate with comma ( , ) - <a target="_blank" href="https://medium.com/@bhvreddy/show-hide-styles-based-on-id-bb4cbfa091d7">more info</a> </p>
428
+ </div>
429
+ </div>
430
+ <?php
431
+ }
432
+ }
433
+
434
+
435
+ // Categorys list - to hide
436
+ if( ! function_exists('ccw_list_cat_tohide_cb') ) {
437
+
438
+ function ccw_list_cat_tohide_cb() {
439
+ $ccw_list_cat_tohide = get_option('ccw_options');
440
+ ?>
441
+ <div class="row">
442
+ <div class="input-field col s12">
443
+ <input name="ccw_options[list_hideon_cat]" value="<?php echo esc_attr( $ccw_list_cat_tohide['list_hideon_cat'] ) ?>" id="ccw_list_cat_tohide" type="text" class="validate input-margin">
444
+ <label for="ccw_list_cat_tohide">Category name's to Hide - add ',' after each category name </label>
445
+ <p class="description"> Category name's to hide, can add multiple Categories separate with comma ( , ) - <a target="_blank" href="https://medium.com/@bhvreddy/show-hide-styles-based-on-category-52453616cb65">more info</a> </p>
446
+ </div>
447
+ </div>
448
+ <?php
449
+ }
450
+ }
451
+
452
+ // Custom shortcode
453
+ if( ! function_exists('ccw_custom_shortcode_cb') ) {
454
+
455
+ function ccw_custom_shortcode_cb() {
456
+ $ccw_shortcode = get_option('ccw_options');
457
+ ?>
458
+ <div class="row">
459
+ <div class="input-field col s12">
460
+ <input name="ccw_options[shortcode]" value="<?php echo esc_attr( $ccw_shortcode['shortcode'] ) ?>" id="shortcode" type="text" class="validate input-margin">
461
+ <label for="shortcode">shortcode name</label>
462
+ <?php
463
+ $shorcode_list = '';
464
+ foreach ($GLOBALS['shortcode_tags'] AS $key => $value) {
465
+ $shorcode_list .= $key . ', ';
466
+ }
467
+ ?>
468
+ <p class="description"> Default values is 'chat', can customize shortcode name - <a target="_blank" href="https://medium.com/clicktochat/shortcode-name-d90fd531d589">more info</a> </p>
469
+ <p class="description"> please dont add this already existing shorcode names - <?php echo $shorcode_list ?> </p>
470
+ </div>
471
+ </div>
472
+ <?php
473
+ }
474
+ }
475
+
476
+ // Sanitize callback ..
477
+ if( ! function_exists('ccw_options_sanitize') ) {
478
+
479
+ function ccw_options_sanitize( $input ) {
480
+
481
+ if ( ! current_user_can( 'manage_options' ) ) {
482
+ wp_die( 'not allowed to modify - please contact admin ' );
483
+ }
484
+
485
+ $new_input = array();
486
+
487
+ if( isset( $input['enable'] ) )
488
+ $new_input['enable'] = sanitize_text_field( $input['enable'] );
489
+
490
+ if( isset( $input['enable_sc'] ) )
491
+ $new_input['enable_sc'] = sanitize_text_field( $input['enable_sc'] );
492
+
493
+ if( isset( $input['number'] ) )
494
+ $new_input['number'] = sanitize_text_field( $input['number'] );
495
+
496
+ if( isset( $input['input_placeholder'] ) )
497
+ $new_input['input_placeholder'] = sanitize_text_field( $input['input_placeholder'] );
498
+
499
+ if( isset( $input['position'] ) )
500
+ $new_input['position'] = sanitize_text_field( $input['position'] );
501
+
502
+ if( isset( $input['style'] ) )
503
+ $new_input['style'] = sanitize_text_field( $input['style'] );
504
+
505
+ if( isset( $input['stylemobile'] ) )
506
+ $new_input['stylemobile'] = sanitize_text_field( $input['stylemobile'] );
507
+
508
+ if( isset( $input['position-1_bottom'] ) )
509
+ $new_input['position-1_bottom'] = sanitize_text_field( $input['position-1_bottom'] );
510
+
511
+ if( isset( $input['position-1_right'] ) )
512
+ $new_input['position-1_right'] = sanitize_text_field( $input['position-1_right'] );
513
+
514
+ if( isset( $input['position-2_bottom'] ) )
515
+ $new_input['position-2_bottom'] = sanitize_text_field( $input['position-2_bottom'] );
516
+
517
+ if( isset( $input['position-2_left'] ) )
518
+ $new_input['position-2_left'] = sanitize_text_field( $input['position-2_left'] );
519
+
520
+ if( isset( $input['position-3_top'] ) )
521
+ $new_input['position-3_top'] = sanitize_text_field( $input['position-3_top'] );
522
+
523
+ if( isset( $input['position-3_left'] ) )
524
+ $new_input['position-3_left'] = sanitize_text_field( $input['position-3_left'] );
525
+
526
+ if( isset( $input['position-4_top'] ) )
527
+ $new_input['position-4_top'] = sanitize_text_field( $input['position-4_top'] );
528
+
529
+ if( isset( $input['position-4_right'] ) )
530
+ $new_input['position-4_right'] = sanitize_text_field( $input['position-4_right'] );
531
+
532
+ if( isset( $input['showon_posts'] ) )
533
+ $new_input['showon_posts'] = sanitize_text_field( $input['showon_posts'] );
534
+
535
+ if( isset( $input['showon_page'] ) )
536
+ $new_input['showon_page'] = sanitize_text_field( $input['showon_page'] );
537
+
538
+ if( isset( $input['showon_homepage'] ) )
539
+ $new_input['showon_homepage'] = sanitize_text_field( $input['showon_homepage'] );
540
+
541
+ if( isset( $input['showon_frontpage'] ) )
542
+ $new_input['showon_frontpage'] = sanitize_text_field( $input['showon_frontpage'] );
543
+
544
+ if( isset( $input['showon_category'] ) )
545
+ $new_input['showon_category'] = sanitize_text_field( $input['showon_category'] );
546
+
547
+ if( isset( $input['showon_archive'] ) )
548
+ $new_input['showon_archive'] = sanitize_text_field( $input['showon_archive'] );
549
+
550
+ if( isset( $input['showon_404'] ) )
551
+ $new_input['showon_404'] = sanitize_text_field( $input['showon_404'] );
552
+
553
+ if( isset( $input['list_hideon_pages'] ) )
554
+ $new_input['list_hideon_pages'] = sanitize_text_field( $input['list_hideon_pages'] );
555
+
556
+ if( isset( $input['list_hideon_cat'] ) )
557
+ $new_input['list_hideon_cat'] = sanitize_text_field( $input['list_hideon_cat'] );
558
+
559
+ if( isset( $input['shortcode'] ) )
560
+ $new_input['shortcode'] = sanitize_text_field( $input['shortcode'] );
561
+
562
+ if( isset( $input['return_type'] ) )
563
+ $new_input['return_type'] = sanitize_text_field( $input['return_type'] );
564
+
565
+ if( isset( $input['group_id'] ) )
566
+ $new_input['group_id'] = sanitize_text_field( $input['group_id'] );
567
+
568
+ // $new_input = sanitize_text_field($input);
569
+ return $new_input;
570
+ }
571
+ }
admin/admin_page_customize_styles.php ADDED
@@ -0,0 +1,742 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * content of the options page .. Customize Styles ..
4
+ * admin_menu.php -> settings_page.php -> admin_page.php
5
+ * in name exists - this short values - it means
6
+ * cs - customize styles
7
+ * cb - call back - function
8
+ */
9
+
10
+ if ( ! defined( 'ABSPATH' ) ) exit;
11
+
12
+ function ccw_customize_styles() {
13
+
14
+ register_setting( 'ccw_settings_group_cs', 'ccw_options_cs' , 'ccw_options_sanitize_cs_cb' );
15
+
16
+ add_settings_section( 'ccw_settings_cs', '', 'ccw_settings_section_cs_cb', 'ccw_options_settings_cs' );
17
+
18
+ add_settings_field( 'ccw_style_1_cs', 'Style 1', 'ccw_style_1_cb', 'ccw_options_settings_cs', 'ccw_settings_cs' );
19
+ add_settings_field( 'ccw_style_2_cs', 'Style 2', 'ccw_style_2_cb', 'ccw_options_settings_cs', 'ccw_settings_cs' );
20
+ add_settings_field( 'ccw_style_3_cs', 'Style 3', 'ccw_style_3_cb', 'ccw_options_settings_cs', 'ccw_settings_cs' );
21
+ add_settings_field( 'ccw_style_4_cs', 'Style 4', 'ccw_style_4_cb', 'ccw_options_settings_cs', 'ccw_settings_cs' );
22
+ add_settings_field( 'ccw_style_5_cs', 'Style 5', 'ccw_style_5_cb', 'ccw_options_settings_cs', 'ccw_settings_cs' );
23
+ add_settings_field( 'ccw_style_6_cs', 'Style 6', 'ccw_style_6_cb', 'ccw_options_settings_cs', 'ccw_settings_cs' );
24
+ add_settings_field( 'ccw_style_7_cs', 'Style 7', 'ccw_style_7_cb', 'ccw_options_settings_cs', 'ccw_settings_cs' );
25
+ add_settings_field( 'ccw_style_8_cs', 'Style 8', 'ccw_style_8_cb', 'ccw_options_settings_cs', 'ccw_settings_cs' );
26
+
27
+ }
28
+ add_action( 'admin_init', 'ccw_customize_styles' );
29
+
30
+
31
+
32
+ if( ! function_exists('ccw_settings_section_cs_cb') ) {
33
+
34
+ function ccw_settings_section_cs_cb() {
35
+ echo '<h1>Customize Styles</h1>';
36
+ }
37
+ }
38
+
39
+
40
+ if( ! function_exists('ccw_style_1_cb') ) {
41
+
42
+ function ccw_style_1_cb() {
43
+ $ccw_style_1 = get_option('ccw_options_cs');
44
+ ?>
45
+ <ul class="collapsible" data-collapsible="accordion">
46
+ <li>
47
+ <div class="collapsible-header">Style 1</div>
48
+ <div class="collapsible-body">
49
+
50
+ <div class="row">
51
+ <div class="col s6">
52
+ <p>Color of text</p>
53
+ </div>
54
+ <div class="input-field col s6">
55
+ <input name="ccw_options_cs[s1_text_color]" data-default-color="#9e9e9e" value="<?php echo esc_attr( $ccw_style_1['s1_text_color'] ) ?>" type="text" class="color-wp" style="height: 1.375rem;" >
56
+ </div>
57
+ </div>
58
+
59
+ <div class="row">
60
+ <div class="col s6">
61
+ <p>Color of text when focus on input box</p>
62
+ </div>
63
+ <div class="input-field col s6">
64
+ <input name="ccw_options_cs[s1_text_color_onfocus]" data-default-color="#26a69a" value="<?php echo esc_attr( $ccw_style_1['s1_text_color_onfocus'] ) ?>" type="text" class="color-wp" style="height: 1.375rem;" >
65
+ </div>
66
+ </div>
67
+
68
+ <div class="row">
69
+ <div class="col s6">
70
+ <p>Color of input field bottom border</p>
71
+ </div>
72
+ <div class="input-field col s6">
73
+ <input name="ccw_options_cs[s1_border_color]" data-default-color="#9e9e9e" value="<?php echo esc_attr( $ccw_style_1['s1_border_color'] ) ?>" type="text" class="color-wp" style="height: 1.375rem;" >
74
+ </div>
75
+ </div>
76
+
77
+ <div class="row">
78
+ <div class="col s6">
79
+ <p>Color of input field border bottom on focus</p>
80
+ </div>
81
+ <div class="input-field col s6">
82
+ <input name="ccw_options_cs[s1_border_color_onfocus]" data-default-color="#26a69a" value="<?php echo esc_attr( $ccw_style_1['s1_border_color_onfocus'] ) ?>" type="text" class="color-wp" style="height: 1.375rem;" >
83
+ </div>
84
+ </div>
85
+
86
+ <div class="row">
87
+ <div class="col s6">
88
+ <p>Color of submit button</p>
89
+ </div>
90
+ <div class="input-field col s6">
91
+ <input name="ccw_options_cs[s1_submit_btn_color]" data-default-color="#26a69a" value="<?php echo esc_attr( $ccw_style_1['s1_submit_btn_color'] ) ?>" type="text" class="color-wp" style="height: 1.375rem;" >
92
+ </div>
93
+ </div>
94
+
95
+ <div class="row">
96
+ <div class="col s6">
97
+ <p>Color of submit button - text, icon </p>
98
+ </div>
99
+ <div class="input-field col s6">
100
+ <input name="ccw_options_cs[s1_submit_btn_text_and_icon_color]" data-default-color="#fff" value="<?php echo esc_attr( $ccw_style_1['s1_submit_btn_text_and_icon_color'] ) ?>" type="text" class="color-wp" style="height: 1.375rem;" >
101
+ </div>
102
+ </div>
103
+
104
+ <div class="row hide">
105
+ <div class="col s6">
106
+ <p>Icon size</p>
107
+ </div>
108
+ <div class="input-field col s4">
109
+ <input name="ccw_options_cs[s1_width]" value="<?php echo esc_attr( $ccw_style_1['s1_width'] ) ?>" type="text" class="" >
110
+ </div>
111
+ </div>
112
+
113
+ </div>
114
+ </div>
115
+ </li>
116
+ </ul>
117
+ <?php
118
+ }
119
+ }
120
+
121
+
122
+ if( ! function_exists('ccw_style_2_cb') ) {
123
+
124
+ function ccw_style_2_cb() {
125
+ $ccw_style_2 = get_option('ccw_options_cs');
126
+ $s2_decoration_value = esc_attr( $ccw_style_2['s2_decoration'] );
127
+ $s2_decoration_onhover = esc_attr( $ccw_style_2['s2_decoration_onhover'] );
128
+ ?>
129
+ <ul class="collapsible" data-collapsible="accordion">
130
+ <li>
131
+ <div class="collapsible-header">Style 2</div>
132
+ <div class="collapsible-body">
133
+
134
+ <div class="row">
135
+ <div class="col s6">
136
+ <p>Text Color</p>
137
+ </div>
138
+ <div class="input-field col s6">
139
+ <input name="ccw_options_cs[s2_text_color]" data-default-color="inherit" value="<?php echo esc_attr( $ccw_style_2['s2_text_color'] ) ?>" type="text" class="color-wp" style="height: 1.375rem;" >
140
+ </div>
141
+ </div>
142
+
143
+ <div class="row">
144
+ <div class="col s6">
145
+ <p>Text Color When Hover</p>
146
+ </div>
147
+ <div class="input-field col s6">
148
+ <input name="ccw_options_cs[s2_text_color_onhover]" data-default-color="inherit" value="<?php echo esc_attr( $ccw_style_2['s2_text_color_onhover'] ) ?>" type="text" class="color-wp" style="height: 1.375rem;" >
149
+ </div>
150
+ </div>
151
+
152
+ <div class="row">
153
+ <div class="col s6">
154
+ <p>Text Decoration</p>
155
+ </div>
156
+ <div class="input-field col s6">
157
+ <select name="ccw_options_cs[s2_decoration]" class="select-2_2">
158
+ <option value="none" <?php echo $s2_decoration_value == 'none' ? 'SELECTED' : ''; ?> >none</option>
159
+ <option value="underline" <?php echo $s2_decoration_value == 'underline' ? 'SELECTED' : ''; ?> >underline</option>
160
+ <option value="overline" <?php echo $s2_decoration_value == 'overline' ? 'SELECTED' : ''; ?> >overline</option>
161
+ <option value="line-through" <?php echo $s2_decoration_value == 'line-through' ? 'SELECTED' : ''; ?> >line-through</option>
162
+ <option value="initial" <?php echo $s2_decoration_value == 'initial' ? 'SELECTED' : ''; ?> >initial</option>
163
+ <option value="inherit" <?php echo $s2_decoration_value == 'inherit' ? 'SELECTED' : ''; ?> >inherit</option>
164
+ </select>
165
+ <label>Text Decoration</label>
166
+ </div>
167
+ </div>
168
+
169
+ <div class="row">
170
+ <div class="col s6">
171
+ <p>Text Decoration when Hover</p>
172
+ </div>
173
+ <div class="input-field col s6">
174
+ <select name="ccw_options_cs[s2_decoration_onhover]" class="select-2_2">
175
+ <option value="none" <?php echo $s2_decoration_onhover == 'none' ? 'SELECTED' : ''; ?> >none</option>
176
+ <option value="underline" <?php echo $s2_decoration_onhover == 'underline' ? 'SELECTED' : ''; ?> >underline</option>
177
+ <option value="overline" <?php echo $s2_decoration_onhover == 'overline' ? 'SELECTED' : ''; ?> >overline</option>
178
+ <option value="line-through" <?php echo $s2_decoration_onhover == 'line-through' ? 'SELECTED' : ''; ?> >line-through</option>
179
+ <option value="initial" <?php echo $s2_decoration_onhover == 'initial' ? 'SELECTED' : ''; ?> >initial</option>
180
+ <option value="inherit" <?php echo $s2_decoration_onhover == 'inherit' ? 'SELECTED' : ''; ?> >inherit</option>
181
+ </select>
182
+ <label>Text Decoration on focus</label>
183
+ </div>
184
+ </div>
185
+
186
+ </div>
187
+ </div>
188
+ </li>
189
+ </ul>
190
+ <?php
191
+ }
192
+ }
193
+
194
+
195
+ if( ! function_exists('ccw_style_3_cb') ) {
196
+
197
+ function ccw_style_3_cb() {
198
+ $ccw_style_3 = get_option('ccw_options_cs');
199
+ ?>
200
+ <ul class="collapsible" data-collapsible="accordion">
201
+ <li>
202
+ <div class="collapsible-header">Style 3</div>
203
+ <div class="collapsible-body">
204
+
205
+ <div class="row">
206
+ <div class="col s6">
207
+ <p>Icon size</p>
208
+ </div>
209
+ <div class="input-field col s4">
210
+ <input name="ccw_options_cs[s3_icon_size]" value="<?php echo esc_attr( $ccw_style_3['s3_icon_size'] ) ?>" type="text" class="" >
211
+ </div>
212
+ </div>
213
+
214
+ </div>
215
+ </div>
216
+ </li>
217
+ </ul>
218
+
219
+ <?php
220
+ }
221
+ }
222
+
223
+ if( ! function_exists('ccw_style_4_cb') ) {
224
+
225
+ function ccw_style_4_cb() {
226
+ $ccw_style_4 = get_option('ccw_options_cs');
227
+ ?>
228
+ <ul class="collapsible" data-collapsible="accordion">
229
+ <li>
230
+ <div class="collapsible-header">Style 4</div>
231
+ <div class="collapsible-body">
232
+
233
+
234
+ <div class="row">
235
+ <div class="col s6">
236
+ <p>Text Color</p>
237
+ </div>
238
+ <div class="input-field col s6">
239
+ <input name="ccw_options_cs[s4_text_color]" data-default-color="rgba(0, 0, 0, 0.6)" value="<?php echo esc_attr( $ccw_style_4['s4_text_color'] ) ?>" type="text" class="color-wp" style="height: 1.375rem;" >
240
+ </div>
241
+ </div>
242
+
243
+ <div class="row">
244
+ <div class="col s6">
245
+ <p>Background Color</p>
246
+ </div>
247
+ <div class="input-field col s6">
248
+ <input name="ccw_options_cs[s4_background_color]" data-default-color="#e4e4e4" value="<?php echo esc_attr( $ccw_style_4['s4_background_color'] ) ?>" type="text" class="color-wp" style="height: 1.375rem;" >
249
+ </div>
250
+ </div>
251
+
252
+ </div>
253
+ </div>
254
+ </li>
255
+ </ul>
256
+
257
+ <?php
258
+ }
259
+ }
260
+
261
+
262
+
263
+ if( ! function_exists('ccw_style_5_cb') ) {
264
+
265
+ function ccw_style_5_cb() {
266
+ $ccw_style_5 = get_option('ccw_options_cs');
267
+ ?>
268
+ <ul class="collapsible" data-collapsible="accordion">
269
+ <li>
270
+ <div class="collapsible-header">Style 5</div>
271
+ <div class="collapsible-body">
272
+
273
+ <div class="row">
274
+ <div class="col s6">
275
+ <p>Color of icon</p>
276
+ </div>
277
+ <div class="input-field col s6">
278
+ <!-- style="height: 1.375rem;" or 22px -->
279
+ <input name="ccw_options_cs[s5_color]" data-default-color="#000" value="<?php echo esc_attr( $ccw_style_5['s5_color'] ) ?>" type="text" class="color-wp" style="height: 1.375rem;" >
280
+ </div>
281
+ </div>
282
+
283
+ <div class="row">
284
+ <div class="col s6">
285
+ <p>Color of icon - when hover </p>
286
+ </div>
287
+ <div class="input-field col s6">
288
+ <input name="ccw_options_cs[s5_hover_color]" data-default-color="#ddd" value="<?php echo esc_attr( $ccw_style_5['s5_hover_color'] ) ?>" type="text" class="color-wp" style="height: 1.375rem;" >
289
+ </div>
290
+ </div>
291
+
292
+ <div class="row">
293
+ <div class="col s6">
294
+ <p>Size of icon</p>
295
+ </div>
296
+ <div class="input-field col s4">
297
+ <input name="ccw_options_cs[s5_icon_size]" value="<?php echo esc_attr( $ccw_style_5['s5_icon_size'] ) ?>" type="text" class="" >
298
+ </div>
299
+ </div>
300
+
301
+ </div>
302
+ </li>
303
+ </ul>
304
+
305
+ <?php
306
+ }
307
+ }
308
+
309
+
310
+ if( ! function_exists('ccw_style_6_cb') ) {
311
+
312
+ function ccw_style_6_cb() {
313
+ $ccw_style_6 = get_option('ccw_options_cs');
314
+ ?>
315
+ <ul class="collapsible" data-collapsible="accordion">
316
+ <li>
317
+ <div class="collapsible-header">Style 6</div>
318
+ <div class="collapsible-body">
319
+
320
+ <div class="row">
321
+ <div class="col s6">
322
+ <p>Color of icon</p>
323
+ </div>
324
+ <div class="input-field col s6">
325
+ <!-- style="height: 1.375rem;" or 22px -->
326
+ <input name="ccw_options_cs[s6_color]" data-default-color="#fff" value="<?php echo esc_attr( $ccw_style_6['s6_color'] ) ?>" type="text" class="color-wp" style="height: 1.375rem;" >
327
+ </div>
328
+ </div>
329
+
330
+ <div class="row">
331
+ <div class="col s6">
332
+ <p>Color of icon - when hover </p>
333
+ </div>
334
+ <div class="input-field col s6">
335
+ <input name="ccw_options_cs[s6_hover_color]" data-default-color="#000" value="<?php echo esc_attr( $ccw_style_6['s6_hover_color'] ) ?>" type="text" class="color-wp" style="height: 1.375rem;" >
336
+ </div>
337
+ </div>
338
+
339
+ <div class="row">
340
+ <div class="col s6">
341
+ <p>Size of icon</p>
342
+ </div>
343
+ <div class="input-field col s4">
344
+ <input name="ccw_options_cs[s6_icon_size]" value="<?php echo esc_attr( $ccw_style_6['s6_icon_size'] ) ?>" type="text" class="" >
345
+ </div>
346
+ </div>
347
+
348
+ <div class="row">
349
+ <div class="col s6">
350
+ <p>Circle color </p>
351
+ </div>
352
+ <div class="input-field col s6">
353
+ <input name="ccw_options_cs[s6_circle_background_color]" data-default-color="#ffa500" value="<?php echo esc_attr( $ccw_style_6['s6_circle_background_color'] ) ?>" type="text" class="color-wp" style="height: 1.375rem;" >
354
+ </div>
355
+ </div>
356
+
357
+ <div class="row">
358
+ <div class="col s6">
359
+ <p>Circle color - when hover </p>
360
+ </div>
361
+ <div class="input-field col s6">
362
+ <input name="ccw_options_cs[s6_circle_background_hover_color]" data-default-color="#ffa500" value="<?php echo esc_attr( $ccw_style_6['s6_circle_background_hover_color'] ) ?>" type="text" class="color-wp" style="height: 1.375rem;" >
363
+ </div>
364
+ </div>
365
+
366
+
367
+ <div class="row">
368
+ <div class="col s6">
369
+ <p>Circle Height</p>
370
+ </div>
371
+ <div class="input-field col s4">
372
+ <input name="ccw_options_cs[s6_circle_height]" value="<?php echo esc_attr( $ccw_style_6['s6_circle_height'] ) ?>" type="text" class="" >
373
+ </div>
374
+ </div>
375
+
376
+ <div class="row">
377
+ <div class="col s6">
378
+ <p>Circle Width</p>
379
+ </div>
380
+ <div class="input-field col s4">
381
+ <input name="ccw_options_cs[s6_circle_width]" value="<?php echo esc_attr( $ccw_style_6['s6_circle_width'] ) ?>" type="text" class="" >
382
+ </div>
383
+ </div>
384
+
385
+ <div class="row">
386
+ <div class="col s6">
387
+ <p>Circle Line Height</p>
388
+ </div>
389
+ <div class="input-field col s4">
390
+ <input name="ccw_options_cs[s6_line_height]" value="<?php echo esc_attr( $ccw_style_6['s6_line_height'] ) ?>" type="text" class="" >
391
+ </div>
392
+ </div>
393
+
394
+ <p class="description">initial add height, width, line-height same values - if feels like icon is not center then adjust 'Line Height' to make icon looks center of the circle</p>
395
+
396
+ </div>
397
+ </div>
398
+ </li>
399
+ </ul>
400
+
401
+ <?php
402
+ }
403
+ }
404
+
405
+
406
+
407
+ if( ! function_exists('ccw_style_7_cb') ) {
408
+
409
+ function ccw_style_7_cb() {
410
+ $ccw_style_7 = get_option('ccw_options_cs');
411
+ ?>
412
+ <ul class="collapsible" data-collapsible="accordion">
413
+ <li>
414
+ <div class="collapsible-header">Style 7</div>
415
+ <div class="collapsible-body">
416
+
417
+
418
+ <div class="row">
419
+ <div class="col s6">
420
+ <p>Color of icon</p>
421
+ </div>
422
+ <div class="input-field col s6">
423
+ <!-- style="height: 1.375rem;" or 22px -->
424
+ <input name="ccw_options_cs[s7_color]" data-default-color="#fff" value="<?php echo esc_attr( $ccw_style_7['s7_color'] ) ?>" type="text" class="color-wp" style="height: 1.375rem;" >
425
+ </div>
426
+ </div>
427
+
428
+ <div class="row">
429
+ <div class="col s6">
430
+ <p>Color of icon - when hover </p>
431
+ </div>
432
+ <div class="input-field col s6">
433
+ <input name="ccw_options_cs[s7_hover_color]" data-default-color="#000" value="<?php echo esc_attr( $ccw_style_7['s7_hover_color'] ) ?>" type="text" class="color-wp" style="height: 1.375rem;" >
434
+ </div>
435
+ </div>
436
+
437
+ <div class="row">
438
+ <div class="col s6">
439
+ <p>Size of icon</p>
440
+ </div>
441
+ <div class="input-field col s4">
442
+ <input name="ccw_options_cs[s7_icon_size]" value="<?php echo esc_attr( $ccw_style_7['s7_icon_size'] ) ?>" type="text" class="" >
443
+ </div>
444
+ </div>
445
+
446
+ <div class="row">
447
+ <div class="col s6">
448
+ <p>box color </p>
449
+ </div>
450
+ <div class="input-field col s6">
451
+ <input name="ccw_options_cs[s7_box_background_color]" data-default-color="#ffa500" value="<?php echo esc_attr( $ccw_style_7['s7_box_background_color'] ) ?>" type="text" class="color-wp" style="height: 1.375rem;" >
452
+ </div>
453
+ </div>
454
+
455
+ <div class="row">
456
+ <div class="col s6">
457
+ <p>box color - when hover </p>
458
+ </div>
459
+ <div class="input-field col s6">
460
+ <input name="ccw_options_cs[s7_box_background_hover_color]" data-default-color="#ffa500" value="<?php echo esc_attr( $ccw_style_7['s7_box_background_hover_color'] ) ?>" type="text" class="color-wp" style="height: 1.375rem;" >
461
+ </div>
462
+ </div>
463
+
464
+
465
+ <div class="row">
466
+ <div class="col s6">
467
+ <p>box Height</p>
468
+ </div>
469
+ <div class="input-field col s4">
470
+ <input name="ccw_options_cs[s7_box_height]" value="<?php echo esc_attr( $ccw_style_7['s7_box_height'] ) ?>" type="text" class="" >
471
+ </div>
472
+ </div>
473
+
474
+ <div class="row">
475
+ <div class="col s6">
476
+ <p>box Width</p>
477
+ </div>
478
+ <div class="input-field col s4">
479
+ <input name="ccw_options_cs[s7_box_width]" value="<?php echo esc_attr( $ccw_style_7['s7_box_width'] ) ?>" type="text" class="" >
480
+ </div>
481
+ </div>
482
+
483
+ <div class="row">
484
+ <div class="col s6">
485
+ <p>box Line Height</p>
486
+ </div>
487
+ <div class="input-field col s4">
488
+ <input name="ccw_options_cs[s7_line_height]" value="<?php echo esc_attr( $ccw_style_7['s7_line_height'] ) ?>" type="text" class="" >
489
+ </div>
490
+ </div>
491
+
492
+ <p class="description">initial add height, width, line-height same values - if feels like icon is not center then adjust 'Line Height' to make icon looks center of the box</p>
493
+
494
+
495
+ </div>
496
+ </div>
497
+ </li>
498
+ </ul>
499
+
500
+ <?php
501
+ }
502
+ }
503
+
504
+
505
+ if( ! function_exists('ccw_style_8_cb') ) {
506
+
507
+ function ccw_style_8_cb() {
508
+ $ccw_style_8 = get_option('ccw_options_cs');
509
+ $s8_icon_float = esc_attr( $ccw_style_8['s8_icon_float'] )
510
+ ?>
511
+ <ul class="collapsible" data-collapsible="accordion">
512
+ <li>
513
+ <div class="collapsible-header">Style 8</div>
514
+ <div class="collapsible-body">
515
+
516
+
517
+ <div class="row">
518
+ <div class="col s6">
519
+ <p>Text Color</p>
520
+ </div>
521
+ <div class="input-field col s6">
522
+ <input name="ccw_options_cs[s8_text_color]" data-default-color="#fff" value="<?php echo esc_attr( $ccw_style_8['s8_text_color'] ) ?>" type="text" class="color-wp" style="height: 1.375rem;" >
523
+ </div>
524
+ </div>
525
+
526
+ <div class="row">
527
+ <div class="col s6">
528
+ <p>Background Color</p>
529
+ </div>
530
+ <div class="input-field col s6">
531
+ <input name="ccw_options_cs[s8_background_color]" data-default-color="#26a69a" value="<?php echo esc_attr( $ccw_style_8['s8_background_color'] ) ?>" type="text" class="color-wp" style="height: 1.375rem;" >
532
+ </div>
533
+ </div>
534
+
535
+ <div class="row">
536
+ <div class="col s6">
537
+ <p>Icon color</p>
538
+ </div>
539
+ <div class="input-field col s6">
540
+ <input name="ccw_options_cs[s8_icon_color]" data-default-color="#fff" value="<?php echo esc_attr( $ccw_style_8['s8_icon_color'] ) ?>" type="text" class="color-wp" style="height: 1.375rem;" >
541
+ </div>
542
+ </div>
543
+
544
+ <div class="row">
545
+ <div class="col s6">
546
+ <p>Text Color on hover</p>
547
+ </div>
548
+ <div class="input-field col s6">
549
+ <input name="ccw_options_cs[s8_text_color_onhover]" data-default-color="#fff" value="<?php echo esc_attr( $ccw_style_8['s8_text_color_onhover'] ) ?>" type="text" class="color-wp" style="height: 1.375rem;" >
550
+ </div>
551
+ </div>
552
+
553
+ <div class="row">
554
+ <div class="col s6">
555
+ <p>Background Color on hover</p>
556
+ </div>
557
+ <div class="input-field col s6">
558
+ <input name="ccw_options_cs[s8_background_color_onhover]" data-default-color="#26a69a" value="<?php echo esc_attr( $ccw_style_8['s8_background_color_onhover'] ) ?>" type="text" class="color-wp" style="height: 1.375rem;" >
559
+ </div>
560
+ </div>
561
+
562
+ <div class="row">
563
+ <div class="col s6">
564
+ <p>Icon color on hover</p>
565
+ </div>
566
+ <div class="input-field col s6">
567
+ <input name="ccw_options_cs[s8_icon_color_onhover]" data-default-color="#fff" value="<?php echo esc_attr( $ccw_style_8['s8_icon_color_onhover'] ) ?>" type="text" class="color-wp" style="height: 1.375rem;" >
568
+ </div>
569
+ </div>
570
+
571
+ <div class="row">
572
+ <div class="col s6">
573
+ <p>Icon float</p>
574
+ </div>
575
+ <div class="input-field col s6">
576
+ <select name="ccw_options_cs[s8_icon_float]" class="select-2_2">
577
+ <option value="left" <?php echo $s8_icon_float == 'left' ? 'SELECTED' : ''; ?> >left</option>
578
+ <option value="right" <?php echo $s8_icon_float == 'right' ? 'SELECTED' : ''; ?> >right</option>
579
+ <option value="hide" <?php echo $s8_icon_float == 'hide' ? 'SELECTED' : ''; ?> >hide</option>
580
+ </select>
581
+ <label>Icon flow</label>
582
+ </div>
583
+ </div>
584
+
585
+ <div class="row hide">
586
+ <div class="col s6">
587
+ <p>Icon size</p>
588
+ </div>
589
+ <div class="input-field col s4">
590
+ <input name="ccw_options_cs[s8_1_width]" value="<?php echo esc_attr( $ccw_style_8['s8_1_width'] ) ?>" type="text" class="" >
591
+ </div>
592
+ </div>
593
+
594
+ </div>
595
+ </div>
596
+ </li>
597
+ </ul>
598
+
599
+ <?php
600
+ }
601
+ }
602
+
603
+
604
+
605
+
606
+
607
+ if( ! function_exists('ccw_options_sanitize_cs_cb') ) {
608
+
609
+ function ccw_options_sanitize_cs_cb( $input ) {
610
+
611
+ if ( ! current_user_can( 'manage_options' ) ) {
612
+ wp_die( 'not allowed to modify - please contact admin ' );
613
+ }
614
+
615
+ $new_input = array();
616
+
617
+ if( isset( $input['s1_text_color'] ) )
618
+ $new_input['s1_text_color'] = sanitize_text_field( $input['s1_text_color'] );
619
+
620
+ if( isset( $input['s1_text_color_onfocus'] ) )
621
+ $new_input['s1_text_color_onfocus'] = sanitize_text_field( $input['s1_text_color_onfocus'] );
622
+
623
+ if( isset( $input['s1_border_color'] ) )
624
+ $new_input['s1_border_color'] = sanitize_text_field( $input['s1_border_color'] );
625
+
626
+ if( isset( $input['s1_border_color_onfocus'] ) )
627
+ $new_input['s1_border_color_onfocus'] = sanitize_text_field( $input['s1_border_color_onfocus'] );
628
+
629
+ if( isset( $input['s1_submit_btn_color'] ) )
630
+ $new_input['s1_submit_btn_color'] = sanitize_text_field( $input['s1_submit_btn_color'] );
631
+
632
+ if( isset( $input['s1_submit_btn_text_and_icon_color'] ) )
633
+ $new_input['s1_submit_btn_text_and_icon_color'] = sanitize_text_field( $input['s1_submit_btn_text_and_icon_color'] );
634
+
635
+ if( isset( $input['s1_width'] ) )
636
+ $new_input['s1_width'] = sanitize_text_field( $input['s1_width'] );
637
+
638
+ if( isset( $input['s2_text_color'] ) )
639
+ $new_input['s2_text_color'] = sanitize_text_field( $input['s2_text_color'] );
640
+
641
+ if( isset( $input['s2_text_color_onhover'] ) )
642
+ $new_input['s2_text_color_onhover'] = sanitize_text_field( $input['s2_text_color_onhover'] );
643
+
644
+ if( isset( $input['s2_decoration'] ) )
645
+ $new_input['s2_decoration'] = sanitize_text_field( $input['s2_decoration'] );
646
+
647
+ if( isset( $input['s2_decoration_onhover'] ) )
648
+ $new_input['s2_decoration_onhover'] = sanitize_text_field( $input['s2_decoration_onhover'] );
649
+
650
+ if( isset( $input['s3_icon_size'] ) )
651
+ $new_input['s3_icon_size'] = sanitize_text_field( $input['s3_icon_size'] );
652
+
653
+ if( isset( $input['s4_text_color'] ) )
654
+ $new_input['s4_text_color'] = sanitize_text_field( $input['s4_text_color'] );
655
+
656
+ if( isset( $input['s4_background_color'] ) )
657
+ $new_input['s4_background_color'] = sanitize_text_field( $input['s4_background_color'] );
658
+
659
+ if( isset( $input['s5_color'] ) )
660
+ $new_input['s5_color'] = sanitize_text_field( $input['s5_color'] );
661
+
662
+ if( isset( $input['s5_hover_color'] ) )
663
+ $new_input['s5_hover_color'] = sanitize_text_field( $input['s5_hover_color'] );
664
+
665
+ if( isset( $input['s5_icon_size'] ) )
666
+ $new_input['s5_icon_size'] = sanitize_text_field( $input['s5_icon_size'] );
667
+
668
+ if( isset( $input['s6_color'] ) )
669
+ $new_input['s6_color'] = sanitize_text_field( $input['s6_color'] );
670
+
671
+ if( isset( $input['s6_hover_color'] ) )
672
+ $new_input['s6_hover_color'] = sanitize_text_field( $input['s6_hover_color'] );
673
+
674
+ if( isset( $input['s6_icon_size'] ) )
675
+ $new_input['s6_icon_size'] = sanitize_text_field( $input['s6_icon_size'] );
676
+
677
+ if( isset( $input['s6_circle_background_color'] ) )
678
+ $new_input['s6_circle_background_color'] = sanitize_text_field( $input['s6_circle_background_color'] );
679
+
680
+ if( isset( $input['s6_circle_background_hover_color'] ) )
681
+ $new_input['s6_circle_background_hover_color'] = sanitize_text_field( $input['s6_circle_background_hover_color'] );
682
+
683
+ if( isset( $input['s6_circle_height'] ) )
684
+ $new_input['s6_circle_height'] = sanitize_text_field( $input['s6_circle_height'] );
685
+
686
+ if( isset( $input['s6_circle_width'] ) )
687
+ $new_input['s6_circle_width'] = sanitize_text_field( $input['s6_circle_width'] );
688
+
689
+ if( isset( $input['s6_line_height'] ) )
690
+ $new_input['s6_line_height'] = sanitize_text_field( $input['s6_line_height'] );
691
+
692
+ if( isset( $input['s7_color'] ) )
693
+ $new_input['s7_color'] = sanitize_text_field( $input['s7_color'] );
694
+
695
+ if( isset( $input['s7_hover_color'] ) )
696
+ $new_input['s7_hover_color'] = sanitize_text_field( $input['s7_hover_color'] );
697
+
698
+ if( isset( $input['s7_icon_size'] ) )
699
+ $new_input['s7_icon_size'] = sanitize_text_field( $input['s7_icon_size'] );
700
+
701
+ if( isset( $input['s7_box_background_color'] ) )
702
+ $new_input['s7_box_background_color'] = sanitize_text_field( $input['s7_box_background_color'] );
703
+
704
+ if( isset( $input['s7_box_background_hover_color'] ) )
705
+ $new_input['s7_box_background_hover_color'] = sanitize_text_field( $input['s7_box_background_hover_color'] );
706
+
707
+ if( isset( $input['s7_box_height'] ) )
708
+ $new_input['s7_box_height'] = sanitize_text_field( $input['s7_box_height'] );
709
+
710
+ if( isset( $input['s7_box_width'] ) )
711
+ $new_input['s7_box_width'] = sanitize_text_field( $input['s7_box_width'] );
712
+
713
+ if( isset( $input['s7_line_height'] ) )
714
+ $new_input['s7_line_height'] = sanitize_text_field( $input['s7_line_height'] );
715
+
716
+ if( isset( $input['s8_text_color'] ) )
717
+ $new_input['s8_text_color'] = sanitize_text_field( $input['s8_text_color'] );
718
+
719
+ if( isset( $input['s8_background_color'] ) )
720
+ $new_input['s8_background_color'] = sanitize_text_field( $input['s8_background_color'] );
721
+
722
+ if( isset( $input['s8_icon_color'] ) )
723
+ $new_input['s8_icon_color'] = sanitize_text_field( $input['s8_icon_color'] );
724
+
725
+ if( isset( $input['s8_text_color_onhover'] ) )
726
+ $new_input['s8_text_color_onhover'] = sanitize_text_field( $input['s8_text_color_onhover'] );
727
+
728
+ if( isset( $input['s8_background_color_onhover'] ) )
729
+ $new_input['s8_background_color_onhover'] = sanitize_text_field( $input['s8_background_color_onhover'] );
730
+
731
+ if( isset( $input['s8_icon_color_onhover'] ) )
732
+ $new_input['s8_icon_color_onhover'] = sanitize_text_field( $input['s8_icon_color_onhover'] );
733
+
734
+ if( isset( $input['s8_icon_float'] ) )
735
+ $new_input['s8_icon_float'] = sanitize_text_field( $input['s8_icon_float'] );
736
+
737
+ if( isset( $input['s8_1_width'] ) )
738
+ $new_input['s8_1_width'] = sanitize_text_field( $input['s8_1_width'] );
739
+
740
+ return $new_input;
741
+ }
742
+ }
admin/default-values.php ADDED
@@ -0,0 +1,130 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * set the default values
4
+ * which stores in database options table
5
+ * dont override user settings
6
+ * get user setting value and merge with newly added values
7
+ *
8
+ * ccw_plugin_details - this values will be overrides..
9
+ */
10
+
11
+ if ( ! defined( 'ABSPATH' ) ) exit;
12
+
13
+
14
+ // plugin details
15
+ $plugin_details = array(
16
+ 'version' => '1.0.0',
17
+ );
18
+
19
+ // Always use update_option - override new values .. don't preseve already existing values
20
+ update_option( 'ccw_plugin_details', $plugin_details );
21
+
22
+
23
+
24
+
25
+
26
+ // top level options page
27
+ $values = array(
28
+ 'enable' => '2',
29
+ 'enable_sc' => '2',
30
+ 'number' => '918897606725',
31
+ 'input_placeholder' => 'WhatsApp us',
32
+ 'position' => '1',
33
+ 'style' => '1',
34
+ 'stylemobile' => '3',
35
+ 'position-1_bottom' => '10px',
36
+ 'position-1_right' => '10px',
37
+ 'position-2_bottom' => '10px',
38
+ 'position-2_left' => '10px',
39
+ 'position-3_top' => '10px',
40
+ 'position-3_left' => '10px',
41
+ 'position-4_top' => '10px',
42
+ 'position-4_right' => '10px',
43
+ 'showon_posts' => '1',
44
+ 'showon_page' => '1',
45
+ 'showon_homepage' => '1',
46
+ 'showon_frontpage' => '1',
47
+ 'showon_category' => '1',
48
+ 'showon_archive' => '1',
49
+ 'showon_404' => '1',
50
+ 'list_hideon_pages' => '',
51
+ 'list_hideon_cat' => '',
52
+ 'shortcode' => 'chat',
53
+
54
+ 'return_type' => 'chat', // chat or group_chat
55
+ 'group_id' => 'DuEZlyOo94A1QirOX42zKr',
56
+ );
57
+
58
+ // update_option( 'ccw_options', $values );
59
+ // add_option( 'ccw_options', $values );
60
+
61
+ $db_values = get_option( 'ccw_options', array() );
62
+ $update_values = array_merge($values, $db_values);
63
+ update_option('ccw_options', $update_values);
64
+
65
+
66
+
67
+
68
+
69
+
70
+ // customize styles - options page
71
+ $values_cs = array(
72
+ 's1_text_color' => '#9e9e9e',
73
+ 's1_text_color_onfocus' => '#26a69a',
74
+ 's1_border_color' => '#9e9e9e',
75
+ 's1_border_color_onfocus' => '#26a69a',
76
+ 's1_submit_btn_color' => '#26a69a',
77
+ 's1_submit_btn_text_and_icon_color' => '#fff',
78
+ 's1_width' => 'auto',
79
+
80
+ 's2_text_color' => 'initial',
81
+ 's2_text_color_onhover' => 'initial',
82
+ 's2_decoration' => 'initial',
83
+ 's2_decoration_onhover' => 'initial',
84
+
85
+ 's3_icon_size' => '48px',
86
+
87
+ 's4_text_color' => 'rgba(0, 0, 0, 0.6)',
88
+ 's4_background_color' => '#e4e4e4',
89
+
90
+ 's5_color' => '#000',
91
+ 's5_hover_color' => '#ddd',
92
+ 's5_icon_size' => '24px',
93
+
94
+ 's6_color' => '#fff',
95
+ 's6_hover_color' => '#000',
96
+ 's6_icon_size' => '24px',
97
+ 's6_circle_background_color' => '#ffa500',
98
+ 's6_circle_background_hover_color' => '#00e51e',
99
+ 's6_circle_height' => '48px',
100
+ 's6_circle_width' => '48px',
101
+ 's6_line_height' => '48px',
102
+
103
+ 's7_color' => '#fff',
104
+ 's7_hover_color' => '#000',
105
+ 's7_icon_size' => '24px',
106
+ 's7_box_background_color' => '#ffa500',
107
+ 's7_box_background_hover_color' => '#00e51e',
108
+ 's7_box_height' => '48px',
109
+ 's7_box_width' => '48px',
110
+ 's7_line_height' => '48px',
111
+
112
+ 's8_text_color' => '#fff',
113
+ 's8_background_color' => '#26a69a',
114
+ 's8_icon_color' => '#fff',
115
+
116
+ 's8_text_color_onhover' => '#fff',
117
+ 's8_background_color_onhover' => '#26a69a',
118
+ 's8_icon_color_onhover' => '#fff',
119
+ 's8_icon_float' => 'right',
120
+ 's8_1_width' => '',
121
+ );
122
+
123
+ $db_values_cs = get_option( 'ccw_options_cs', array() );
124
+ $update_values_cs = array_merge($values_cs, $db_values_cs);
125
+ update_option('ccw_options_cs', $update_values_cs);
126
+
127
+
128
+
129
+
130
+
admin/settings_page.php ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * options page
4
+ * content of this page load / continue at admin_page.php
5
+ */
6
+
7
+ if ( ! defined( 'ABSPATH' ) ) exit;
8
+
9
+ ?>
10
+
11
+ <div class="wrap">
12
+
13
+ <?php settings_errors(); ?>
14
+
15
+ <div class="row">
16
+ <div class="col s12 m12 xl6">
17
+ <form action="options.php" method="post" class="col s12">
18
+ <?php settings_fields( 'ccw_settings_group' ); ?>
19
+ <?php do_settings_sections( 'ccw_options_settings' ) ?>
20
+ <?php submit_button() ?>
21
+ </form>
22
+ </div>
23
+ <div class="col admin_guide">
24
+ </div>
25
+ </div>
26
+
27
+ </div>
admin/sp_customize_styles.php ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * settings page - customize styles ( settings_page.php is main page and this is sub page )
4
+ * options page
5
+ * content of this page load / continue at admin_page_customize_styles.php
6
+ * cs - customize styles
7
+ */
8
+
9
+ if ( ! defined( 'ABSPATH' ) ) exit;
10
+
11
+ ?>
12
+
13
+ <div class="wrap">
14
+
15
+ <?php settings_errors(); ?>
16
+
17
+ <div class="row">
18
+ <div class="col s12 m12 xl6">
19
+ <form action="options.php" method="post" class="col s12">
20
+ <?php settings_fields( 'ccw_settings_group_cs' ); ?>
21
+ <?php do_settings_sections( 'ccw_options_settings_cs' ) ?>
22
+ <?php submit_button() ?>
23
+ </form>
24
+ </div>
25
+ <div class="col admin_guide">
26
+ </div>
27
+ </div>
28
+
29
+ </div>
assets/css/admin_main.css ADDED
@@ -0,0 +1,4765 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*
2
+ * Materializecss
3
+ * custom Code
4
+ */
5
+
6
+
7
+ /* Materializecss - http://materializecss.com/ */
8
+
9
+ .materialize-red {
10
+ background-color: #e51c23 !important; }
11
+
12
+ .materialize-red-text {
13
+ color: #e51c23 !important; }
14
+
15
+ .materialize-red.lighten-5 {
16
+ background-color: #fdeaeb !important; }
17
+
18
+ .materialize-red-text.text-lighten-5 {
19
+ color: #fdeaeb !important; }
20
+
21
+ .materialize-red.lighten-4 {
22
+ background-color: #f8c1c3 !important; }
23
+
24
+ .materialize-red-text.text-lighten-4 {
25
+ color: #f8c1c3 !important; }
26
+
27
+ .materialize-red.lighten-3 {
28
+ background-color: #f3989b !important; }
29
+
30
+ .materialize-red-text.text-lighten-3 {
31
+ color: #f3989b !important; }
32
+
33
+ .materialize-red.lighten-2 {
34
+ background-color: #ee6e73 !important; }
35
+
36
+ .materialize-red-text.text-lighten-2 {
37
+ color: #ee6e73 !important; }
38
+
39
+ .materialize-red.lighten-1 {
40
+ background-color: #ea454b !important; }
41
+
42
+ .materialize-red-text.text-lighten-1 {
43
+ color: #ea454b !important; }
44
+
45
+ .materialize-red.darken-1 {
46
+ background-color: #d0181e !important; }
47
+
48
+ .materialize-red-text.text-darken-1 {
49
+ color: #d0181e !important; }
50
+
51
+ .materialize-red.darken-2 {
52
+ background-color: #b9151b !important; }
53
+
54
+ .materialize-red-text.text-darken-2 {
55
+ color: #b9151b !important; }
56
+
57
+ .materialize-red.darken-3 {
58
+ background-color: #a21318 !important; }
59
+
60
+ .materialize-red-text.text-darken-3 {
61
+ color: #a21318 !important; }
62
+
63
+ .materialize-red.darken-4 {
64
+ background-color: #8b1014 !important; }
65
+
66
+ .materialize-red-text.text-darken-4 {
67
+ color: #8b1014 !important; }
68
+
69
+ .red {
70
+ background-color: #F44336 !important; }
71
+
72
+ .red-text {
73
+ color: #F44336 !important; }
74
+
75
+ .red.lighten-5 {
76
+ background-color: #FFEBEE !important; }
77
+
78
+ .red-text.text-lighten-5 {
79
+ color: #FFEBEE !important; }
80
+
81
+ .red.lighten-4 {
82
+ background-color: #FFCDD2 !important; }
83
+
84
+ .red-text.text-lighten-4 {
85
+ color: #FFCDD2 !important; }
86
+
87
+ .red.lighten-3 {
88
+ background-color: #EF9A9A !important; }
89
+
90
+ .red-text.text-lighten-3 {
91
+ color: #EF9A9A !important; }
92
+
93
+ .red.lighten-2 {
94
+ background-color: #E57373 !important; }
95
+
96
+ .red-text.text-lighten-2 {
97
+ color: #E57373 !important; }
98
+
99
+ .red.lighten-1 {
100
+ background-color: #EF5350 !important; }
101
+
102
+ .red-text.text-lighten-1 {
103
+ color: #EF5350 !important; }
104
+
105
+ .red.darken-1 {
106
+ background-color: #E53935 !important; }
107
+
108
+ .red-text.text-darken-1 {
109
+ color: #E53935 !important; }
110
+
111
+ .red.darken-2 {
112
+ background-color: #D32F2F !important; }
113
+
114
+ .red-text.text-darken-2 {
115
+ color: #D32F2F !important; }
116
+
117
+ .red.darken-3 {
118
+ background-color: #C62828 !important; }
119
+
120
+ .red-text.text-darken-3 {
121
+ color: #C62828 !important; }
122
+
123
+ .red.darken-4 {
124
+ background-color: #B71C1C !important; }
125
+
126
+ .red-text.text-darken-4 {
127
+ color: #B71C1C !important; }
128
+
129
+ .red.accent-1 {
130
+ background-color: #FF8A80 !important; }
131
+
132
+ .red-text.text-accent-1 {
133
+ color: #FF8A80 !important; }
134
+
135
+ .red.accent-2 {
136
+ background-color: #FF5252 !important; }
137
+
138
+ .red-text.text-accent-2 {
139
+ color: #FF5252 !important; }
140
+
141
+ .red.accent-3 {
142
+ background-color: #FF1744 !important; }
143
+
144
+ .red-text.text-accent-3 {
145
+ color: #FF1744 !important; }
146
+
147
+ .red.accent-4 {
148
+ background-color: #D50000 !important; }
149
+
150
+ .red-text.text-accent-4 {
151
+ color: #D50000 !important; }
152
+
153
+ .pink {
154
+ background-color: #e91e63 !important; }
155
+
156
+ .pink-text {
157
+ color: #e91e63 !important; }
158
+
159
+ .pink.lighten-5 {
160
+ background-color: #fce4ec !important; }
161
+
162
+ .pink-text.text-lighten-5 {
163
+ color: #fce4ec !important; }
164
+
165
+ .pink.lighten-4 {
166
+ background-color: #f8bbd0 !important; }
167
+
168
+ .pink-text.text-lighten-4 {
169
+ color: #f8bbd0 !important; }
170
+
171
+ .pink.lighten-3 {
172
+ background-color: #f48fb1 !important; }
173
+
174
+ .pink-text.text-lighten-3 {
175
+ color: #f48fb1 !important; }
176
+
177
+ .pink.lighten-2 {
178
+ background-color: #f06292 !important; }
179
+
180
+ .pink-text.text-lighten-2 {
181
+ color: #f06292 !important; }
182
+
183
+ .pink.lighten-1 {
184
+ background-color: #ec407a !important; }
185
+
186
+ .pink-text.text-lighten-1 {
187
+ color: #ec407a !important; }
188
+
189
+ .pink.darken-1 {
190
+ background-color: #d81b60 !important; }
191
+
192
+ .pink-text.text-darken-1 {
193
+ color: #d81b60 !important; }
194
+
195
+ .pink.darken-2 {
196
+ background-color: #c2185b !important; }
197
+
198
+ .pink-text.text-darken-2 {
199
+ color: #c2185b !important; }
200
+
201
+ .pink.darken-3 {
202
+ background-color: #ad1457 !important; }
203
+
204
+ .pink-text.text-darken-3 {
205
+ color: #ad1457 !important; }
206
+
207
+ .pink.darken-4 {
208
+ background-color: #880e4f !important; }
209
+
210
+ .pink-text.text-darken-4 {
211
+ color: #880e4f !important; }
212
+
213
+ .pink.accent-1 {
214
+ background-color: #ff80ab !important; }
215
+
216
+ .pink-text.text-accent-1 {
217
+ color: #ff80ab !important; }
218
+
219
+ .pink.accent-2 {
220
+ background-color: #ff4081 !important; }
221
+
222
+ .pink-text.text-accent-2 {
223
+ color: #ff4081 !important; }
224
+
225
+ .pink.accent-3 {
226
+ background-color: #f50057 !important; }
227
+
228
+ .pink-text.text-accent-3 {
229
+ color: #f50057 !important; }
230
+
231
+ .pink.accent-4 {
232
+ background-color: #c51162 !important; }
233
+
234
+ .pink-text.text-accent-4 {
235
+ color: #c51162 !important; }
236
+
237
+ .purple {
238
+ background-color: #9c27b0 !important; }
239
+
240
+ .purple-text {
241
+ color: #9c27b0 !important; }
242
+
243
+ .purple.lighten-5 {
244
+ background-color: #f3e5f5 !important; }
245
+
246
+ .purple-text.text-lighten-5 {
247
+ color: #f3e5f5 !important; }
248
+
249
+ .purple.lighten-4 {
250
+ background-color: #e1bee7 !important; }
251
+
252
+ .purple-text.text-lighten-4 {
253
+ color: #e1bee7 !important; }
254
+
255
+ .purple.lighten-3 {
256
+ background-color: #ce93d8 !important; }
257
+
258
+ .purple-text.text-lighten-3 {
259
+ color: #ce93d8 !important; }
260
+
261
+ .purple.lighten-2 {
262
+ background-color: #ba68c8 !important; }
263
+
264
+ .purple-text.text-lighten-2 {
265
+ color: #ba68c8 !important; }
266
+
267
+ .purple.lighten-1 {
268
+ background-color: #ab47bc !important; }
269
+
270
+ .purple-text.text-lighten-1 {
271
+ color: #ab47bc !important; }
272
+
273
+ .purple.darken-1 {
274
+ background-color: #8e24aa !important; }
275
+
276
+ .purple-text.text-darken-1 {
277
+ color: #8e24aa !important; }
278
+
279
+ .purple.darken-2 {
280
+ background-color: #7b1fa2 !important; }
281
+
282
+ .purple-text.text-darken-2 {
283
+ color: #7b1fa2 !important; }
284
+
285
+ .purple.darken-3 {
286
+ background-color: #6a1b9a !important; }
287
+
288
+ .purple-text.text-darken-3 {
289
+ color: #6a1b9a !important; }
290
+
291
+ .purple.darken-4 {
292
+ background-color: #4a148c !important; }
293
+
294
+ .purple-text.text-darken-4 {
295
+ color: #4a148c !important; }
296
+
297
+ .purple.accent-1 {
298
+ background-color: #ea80fc !important; }
299
+
300
+ .purple-text.text-accent-1 {
301
+ color: #ea80fc !important; }
302
+
303
+ .purple.accent-2 {
304
+ background-color: #e040fb !important; }
305
+
306
+ .purple-text.text-accent-2 {
307
+ color: #e040fb !important; }
308
+
309
+ .purple.accent-3 {
310
+ background-color: #d500f9 !important; }
311
+
312
+ .purple-text.text-accent-3 {
313
+ color: #d500f9 !important; }
314
+
315
+ .purple.accent-4 {
316
+ background-color: #aa00ff !important; }
317
+
318
+ .purple-text.text-accent-4 {
319
+ color: #aa00ff !important; }
320
+
321
+ .deep-purple {
322
+ background-color: #673ab7 !important; }
323
+
324
+ .deep-purple-text {
325
+ color: #673ab7 !important; }
326
+
327
+ .deep-purple.lighten-5 {
328
+ background-color: #ede7f6 !important; }
329
+
330
+ .deep-purple-text.text-lighten-5 {
331
+ color: #ede7f6 !important; }
332
+
333
+ .deep-purple.lighten-4 {
334
+ background-color: #d1c4e9 !important; }
335
+
336
+ .deep-purple-text.text-lighten-4 {
337
+ color: #d1c4e9 !important; }
338
+
339
+ .deep-purple.lighten-3 {
340
+ background-color: #b39ddb !important; }
341
+
342
+ .deep-purple-text.text-lighten-3 {
343
+ color: #b39ddb !important; }
344
+
345
+ .deep-purple.lighten-2 {
346
+ background-color: #9575cd !important; }
347
+
348
+ .deep-purple-text.text-lighten-2 {
349
+ color: #9575cd !important; }
350
+
351
+ .deep-purple.lighten-1 {
352
+ background-color: #7e57c2 !important; }
353
+
354
+ .deep-purple-text.text-lighten-1 {
355
+ color: #7e57c2 !important; }
356
+
357
+ .deep-purple.darken-1 {
358
+ background-color: #5e35b1 !important; }
359
+
360
+ .deep-purple-text.text-darken-1 {
361
+ color: #5e35b1 !important; }
362
+
363
+ .deep-purple.darken-2 {
364
+ background-color: #512da8 !important; }
365
+
366
+ .deep-purple-text.text-darken-2 {
367
+ color: #512da8 !important; }
368
+
369
+ .deep-purple.darken-3 {
370
+ background-color: #4527a0 !important; }
371
+
372
+ .deep-purple-text.text-darken-3 {
373
+ color: #4527a0 !important; }
374
+
375
+ .deep-purple.darken-4 {
376
+ background-color: #311b92 !important; }
377
+
378
+ .deep-purple-text.text-darken-4 {
379
+ color: #311b92 !important; }
380
+
381
+ .deep-purple.accent-1 {
382
+ background-color: #b388ff !important; }
383
+
384
+ .deep-purple-text.text-accent-1 {
385
+ color: #b388ff !important; }
386
+
387
+ .deep-purple.accent-2 {
388
+ background-color: #7c4dff !important; }
389
+
390
+ .deep-purple-text.text-accent-2 {
391
+ color: #7c4dff !important; }
392
+
393
+ .deep-purple.accent-3 {
394
+ background-color: #651fff !important; }
395
+
396
+ .deep-purple-text.text-accent-3 {
397
+ color: #651fff !important; }
398
+
399
+ .deep-purple.accent-4 {
400
+ background-color: #6200ea !important; }
401
+
402
+ .deep-purple-text.text-accent-4 {
403
+ color: #6200ea !important; }
404
+
405
+ .indigo {
406
+ background-color: #3f51b5 !important; }
407
+
408
+ .indigo-text {
409
+ color: #3f51b5 !important; }
410
+
411
+ .indigo.lighten-5 {
412
+ background-color: #e8eaf6 !important; }
413
+
414
+ .indigo-text.text-lighten-5 {
415
+ color: #e8eaf6 !important; }
416
+
417
+ .indigo.lighten-4 {
418
+ background-color: #c5cae9 !important; }
419
+
420
+ .indigo-text.text-lighten-4 {
421
+ color: #c5cae9 !important; }
422
+
423
+ .indigo.lighten-3 {
424
+ background-color: #9fa8da !important; }
425
+
426
+ .indigo-text.text-lighten-3 {
427
+ color: #9fa8da !important; }
428
+
429
+ .indigo.lighten-2 {
430
+ background-color: #7986cb !important; }
431
+
432
+ .indigo-text.text-lighten-2 {
433
+ color: #7986cb !important; }
434
+
435
+ .indigo.lighten-1 {
436
+ background-color: #5c6bc0 !important; }
437
+
438
+ .indigo-text.text-lighten-1 {
439
+ color: #5c6bc0 !important; }
440
+
441
+ .indigo.darken-1 {
442
+ background-color: #3949ab !important; }
443
+
444
+ .indigo-text.text-darken-1 {
445
+ color: #3949ab !important; }
446
+
447
+ .indigo.darken-2 {
448
+ background-color: #303f9f !important; }
449
+
450
+ .indigo-text.text-darken-2 {
451
+ color: #303f9f !important; }
452
+
453
+ .indigo.darken-3 {
454
+ background-color: #283593 !important; }
455
+
456
+ .indigo-text.text-darken-3 {
457
+ color: #283593 !important; }
458
+
459
+ .indigo.darken-4 {
460
+ background-color: #1a237e !important; }
461
+
462
+ .indigo-text.text-darken-4 {
463
+ color: #1a237e !important; }
464
+
465
+ .indigo.accent-1 {
466
+ background-color: #8c9eff !important; }
467
+
468
+ .indigo-text.text-accent-1 {
469
+ color: #8c9eff !important; }
470
+
471
+ .indigo.accent-2 {
472
+ background-color: #536dfe !important; }
473
+
474
+ .indigo-text.text-accent-2 {
475
+ color: #536dfe !important; }
476
+
477
+ .indigo.accent-3 {
478
+ background-color: #3d5afe !important; }
479
+
480
+ .indigo-text.text-accent-3 {
481
+ color: #3d5afe !important; }
482
+
483
+ .indigo.accent-4 {
484
+ background-color: #304ffe !important; }
485
+
486
+ .indigo-text.text-accent-4 {
487
+ color: #304ffe !important; }
488
+
489
+ .blue {
490
+ background-color: #2196F3 !important; }
491
+
492
+ .blue-text {
493
+ color: #2196F3 !important; }
494
+
495
+ .blue.lighten-5 {
496
+ background-color: #E3F2FD !important; }
497
+
498
+ .blue-text.text-lighten-5 {
499
+ color: #E3F2FD !important; }
500
+
501
+ .blue.lighten-4 {
502
+ background-color: #BBDEFB !important; }
503
+
504
+ .blue-text.text-lighten-4 {
505
+ color: #BBDEFB !important; }
506
+
507
+ .blue.lighten-3 {
508
+ background-color: #90CAF9 !important; }
509
+
510
+ .blue-text.text-lighten-3 {
511
+ color: #90CAF9 !important; }
512
+
513
+ .blue.lighten-2 {
514
+ background-color: #64B5F6 !important; }
515
+
516
+ .blue-text.text-lighten-2 {
517
+ color: #64B5F6 !important; }
518
+
519
+ .blue.lighten-1 {
520
+ background-color: #42A5F5 !important; }
521
+
522
+ .blue-text.text-lighten-1 {
523
+ color: #42A5F5 !important; }
524
+
525
+ .blue.darken-1 {
526
+ background-color: #1E88E5 !important; }
527
+
528
+ .blue-text.text-darken-1 {
529
+ color: #1E88E5 !important; }
530
+
531
+ .blue.darken-2 {
532
+ background-color: #1976D2 !important; }
533
+
534
+ .blue-text.text-darken-2 {
535
+ color: #1976D2 !important; }
536
+
537
+ .blue.darken-3 {
538
+ background-color: #1565C0 !important; }
539
+
540
+ .blue-text.text-darken-3 {
541
+ color: #1565C0 !important; }
542
+
543
+ .blue.darken-4 {
544
+ background-color: #0D47A1 !important; }
545
+
546
+ .blue-text.text-darken-4 {
547
+ color: #0D47A1 !important; }
548
+
549
+ .blue.accent-1 {
550
+ background-color: #82B1FF !important; }
551
+
552
+ .blue-text.text-accent-1 {
553
+ color: #82B1FF !important; }
554
+
555
+ .blue.accent-2 {
556
+ background-color: #448AFF !important; }
557
+
558
+ .blue-text.text-accent-2 {
559
+ color: #448AFF !important; }
560
+
561
+ .blue.accent-3 {
562
+ background-color: #2979FF !important; }
563
+
564
+ .blue-text.text-accent-3 {
565
+ color: #2979FF !important; }
566
+
567
+ .blue.accent-4 {
568
+ background-color: #2962FF !important; }
569
+
570
+ .blue-text.text-accent-4 {
571
+ color: #2962FF !important; }
572
+
573
+ .light-blue {
574
+ background-color: #03a9f4 !important; }
575
+
576
+ .light-blue-text {
577
+ color: #03a9f4 !important; }
578
+
579
+ .light-blue.lighten-5 {
580
+ background-color: #e1f5fe !important; }
581
+
582
+ .light-blue-text.text-lighten-5 {
583
+ color: #e1f5fe !important; }
584
+
585
+ .light-blue.lighten-4 {
586
+ background-color: #b3e5fc !important; }
587
+
588
+ .light-blue-text.text-lighten-4 {
589
+ color: #b3e5fc !important; }
590
+
591
+ .light-blue.lighten-3 {
592
+ background-color: #81d4fa !important; }
593
+
594
+ .light-blue-text.text-lighten-3 {
595
+ color: #81d4fa !important; }
596
+
597
+ .light-blue.lighten-2 {
598
+ background-color: #4fc3f7 !important; }
599
+
600
+ .light-blue-text.text-lighten-2 {
601
+ color: #4fc3f7 !important; }
602
+
603
+ .light-blue.lighten-1 {
604
+ background-color: #29b6f6 !important; }
605
+
606
+ .light-blue-text.text-lighten-1 {
607
+ color: #29b6f6 !important; }
608
+
609
+ .light-blue.darken-1 {
610
+ background-color: #039be5 !important; }
611
+
612
+ .light-blue-text.text-darken-1 {
613
+ color: #039be5 !important; }
614
+
615
+ .light-blue.darken-2 {
616
+ background-color: #0288d1 !important; }
617
+
618
+ .light-blue-text.text-darken-2 {
619
+ color: #0288d1 !important; }
620
+
621
+ .light-blue.darken-3 {
622
+ background-color: #0277bd !important; }
623
+
624
+ .light-blue-text.text-darken-3 {
625
+ color: #0277bd !important; }
626
+
627
+ .light-blue.darken-4 {
628
+ background-color: #01579b !important; }
629
+
630
+ .light-blue-text.text-darken-4 {
631
+ color: #01579b !important; }
632
+
633
+ .light-blue.accent-1 {
634
+ background-color: #80d8ff !important; }
635
+
636
+ .light-blue-text.text-accent-1 {
637
+ color: #80d8ff !important; }
638
+
639
+ .light-blue.accent-2 {
640
+ background-color: #40c4ff !important; }
641
+
642
+ .light-blue-text.text-accent-2 {
643
+ color: #40c4ff !important; }
644
+
645
+ .light-blue.accent-3 {
646
+ background-color: #00b0ff !important; }
647
+
648
+ .light-blue-text.text-accent-3 {
649
+ color: #00b0ff !important; }
650
+
651
+ .light-blue.accent-4 {
652
+ background-color: #0091ea !important; }
653
+
654
+ .light-blue-text.text-accent-4 {
655
+ color: #0091ea !important; }
656
+
657
+ .cyan {
658
+ background-color: #00bcd4 !important; }
659
+
660
+ .cyan-text {
661
+ color: #00bcd4 !important; }
662
+
663
+ .cyan.lighten-5 {
664
+ background-color: #e0f7fa !important; }
665
+
666
+ .cyan-text.text-lighten-5 {
667
+ color: #e0f7fa !important; }
668
+
669
+ .cyan.lighten-4 {
670
+ background-color: #b2ebf2 !important; }
671
+
672
+ .cyan-text.text-lighten-4 {
673
+ color: #b2ebf2 !important; }
674
+
675
+ .cyan.lighten-3 {
676
+ background-color: #80deea !important; }
677
+
678
+ .cyan-text.text-lighten-3 {
679
+ color: #80deea !important; }
680
+
681
+ .cyan.lighten-2 {
682
+ background-color: #4dd0e1 !important; }
683
+
684
+ .cyan-text.text-lighten-2 {
685
+ color: #4dd0e1 !important; }
686
+
687
+ .cyan.lighten-1 {
688
+ background-color: #26c6da !important; }
689
+
690
+ .cyan-text.text-lighten-1 {
691
+ color: #26c6da !important; }
692
+
693
+ .cyan.darken-1 {
694
+ background-color: #00acc1 !important; }
695
+
696
+ .cyan-text.text-darken-1 {
697
+ color: #00acc1 !important; }
698
+
699
+ .cyan.darken-2 {
700
+ background-color: #0097a7 !important; }
701
+
702
+ .cyan-text.text-darken-2 {
703
+ color: #0097a7 !important; }
704
+
705
+ .cyan.darken-3 {
706
+ background-color: #00838f !important; }
707
+
708
+ .cyan-text.text-darken-3 {
709
+ color: #00838f !important; }
710
+
711
+ .cyan.darken-4 {
712
+ background-color: #006064 !important; }
713
+
714
+ .cyan-text.text-darken-4 {
715
+ color: #006064 !important; }
716
+
717
+ .cyan.accent-1 {
718
+ background-color: #84ffff !important; }
719
+
720
+ .cyan-text.text-accent-1 {
721
+ color: #84ffff !important; }
722
+
723
+ .cyan.accent-2 {
724
+ background-color: #18ffff !important; }
725
+
726
+ .cyan-text.text-accent-2 {
727
+ color: #18ffff !important; }
728
+
729
+ .cyan.accent-3 {
730
+ background-color: #00e5ff !important; }
731
+
732
+ .cyan-text.text-accent-3 {
733
+ color: #00e5ff !important; }
734
+
735
+ .cyan.accent-4 {
736
+ background-color: #00b8d4 !important; }
737
+
738
+ .cyan-text.text-accent-4 {
739
+ color: #00b8d4 !important; }
740
+
741
+ .teal {
742
+ background-color: #009688 !important; }
743
+
744
+ .teal-text {
745
+ color: #009688 !important; }
746
+
747
+ .teal.lighten-5 {
748
+ background-color: #e0f2f1 !important; }
749
+
750
+ .teal-text.text-lighten-5 {
751
+ color: #e0f2f1 !important; }
752
+
753
+ .teal.lighten-4 {
754
+ background-color: #b2dfdb !important; }
755
+
756
+ .teal-text.text-lighten-4 {
757
+ color: #b2dfdb !important; }
758
+
759
+ .teal.lighten-3 {
760
+ background-color: #80cbc4 !important; }
761
+
762
+ .teal-text.text-lighten-3 {
763
+ color: #80cbc4 !important; }
764
+
765
+ .teal.lighten-2 {
766
+ background-color: #4db6ac !important; }
767
+
768
+ .teal-text.text-lighten-2 {
769
+ color: #4db6ac !important; }
770
+
771
+ .teal.lighten-1 {
772
+ background-color: #26a69a !important; }
773
+
774
+ .teal-text.text-lighten-1 {
775
+ color: #26a69a !important; }
776
+
777
+ .teal.darken-1 {
778
+ background-color: #00897b !important; }
779
+
780
+ .teal-text.text-darken-1 {
781
+ color: #00897b !important; }
782
+
783
+ .teal.darken-2 {
784
+ background-color: #00796b !important; }
785
+
786
+ .teal-text.text-darken-2 {
787
+ color: #00796b !important; }
788
+
789
+ .teal.darken-3 {
790
+ background-color: #00695c !important; }
791
+
792
+ .teal-text.text-darken-3 {
793
+ color: #00695c !important; }
794
+
795
+ .teal.darken-4 {
796
+ background-color: #004d40 !important; }
797
+
798
+ .teal-text.text-darken-4 {
799
+ color: #004d40 !important; }
800
+
801
+ .teal.accent-1 {
802
+ background-color: #a7ffeb !important; }
803
+
804
+ .teal-text.text-accent-1 {
805
+ color: #a7ffeb !important; }
806
+
807
+ .teal.accent-2 {
808
+ background-color: #64ffda !important; }
809
+
810
+ .teal-text.text-accent-2 {
811
+ color: #64ffda !important; }
812
+
813
+ .teal.accent-3 {
814
+ background-color: #1de9b6 !important; }
815
+
816
+ .teal-text.text-accent-3 {
817
+ color: #1de9b6 !important; }
818
+
819
+ .teal.accent-4 {
820
+ background-color: #00bfa5 !important; }
821
+
822
+ .teal-text.text-accent-4 {
823
+ color: #00bfa5 !important; }
824
+
825
+ .green {
826
+ background-color: #4CAF50 !important; }
827
+
828
+ .green-text {
829
+ color: #4CAF50 !important; }
830
+
831
+ .green.lighten-5 {
832
+ background-color: #E8F5E9 !important; }
833
+
834
+ .green-text.text-lighten-5 {
835
+ color: #E8F5E9 !important; }
836
+
837
+ .green.lighten-4 {
838
+ background-color: #C8E6C9 !important; }
839
+
840
+ .green-text.text-lighten-4 {
841
+ color: #C8E6C9 !important; }
842
+
843
+ .green.lighten-3 {
844
+ background-color: #A5D6A7 !important; }
845
+
846
+ .green-text.text-lighten-3 {
847
+ color: #A5D6A7 !important; }
848
+
849
+ .green.lighten-2 {
850
+ background-color: #81C784 !important; }
851
+
852
+ .green-text.text-lighten-2 {
853
+ color: #81C784 !important; }
854
+
855
+ .green.lighten-1 {
856
+ background-color: #66BB6A !important; }
857
+
858
+ .green-text.text-lighten-1 {
859
+ color: #66BB6A !important; }
860
+
861
+ .green.darken-1 {
862
+ background-color: #43A047 !important; }
863
+
864
+ .green-text.text-darken-1 {
865
+ color: #43A047 !important; }
866
+
867
+ .green.darken-2 {
868
+ background-color: #388E3C !important; }
869
+
870
+ .green-text.text-darken-2 {
871
+ color: #388E3C !important; }
872
+
873
+ .green.darken-3 {
874
+ background-color: #2E7D32 !important; }
875
+
876
+ .green-text.text-darken-3 {
877
+ color: #2E7D32 !important; }
878
+
879
+ .green.darken-4 {
880
+ background-color: #1B5E20 !important; }
881
+
882
+ .green-text.text-darken-4 {
883
+ color: #1B5E20 !important; }
884
+
885
+ .green.accent-1 {
886
+ background-color: #B9F6CA !important; }
887
+
888
+ .green-text.text-accent-1 {
889
+ color: #B9F6CA !important; }
890
+
891
+ .green.accent-2 {
892
+ background-color: #69F0AE !important; }
893
+
894
+ .green-text.text-accent-2 {
895
+ color: #69F0AE !important; }
896
+
897
+ .green.accent-3 {
898
+ background-color: #00E676 !important; }
899
+
900
+ .green-text.text-accent-3 {
901
+ color: #00E676 !important; }
902
+
903
+ .green.accent-4 {
904
+ background-color: #00C853 !important; }
905
+
906
+ .green-text.text-accent-4 {
907
+ color: #00C853 !important; }
908
+
909
+ .light-green {
910
+ background-color: #8bc34a !important; }
911
+
912
+ .light-green-text {
913
+ color: #8bc34a !important; }
914
+
915
+ .light-green.lighten-5 {
916
+ background-color: #f1f8e9 !important; }
917
+
918
+ .light-green-text.text-lighten-5 {
919
+ color: #f1f8e9 !important; }
920
+
921
+ .light-green.lighten-4 {
922
+ background-color: #dcedc8 !important; }
923
+
924
+ .light-green-text.text-lighten-4 {
925
+ color: #dcedc8 !important; }
926
+
927
+ .light-green.lighten-3 {
928
+ background-color: #c5e1a5 !important; }
929
+
930
+ .light-green-text.text-lighten-3 {
931
+ color: #c5e1a5 !important; }
932
+
933
+ .light-green.lighten-2 {
934
+ background-color: #aed581 !important; }
935
+
936
+ .light-green-text.text-lighten-2 {
937
+ color: #aed581 !important; }
938
+
939
+ .light-green.lighten-1 {
940
+ background-color: #9ccc65 !important; }
941
+
942
+ .light-green-text.text-lighten-1 {
943
+ color: #9ccc65 !important; }
944
+
945
+ .light-green.darken-1 {
946
+ background-color: #7cb342 !important; }
947
+
948
+ .light-green-text.text-darken-1 {
949
+ color: #7cb342 !important; }
950
+
951
+ .light-green.darken-2 {
952
+ background-color: #689f38 !important; }
953
+
954
+ .light-green-text.text-darken-2 {
955
+ color: #689f38 !important; }
956
+
957
+ .light-green.darken-3 {
958
+ background-color: #558b2f !important; }
959
+
960
+ .light-green-text.text-darken-3 {
961
+ color: #558b2f !important; }
962
+
963
+ .light-green.darken-4 {
964
+ background-color: #33691e !important; }
965
+
966
+ .light-green-text.text-darken-4 {
967
+ color: #33691e !important; }
968
+
969
+ .light-green.accent-1 {
970
+ background-color: #ccff90 !important; }
971
+
972
+ .light-green-text.text-accent-1 {
973
+ color: #ccff90 !important; }
974
+
975
+ .light-green.accent-2 {
976
+ background-color: #b2ff59 !important; }
977
+
978
+ .light-green-text.text-accent-2 {
979
+ color: #b2ff59 !important; }
980
+
981
+ .light-green.accent-3 {
982
+ background-color: #76ff03 !important; }
983
+
984
+ .light-green-text.text-accent-3 {
985
+ color: #76ff03 !important; }
986
+
987
+ .light-green.accent-4 {
988
+ background-color: #64dd17 !important; }
989
+
990
+ .light-green-text.text-accent-4 {
991
+ color: #64dd17 !important; }
992
+
993
+ .lime {
994
+ background-color: #cddc39 !important; }
995
+
996
+ .lime-text {
997
+ color: #cddc39 !important; }
998
+
999
+ .lime.lighten-5 {
1000
+ background-color: #f9fbe7 !important; }
1001
+
1002
+ .lime-text.text-lighten-5 {
1003
+ color: #f9fbe7 !important; }
1004
+
1005
+ .lime.lighten-4 {
1006
+ background-color: #f0f4c3 !important; }
1007
+
1008
+ .lime-text.text-lighten-4 {
1009
+ color: #f0f4c3 !important; }
1010
+
1011
+ .lime.lighten-3 {
1012
+ background-color: #e6ee9c !important; }
1013
+
1014
+ .lime-text.text-lighten-3 {
1015
+ color: #e6ee9c !important; }
1016
+
1017
+ .lime.lighten-2 {
1018
+ background-color: #dce775 !important; }
1019
+
1020
+ .lime-text.text-lighten-2 {
1021
+ color: #dce775 !important; }
1022
+
1023
+ .lime.lighten-1 {
1024
+ background-color: #d4e157 !important; }
1025
+
1026
+ .lime-text.text-lighten-1 {
1027
+ color: #d4e157 !important; }
1028
+
1029
+ .lime.darken-1 {
1030
+ background-color: #c0ca33 !important; }
1031
+
1032
+ .lime-text.text-darken-1 {
1033
+ color: #c0ca33 !important; }
1034
+
1035
+ .lime.darken-2 {
1036
+ background-color: #afb42b !important; }
1037
+
1038
+ .lime-text.text-darken-2 {
1039
+ color: #afb42b !important; }
1040
+
1041
+ .lime.darken-3 {
1042
+ background-color: #9e9d24 !important; }
1043
+
1044
+ .lime-text.text-darken-3 {
1045
+ color: #9e9d24 !important; }
1046
+
1047
+ .lime.darken-4 {
1048
+ background-color: #827717 !important; }
1049
+
1050
+ .lime-text.text-darken-4 {
1051
+ color: #827717 !important; }
1052
+
1053
+ .lime.accent-1 {
1054
+ background-color: #f4ff81 !important; }
1055
+
1056
+ .lime-text.text-accent-1 {
1057
+ color: #f4ff81 !important; }
1058
+
1059
+ .lime.accent-2 {
1060
+ background-color: #eeff41 !important; }
1061
+
1062
+ .lime-text.text-accent-2 {
1063
+ color: #eeff41 !important; }
1064
+
1065
+ .lime.accent-3 {
1066
+ background-color: #c6ff00 !important; }
1067
+
1068
+ .lime-text.text-accent-3 {
1069
+ color: #c6ff00 !important; }
1070
+
1071
+ .lime.accent-4 {
1072
+ background-color: #aeea00 !important; }
1073
+
1074
+ .lime-text.text-accent-4 {
1075
+ color: #aeea00 !important; }
1076
+
1077
+ .yellow {
1078
+ background-color: #ffeb3b !important; }
1079
+
1080
+ .yellow-text {
1081
+ color: #ffeb3b !important; }
1082
+
1083
+ .yellow.lighten-5 {
1084
+ background-color: #fffde7 !important; }
1085
+
1086
+ .yellow-text.text-lighten-5 {
1087
+ color: #fffde7 !important; }
1088
+
1089
+ .yellow.lighten-4 {
1090
+ background-color: #fff9c4 !important; }
1091
+
1092
+ .yellow-text.text-lighten-4 {
1093
+ color: #fff9c4 !important; }
1094
+
1095
+ .yellow.lighten-3 {
1096
+ background-color: #fff59d !important; }
1097
+
1098
+ .yellow-text.text-lighten-3 {
1099
+ color: #fff59d !important; }
1100
+
1101
+ .yellow.lighten-2 {
1102
+ background-color: #fff176 !important; }
1103
+
1104
+ .yellow-text.text-lighten-2 {
1105
+ color: #fff176 !important; }
1106
+
1107
+ .yellow.lighten-1 {
1108
+ background-color: #ffee58 !important; }
1109
+
1110
+ .yellow-text.text-lighten-1 {
1111
+ color: #ffee58 !important; }
1112
+
1113
+ .yellow.darken-1 {
1114
+ background-color: #fdd835 !important; }
1115
+
1116
+ .yellow-text.text-darken-1 {
1117
+ color: #fdd835 !important; }
1118
+
1119
+ .yellow.darken-2 {
1120
+ background-color: #fbc02d !important; }
1121
+
1122
+ .yellow-text.text-darken-2 {
1123
+ color: #fbc02d !important; }
1124
+
1125
+ .yellow.darken-3 {
1126
+ background-color: #f9a825 !important; }
1127
+
1128
+ .yellow-text.text-darken-3 {
1129
+ color: #f9a825 !important; }
1130
+
1131
+ .yellow.darken-4 {
1132
+ background-color: #f57f17 !important; }
1133
+
1134
+ .yellow-text.text-darken-4 {
1135
+ color: #f57f17 !important; }
1136
+
1137
+ .yellow.accent-1 {
1138
+ background-color: #ffff8d !important; }
1139
+
1140
+ .yellow-text.text-accent-1 {
1141
+ color: #ffff8d !important; }
1142
+
1143
+ .yellow.accent-2 {
1144
+ background-color: #ffff00 !important; }
1145
+
1146
+ .yellow-text.text-accent-2 {
1147
+ color: #ffff00 !important; }
1148
+
1149
+ .yellow.accent-3 {
1150
+ background-color: #ffea00 !important; }
1151
+
1152
+ .yellow-text.text-accent-3 {
1153
+ color: #ffea00 !important; }
1154
+
1155
+ .yellow.accent-4 {
1156
+ background-color: #ffd600 !important; }
1157
+
1158
+ .yellow-text.text-accent-4 {
1159
+ color: #ffd600 !important; }
1160
+
1161
+ .amber {
1162
+ background-color: #ffc107 !important; }
1163
+
1164
+ .amber-text {
1165
+ color: #ffc107 !important; }
1166
+
1167
+ .amber.lighten-5 {
1168
+ background-color: #fff8e1 !important; }
1169
+
1170
+ .amber-text.text-lighten-5 {
1171
+ color: #fff8e1 !important; }
1172
+
1173
+ .amber.lighten-4 {
1174
+ background-color: #ffecb3 !important; }
1175
+
1176
+ .amber-text.text-lighten-4 {
1177
+ color: #ffecb3 !important; }
1178
+
1179
+ .amber.lighten-3 {
1180
+ background-color: #ffe082 !important; }
1181
+
1182
+ .amber-text.text-lighten-3 {
1183
+ color: #ffe082 !important; }
1184
+
1185
+ .amber.lighten-2 {
1186
+ background-color: #ffd54f !important; }
1187
+
1188
+ .amber-text.text-lighten-2 {
1189
+ color: #ffd54f !important; }
1190
+
1191
+ .amber.lighten-1 {
1192
+ background-color: #ffca28 !important; }
1193
+
1194
+ .amber-text.text-lighten-1 {
1195
+ color: #ffca28 !important; }
1196
+
1197
+ .amber.darken-1 {
1198
+ background-color: #ffb300 !important; }
1199
+
1200
+ .amber-text.text-darken-1 {
1201
+ color: #ffb300 !important; }
1202
+
1203
+ .amber.darken-2 {
1204
+ background-color: #ffa000 !important; }
1205
+
1206
+ .amber-text.text-darken-2 {
1207
+ color: #ffa000 !important; }
1208
+
1209
+ .amber.darken-3 {
1210
+ background-color: #ff8f00 !important; }
1211
+
1212
+ .amber-text.text-darken-3 {
1213
+ color: #ff8f00 !important; }
1214
+
1215
+ .amber.darken-4 {
1216
+ background-color: #ff6f00 !important; }
1217
+
1218
+ .amber-text.text-darken-4 {
1219
+ color: #ff6f00 !important; }
1220
+
1221
+ .amber.accent-1 {
1222
+ background-color: #ffe57f !important; }
1223
+
1224
+ .amber-text.text-accent-1 {
1225
+ color: #ffe57f !important; }
1226
+
1227
+ .amber.accent-2 {
1228
+ background-color: #ffd740 !important; }
1229
+
1230
+ .amber-text.text-accent-2 {
1231
+ color: #ffd740 !important; }
1232
+
1233
+ .amber.accent-3 {
1234
+ background-color: #ffc400 !important; }
1235
+
1236
+ .amber-text.text-accent-3 {
1237
+ color: #ffc400 !important; }
1238
+
1239
+ .amber.accent-4 {
1240
+ background-color: #ffab00 !important; }
1241
+
1242
+ .amber-text.text-accent-4 {
1243
+ color: #ffab00 !important; }
1244
+
1245
+ .orange {
1246
+ background-color: #ff9800 !important; }
1247
+
1248
+ .orange-text {
1249
+ color: #ff9800 !important; }
1250
+
1251
+ .orange.lighten-5 {
1252
+ background-color: #fff3e0 !important; }
1253
+
1254
+ .orange-text.text-lighten-5 {
1255
+ color: #fff3e0 !important; }
1256
+
1257
+ .orange.lighten-4 {
1258
+ background-color: #ffe0b2 !important; }
1259
+
1260
+ .orange-text.text-lighten-4 {
1261
+ color: #ffe0b2 !important; }
1262
+
1263
+ .orange.lighten-3 {
1264
+ background-color: #ffcc80 !important; }
1265
+
1266
+ .orange-text.text-lighten-3 {
1267
+ color: #ffcc80 !important; }
1268
+
1269
+ .orange.lighten-2 {
1270
+ background-color: #ffb74d !important; }
1271
+
1272
+ .orange-text.text-lighten-2 {
1273
+ color: #ffb74d !important; }
1274
+
1275
+ .orange.lighten-1 {
1276
+ background-color: #ffa726 !important; }
1277
+
1278
+ .orange-text.text-lighten-1 {
1279
+ color: #ffa726 !important; }
1280
+
1281
+ .orange.darken-1 {
1282
+ background-color: #fb8c00 !important; }
1283
+
1284
+ .orange-text.text-darken-1 {
1285
+ color: #fb8c00 !important; }
1286
+
1287
+ .orange.darken-2 {
1288
+ background-color: #f57c00 !important; }
1289
+
1290
+ .orange-text.text-darken-2 {
1291
+ color: #f57c00 !important; }
1292
+
1293
+ .orange.darken-3 {
1294
+ background-color: #ef6c00 !important; }
1295
+
1296
+ .orange-text.text-darken-3 {
1297
+ color: #ef6c00 !important; }
1298
+
1299
+ .orange.darken-4 {
1300
+ background-color: #e65100 !important; }
1301
+
1302
+ .orange-text.text-darken-4 {
1303
+ color: #e65100 !important; }
1304
+
1305
+ .orange.accent-1 {
1306
+ background-color: #ffd180 !important; }
1307
+
1308
+ .orange-text.text-accent-1 {
1309
+ color: #ffd180 !important; }
1310
+
1311
+ .orange.accent-2 {
1312
+ background-color: #ffab40 !important; }
1313
+
1314
+ .orange-text.text-accent-2 {
1315
+ color: #ffab40 !important; }
1316
+
1317
+ .orange.accent-3 {
1318
+ background-color: #ff9100 !important; }
1319
+
1320
+ .orange-text.text-accent-3 {
1321
+ color: #ff9100 !important; }
1322
+
1323
+ .orange.accent-4 {
1324
+ background-color: #ff6d00 !important; }
1325
+
1326
+ .orange-text.text-accent-4 {
1327
+ color: #ff6d00 !important; }
1328
+
1329
+ .deep-orange {
1330
+ background-color: #ff5722 !important; }
1331
+
1332
+ .deep-orange-text {
1333
+ color: #ff5722 !important; }
1334
+
1335
+ .deep-orange.lighten-5 {
1336
+ background-color: #fbe9e7 !important; }
1337
+
1338
+ .deep-orange-text.text-lighten-5 {
1339
+ color: #fbe9e7 !important; }
1340
+
1341
+ .deep-orange.lighten-4 {
1342
+ background-color: #ffccbc !important; }
1343
+
1344
+ .deep-orange-text.text-lighten-4 {
1345
+ color: #ffccbc !important; }
1346
+
1347
+ .deep-orange.lighten-3 {
1348
+ background-color: #ffab91 !important; }
1349
+
1350
+ .deep-orange-text.text-lighten-3 {
1351
+ color: #ffab91 !important; }
1352
+
1353
+ .deep-orange.lighten-2 {
1354
+ background-color: #ff8a65 !important; }
1355
+
1356
+ .deep-orange-text.text-lighten-2 {
1357
+ color: #ff8a65 !important; }
1358
+
1359
+ .deep-orange.lighten-1 {
1360
+ background-color: #ff7043 !important; }
1361
+
1362
+ .deep-orange-text.text-lighten-1 {
1363
+ color: #ff7043 !important; }
1364
+
1365
+ .deep-orange.darken-1 {
1366
+ background-color: #f4511e !important; }
1367
+
1368
+ .deep-orange-text.text-darken-1 {
1369
+ color: #f4511e !important; }
1370
+
1371
+ .deep-orange.darken-2 {
1372
+ background-color: #e64a19 !important; }
1373
+
1374
+ .deep-orange-text.text-darken-2 {
1375
+ color: #e64a19 !important; }
1376
+
1377
+ .deep-orange.darken-3 {
1378
+ background-color: #d84315 !important; }
1379
+
1380
+ .deep-orange-text.text-darken-3 {
1381
+ color: #d84315 !important; }
1382
+
1383
+ .deep-orange.darken-4 {
1384
+ background-color: #bf360c !important; }
1385
+
1386
+ .deep-orange-text.text-darken-4 {
1387
+ color: #bf360c !important; }
1388
+
1389
+ .deep-orange.accent-1 {
1390
+ background-color: #ff9e80 !important; }
1391
+
1392
+ .deep-orange-text.text-accent-1 {
1393
+ color: #ff9e80 !important; }
1394
+
1395
+ .deep-orange.accent-2 {
1396
+ background-color: #ff6e40 !important; }
1397
+
1398
+ .deep-orange-text.text-accent-2 {
1399
+ color: #ff6e40 !important; }
1400
+
1401
+ .deep-orange.accent-3 {
1402
+ background-color: #ff3d00 !important; }
1403
+
1404
+ .deep-orange-text.text-accent-3 {
1405
+ color: #ff3d00 !important; }
1406
+
1407
+ .deep-orange.accent-4 {
1408
+ background-color: #dd2c00 !important; }
1409
+
1410
+ .deep-orange-text.text-accent-4 {
1411
+ color: #dd2c00 !important; }
1412
+
1413
+ .brown {
1414
+ background-color: #795548 !important; }
1415
+
1416
+ .brown-text {
1417
+ color: #795548 !important; }
1418
+
1419
+ .brown.lighten-5 {
1420
+ background-color: #efebe9 !important; }
1421
+
1422
+ .brown-text.text-lighten-5 {
1423
+ color: #efebe9 !important; }
1424
+
1425
+ .brown.lighten-4 {
1426
+ background-color: #d7ccc8 !important; }
1427
+
1428
+ .brown-text.text-lighten-4 {
1429
+ color: #d7ccc8 !important; }
1430
+
1431
+ .brown.lighten-3 {
1432
+ background-color: #bcaaa4 !important; }
1433
+
1434
+ .brown-text.text-lighten-3 {
1435
+ color: #bcaaa4 !important; }
1436
+
1437
+ .brown.lighten-2 {
1438
+ background-color: #a1887f !important; }
1439
+
1440
+ .brown-text.text-lighten-2 {
1441
+ color: #a1887f !important; }
1442
+
1443
+ .brown.lighten-1 {
1444
+ background-color: #8d6e63 !important; }
1445
+
1446
+ .brown-text.text-lighten-1 {
1447
+ color: #8d6e63 !important; }
1448
+
1449
+ .brown.darken-1 {
1450
+ background-color: #6d4c41 !important; }
1451
+
1452
+ .brown-text.text-darken-1 {
1453
+ color: #6d4c41 !important; }
1454
+
1455
+ .brown.darken-2 {
1456
+ background-color: #5d4037 !important; }
1457
+
1458
+ .brown-text.text-darken-2 {
1459
+ color: #5d4037 !important; }
1460
+
1461
+ .brown.darken-3 {
1462
+ background-color: #4e342e !important; }
1463
+
1464
+ .brown-text.text-darken-3 {
1465
+ color: #4e342e !important; }
1466
+
1467
+ .brown.darken-4 {
1468
+ background-color: #3e2723 !important; }
1469
+
1470
+ .brown-text.text-darken-4 {
1471
+ color: #3e2723 !important; }
1472
+
1473
+ .blue-grey {
1474
+ background-color: #607d8b !important; }
1475
+
1476
+ .blue-grey-text {
1477
+ color: #607d8b !important; }
1478
+
1479
+ .blue-grey.lighten-5 {
1480
+ background-color: #eceff1 !important; }
1481
+
1482
+ .blue-grey-text.text-lighten-5 {
1483
+ color: #eceff1 !important; }
1484
+
1485
+ .blue-grey.lighten-4 {
1486
+ background-color: #cfd8dc !important; }
1487
+
1488
+ .blue-grey-text.text-lighten-4 {
1489
+ color: #cfd8dc !important; }
1490
+
1491
+ .blue-grey.lighten-3 {
1492
+ background-color: #b0bec5 !important; }
1493
+
1494
+ .blue-grey-text.text-lighten-3 {
1495
+ color: #b0bec5 !important; }
1496
+
1497
+ .blue-grey.lighten-2 {
1498
+ background-color: #90a4ae !important; }
1499
+
1500
+ .blue-grey-text.text-lighten-2 {
1501
+ color: #90a4ae !important; }
1502
+
1503
+ .blue-grey.lighten-1 {
1504
+ background-color: #78909c !important; }
1505
+
1506
+ .blue-grey-text.text-lighten-1 {
1507
+ color: #78909c !important; }
1508
+
1509
+ .blue-grey.darken-1 {
1510
+ background-color: #546e7a !important; }
1511
+
1512
+ .blue-grey-text.text-darken-1 {
1513
+ color: #546e7a !important; }
1514
+
1515
+ .blue-grey.darken-2 {
1516
+ background-color: #455a64 !important; }
1517
+
1518
+ .blue-grey-text.text-darken-2 {
1519
+ color: #455a64 !important; }
1520
+
1521
+ .blue-grey.darken-3 {
1522
+ background-color: #37474f !important; }
1523
+
1524
+ .blue-grey-text.text-darken-3 {
1525
+ color: #37474f !important; }
1526
+
1527
+ .blue-grey.darken-4 {
1528
+ background-color: #263238 !important; }
1529
+
1530
+ .blue-grey-text.text-darken-4 {
1531
+ color: #263238 !important; }
1532
+
1533
+ .grey {
1534
+ background-color: #9e9e9e !important; }
1535
+
1536
+ .grey-text {
1537
+ color: #9e9e9e !important; }
1538
+
1539
+ .grey.lighten-5 {
1540
+ background-color: #fafafa !important; }
1541
+
1542
+ .grey-text.text-lighten-5 {
1543
+ color: #fafafa !important; }
1544
+
1545
+ .grey.lighten-4 {
1546
+ background-color: #f5f5f5 !important; }
1547
+
1548
+ .grey-text.text-lighten-4 {
1549
+ color: #f5f5f5 !important; }
1550
+
1551
+ .grey.lighten-3 {
1552
+ background-color: #eeeeee !important; }
1553
+
1554
+ .grey-text.text-lighten-3 {
1555
+ color: #eeeeee !important; }
1556
+
1557
+ .grey.lighten-2 {
1558
+ background-color: #e0e0e0 !important; }
1559
+
1560
+ .grey-text.text-lighten-2 {
1561
+ color: #e0e0e0 !important; }
1562
+
1563
+ .grey.lighten-1 {
1564
+ background-color: #bdbdbd !important; }
1565
+
1566
+ .grey-text.text-lighten-1 {
1567
+ color: #bdbdbd !important; }
1568
+
1569
+ .grey.darken-1 {
1570
+ background-color: #757575 !important; }
1571
+
1572
+ .grey-text.text-darken-1 {
1573
+ color: #757575 !important; }
1574
+
1575
+ .grey.darken-2 {
1576
+ background-color: #616161 !important; }
1577
+
1578
+ .grey-text.text-darken-2 {
1579
+ color: #616161 !important; }
1580
+
1581
+ .grey.darken-3 {
1582
+ background-color: #424242 !important; }
1583
+
1584
+ .grey-text.text-darken-3 {
1585
+ color: #424242 !important; }
1586
+
1587
+ .grey.darken-4 {
1588
+ background-color: #212121 !important; }
1589
+
1590
+ .grey-text.text-darken-4 {
1591
+ color: #212121 !important; }
1592
+
1593
+ .black {
1594
+ background-color: #000000 !important; }
1595
+
1596
+ .black-text {
1597
+ color: #000000 !important; }
1598
+
1599
+ .white {
1600
+ background-color: #FFFFFF !important; }
1601
+
1602
+ .white-text {
1603
+ color: #FFFFFF !important; }
1604
+
1605
+ .transparent {
1606
+ background-color: transparent !important; }
1607
+
1608
+ .transparent-text {
1609
+ color: transparent !important; }
1610
+
1611
+ /*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */
1612
+ /**
1613
+ * 1. Set default font family to sans-serif.
1614
+ * 2. Prevent iOS and IE text size adjust after device orientation change,
1615
+ * without disabling user zoom.
1616
+ */
1617
+ html {
1618
+ font-family: sans-serif;
1619
+ /* 1 */
1620
+ -ms-text-size-adjust: 100%;
1621
+ /* 2 */
1622
+ -webkit-text-size-adjust: 100%;
1623
+ /* 2 */ }
1624
+
1625
+ /**
1626
+ * Remove default margin.
1627
+ */
1628
+ body {
1629
+ margin: 0; }
1630
+
1631
+ /* HTML5 display definitions
1632
+ ========================================================================== */
1633
+ /**
1634
+ * Correct `block` display not defined for any HTML5 element in IE 8/9.
1635
+ * Correct `block` display not defined for `details` or `summary` in IE 10/11
1636
+ * and Firefox.
1637
+ * Correct `block` display not defined for `main` in IE 11.
1638
+ */
1639
+ article,
1640
+ aside,
1641
+ details,
1642
+ figcaption,
1643
+ figure,
1644
+ footer,
1645
+ header,
1646
+ hgroup,
1647
+ main,
1648
+ menu,
1649
+ nav,
1650
+ section,
1651
+ summary {
1652
+ display: block; }
1653
+
1654
+ /**
1655
+ * 1. Correct `inline-block` display not defined in IE 8/9.
1656
+ * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.
1657
+ */
1658
+ audio,
1659
+ canvas,
1660
+ progress,
1661
+ video {
1662
+ display: inline-block;
1663
+ /* 1 */
1664
+ vertical-align: baseline;
1665
+ /* 2 */ }
1666
+
1667
+ /**
1668
+ * Prevent modern browsers from displaying `audio` without controls.
1669
+ * Remove excess height in iOS 5 devices.
1670
+ */
1671
+ audio:not([controls]) {
1672
+ display: none;
1673
+ height: 0; }
1674
+
1675
+ /**
1676
+ * Address `[hidden]` styling not present in IE 8/9/10.
1677
+ * Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22.
1678
+ */
1679
+ [hidden],
1680
+ template {
1681
+ display: none; }
1682
+
1683
+ /* Links
1684
+ ========================================================================== */
1685
+ /**
1686
+ * Remove the gray background color from active links in IE 10.
1687
+ */
1688
+ a {
1689
+ background-color: transparent; }
1690
+
1691
+ /**
1692
+ * Improve readability of focused elements when they are also in an
1693
+ * active/hover state.
1694
+ */
1695
+ a:active,
1696
+ a:hover {
1697
+ outline: 0; }
1698
+
1699
+ /* Text-level semantics
1700
+ ========================================================================== */
1701
+ /**
1702
+ * Address styling not present in IE 8/9/10/11, Safari, and Chrome.
1703
+ */
1704
+ abbr[title] {
1705
+ border-bottom: 1px dotted; }
1706
+
1707
+ /**
1708
+ * Address style set to `bolder` in Firefox 4+, Safari, and Chrome.
1709
+ */
1710
+ b,
1711
+ strong {
1712
+ font-weight: bold; }
1713
+
1714
+ /**
1715
+ * Address styling not present in Safari and Chrome.
1716
+ */
1717
+ dfn {
1718
+ font-style: italic; }
1719
+
1720
+ /**
1721
+ * Address variable `h1` font-size and margin within `section` and `article`
1722
+ * contexts in Firefox 4+, Safari, and Chrome.
1723
+ */
1724
+ h1 {
1725
+ font-size: 2em;
1726
+ margin: 0.67em 0; }
1727
+
1728
+ /**
1729
+ * Address styling not present in IE 8/9.
1730
+ */
1731
+ mark {
1732
+ background: #ff0;
1733
+ color: #000; }
1734
+
1735
+ /**
1736
+ * Address inconsistent and variable font size in all browsers.
1737
+ */
1738
+ small {
1739
+ font-size: 80%; }
1740
+
1741
+ /**
1742
+ * Prevent `sub` and `sup` affecting `line-height` in all browsers.
1743
+ */
1744
+ sub,
1745
+ sup {
1746
+ font-size: 75%;
1747
+ line-height: 0;
1748
+ position: relative;
1749
+ vertical-align: baseline; }
1750
+
1751
+ sup {
1752
+ top: -0.5em; }
1753
+
1754
+ sub {
1755
+ bottom: -0.25em; }
1756
+
1757
+ /* Embedded content
1758
+ ========================================================================== */
1759
+ /**
1760
+ * Remove border when inside `a` element in IE 8/9/10.
1761
+ */
1762
+ img {
1763
+ border: 0; }
1764
+
1765
+ /**
1766
+ * Correct overflow not hidden in IE 9/10/11.
1767
+ */
1768
+ svg:not(:root) {
1769
+ overflow: hidden; }
1770
+
1771
+ /* Grouping content
1772
+ ========================================================================== */
1773
+ /**
1774
+ * Address margin not present in IE 8/9 and Safari.
1775
+ */
1776
+ figure {
1777
+ margin: 1em 40px; }
1778
+
1779
+ /**
1780
+ * Address differences between Firefox and other browsers.
1781
+ */
1782
+ hr {
1783
+ box-sizing: content-box;
1784
+ height: 0; }
1785
+
1786
+ /**
1787
+ * Contain overflow in all browsers.
1788
+ */
1789
+ pre {
1790
+ overflow: auto; }
1791
+
1792
+ /**
1793
+ * Address odd `em`-unit font size rendering in all browsers.
1794
+ */
1795
+ code,
1796
+ kbd,
1797
+ pre,
1798
+ samp {
1799
+ font-family: monospace, monospace;
1800
+ font-size: 1em; }
1801
+
1802
+ /* Forms
1803
+ ========================================================================== */
1804
+ /**
1805
+ * Known limitation: by default, Chrome and Safari on OS X allow very limited
1806
+ * styling of `select`, unless a `border` property is set.
1807
+ */
1808
+ /**
1809
+ * 1. Correct color not being inherited.
1810
+ * Known issue: affects color of disabled elements.
1811
+ * 2. Correct font properties not being inherited.
1812
+ * 3. Address margins set differently in Firefox 4+, Safari, and Chrome.
1813
+ */
1814
+ button,
1815
+ input,
1816
+ optgroup,
1817
+ select,
1818
+ textarea {
1819
+ color: inherit;
1820
+ /* 1 */
1821
+ font: inherit;
1822
+ /* 2 */
1823
+ margin: 0;
1824
+ /* 3 */ }
1825
+
1826
+ /**
1827
+ * Address `overflow` set to `hidden` in IE 8/9/10/11.
1828
+ */
1829
+ button {
1830
+ overflow: visible; }
1831
+
1832
+ /**
1833
+ * Address inconsistent `text-transform` inheritance for `button` and `select`.
1834
+ * All other form control elements do not inherit `text-transform` values.
1835
+ * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.
1836
+ * Correct `select` style inheritance in Firefox.
1837
+ */
1838
+ button,
1839
+ select {
1840
+ text-transform: none; }
1841
+
1842
+ /**
1843
+ * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
1844
+ * and `video` controls.
1845
+ * 2. Correct inability to style clickable `input` types in iOS.
1846
+ * 3. Improve usability and consistency of cursor style between image-type
1847
+ * `input` and others.
1848
+ */
1849
+ button,
1850
+ html input[type="button"],
1851
+ input[type="reset"],
1852
+ input[type="submit"] {
1853
+ -webkit-appearance: button;
1854
+ /* 2 */
1855
+ cursor: pointer;
1856
+ /* 3 */ }
1857
+
1858
+ /**
1859
+ * Re-set default cursor for disabled elements.
1860
+ */
1861
+ button[disabled],
1862
+ html input[disabled] {
1863
+ cursor: default; }
1864
+
1865
+ /**
1866
+ * Remove inner padding and border in Firefox 4+.
1867
+ */
1868
+ button::-moz-focus-inner,
1869
+ input::-moz-focus-inner {
1870
+ border: 0;
1871
+ padding: 0; }
1872
+
1873
+ /**
1874
+ * Address Firefox 4+ setting `line-height` on `input` using `!important` in
1875
+ * the UA stylesheet.
1876
+ */
1877
+ input {
1878
+ line-height: normal; }
1879
+
1880
+ /**
1881
+ * It's recommended that you don't attempt to style these elements.
1882
+ * Firefox's implementation doesn't respect box-sizing, padding, or width.
1883
+ *
1884
+ * 1. Address box sizing set to `content-box` in IE 8/9/10.
1885
+ * 2. Remove excess padding in IE 8/9/10.
1886
+ */
1887
+ input[type="checkbox"],
1888
+ input[type="radio"] {
1889
+ box-sizing: border-box;
1890
+ /* 1 */
1891
+ padding: 0;
1892
+ /* 2 */ }
1893
+
1894
+ /**
1895
+ * Fix the cursor style for Chrome's increment/decrement buttons. For certain
1896
+ * `font-size` values of the `input`, it causes the cursor style of the
1897
+ * decrement button to change from `default` to `text`.
1898
+ */
1899
+ input[type="number"]::-webkit-inner-spin-button,
1900
+ input[type="number"]::-webkit-outer-spin-button {
1901
+ height: auto; }
1902
+
1903
+ /**
1904
+ * 1. Address `appearance` set to `searchfield` in Safari and Chrome.
1905
+ * 2. Address `box-sizing` set to `border-box` in Safari and Chrome.
1906
+ */
1907
+ input[type="search"] {
1908
+ -webkit-appearance: textfield;
1909
+ /* 1 */
1910
+ box-sizing: content-box;
1911
+ /* 2 */ }
1912
+
1913
+ /**
1914
+ * Remove inner padding and search cancel button in Safari and Chrome on OS X.
1915
+ * Safari (but not Chrome) clips the cancel button when the search input has
1916
+ * padding (and `textfield` appearance).
1917
+ */
1918
+ input[type="search"]::-webkit-search-cancel-button,
1919
+ input[type="search"]::-webkit-search-decoration {
1920
+ -webkit-appearance: none; }
1921
+
1922
+ /**
1923
+ * Define consistent border, margin, and padding.
1924
+ */
1925
+ fieldset {
1926
+ border: 1px solid #c0c0c0;
1927
+ margin: 0 2px;
1928
+ padding: 0.35em 0.625em 0.75em; }
1929
+
1930
+ /**
1931
+ * 1. Correct `color` not being inherited in IE 8/9/10/11.
1932
+ * 2. Remove padding so people aren't caught out if they zero out fieldsets.
1933
+ */
1934
+ legend {
1935
+ border: 0;
1936
+ /* 1 */
1937
+ padding: 0;
1938
+ /* 2 */ }
1939
+
1940
+ /**
1941
+ * Remove default vertical scrollbar in IE 8/9/10/11.
1942
+ */
1943
+ textarea {
1944
+ overflow: auto; }
1945
+
1946
+ /**
1947
+ * Don't inherit the `font-weight` (applied by a rule above).
1948
+ * NOTE: the default cannot safely be changed in Chrome and Safari on OS X.
1949
+ */
1950
+ optgroup {
1951
+ font-weight: bold; }
1952
+
1953
+ /* Tables
1954
+ ========================================================================== */
1955
+ /**
1956
+ * Remove most spacing between table cells.
1957
+ */
1958
+ table {
1959
+ border-collapse: collapse;
1960
+ border-spacing: 0; }
1961
+
1962
+ td,
1963
+ th {
1964
+ padding: 0; }
1965
+
1966
+ html {
1967
+ box-sizing: border-box; }
1968
+
1969
+ *, *:before, *:after {
1970
+ box-sizing: inherit; }
1971
+
1972
+ ul:not(.browser-default) {
1973
+ padding-left: 0;
1974
+ list-style-type: none; }
1975
+ ul:not(.browser-default) > li {
1976
+ list-style-type: none; }
1977
+
1978
+ a {
1979
+ color: #039be5;
1980
+ text-decoration: none;
1981
+ -webkit-tap-highlight-color: transparent; }
1982
+
1983
+ .valign-wrapper {
1984
+ display: flex;
1985
+ align-items: center; }
1986
+
1987
+ .clearfix {
1988
+ clear: both; }
1989
+
1990
+ .z-depth-0 {
1991
+ box-shadow: none !important; }
1992
+
1993
+ .z-depth-1, .btn, .btn-large, .btn-floating, .dropdown-content, .collapsible {
1994
+ box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -2px rgba(0, 0, 0, 0.2); }
1995
+
1996
+ .z-depth-1-half, .btn:hover, .btn-large:hover, .btn-floating:hover {
1997
+ box-shadow: 0 3px 3px 0 rgba(0, 0, 0, 0.14), 0 1px 7px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -1px rgba(0, 0, 0, 0.2); }
1998
+
1999
+ .z-depth-2 {
2000
+ box-shadow: 0 4px 5px 0 rgba(0, 0, 0, 0.14), 0 1px 10px 0 rgba(0, 0, 0, 0.12), 0 2px 4px -1px rgba(0, 0, 0, 0.3); }
2001
+
2002
+ .z-depth-3 {
2003
+ box-shadow: 0 6px 10px 0 rgba(0, 0, 0, 0.14), 0 1px 18px 0 rgba(0, 0, 0, 0.12), 0 3px 5px -1px rgba(0, 0, 0, 0.3); }
2004
+
2005
+ .z-depth-4 {
2006
+ box-shadow: 0 8px 10px 1px rgba(0, 0, 0, 0.14), 0 3px 14px 2px rgba(0, 0, 0, 0.12), 0 5px 5px -3px rgba(0, 0, 0, 0.3); }
2007
+
2008
+ .z-depth-5 {
2009
+ box-shadow: 0 16px 24px 2px rgba(0, 0, 0, 0.14), 0 6px 30px 5px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(0, 0, 0, 0.3); }
2010
+
2011
+ .hoverable {
2012
+ transition: box-shadow .25s; }
2013
+ .hoverable:hover {
2014
+ box-shadow: 0 8px 17px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19); }
2015
+
2016
+ .divider {
2017
+ height: 1px;
2018
+ overflow: hidden;
2019
+ background-color: #e0e0e0; }
2020
+
2021
+ blockquote {
2022
+ margin: 20px 0;
2023
+ padding-left: 1.5rem;
2024
+ border-left: 5px solid #ee6e73; }
2025
+
2026
+ i {
2027
+ line-height: inherit; }
2028
+ i.left {
2029
+ float: left;
2030
+ margin-right: 15px; }
2031
+ i.right {
2032
+ float: right;
2033
+ margin-left: 15px; }
2034
+ i.tiny {
2035
+ font-size: 1rem; }
2036
+ i.small {
2037
+ font-size: 2rem; }
2038
+ i.medium {
2039
+ font-size: 4rem; }
2040
+ i.large {
2041
+ font-size: 6rem; }
2042
+
2043
+ img.responsive-img,
2044
+ video.responsive-video {
2045
+ max-width: 100%;
2046
+ height: auto; }
2047
+
2048
+ .pagination li {
2049
+ display: inline-block;
2050
+ border-radius: 2px;
2051
+ text-align: center;
2052
+ vertical-align: top;
2053
+ height: 30px; }
2054
+ .pagination li a {
2055
+ color: #444;
2056
+ display: inline-block;
2057
+ font-size: 1.2rem;
2058
+ padding: 0 10px;
2059
+ line-height: 30px; }
2060
+ .pagination li.active a {
2061
+ color: #fff; }
2062
+ .pagination li.active {
2063
+ background-color: #ee6e73; }
2064
+ .pagination li.disabled a {
2065
+ cursor: default;
2066
+ color: #999; }
2067
+ .pagination li i {
2068
+ font-size: 2rem; }
2069
+
2070
+ .pagination li.pages ul li {
2071
+ display: inline-block;
2072
+ float: none; }
2073
+
2074
+ @media only screen and (max-width: 992px) {
2075
+ .pagination {
2076
+ width: 100%; }
2077
+ .pagination li.prev,
2078
+ .pagination li.next {
2079
+ width: 10%; }
2080
+ .pagination li.pages {
2081
+ width: 80%;
2082
+ overflow: hidden;
2083
+ white-space: nowrap; } }
2084
+
2085
+ .breadcrumb {
2086
+ font-size: 18px;
2087
+ color: rgba(255, 255, 255, 0.7); }
2088
+ .breadcrumb i,
2089
+ .breadcrumb [class^="mdi-"], .breadcrumb [class*="mdi-"],
2090
+ .breadcrumb i.material-icons {
2091
+ display: inline-block;
2092
+ float: left;
2093
+ font-size: 24px; }
2094
+ .breadcrumb:before {
2095
+ content: '\E5CC';
2096
+ color: rgba(255, 255, 255, 0.7);
2097
+ vertical-align: top;
2098
+ display: inline-block;
2099
+ font-family: 'Material Icons';
2100
+ font-weight: normal;
2101
+ font-style: normal;
2102
+ font-size: 25px;
2103
+ margin: 0 10px 0 8px;
2104
+ -webkit-font-smoothing: antialiased; }
2105
+ .breadcrumb:first-child:before {
2106
+ display: none; }
2107
+ .breadcrumb:last-child {
2108
+ color: #fff; }
2109
+
2110
+ .parallax-container {
2111
+ position: relative;
2112
+ overflow: hidden;
2113
+ height: 500px; }
2114
+ .parallax-container .parallax {
2115
+ position: absolute;
2116
+ top: 0;
2117
+ left: 0;
2118
+ right: 0;
2119
+ bottom: 0;
2120
+ z-index: -1; }
2121
+ .parallax-container .parallax img {
2122
+ display: none;
2123
+ position: absolute;
2124
+ left: 50%;
2125
+ bottom: 0;
2126
+ min-width: 100%;
2127
+ min-height: 100%;
2128
+ transform: translate3d(0, 0, 0);
2129
+ transform: translateX(-50%); }
2130
+
2131
+ .pin-top, .pin-bottom {
2132
+ position: relative; }
2133
+
2134
+ .pinned {
2135
+ position: fixed !important; }
2136
+
2137
+ /*********************
2138
+ Transition Classes
2139
+ **********************/
2140
+ ul.staggered-list li {
2141
+ opacity: 0; }
2142
+
2143
+ .fade-in {
2144
+ opacity: 0;
2145
+ transform-origin: 0 50%; }
2146
+
2147
+ /*********************
2148
+ Media Query Classes
2149
+ **********************/
2150
+ @media only screen and (max-width: 600px) {
2151
+ .hide-on-small-only, .hide-on-small-and-down {
2152
+ display: none !important; } }
2153
+
2154
+ @media only screen and (max-width: 992px) {
2155
+ .hide-on-med-and-down {
2156
+ display: none !important; } }
2157
+
2158
+ @media only screen and (min-width: 601px) {
2159
+ .hide-on-med-and-up {
2160
+ display: none !important; } }
2161
+
2162
+ @media only screen and (min-width: 600px) and (max-width: 992px) {
2163
+ .hide-on-med-only {
2164
+ display: none !important; } }
2165
+
2166
+ @media only screen and (min-width: 993px) {
2167
+ .hide-on-large-only {
2168
+ display: none !important; } }
2169
+
2170
+ @media only screen and (min-width: 993px) {
2171
+ .show-on-large {
2172
+ display: block !important; } }
2173
+
2174
+ @media only screen and (min-width: 600px) and (max-width: 992px) {
2175
+ .show-on-medium {
2176
+ display: block !important; } }
2177
+
2178
+ @media only screen and (max-width: 600px) {
2179
+ .show-on-small {
2180
+ display: block !important; } }
2181
+
2182
+ @media only screen and (min-width: 601px) {
2183
+ .show-on-medium-and-up {
2184
+ display: block !important; } }
2185
+
2186
+ @media only screen and (max-width: 992px) {
2187
+ .show-on-medium-and-down {
2188
+ display: block !important; } }
2189
+
2190
+ @media only screen and (max-width: 600px) {
2191
+ .center-on-small-only {
2192
+ text-align: center; } }
2193
+
2194
+ .page-footer {
2195
+ padding-top: 20px;
2196
+ color: #fff;
2197
+ background-color: #ee6e73; }
2198
+ .page-footer .footer-copyright {
2199
+ overflow: hidden;
2200
+ min-height: 50px;
2201
+ display: flex;
2202
+ align-items: center;
2203
+ padding: 10px 0px;
2204
+ color: rgba(255, 255, 255, 0.8);
2205
+ background-color: rgba(51, 51, 51, 0.08); }
2206
+
2207
+ table, th, td {
2208
+ border: none; }
2209
+
2210
+ table {
2211
+ width: 100%;
2212
+ display: table; }
2213
+ table.bordered > thead > tr,
2214
+ table.bordered > tbody > tr {
2215
+ border-bottom: 1px solid #d0d0d0; }
2216
+ table.striped > tbody > tr:nth-child(odd) {
2217
+ background-color: #f2f2f2; }
2218
+ table.striped > tbody > tr > td {
2219
+ border-radius: 0; }
2220
+ table.highlight > tbody > tr {
2221
+ transition: background-color .25s ease; }
2222
+ table.highlight > tbody > tr:hover {
2223
+ background-color: #f2f2f2; }
2224
+ table.centered thead tr th, table.centered tbody tr td {
2225
+ text-align: center; }
2226
+
2227
+ thead {
2228
+ border-bottom: 1px solid #d0d0d0; }
2229
+
2230
+ td, th {
2231
+ padding: 15px 5px;
2232
+ display: table-cell;
2233
+ text-align: left;
2234
+ vertical-align: middle;
2235
+ border-radius: 2px; }
2236
+
2237
+ @media only screen and (max-width: 992px) {
2238
+ table.responsive-table {
2239
+ width: 100%;
2240
+ border-collapse: collapse;
2241
+ border-spacing: 0;
2242
+ display: block;
2243
+ position: relative;
2244
+ /* sort out borders */ }
2245
+ table.responsive-table td:empty:before {
2246
+ content: '\A0'; }
2247
+ table.responsive-table th,
2248
+ table.responsive-table td {
2249
+ margin: 0;
2250
+ vertical-align: top; }
2251
+ table.responsive-table th {
2252
+ text-align: left; }
2253
+ table.responsive-table thead {
2254
+ display: block;
2255
+ float: left; }
2256
+ table.responsive-table thead tr {
2257
+ display: block;
2258
+ padding: 0 10px 0 0; }
2259
+ table.responsive-table thead tr th::before {
2260
+ content: "\A0"; }
2261
+ table.responsive-table tbody {
2262
+ display: block;
2263
+ width: auto;
2264
+ position: relative;
2265
+ overflow-x: auto;
2266
+ white-space: nowrap; }
2267
+ table.responsive-table tbody tr {
2268
+ display: inline-block;
2269
+ vertical-align: top; }
2270
+ table.responsive-table th {
2271
+ display: block;
2272
+ text-align: right; }
2273
+ table.responsive-table td {
2274
+ display: block;
2275
+ min-height: 1.25em;
2276
+ text-align: left; }
2277
+ table.responsive-table tr {
2278
+ padding: 0 10px; }
2279
+ table.responsive-table thead {
2280
+ border: 0;
2281
+ border-right: 1px solid #d0d0d0; }
2282
+ table.responsive-table.bordered th {
2283
+ border-bottom: 0;
2284
+ border-left: 0; }
2285
+ table.responsive-table.bordered td {
2286
+ border-left: 0;
2287
+ border-right: 0;
2288
+ border-bottom: 0; }
2289
+ table.responsive-table.bordered tr {
2290
+ border: 0; }
2291
+ table.responsive-table.bordered tbody tr {
2292
+ border-right: 1px solid #d0d0d0; } }
2293
+
2294
+ .collection {
2295
+ margin: 0.5rem 0 1rem 0;
2296
+ border: 1px solid #e0e0e0;
2297
+ border-radius: 2px;
2298
+ overflow: hidden;
2299
+ position: relative; }
2300
+ .collection .collection-item {
2301
+ background-color: #fff;
2302
+ line-height: 1.5rem;
2303
+ padding: 10px 20px;
2304
+ margin: 0;
2305
+ border-bottom: 1px solid #e0e0e0; }
2306
+ .collection .collection-item.avatar {
2307
+ min-height: 84px;
2308
+ padding-left: 72px;
2309
+ position: relative; }
2310
+ .collection .collection-item.avatar:not(.circle-clipper) > .circle,
2311
+ .collection .collection-item.avatar :not(.circle-clipper) > .circle {
2312
+ position: absolute;
2313
+ width: 42px;
2314
+ height: 42px;
2315
+ overflow: hidden;
2316
+ left: 15px;
2317
+ display: inline-block;
2318
+ vertical-align: middle; }
2319
+ .collection .collection-item.avatar i.circle {
2320
+ font-size: 18px;
2321
+ line-height: 42px;
2322
+ color: #fff;
2323
+ background-color: #999;
2324
+ text-align: center; }
2325
+ .collection .collection-item.avatar .title {
2326
+ font-size: 16px; }
2327
+ .collection .collection-item.avatar p {
2328
+ margin: 0; }
2329
+ .collection .collection-item.avatar .secondary-content {
2330
+ position: absolute;
2331
+ top: 16px;
2332
+ right: 16px; }
2333
+ .collection .collection-item:last-child {
2334
+ border-bottom: none; }
2335
+ .collection .collection-item.active {
2336
+ background-color: #26a69a;
2337
+ color: #eafaf9; }
2338
+ .collection .collection-item.active .secondary-content {
2339
+ color: #fff; }
2340
+ .collection a.collection-item {
2341
+ display: block;
2342
+ transition: .25s;
2343
+ color: #26a69a; }
2344
+ .collection a.collection-item:not(.active):hover {
2345
+ background-color: #ddd; }
2346
+ .collection.with-header .collection-header {
2347
+ background-color: #fff;
2348
+ border-bottom: 1px solid #e0e0e0;
2349
+ padding: 10px 20px; }
2350
+ .collection.with-header .collection-item {
2351
+ padding-left: 30px; }
2352
+ .collection.with-header .collection-item.avatar {
2353
+ padding-left: 72px; }
2354
+
2355
+ .secondary-content {
2356
+ float: right;
2357
+ color: #26a69a; }
2358
+
2359
+ .collapsible .collection {
2360
+ margin: 0;
2361
+ border: none; }
2362
+
2363
+ .video-container {
2364
+ position: relative;
2365
+ padding-bottom: 56.25%;
2366
+ height: 0;
2367
+ overflow: hidden; }
2368
+ .video-container iframe, .video-container object, .video-container embed {
2369
+ position: absolute;
2370
+ top: 0;
2371
+ left: 0;
2372
+ width: 100%;
2373
+ height: 100%; }
2374
+
2375
+ .progress {
2376
+ position: relative;
2377
+ height: 4px;
2378
+ display: block;
2379
+ width: 100%;
2380
+ background-color: #acece6;
2381
+ border-radius: 2px;
2382
+ margin: 0.5rem 0 1rem 0;
2383
+ overflow: hidden; }
2384
+ .progress .determinate {
2385
+ position: absolute;
2386
+ top: 0;
2387
+ left: 0;
2388
+ bottom: 0;
2389
+ background-color: #26a69a;
2390
+ transition: width .3s linear; }
2391
+ .progress .indeterminate {
2392
+ background-color: #26a69a; }
2393
+ .progress .indeterminate:before {
2394
+ content: '';
2395
+ position: absolute;
2396
+ background-color: inherit;
2397
+ top: 0;
2398
+ left: 0;
2399
+ bottom: 0;
2400
+ will-change: left, right;
2401
+ animation: indeterminate 2.1s cubic-bezier(0.65, 0.815, 0.735, 0.395) infinite; }
2402
+ .progress .indeterminate:after {
2403
+ content: '';
2404
+ position: absolute;
2405
+ background-color: inherit;
2406
+ top: 0;
2407
+ left: 0;
2408
+ bottom: 0;
2409
+ will-change: left, right;
2410
+ animation: indeterminate-short 2.1s cubic-bezier(0.165, 0.84, 0.44, 1) infinite;
2411
+ animation-delay: 1.15s; }
2412
+
2413
+ @keyframes indeterminate {
2414
+ 0% {
2415
+ left: -35%;
2416
+ right: 100%; }
2417
+ 60% {
2418
+ left: 100%;
2419
+ right: -90%; }
2420
+ 100% {
2421
+ left: 100%;
2422
+ right: -90%; } }
2423
+
2424
+ @keyframes indeterminate-short {
2425
+ 0% {
2426
+ left: -200%;
2427
+ right: 100%; }
2428
+ 60% {
2429
+ left: 107%;
2430
+ right: -8%; }
2431
+ 100% {
2432
+ left: 107%;
2433
+ right: -8%; } }
2434
+
2435
+ /*******************
2436
+ Utility Classes
2437
+ *******************/
2438
+ .hide {
2439
+ display: none !important; }
2440
+
2441
+ .left-align {
2442
+ text-align: left; }
2443
+
2444
+ .right-align {
2445
+ text-align: right; }
2446
+
2447
+ .center, .center-align {
2448
+ text-align: center; }
2449
+
2450
+ .left {
2451
+ float: left !important; }
2452
+
2453
+ .right {
2454
+ float: right !important; }
2455
+
2456
+ .no-select, input[type=range],
2457
+ input[type=range] + .thumb {
2458
+ user-select: none; }
2459
+
2460
+ .circle {
2461
+ border-radius: 50%; }
2462
+
2463
+ .center-block {
2464
+ display: block;
2465
+ margin-left: auto;
2466
+ margin-right: auto; }
2467
+
2468
+ .truncate {
2469
+ display: block;
2470
+ white-space: nowrap;
2471
+ overflow: hidden;
2472
+ text-overflow: ellipsis; }
2473
+
2474
+ .no-padding {
2475
+ padding: 0 !important; }
2476
+
2477
+ /* This is needed for some mobile phones to display the Google Icon font properly */
2478
+ .material-icons {
2479
+ text-rendering: optimizeLegibility;
2480
+ font-feature-settings: 'liga'; }
2481
+
2482
+ .container {
2483
+ margin: 0 auto;
2484
+ max-width: 1280px;
2485
+ width: 90%; }
2486
+
2487
+ @media only screen and (min-width: 601px) {
2488
+ .container {
2489
+ width: 85%; } }
2490
+
2491
+ @media only screen and (min-width: 993px) {
2492
+ .container {
2493
+ width: 70%; } }
2494
+
2495
+ .container .row {
2496
+ margin-left: -0.75rem;
2497
+ margin-right: -0.75rem; }
2498
+
2499
+ .section {
2500
+ padding-top: 1rem;
2501
+ padding-bottom: 1rem; }
2502
+ .section.no-pad {
2503
+ padding: 0; }
2504
+ .section.no-pad-bot {
2505
+ padding-bottom: 0; }
2506
+ .section.no-pad-top {
2507
+ padding-top: 0; }
2508
+
2509
+ .row {
2510
+ margin-left: auto;
2511
+ margin-right: auto;
2512
+ margin-bottom: 20px; }
2513
+ .row:after {
2514
+ content: "";
2515
+ display: table;
2516
+ clear: both; }
2517
+ .row .col {
2518
+ float: left;
2519
+ box-sizing: border-box;
2520
+ padding: 0 0.75rem;
2521
+ min-height: 1px; }
2522
+ .row .col[class*="push-"], .row .col[class*="pull-"] {
2523
+ position: relative; }
2524
+ .row .col.s1 {
2525
+ width: 8.33333%;
2526
+ margin-left: auto;
2527
+ left: auto;
2528
+ right: auto; }
2529
+ .row .col.s2 {
2530
+ width: 16.66667%;
2531
+ margin-left: auto;
2532
+ left: auto;
2533
+ right: auto; }
2534
+ .row .col.s3 {
2535
+ width: 25%;
2536
+ margin-left: auto;
2537
+ left: auto;
2538
+ right: auto; }
2539
+ .row .col.s4 {
2540
+ width: 33.33333%;
2541
+ margin-left: auto;
2542
+ left: auto;
2543
+ right: auto; }
2544
+ .row .col.s5 {
2545
+ width: 41.66667%;
2546
+ margin-left: auto;
2547
+ left: auto;
2548
+ right: auto; }
2549
+ .row .col.s6 {
2550
+ width: 50%;
2551
+ margin-left: auto;
2552
+ left: auto;
2553
+ right: auto; }
2554
+ .row .col.s7 {
2555
+ width: 58.33333%;
2556
+ margin-left: auto;
2557
+ left: auto;
2558
+ right: auto; }
2559
+ .row .col.s8 {
2560
+ width: 66.66667%;
2561
+ margin-left: auto;
2562
+ left: auto;
2563
+ right: auto; }
2564
+ .row .col.s9 {
2565
+ width: 75%;
2566
+ margin-left: auto;
2567
+ left: auto;
2568
+ right: auto; }
2569
+ .row .col.s10 {
2570
+ width: 83.33333%;
2571
+ margin-left: auto;
2572
+ left: auto;
2573
+ right: auto; }
2574
+ .row .col.s11 {
2575
+ width: 91.66667%;
2576
+ margin-left: auto;
2577
+ left: auto;
2578
+ right: auto; }
2579
+ .row .col.s12 {
2580
+ width: 100%;
2581
+ margin-left: auto;
2582
+ left: auto;
2583
+ right: auto; }
2584
+ .row .col.offset-s1 {
2585
+ margin-left: 8.33333%; }
2586
+ .row .col.pull-s1 {
2587
+ right: 8.33333%; }
2588
+ .row .col.push-s1 {
2589
+ left: 8.33333%; }
2590
+ .row .col.offset-s2 {
2591
+ margin-left: 16.66667%; }
2592
+ .row .col.pull-s2 {
2593
+ right: 16.66667%; }
2594
+ .row .col.push-s2 {
2595
+ left: 16.66667%; }
2596
+ .row .col.offset-s3 {
2597
+ margin-left: 25%; }
2598
+ .row .col.pull-s3 {
2599
+ right: 25%; }
2600
+ .row .col.push-s3 {
2601
+ left: 25%; }
2602
+ .row .col.offset-s4 {
2603
+ margin-left: 33.33333%; }
2604
+ .row .col.pull-s4 {
2605
+ right: 33.33333%; }
2606
+ .row .col.push-s4 {
2607
+ left: 33.33333%; }
2608
+ .row .col.offset-s5 {
2609
+ margin-left: 41.66667%; }
2610
+ .row .col.pull-s5 {
2611
+ right: 41.66667%; }
2612
+ .row .col.push-s5 {
2613
+ left: 41.66667%; }
2614
+ .row .col.offset-s6 {
2615
+ margin-left: 50%; }
2616
+ .row .col.pull-s6 {
2617
+ right: 50%; }
2618
+ .row .col.push-s6 {
2619
+ left: 50%; }
2620
+ .row .col.offset-s7 {
2621
+ margin-left: 58.33333%; }
2622
+ .row .col.pull-s7 {
2623
+ right: 58.33333%; }
2624
+ .row .col.push-s7 {
2625
+ left: 58.33333%; }
2626
+ .row .col.offset-s8 {
2627
+ margin-left: 66.66667%; }
2628
+ .row .col.pull-s8 {
2629
+ right: 66.66667%; }
2630
+ .row .col.push-s8 {
2631
+ left: 66.66667%; }
2632
+ .row .col.offset-s9 {
2633
+ margin-left: 75%; }
2634
+ .row .col.pull-s9 {
2635
+ right: 75%; }
2636
+ .row .col.push-s9 {
2637
+ left: 75%; }
2638
+ .row .col.offset-s10 {
2639
+ margin-left: 83.33333%; }
2640
+ .row .col.pull-s10 {
2641
+ right: 83.33333%; }
2642
+ .row .col.push-s10 {
2643
+ left: 83.33333%; }
2644
+ .row .col.offset-s11 {
2645
+ margin-left: 91.66667%; }
2646
+ .row .col.pull-s11 {
2647
+ right: 91.66667%; }
2648
+ .row .col.push-s11 {
2649
+ left: 91.66667%; }
2650
+ .row .col.offset-s12 {
2651
+ margin-left: 100%; }
2652
+ .row .col.pull-s12 {
2653
+ right: 100%; }
2654
+ .row .col.push-s12 {
2655
+ left: 100%; }
2656
+ @media only screen and (min-width: 601px) {
2657
+ .row .col.m1 {
2658
+ width: 8.33333%;
2659
+ margin-left: auto;
2660
+ left: auto;
2661
+ right: auto; }
2662
+ .row .col.m2 {
2663
+ width: 16.66667%;
2664
+ margin-left: auto;
2665
+ left: auto;
2666
+ right: auto; }
2667
+ .row .col.m3 {
2668
+ width: 25%;
2669
+ margin-left: auto;
2670
+ left: auto;
2671
+ right: auto; }
2672
+ .row .col.m4 {
2673
+ width: 33.33333%;
2674
+ margin-left: auto;
2675
+ left: auto;
2676
+ right: auto; }
2677
+ .row .col.m5 {
2678
+ width: 41.66667%;
2679
+ margin-left: auto;
2680
+ left: auto;
2681
+ right: auto; }
2682
+ .row .col.m6 {
2683
+ width: 50%;
2684
+ margin-left: auto;
2685
+ left: auto;
2686
+ right: auto; }
2687
+ .row .col.m7 {
2688
+ width: 58.33333%;
2689
+ margin-left: auto;
2690
+ left: auto;
2691
+ right: auto; }
2692
+ .row .col.m8 {
2693
+ width: 66.66667%;
2694
+ margin-left: auto;
2695
+ left: auto;
2696
+ right: auto; }
2697
+ .row .col.m9 {
2698
+ width: 75%;
2699
+ margin-left: auto;
2700
+ left: auto;
2701
+ right: auto; }
2702
+ .row .col.m10 {
2703
+ width: 83.33333%;
2704
+ margin-left: auto;
2705
+ left: auto;
2706
+ right: auto; }
2707
+ .row .col.m11 {
2708
+ width: 91.66667%;
2709
+ margin-left: auto;
2710
+ left: auto;
2711
+ right: auto; }
2712
+ .row .col.m12 {
2713
+ width: 100%;
2714
+ margin-left: auto;
2715
+ left: auto;
2716
+ right: auto; }
2717
+ .row .col.offset-m1 {
2718
+ margin-left: 8.33333%; }
2719
+ .row .col.pull-m1 {
2720
+ right: 8.33333%; }
2721
+ .row .col.push-m1 {
2722
+ left: 8.33333%; }
2723
+ .row .col.offset-m2 {
2724
+ margin-left: 16.66667%; }
2725
+ .row .col.pull-m2 {
2726
+ right: 16.66667%; }
2727
+ .row .col.push-m2 {
2728
+ left: 16.66667%; }
2729
+ .row .col.offset-m3 {
2730
+ margin-left: 25%; }
2731
+ .row .col.pull-m3 {
2732
+ right: 25%; }
2733
+ .row .col.push-m3 {
2734
+ left: 25%; }
2735
+ .row .col.offset-m4 {
2736
+ margin-left: 33.33333%; }
2737
+ .row .col.pull-m4 {
2738
+ right: 33.33333%; }
2739
+ .row .col.push-m4 {
2740
+ left: 33.33333%; }
2741
+ .row .col.offset-m5 {
2742
+ margin-left: 41.66667%; }
2743
+ .row .col.pull-m5 {
2744
+ right: 41.66667%; }
2745
+ .row .col.push-m5 {
2746
+ left: 41.66667%; }
2747
+ .row .col.offset-m6 {
2748
+ margin-left: 50%; }
2749
+ .row .col.pull-m6 {
2750
+ right: 50%; }
2751
+ .row .col.push-m6 {
2752
+ left: 50%; }
2753
+ .row .col.offset-m7 {
2754
+ margin-left: 58.33333%; }
2755
+ .row .col.pull-m7 {
2756
+ right: 58.33333%; }
2757
+ .row .col.push-m7 {
2758
+ left: 58.33333%; }
2759
+ .row .col.offset-m8 {
2760
+ margin-left: 66.66667%; }
2761
+ .row .col.pull-m8 {
2762
+ right: 66.66667%; }
2763
+ .row .col.push-m8 {
2764
+ left: 66.66667%; }
2765
+ .row .col.offset-m9 {
2766
+ margin-left: 75%; }
2767
+ .row .col.pull-m9 {
2768
+ right: 75%; }
2769
+ .row .col.push-m9 {
2770
+ left: 75%; }
2771
+ .row .col.offset-m10 {
2772
+ margin-left: 83.33333%; }
2773
+ .row .col.pull-m10 {
2774
+ right: 83.33333%; }
2775
+ .row .col.push-m10 {
2776
+ left: 83.33333%; }
2777
+ .row .col.offset-m11 {
2778
+ margin-left: 91.66667%; }
2779
+ .row .col.pull-m11 {
2780
+ right: 91.66667%; }
2781
+ .row .col.push-m11 {
2782
+ left: 91.66667%; }
2783
+ .row .col.offset-m12 {
2784
+ margin-left: 100%; }
2785
+ .row .col.pull-m12 {
2786
+ right: 100%; }
2787
+ .row .col.push-m12 {
2788
+ left: 100%; } }
2789
+ @media only screen and (min-width: 993px) {
2790
+ .row .col.l1 {
2791
+ width: 8.33333%;
2792
+ margin-left: auto;
2793
+ left: auto;
2794
+ right: auto; }
2795
+ .row .col.l2 {
2796
+ width: 16.66667%;
2797
+ margin-left: auto;
2798
+ left: auto;
2799
+ right: auto; }
2800
+ .row .col.l3 {
2801
+ width: 25%;
2802
+ margin-left: auto;
2803
+ left: auto;
2804
+ right: auto; }
2805
+ .row .col.l4 {
2806
+ width: 33.33333%;
2807
+ margin-left: auto;
2808
+ left: auto;
2809
+ right: auto; }
2810
+ .row .col.l5 {
2811
+ width: 41.66667%;
2812
+ margin-left: auto;
2813
+ left: auto;
2814
+ right: auto; }
2815
+ .row .col.l6 {
2816
+ width: 50%;
2817
+ margin-left: auto;
2818
+ left: auto;
2819
+ right: auto; }
2820
+ .row .col.l7 {
2821
+ width: 58.33333%;
2822
+ margin-left: auto;
2823
+ left: auto;
2824
+ right: auto; }
2825
+ .row .col.l8 {
2826
+ width: 66.66667%;
2827
+ margin-left: auto;
2828
+ left: auto;
2829
+ right: auto; }
2830
+ .row .col.l9 {
2831
+ width: 75%;
2832
+ margin-left: auto;
2833
+ left: auto;
2834
+ right: auto; }
2835
+ .row .col.l10 {
2836
+ width: 83.33333%;
2837
+ margin-left: auto;
2838
+ left: auto;
2839
+ right: auto; }
2840
+ .row .col.l11 {
2841
+ width: 91.66667%;
2842
+ margin-left: auto;
2843
+ left: auto;
2844
+ right: auto; }
2845
+ .row .col.l12 {
2846
+ width: 100%;
2847
+ margin-left: auto;
2848
+ left: auto;
2849
+ right: auto; }
2850
+ .row .col.offset-l1 {
2851
+ margin-left: 8.33333%; }
2852
+ .row .col.pull-l1 {
2853
+ right: 8.33333%; }
2854
+ .row .col.push-l1 {
2855
+ left: 8.33333%; }
2856
+ .row .col.offset-l2 {
2857
+ margin-left: 16.66667%; }
2858
+ .row .col.pull-l2 {
2859
+ right: 16.66667%; }
2860
+ .row .col.push-l2 {
2861
+ left: 16.66667%; }
2862
+ .row .col.offset-l3 {
2863
+ margin-left: 25%; }
2864
+ .row .col.pull-l3 {
2865
+ right: 25%; }
2866
+ .row .col.push-l3 {
2867
+ left: 25%; }
2868
+ .row .col.offset-l4 {
2869
+ margin-left: 33.33333%; }
2870
+ .row .col.pull-l4 {
2871
+ right: 33.33333%; }
2872
+ .row .col.push-l4 {
2873
+ left: 33.33333%; }
2874
+ .row .col.offset-l5 {
2875
+ margin-left: 41.66667%; }
2876
+ .row .col.pull-l5 {
2877
+ right: 41.66667%; }
2878
+ .row .col.push-l5 {
2879
+ left: 41.66667%; }
2880
+ .row .col.offset-l6 {
2881
+ margin-left: 50%; }
2882
+ .row .col.pull-l6 {
2883
+ right: 50%; }
2884
+ .row .col.push-l6 {
2885
+ left: 50%; }
2886
+ .row .col.offset-l7 {
2887
+ margin-left: 58.33333%; }
2888
+ .row .col.pull-l7 {
2889
+ right: 58.33333%; }
2890
+ .row .col.push-l7 {
2891
+ left: 58.33333%; }
2892
+ .row .col.offset-l8 {
2893
+ margin-left: 66.66667%; }
2894
+ .row .col.pull-l8 {
2895
+ right: 66.66667%; }
2896
+ .row .col.push-l8 {
2897
+ left: 66.66667%; }
2898
+ .row .col.offset-l9 {
2899
+ margin-left: 75%; }
2900
+ .row .col.pull-l9 {
2901
+ right: 75%; }
2902
+ .row .col.push-l9 {
2903
+ left: 75%; }
2904
+ .row .col.offset-l10 {
2905
+ margin-left: 83.33333%; }
2906
+ .row .col.pull-l10 {
2907
+ right: 83.33333%; }
2908
+ .row .col.push-l10 {
2909
+ left: 83.33333%; }
2910
+ .row .col.offset-l11 {
2911
+ margin-left: 91.66667%; }
2912
+ .row .col.pull-l11 {
2913
+ right: 91.66667%; }
2914
+ .row .col.push-l11 {
2915
+ left: 91.66667%; }
2916
+ .row .col.offset-l12 {
2917
+ margin-left: 100%; }
2918
+ .row .col.pull-l12 {
2919
+ right: 100%; }
2920
+ .row .col.push-l12 {
2921
+ left: 100%; } }
2922
+ @media only screen and (min-width: 1201px) {
2923
+ .row .col.xl1 {
2924
+ width: 8.33333%;
2925
+ margin-left: auto;
2926
+ left: auto;
2927
+ right: auto; }
2928
+ .row .col.xl2 {
2929
+ width: 16.66667%;
2930
+ margin-left: auto;
2931
+ left: auto;
2932
+ right: auto; }
2933
+ .row .col.xl3 {
2934
+ width: 25%;
2935
+ margin-left: auto;
2936
+ left: auto;
2937
+ right: auto; }
2938
+ .row .col.xl4 {
2939
+ width: 33.33333%;
2940
+ margin-left: auto;
2941
+ left: auto;
2942
+ right: auto; }
2943
+ .row .col.xl5 {
2944
+ width: 41.66667%;
2945
+ margin-left: auto;
2946
+ left: auto;
2947
+ right: auto; }
2948
+ .row .col.xl6 {
2949
+ width: 50%;
2950
+ margin-left: auto;
2951
+ left: auto;
2952
+ right: auto; }
2953
+ .row .col.xl7 {
2954
+ width: 58.33333%;
2955
+ margin-left: auto;
2956
+ left: auto;
2957
+ right: auto; }
2958
+ .row .col.xl8 {
2959
+ width: 66.66667%;
2960
+ margin-left: auto;
2961
+ left: auto;
2962
+ right: auto; }
2963
+ .row .col.xl9 {
2964
+ width: 75%;
2965
+ margin-left: auto;
2966
+ left: auto;
2967
+ right: auto; }
2968
+ .row .col.xl10 {
2969
+ width: 83.33333%;
2970
+ margin-left: auto;
2971
+ left: auto;
2972
+ right: auto; }
2973
+ .row .col.xl11 {
2974
+ width: 91.66667%;
2975
+ margin-left: auto;
2976
+ left: auto;
2977
+ right: auto; }
2978
+ .row .col.xl12 {
2979
+ width: 100%;
2980
+ margin-left: auto;
2981
+ left: auto;
2982
+ right: auto; }
2983
+ .row .col.offset-xl1 {
2984
+ margin-left: 8.33333%; }
2985
+ .row .col.pull-xl1 {
2986
+ right: 8.33333%; }
2987
+ .row .col.push-xl1 {
2988
+ left: 8.33333%; }
2989
+ .row .col.offset-xl2 {
2990
+ margin-left: 16.66667%; }
2991
+ .row .col.pull-xl2 {
2992
+ right: 16.66667%; }
2993
+ .row .col.push-xl2 {
2994
+ left: 16.66667%; }
2995
+ .row .col.offset-xl3 {
2996
+ margin-left: 25%; }
2997
+ .row .col.pull-xl3 {
2998
+ right: 25%; }
2999
+ .row .col.push-xl3 {
3000
+ left: 25%; }
3001
+ .row .col.offset-xl4 {
3002
+ margin-left: 33.33333%; }
3003
+ .row .col.pull-xl4 {
3004
+ right: 33.33333%; }
3005
+ .row .col.push-xl4 {
3006
+ left: 33.33333%; }
3007
+ .row .col.offset-xl5 {
3008
+ margin-left: 41.66667%; }
3009
+ .row .col.pull-xl5 {
3010
+ right: 41.66667%; }
3011
+ .row .col.push-xl5 {
3012
+ left: 41.66667%; }
3013
+ .row .col.offset-xl6 {
3014
+ margin-left: 50%; }
3015
+ .row .col.pull-xl6 {
3016
+ right: 50%; }
3017
+ .row .col.push-xl6 {
3018
+ left: 50%; }
3019
+ .row .col.offset-xl7 {
3020
+ margin-left: 58.33333%; }
3021
+ .row .col.pull-xl7 {
3022
+ right: 58.33333%; }
3023
+ .row .col.push-xl7 {
3024
+ left: 58.33333%; }
3025
+ .row .col.offset-xl8 {
3026
+ margin-left: 66.66667%; }
3027
+ .row .col.pull-xl8 {
3028
+ right: 66.66667%; }
3029
+ .row .col.push-xl8 {
3030
+ left: 66.66667%; }
3031
+ .row .col.offset-xl9 {
3032
+ margin-left: 75%; }
3033
+ .row .col.pull-xl9 {
3034
+ right: 75%; }
3035
+ .row .col.push-xl9 {
3036
+ left: 75%; }
3037
+ .row .col.offset-xl10 {
3038
+ margin-left: 83.33333%; }
3039
+ .row .col.pull-xl10 {
3040
+ right: 83.33333%; }
3041
+ .row .col.push-xl10 {
3042
+ left: 83.33333%; }
3043
+ .row .col.offset-xl11 {
3044
+ margin-left: 91.66667%; }
3045
+ .row .col.pull-xl11 {
3046
+ right: 91.66667%; }
3047
+ .row .col.push-xl11 {
3048
+ left: 91.66667%; }
3049
+ .row .col.offset-xl12 {
3050
+ margin-left: 100%; }
3051
+ .row .col.pull-xl12 {
3052
+ right: 100%; }
3053
+ .row .col.push-xl12 {
3054
+ left: 100%; } }
3055
+
3056
+ a {
3057
+ text-decoration: none; }
3058
+
3059
+ html {
3060
+ line-height: 1.5;
3061
+ font-family: "Roboto", sans-serif;
3062
+ font-weight: normal;
3063
+ color: rgba(0, 0, 0, 0.87); }
3064
+ @media only screen and (min-width: 0) {
3065
+ html {
3066
+ font-size: 14px; } }
3067
+ @media only screen and (min-width: 992px) {
3068
+ html {
3069
+ font-size: 14.5px; } }
3070
+ @media only screen and (min-width: 1200px) {
3071
+ html {
3072
+ font-size: 15px; } }
3073
+
3074
+ h1, h2, h3, h4, h5, h6 {
3075
+ font-weight: 400;
3076
+ line-height: 1.1; }
3077
+
3078
+ h1 a, h2 a, h3 a, h4 a, h5 a, h6 a {
3079
+ font-weight: inherit; }
3080
+
3081
+ h1 {
3082
+ font-size: 4.2rem;
3083
+ line-height: 110%;
3084
+ margin: 2.1rem 0 1.68rem 0; }
3085
+
3086
+ h2 {
3087
+ font-size: 3.56rem;
3088
+ line-height: 110%;
3089
+ margin: 1.78rem 0 1.424rem 0; }
3090
+
3091
+ h3 {
3092
+ font-size: 2.92rem;
3093
+ line-height: 110%;
3094
+ margin: 1.46rem 0 1.168rem 0; }
3095
+
3096
+ h4 {
3097
+ font-size: 2.28rem;
3098
+ line-height: 110%;
3099
+ margin: 1.14rem 0 0.912rem 0; }
3100
+
3101
+ h5 {
3102
+ font-size: 1.64rem;
3103
+ line-height: 110%;
3104
+ margin: 0.82rem 0 0.656rem 0; }
3105
+
3106
+ h6 {
3107
+ font-size: 1rem;
3108
+ line-height: 110%;
3109
+ margin: 0.5rem 0 0.4rem 0; }
3110
+
3111
+ em {
3112
+ font-style: italic; }
3113
+
3114
+ strong {
3115
+ font-weight: 500; }
3116
+
3117
+ small {
3118
+ font-size: 75%; }
3119
+
3120
+ .light, .page-footer .footer-copyright {
3121
+ font-weight: 300; }
3122
+
3123
+ .thin {
3124
+ font-weight: 200; }
3125
+
3126
+ .flow-text {
3127
+ font-weight: 300; }
3128
+ @media only screen and (min-width: 360px) {
3129
+ .flow-text {
3130
+ font-size: 1.2rem; } }
3131
+ @media only screen and (min-width: 390px) {
3132
+ .flow-text {
3133
+ font-size: 1.224rem; } }
3134
+ @media only screen and (min-width: 420px) {
3135
+ .flow-text {
3136
+ font-size: 1.248rem; } }
3137
+ @media only screen and (min-width: 450px) {
3138
+ .flow-text {
3139
+ font-size: 1.272rem; } }
3140
+ @media only screen and (min-width: 480px) {
3141
+ .flow-text {
3142
+ font-size: 1.296rem; } }
3143
+ @media only screen and (min-width: 510px) {
3144
+ .flow-text {
3145
+ font-size: 1.32rem; } }
3146
+ @media only screen and (min-width: 540px) {
3147
+ .flow-text {
3148
+ font-size: 1.344rem; } }
3149
+ @media only screen and (min-width: 570px) {
3150
+ .flow-text {
3151
+ font-size: 1.368rem; } }
3152
+ @media only screen and (min-width: 600px) {
3153
+ .flow-text {
3154
+ font-size: 1.392rem; } }
3155
+ @media only screen and (min-width: 630px) {
3156
+ .flow-text {
3157
+ font-size: 1.416rem; } }
3158
+ @media only screen and (min-width: 660px) {
3159
+ .flow-text {
3160
+ font-size: 1.44rem; } }
3161
+ @media only screen and (min-width: 690px) {
3162
+ .flow-text {
3163
+ font-size: 1.464rem; } }
3164
+ @media only screen and (min-width: 720px) {
3165
+ .flow-text {
3166
+ font-size: 1.488rem; } }
3167
+ @media only screen and (min-width: 750px) {
3168
+ .flow-text {
3169
+ font-size: 1.512rem; } }
3170
+ @media only screen and (min-width: 780px) {
3171
+ .flow-text {
3172
+ font-size: 1.536rem; } }
3173
+ @media only screen and (min-width: 810px) {
3174
+ .flow-text {
3175
+ font-size: 1.56rem; } }
3176
+ @media only screen and (min-width: 840px) {
3177
+ .flow-text {
3178
+ font-size: 1.584rem; } }
3179
+ @media only screen and (min-width: 870px) {
3180
+ .flow-text {
3181
+ font-size: 1.608rem; } }
3182
+ @media only screen and (min-width: 900px) {
3183
+ .flow-text {
3184
+ font-size: 1.632rem; } }
3185
+ @media only screen and (min-width: 930px) {
3186
+ .flow-text {
3187
+ font-size: 1.656rem; } }
3188
+ @media only screen and (min-width: 960px) {
3189
+ .flow-text {
3190
+ font-size: 1.68rem; } }
3191
+ @media only screen and (max-width: 360px) {
3192
+ .flow-text {
3193
+ font-size: 1.2rem; } }
3194
+
3195
+ .btn, .btn-large,
3196
+ .btn-flat {
3197
+ border: none;
3198
+ border-radius: 2px;
3199
+ display: inline-block;
3200
+ height: 36px;
3201
+ line-height: 36px;
3202
+ padding: 0 2rem;
3203
+ text-transform: uppercase;
3204
+ vertical-align: middle;
3205
+ -webkit-tap-highlight-color: transparent; }
3206
+
3207
+ .btn.disabled, .disabled.btn-large,
3208
+ .btn-floating.disabled,
3209
+ .btn-large.disabled,
3210
+ .btn-flat.disabled,
3211
+ .btn:disabled,
3212
+ .btn-large:disabled,
3213
+ .btn-floating:disabled,
3214
+ .btn-large:disabled,
3215
+ .btn-flat:disabled,
3216
+ .btn[disabled],
3217
+ [disabled].btn-large,
3218
+ .btn-floating[disabled],
3219
+ .btn-large[disabled],
3220
+ .btn-flat[disabled] {
3221
+ pointer-events: none;
3222
+ background-color: #DFDFDF !important;
3223
+ box-shadow: none;
3224
+ color: #9F9F9F !important;
3225
+ cursor: default; }
3226
+ .btn.disabled:hover, .disabled.btn-large:hover,
3227
+ .btn-floating.disabled:hover,
3228
+ .btn-large.disabled:hover,
3229
+ .btn-flat.disabled:hover,
3230
+ .btn:disabled:hover,
3231
+ .btn-large:disabled:hover,
3232
+ .btn-floating:disabled:hover,
3233
+ .btn-large:disabled:hover,
3234
+ .btn-flat:disabled:hover,
3235
+ .btn[disabled]:hover,
3236
+ [disabled].btn-large:hover,
3237
+ .btn-floating[disabled]:hover,
3238
+ .btn-large[disabled]:hover,
3239
+ .btn-flat[disabled]:hover {
3240
+ background-color: #DFDFDF !important;
3241
+ color: #9F9F9F !important; }
3242
+
3243
+ .btn, .btn-large,
3244
+ .btn-floating,
3245
+ .btn-large,
3246
+ .btn-flat {
3247
+ font-size: 1rem;
3248
+ outline: 0; }
3249
+ .btn i, .btn-large i,
3250
+ .btn-floating i,
3251
+ .btn-large i,
3252
+ .btn-flat i {
3253
+ font-size: 1.3rem;
3254
+ line-height: inherit; }
3255
+
3256
+ .btn:focus, .btn-large:focus,
3257
+ .btn-floating:focus {
3258
+ background-color: #1d7d74; }
3259
+
3260
+ .btn, .btn-large {
3261
+ text-decoration: none;
3262
+ color: #fff;
3263
+ background-color: #26a69a;
3264
+ text-align: center;
3265
+ letter-spacing: .5px;
3266
+ transition: .2s ease-out;
3267
+ cursor: pointer; }
3268
+ .btn:hover, .btn-large:hover {
3269
+ background-color: #2bbbad; }
3270
+
3271
+ .btn-floating {
3272
+ display: inline-block;
3273
+ color: #fff;
3274
+ position: relative;
3275
+ overflow: hidden;
3276
+ z-index: 1;
3277
+ width: 40px;
3278
+ height: 40px;
3279
+ line-height: 40px;
3280
+ padding: 0;
3281
+ background-color: #26a69a;
3282
+ border-radius: 50%;
3283
+ transition: .3s;
3284
+ cursor: pointer;
3285
+ vertical-align: middle; }
3286
+ .btn-floating:hover {
3287
+ background-color: #26a69a; }
3288
+ .btn-floating:before {
3289
+ border-radius: 0; }
3290
+ .btn-floating.btn-large {
3291
+ width: 56px;
3292
+ height: 56px; }
3293
+ .btn-floating.btn-large.halfway-fab {
3294
+ bottom: -28px; }
3295
+ .btn-floating.btn-large i {
3296
+ line-height: 56px; }
3297
+ .btn-floating.halfway-fab {
3298
+ position: absolute;
3299
+ right: 24px;
3300
+ bottom: -20px; }
3301
+ .btn-floating.halfway-fab.left {
3302
+ right: auto;
3303
+ left: 24px; }
3304
+ .btn-floating i {
3305
+ width: inherit;
3306
+ display: inline-block;
3307
+ text-align: center;
3308
+ color: #fff;
3309
+ font-size: 1.6rem;
3310
+ line-height: 40px; }
3311
+
3312
+ button.btn-floating {
3313
+ border: none; }
3314
+
3315
+ .fixed-action-btn {
3316
+ position: fixed;
3317
+ right: 23px;
3318
+ bottom: 23px;
3319
+ padding-top: 15px;
3320
+ margin-bottom: 0;
3321
+ z-index: 997; }
3322
+ .fixed-action-btn.active ul {
3323
+ visibility: visible; }
3324
+ .fixed-action-btn.horizontal {
3325
+ padding: 0 0 0 15px; }
3326
+ .fixed-action-btn.horizontal ul {
3327
+ text-align: right;
3328
+ right: 64px;
3329
+ top: 50%;
3330
+ transform: translateY(-50%);
3331
+ height: 100%;
3332
+ left: auto;
3333
+ width: 500px;
3334
+ /*width 100% only goes to width of button container */ }
3335
+ .fixed-action-btn.horizontal ul li {
3336
+ display: inline-block;
3337
+ margin: 15px 15px 0 0; }
3338
+ .fixed-action-btn.toolbar {
3339
+ padding: 0;
3340
+ height: 56px; }
3341
+ .fixed-action-btn.toolbar.active > a i {
3342
+ opacity: 0; }
3343
+ .fixed-action-btn.toolbar ul {
3344
+ display: flex;
3345
+ top: 0;
3346
+ bottom: 0;
3347
+ z-index: 1; }
3348
+ .fixed-action-btn.toolbar ul li {
3349
+ flex: 1;
3350
+ display: inline-block;
3351
+ margin: 0;
3352
+ height: 100%;
3353
+ transition: none; }
3354
+ .fixed-action-btn.toolbar ul li a {
3355
+ display: block;
3356
+ overflow: hidden;
3357
+ position: relative;
3358
+ width: 100%;
3359
+ height: 100%;
3360
+ background-color: transparent;
3361
+ box-shadow: none;
3362
+ color: #fff;
3363
+ line-height: 56px;
3364
+ z-index: 1; }
3365
+ .fixed-action-btn.toolbar ul li a i {
3366
+ line-height: inherit; }
3367
+ .fixed-action-btn ul {
3368
+ left: 0;
3369
+ right: 0;
3370
+ text-align: center;
3371
+ position: absolute;
3372
+ bottom: 64px;
3373
+ margin: 0;
3374
+ visibility: hidden; }
3375
+ .fixed-action-btn ul li {
3376
+ margin-bottom: 15px; }
3377
+ .fixed-action-btn ul a.btn-floating {
3378
+ opacity: 0; }
3379
+ .fixed-action-btn .fab-backdrop {
3380
+ position: absolute;
3381
+ top: 0;
3382
+ left: 0;
3383
+ z-index: -1;
3384
+ width: 40px;
3385
+ height: 40px;
3386
+ background-color: #26a69a;
3387
+ border-radius: 50%;
3388
+ transform: scale(0); }
3389
+
3390
+ .btn-flat {
3391
+ box-shadow: none;
3392
+ background-color: transparent;
3393
+ color: #343434;
3394
+ cursor: pointer;
3395
+ transition: background-color .2s; }
3396
+ .btn-flat:focus, .btn-flat:hover {
3397
+ box-shadow: none; }
3398
+ .btn-flat:focus {
3399
+ background-color: rgba(0, 0, 0, 0.1); }
3400
+ .btn-flat.disabled {
3401
+ background-color: transparent !important;
3402
+ color: #b3b3b3 !important;
3403
+ cursor: default; }
3404
+
3405
+ .btn-large {
3406
+ height: 54px;
3407
+ line-height: 54px; }
3408
+ .btn-large i {
3409
+ font-size: 1.6rem; }
3410
+
3411
+ .btn-block {
3412
+ display: block; }
3413
+
3414
+ .dropdown-content {
3415
+ background-color: #fff;
3416
+ margin: 0;
3417
+ display: none;
3418
+ min-width: 100px;
3419
+ max-height: 650px;
3420
+ overflow-y: auto;
3421
+ opacity: 0;
3422
+ position: absolute;
3423
+ z-index: 999;
3424
+ will-change: width, height; }
3425
+ .dropdown-content li {
3426
+ clear: both;
3427
+ color: rgba(0, 0, 0, 0.87);
3428
+ cursor: pointer;
3429
+ min-height: 50px;
3430
+ line-height: 1.5rem;
3431
+ width: 100%;
3432
+ text-align: left;
3433
+ text-transform: none; }
3434
+ .dropdown-content li:hover, .dropdown-content li.active, .dropdown-content li.selected {
3435
+ background-color: #eee; }
3436
+ .dropdown-content li.active.selected {
3437
+ background-color: #e1e1e1; }
3438
+ .dropdown-content li.divider {
3439
+ min-height: 0;
3440
+ height: 1px; }
3441
+ .dropdown-content li > a, .dropdown-content li > span {
3442
+ font-size: 16px;
3443
+ color: #26a69a;
3444
+ display: block;
3445
+ line-height: 22px;
3446
+ padding: 14px 16px; }
3447
+ .dropdown-content li > span > label {
3448
+ top: 1px;
3449
+ left: 0;
3450
+ height: 18px; }
3451
+ .dropdown-content li > a > i {
3452
+ height: inherit;
3453
+ line-height: inherit;
3454
+ float: left;
3455
+ margin: 0 24px 0 0;
3456
+ width: 24px; }
3457
+
3458
+ .input-field.col .dropdown-content [type="checkbox"] + label {
3459
+ top: 1px;
3460
+ left: 0;
3461
+ height: 18px; }
3462
+
3463
+ /*!
3464
+ * Waves v0.6.0
3465
+ * http://fian.my.id/Waves
3466
+ *
3467
+ * Copyright 2014 Alfiana E. Sibuea and other contributors
3468
+ * Released under the MIT license
3469
+ * https://github.com/fians/Waves/blob/master/LICENSE
3470
+ */
3471
+ .waves-effect {
3472
+ position: relative;
3473
+ cursor: pointer;
3474
+ display: inline-block;
3475
+ overflow: hidden;
3476
+ user-select: none;
3477
+ -webkit-tap-highlight-color: transparent;
3478
+ vertical-align: middle;
3479
+ z-index: 1;
3480
+ transition: .3s ease-out; }
3481
+ .waves-effect .waves-ripple {
3482
+ position: absolute;
3483
+ border-radius: 50%;
3484
+ width: 20px;
3485
+ height: 20px;
3486
+ margin-top: -10px;
3487
+ margin-left: -10px;
3488
+ opacity: 0;
3489
+ background: rgba(0, 0, 0, 0.2);
3490
+ transition: all 0.7s ease-out;
3491
+ transition-property: transform, opacity;
3492
+ transform: scale(0);
3493
+ pointer-events: none; }
3494
+ .waves-effect.waves-light .waves-ripple {
3495
+ background-color: rgba(255, 255, 255, 0.45); }
3496
+ .waves-effect.waves-red .waves-ripple {
3497
+ background-color: rgba(244, 67, 54, 0.7); }
3498
+ .waves-effect.waves-yellow .waves-ripple {
3499
+ background-color: rgba(255, 235, 59, 0.7); }
3500
+ .waves-effect.waves-orange .waves-ripple {
3501
+ background-color: rgba(255, 152, 0, 0.7); }
3502
+ .waves-effect.waves-purple .waves-ripple {
3503
+ background-color: rgba(156, 39, 176, 0.7); }
3504
+ .waves-effect.waves-green .waves-ripple {
3505
+ background-color: rgba(76, 175, 80, 0.7); }
3506
+ .waves-effect.waves-teal .waves-ripple {
3507
+ background-color: rgba(0, 150, 136, 0.7); }
3508
+ .waves-effect input[type="button"], .waves-effect input[type="reset"], .waves-effect input[type="submit"] {
3509
+ border: 0;
3510
+ font-style: normal;
3511
+ font-size: inherit;
3512
+ text-transform: inherit;
3513
+ background: none; }
3514
+ .waves-effect img {
3515
+ position: relative;
3516
+ z-index: -1; }
3517
+
3518
+ .waves-notransition {
3519
+ transition: none !important; }
3520
+
3521
+ .waves-circle {
3522
+ transform: translateZ(0);
3523
+ -webkit-mask-image: -webkit-radial-gradient(circle, white 100%, black 100%); }
3524
+
3525
+ .waves-input-wrapper {
3526
+ border-radius: 0.2em;
3527
+ vertical-align: bottom; }
3528
+ .waves-input-wrapper .waves-button-input {
3529
+ position: relative;
3530
+ top: 0;
3531
+ left: 0;
3532
+ z-index: 1; }
3533
+
3534
+ .waves-circle {
3535
+ text-align: center;
3536
+ width: 2.5em;
3537
+ height: 2.5em;
3538
+ line-height: 2.5em;
3539
+ border-radius: 50%;
3540
+ -webkit-mask-image: none; }
3541
+
3542
+ .waves-block {
3543
+ display: block; }
3544
+
3545
+ /* Firefox Bug: link not triggered */
3546
+ .waves-effect .waves-ripple {
3547
+ z-index: -1; }
3548
+
3549
+ .collapsible {
3550
+ border-top: 1px solid #ddd;
3551
+ border-right: 1px solid #ddd;
3552
+ border-left: 1px solid #ddd;
3553
+ margin: 0.5rem 0 1rem 0; }
3554
+
3555
+ .collapsible-header {
3556
+ display: flex;
3557
+ cursor: pointer;
3558
+ -webkit-tap-highlight-color: transparent;
3559
+ line-height: 1.5;
3560
+ padding: 1rem;
3561
+ background-color: #fff;
3562
+ border-bottom: 1px solid #ddd; }
3563
+ .collapsible-header i {
3564
+ width: 2rem;
3565
+ font-size: 1.6rem;
3566
+ display: inline-block;
3567
+ text-align: center;
3568
+ margin-right: 1rem; }
3569
+
3570
+ .collapsible-body {
3571
+ display: none;
3572
+ border-bottom: 1px solid #ddd;
3573
+ box-sizing: border-box;
3574
+ padding: 2rem; }
3575
+
3576
+ .side-nav .collapsible,
3577
+ .side-nav.fixed .collapsible {
3578
+ border: none;
3579
+ box-shadow: none; }
3580
+ .side-nav .collapsible li,
3581
+ .side-nav.fixed .collapsible li {
3582
+ padding: 0; }
3583
+
3584
+ .side-nav .collapsible-header,
3585
+ .side-nav.fixed .collapsible-header {
3586
+ background-color: transparent;
3587
+ border: none;
3588
+ line-height: inherit;
3589
+ height: inherit;
3590
+ padding: 0 16px; }
3591
+ .side-nav .collapsible-header:hover,
3592
+ .side-nav.fixed .collapsible-header:hover {
3593
+ background-color: rgba(0, 0, 0, 0.05); }
3594
+ .side-nav .collapsible-header i,
3595
+ .side-nav.fixed .collapsible-header i {
3596
+ line-height: inherit; }
3597
+
3598
+ .side-nav .collapsible-body,
3599
+ .side-nav.fixed .collapsible-body {
3600
+ border: 0;
3601
+ background-color: #fff; }
3602
+ .side-nav .collapsible-body li a,
3603
+ .side-nav.fixed .collapsible-body li a {
3604
+ padding: 0 23.5px 0 31px; }
3605
+
3606
+ .collapsible.popout {
3607
+ border: none;
3608
+ box-shadow: none; }
3609
+ .collapsible.popout > li {
3610
+ box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12);
3611
+ margin: 0 24px;
3612
+ transition: margin 0.35s cubic-bezier(0.25, 0.46, 0.45, 0.94); }
3613
+ .collapsible.popout > li.active {
3614
+ box-shadow: 0 5px 11px 0 rgba(0, 0, 0, 0.18), 0 4px 15px 0 rgba(0, 0, 0, 0.15);
3615
+ margin: 16px 0; }
3616
+
3617
+ .chip {
3618
+ display: inline-block;
3619
+ height: 32px;
3620
+ font-size: 13px;
3621
+ font-weight: 500;
3622
+ color: rgba(0, 0, 0, 0.6);
3623
+ line-height: 32px;
3624
+ padding: 0 12px;
3625
+ border-radius: 16px;
3626
+ background-color: #e4e4e4;
3627
+ margin-bottom: 5px;
3628
+ margin-right: 5px; }
3629
+ .chip > img {
3630
+ float: left;
3631
+ margin: 0 8px 0 -12px;
3632
+ height: 32px;
3633
+ width: 32px;
3634
+ border-radius: 50%; }
3635
+ .chip .close {
3636
+ cursor: pointer;
3637
+ float: right;
3638
+ font-size: 16px;
3639
+ line-height: 32px;
3640
+ padding-left: 8px; }
3641
+
3642
+ .chips {
3643
+ border: none;
3644
+ border-bottom: 1px solid #9e9e9e;
3645
+ box-shadow: none;
3646
+ margin: 0 0 20px 0;
3647
+ min-height: 45px;
3648
+ outline: none;
3649
+ transition: all .3s; }
3650
+ .chips.focus {
3651
+ border-bottom: 1px solid #26a69a;
3652
+ box-shadow: 0 1px 0 0 #26a69a; }
3653
+ .chips:hover {
3654
+ cursor: text; }
3655
+ .chips .chip.selected {
3656
+ background-color: #26a69a;
3657
+ color: #fff; }
3658
+ .chips .input {
3659
+ background: none;
3660
+ border: 0;
3661
+ color: rgba(0, 0, 0, 0.6);
3662
+ display: inline-block;
3663
+ font-size: 1rem;
3664
+ height: 3rem;
3665
+ line-height: 32px;
3666
+ outline: 0;
3667
+ margin: 0;
3668
+ padding: 0 !important;
3669
+ width: 120px !important; }
3670
+ .chips .input:focus {
3671
+ border: 0 !important;
3672
+ box-shadow: none !important; }
3673
+ .chips .autocomplete-content {
3674
+ margin-top: 0;
3675
+ margin-bottom: 0; }
3676
+
3677
+ .prefix ~ .chips {
3678
+ margin-left: 3rem;
3679
+ width: 92%;
3680
+ width: calc(100% - 3rem); }
3681
+
3682
+ .chips:empty ~ label {
3683
+ font-size: 0.8rem;
3684
+ transform: translateY(-140%); }
3685
+
3686
+ select:focus {
3687
+ outline: 1px solid #c9f3ef; }
3688
+
3689
+ button:focus {
3690
+ outline: none;
3691
+ background-color: #2ab7a9; }
3692
+
3693
+ label {
3694
+ font-size: 0.8rem;
3695
+ color: #9e9e9e; }
3696
+
3697
+ /* Text Inputs + Textarea
3698
+ ========================================================================== */
3699
+ /* Style Placeholders */
3700
+ ::placeholder {
3701
+ color: #d1d1d1; }
3702
+
3703
+ /* Text inputs */
3704
+ input:not([type]),
3705
+ input[type=text]:not(.browser-default),
3706
+ input[type=password]:not(.browser-default),
3707
+ input[type=email]:not(.browser-default),
3708
+ input[type=url]:not(.browser-default),
3709
+ input[type=time]:not(.browser-default),
3710
+ input[type=date]:not(.browser-default),
3711
+ input[type=datetime]:not(.browser-default),
3712
+ input[type=datetime-local]:not(.browser-default),
3713
+ input[type=tel]:not(.browser-default),
3714
+ input[type=number]:not(.browser-default),
3715
+ input[type=search]:not(.browser-default),
3716
+ textarea.materialize-textarea {
3717
+ background-color: transparent;
3718
+ border: none;
3719
+ border-bottom: 1px solid #9e9e9e;
3720
+ border-radius: 0;
3721
+ outline: none;
3722
+ height: 3rem;
3723
+ width: 100%;
3724
+ font-size: 1rem;
3725
+ margin: 0 0 20px 0;
3726
+ padding: 0;
3727
+ box-shadow: none;
3728
+ box-sizing: content-box;
3729
+ transition: all 0.3s; }
3730
+ input:not([type]):disabled, input:not([type])[readonly="readonly"],
3731
+ input[type=text]:not(.browser-default):disabled,
3732
+ input[type=text]:not(.browser-default)[readonly="readonly"],
3733
+ input[type=password]:not(.browser-default):disabled,
3734
+ input[type=password]:not(.browser-default)[readonly="readonly"],
3735
+ input[type=email]:not(.browser-default):disabled,
3736
+ input[type=email]:not(.browser-default)[readonly="readonly"],
3737
+ input[type=url]:not(.browser-default):disabled,
3738
+ input[type=url]:not(.browser-default)[readonly="readonly"],
3739
+ input[type=time]:not(.browser-default):disabled,
3740
+ input[type=time]:not(.browser-default)[readonly="readonly"],
3741
+ input[type=date]:not(.browser-default):disabled,
3742
+ input[type=date]:not(.browser-default)[readonly="readonly"],
3743
+ input[type=datetime]:not(.browser-default):disabled,
3744
+ input[type=datetime]:not(.browser-default)[readonly="readonly"],
3745
+ input[type=datetime-local]:not(.browser-default):disabled,
3746
+ input[type=datetime-local]:not(.browser-default)[readonly="readonly"],
3747
+ input[type=tel]:not(.browser-default):disabled,
3748
+ input[type=tel]:not(.browser-default)[readonly="readonly"],
3749
+ input[type=number]:not(.browser-default):disabled,
3750
+ input[type=number]:not(.browser-default)[readonly="readonly"],
3751
+ input[type=search]:not(.browser-default):disabled,
3752
+ input[type=search]:not(.browser-default)[readonly="readonly"],
3753
+ textarea.materialize-textarea:disabled,
3754
+ textarea.materialize-textarea[readonly="readonly"] {
3755
+ color: rgba(0, 0, 0, 0.42);
3756
+ border-bottom: 1px dotted rgba(0, 0, 0, 0.42); }
3757
+ input:not([type]):disabled + label,
3758
+ input:not([type])[readonly="readonly"] + label,
3759
+ input[type=text]:not(.browser-default):disabled + label,
3760
+ input[type=text]:not(.browser-default)[readonly="readonly"] + label,
3761
+ input[type=password]:not(.browser-default):disabled + label,
3762
+ input[type=password]:not(.browser-default)[readonly="readonly"] + label,
3763
+ input[type=email]:not(.browser-default):disabled + label,
3764
+ input[type=email]:not(.browser-default)[readonly="readonly"] + label,
3765
+ input[type=url]:not(.browser-default):disabled + label,
3766
+ input[type=url]:not(.browser-default)[readonly="readonly"] + label,
3767
+ input[type=time]:not(.browser-default):disabled + label,
3768
+ input[type=time]:not(.browser-default)[readonly="readonly"] + label,
3769
+ input[type=date]:not(.browser-default):disabled + label,
3770
+ input[type=date]:not(.browser-default)[readonly="readonly"] + label,
3771
+ input[type=datetime]:not(.browser-default):disabled + label,
3772
+ input[type=datetime]:not(.browser-default)[readonly="readonly"] + label,
3773
+ input[type=datetime-local]:not(.browser-default):disabled + label,
3774
+ input[type=datetime-local]:not(.browser-default)[readonly="readonly"] + label,
3775
+ input[type=tel]:not(.browser-default):disabled + label,
3776
+ input[type=tel]:not(.browser-default)[readonly="readonly"] + label,
3777
+ input[type=number]:not(.browser-default):disabled + label,
3778
+ input[type=number]:not(.browser-default)[readonly="readonly"] + label,
3779
+ input[type=search]:not(.browser-default):disabled + label,
3780
+ input[type=search]:not(.browser-default)[readonly="readonly"] + label,
3781
+ textarea.materialize-textarea:disabled + label,
3782
+ textarea.materialize-textarea[readonly="readonly"] + label {
3783
+ color: rgba(0, 0, 0, 0.42); }
3784
+ input:not([type]):focus:not([readonly]),
3785
+ input[type=text]:not(.browser-default):focus:not([readonly]),
3786
+ input[type=password]:not(.browser-default):focus:not([readonly]),
3787
+ input[type=email]:not(.browser-default):focus:not([readonly]),
3788
+ input[type=url]:not(.browser-default):focus:not([readonly]),
3789
+ input[type=time]:not(.browser-default):focus:not([readonly]),
3790
+ input[type=date]:not(.browser-default):focus:not([readonly]),
3791
+ input[type=datetime]:not(.browser-default):focus:not([readonly]),
3792
+ input[type=datetime-local]:not(.browser-default):focus:not([readonly]),
3793
+ input[type=tel]:not(.browser-default):focus:not([readonly]),
3794
+ input[type=number]:not(.browser-default):focus:not([readonly]),
3795
+ input[type=search]:not(.browser-default):focus:not([readonly]),
3796
+ textarea.materialize-textarea:focus:not([readonly]) {
3797
+ border-bottom: 1px solid #26a69a;
3798
+ box-shadow: 0 1px 0 0 #26a69a; }
3799
+ input:not([type]):focus:not([readonly]) + label,
3800
+ input[type=text]:not(.browser-default):focus:not([readonly]) + label,
3801
+ input[type=password]:not(.browser-default):focus:not([readonly]) + label,
3802
+ input[type=email]:not(.browser-default):focus:not([readonly]) + label,
3803
+ input[type=url]:not(.browser-default):focus:not([readonly]) + label,
3804
+ input[type=time]:not(.browser-default):focus:not([readonly]) + label,
3805
+ input[type=date]:not(.browser-default):focus:not([readonly]) + label,
3806
+ input[type=datetime]:not(.browser-default):focus:not([readonly]) + label,
3807
+ input[type=datetime-local]:not(.browser-default):focus:not([readonly]) + label,
3808
+ input[type=tel]:not(.browser-default):focus:not([readonly]) + label,
3809
+ input[type=number]:not(.browser-default):focus:not([readonly]) + label,
3810
+ input[type=search]:not(.browser-default):focus:not([readonly]) + label,
3811
+ textarea.materialize-textarea:focus:not([readonly]) + label {
3812
+ color: #26a69a; }
3813
+ input:not([type]).validate + label,
3814
+ input[type=text]:not(.browser-default).validate + label,
3815
+ input[type=password]:not(.browser-default).validate + label,
3816
+ input[type=email]:not(.browser-default).validate + label,
3817
+ input[type=url]:not(.browser-default).validate + label,
3818
+ input[type=time]:not(.browser-default).validate + label,
3819
+ input[type=date]:not(.browser-default).validate + label,
3820
+ input[type=datetime]:not(.browser-default).validate + label,
3821
+ input[type=datetime-local]:not(.browser-default).validate + label,
3822
+ input[type=tel]:not(.browser-default).validate + label,
3823
+ input[type=number]:not(.browser-default).validate + label,
3824
+ input[type=search]:not(.browser-default).validate + label,
3825
+ textarea.materialize-textarea.validate + label {
3826
+ width: 100%; }
3827
+ input:not([type]).invalid + label:after,
3828
+ input:not([type]).valid + label:after,
3829
+ input[type=text]:not(.browser-default).invalid + label:after,
3830
+ input[type=text]:not(.browser-default).valid + label:after,
3831
+ input[type=password]:not(.browser-default).invalid + label:after,
3832
+ input[type=password]:not(.browser-default).valid + label:after,
3833
+ input[type=email]:not(.browser-default).invalid + label:after,
3834
+ input[type=email]:not(.browser-default).valid + label:after,
3835
+ input[type=url]:not(.browser-default).invalid + label:after,
3836
+ input[type=url]:not(.browser-default).valid + label:after,
3837
+ input[type=time]:not(.browser-default).invalid + label:after,
3838
+ input[type=time]:not(.browser-default).valid + label:after,
3839
+ input[type=date]:not(.browser-default).invalid + label:after,
3840
+ input[type=date]:not(.browser-default).valid + label:after,
3841
+ input[type=datetime]:not(.browser-default).invalid + label:after,
3842
+ input[type=datetime]:not(.browser-default).valid + label:after,
3843
+ input[type=datetime-local]:not(.browser-default).invalid + label:after,
3844
+ input[type=datetime-local]:not(.browser-default).valid + label:after,
3845
+ input[type=tel]:not(.browser-default).invalid + label:after,
3846
+ input[type=tel]:not(.browser-default).valid + label:after,
3847
+ input[type=number]:not(.browser-default).invalid + label:after,
3848
+ input[type=number]:not(.browser-default).valid + label:after,
3849
+ input[type=search]:not(.browser-default).invalid + label:after,
3850
+ input[type=search]:not(.browser-default).valid + label:after,
3851
+ textarea.materialize-textarea.invalid + label:after,
3852
+ textarea.materialize-textarea.valid + label:after {
3853
+ display: none; }
3854
+ input:not([type]).invalid + label.active:after,
3855
+ input:not([type]).valid + label.active:after,
3856
+ input[type=text]:not(.browser-default).invalid + label.active:after,
3857
+ input[type=text]:not(.browser-default).valid + label.active:after,
3858
+ input[type=password]:not(.browser-default).invalid + label.active:after,
3859
+ input[type=password]:not(.browser-default).valid + label.active:after,
3860
+ input[type=email]:not(.browser-default).invalid + label.active:after,
3861
+ input[type=email]:not(.browser-default).valid + label.active:after,
3862
+ input[type=url]:not(.browser-default).invalid + label.active:after,
3863
+ input[type=url]:not(.browser-default).valid + label.active:after,
3864
+ input[type=time]:not(.browser-default).invalid + label.active:after,
3865
+ input[type=time]:not(.browser-default).valid + label.active:after,
3866
+ input[type=date]:not(.browser-default).invalid + label.active:after,
3867
+ input[type=date]:not(.browser-default).valid + label.active:after,
3868
+ input[type=datetime]:not(.browser-default).invalid + label.active:after,
3869
+ input[type=datetime]:not(.browser-default).valid + label.active:after,
3870
+ input[type=datetime-local]:not(.browser-default).invalid + label.active:after,
3871
+ input[type=datetime-local]:not(.browser-default).valid + label.active:after,
3872
+ input[type=tel]:not(.browser-default).invalid + label.active:after,
3873
+ input[type=tel]:not(.browser-default).valid + label.active:after,
3874
+ input[type=number]:not(.browser-default).invalid + label.active:after,
3875
+ input[type=number]:not(.browser-default).valid + label.active:after,
3876
+ input[type=search]:not(.browser-default).invalid + label.active:after,
3877
+ input[type=search]:not(.browser-default).valid + label.active:after,
3878
+ textarea.materialize-textarea.invalid + label.active:after,
3879
+ textarea.materialize-textarea.valid + label.active:after {
3880
+ display: block; }
3881
+
3882
+ /* Validation Sass Placeholders */
3883
+ input.valid:not([type]), input.valid:not([type]):focus,
3884
+ input[type=text].valid:not(.browser-default),
3885
+ input[type=text].valid:not(.browser-default):focus,
3886
+ input[type=password].valid:not(.browser-default),
3887
+ input[type=password].valid:not(.browser-default):focus,
3888
+ input[type=email].valid:not(.browser-default),
3889
+ input[type=email].valid:not(.browser-default):focus,
3890
+ input[type=url].valid:not(.browser-default),
3891
+ input[type=url].valid:not(.browser-default):focus,
3892
+ input[type=time].valid:not(.browser-default),
3893
+ input[type=time].valid:not(.browser-default):focus,
3894
+ input[type=date].valid:not(.browser-default),
3895
+ input[type=date].valid:not(.browser-default):focus,
3896
+ input[type=datetime].valid:not(.browser-default),
3897
+ input[type=datetime].valid:not(.browser-default):focus,
3898
+ input[type=datetime-local].valid:not(.browser-default),
3899
+ input[type=datetime-local].valid:not(.browser-default):focus,
3900
+ input[type=tel].valid:not(.browser-default),
3901
+ input[type=tel].valid:not(.browser-default):focus,
3902
+ input[type=number].valid:not(.browser-default),
3903
+ input[type=number].valid:not(.browser-default):focus,
3904
+ input[type=search].valid:not(.browser-default),
3905
+ input[type=search].valid:not(.browser-default):focus,
3906
+ textarea.materialize-textarea.valid,
3907
+ textarea.materialize-textarea.valid:focus, .select-wrapper.valid > input.select-dropdown {
3908
+ border-bottom: 1px solid #4CAF50;
3909
+ box-shadow: 0 1px 0 0 #4CAF50; }
3910
+
3911
+ input.invalid:not([type]), input.invalid:not([type]):focus,
3912
+ input[type=text].invalid:not(.browser-default),
3913
+ input[type=text].invalid:not(.browser-default):focus,
3914
+ input[type=password].invalid:not(.browser-default),
3915
+ input[type=password].invalid:not(.browser-default):focus,
3916
+ input[type=email].invalid:not(.browser-default),
3917
+ input[type=email].invalid:not(.browser-default):focus,
3918
+ input[type=url].invalid:not(.browser-default),
3919
+ input[type=url].invalid:not(.browser-default):focus,
3920
+ input[type=time].invalid:not(.browser-default),
3921
+ input[type=time].invalid:not(.browser-default):focus,
3922
+ input[type=date].invalid:not(.browser-default),
3923
+ input[type=date].invalid:not(.browser-default):focus,
3924
+ input[type=datetime].invalid:not(.browser-default),
3925
+ input[type=datetime].invalid:not(.browser-default):focus,
3926
+ input[type=datetime-local].invalid:not(.browser-default),
3927
+ input[type=datetime-local].invalid:not(.browser-default):focus,
3928
+ input[type=tel].invalid:not(.browser-default),
3929
+ input[type=tel].invalid:not(.browser-default):focus,
3930
+ input[type=number].invalid:not(.browser-default),
3931
+ input[type=number].invalid:not(.browser-default):focus,
3932
+ input[type=search].invalid:not(.browser-default),
3933
+ input[type=search].invalid:not(.browser-default):focus,
3934
+ textarea.materialize-textarea.invalid,
3935
+ textarea.materialize-textarea.invalid:focus, .select-wrapper.invalid > input.select-dropdown {
3936
+ border-bottom: 1px solid #F44336;
3937
+ box-shadow: 0 1px 0 0 #F44336; }
3938
+
3939
+ input:not([type]).valid + label:after,
3940
+ input:not([type]):focus.valid + label:after,
3941
+ input[type=text]:not(.browser-default).valid + label:after,
3942
+ input[type=text]:not(.browser-default):focus.valid + label:after,
3943
+ input[type=password]:not(.browser-default).valid + label:after,
3944
+ input[type=password]:not(.browser-default):focus.valid + label:after,
3945
+ input[type=email]:not(.browser-default).valid + label:after,
3946
+ input[type=email]:not(.browser-default):focus.valid + label:after,
3947
+ input[type=url]:not(.browser-default).valid + label:after,
3948
+ input[type=url]:not(.browser-default):focus.valid + label:after,
3949
+ input[type=time]:not(.browser-default).valid + label:after,
3950
+ input[type=time]:not(.browser-default):focus.valid + label:after,
3951
+ input[type=date]:not(.browser-default).valid + label:after,
3952
+ input[type=date]:not(.browser-default):focus.valid + label:after,
3953
+ input[type=datetime]:not(.browser-default).valid + label:after,
3954
+ input[type=datetime]:not(.browser-default):focus.valid + label:after,
3955
+ input[type=datetime-local]:not(.browser-default).valid + label:after,
3956
+ input[type=datetime-local]:not(.browser-default):focus.valid + label:after,
3957
+ input[type=tel]:not(.browser-default).valid + label:after,
3958
+ input[type=tel]:not(.browser-default):focus.valid + label:after,
3959
+ input[type=number]:not(.browser-default).valid + label:after,
3960
+ input[type=number]:not(.browser-default):focus.valid + label:after,
3961
+ input[type=search]:not(.browser-default).valid + label:after,
3962
+ input[type=search]:not(.browser-default):focus.valid + label:after,
3963
+ textarea.materialize-textarea.valid + label:after,
3964
+ textarea.materialize-textarea:focus.valid + label:after, .select-wrapper.valid + label:after {
3965
+ content: attr(data-success);
3966
+ color: #4CAF50;
3967
+ opacity: 1;
3968
+ transform: translateY(9px); }
3969
+
3970
+ input:not([type]).invalid + label:after,
3971
+ input:not([type]):focus.invalid + label:after,
3972
+ input[type=text]:not(.browser-default).invalid + label:after,
3973
+ input[type=text]:not(.browser-default):focus.invalid + label:after,
3974
+ input[type=password]:not(.browser-default).invalid + label:after,
3975
+ input[type=password]:not(.browser-default):focus.invalid + label:after,
3976
+ input[type=email]:not(.browser-default).invalid + label:after,
3977
+ input[type=email]:not(.browser-default):focus.invalid + label:after,
3978
+ input[type=url]:not(.browser-default).invalid + label:after,
3979
+ input[type=url]:not(.browser-default):focus.invalid + label:after,
3980
+ input[type=time]:not(.browser-default).invalid + label:after,
3981
+ input[type=time]:not(.browser-default):focus.invalid + label:after,
3982
+ input[type=date]:not(.browser-default).invalid + label:after,
3983
+ input[type=date]:not(.browser-default):focus.invalid + label:after,
3984
+ input[type=datetime]:not(.browser-default).invalid + label:after,
3985
+ input[type=datetime]:not(.browser-default):focus.invalid + label:after,
3986
+ input[type=datetime-local]:not(.browser-default).invalid + label:after,
3987
+ input[type=datetime-local]:not(.browser-default):focus.invalid + label:after,
3988
+ input[type=tel]:not(.browser-default).invalid + label:after,
3989
+ input[type=tel]:not(.browser-default):focus.invalid + label:after,
3990
+ input[type=number]:not(.browser-default).invalid + label:after,
3991
+ input[type=number]:not(.browser-default):focus.invalid + label:after,
3992
+ input[type=search]:not(.browser-default).invalid + label:after,
3993
+ input[type=search]:not(.browser-default):focus.invalid + label:after,
3994
+ textarea.materialize-textarea.invalid + label:after,
3995
+ textarea.materialize-textarea:focus.invalid + label:after, .select-wrapper.invalid + label:after {
3996
+ content: attr(data-error);
3997
+ color: #F44336;
3998
+ opacity: 1;
3999
+ transform: translateY(9px); }
4000
+
4001
+ input:not([type]) + label:after,
4002
+ input[type=text]:not(.browser-default) + label:after,
4003
+ input[type=password]:not(.browser-default) + label:after,
4004
+ input[type=email]:not(.browser-default) + label:after,
4005
+ input[type=url]:not(.browser-default) + label:after,
4006
+ input[type=time]:not(.browser-default) + label:after,
4007
+ input[type=date]:not(.browser-default) + label:after,
4008
+ input[type=datetime]:not(.browser-default) + label:after,
4009
+ input[type=datetime-local]:not(.browser-default) + label:after,
4010
+ input[type=tel]:not(.browser-default) + label:after,
4011
+ input[type=number]:not(.browser-default) + label:after,
4012
+ input[type=search]:not(.browser-default) + label:after,
4013
+ textarea.materialize-textarea + label:after, .select-wrapper + label:after {
4014
+ display: block;
4015
+ content: "";
4016
+ position: absolute;
4017
+ top: 100%;
4018
+ left: 0;
4019
+ opacity: 0;
4020
+ transition: .2s opacity ease-out, .2s color ease-out; }
4021
+
4022
+ .input-field {
4023
+ position: relative;
4024
+ margin-top: 1rem; }
4025
+ .input-field.inline {
4026
+ display: inline-block;
4027
+ vertical-align: middle;
4028
+ margin-left: 5px; }
4029
+ .input-field.inline input,
4030
+ .input-field.inline .select-dropdown {
4031
+ margin-bottom: 1rem; }
4032
+ .input-field.col label {
4033
+ left: 0.75rem; }
4034
+ .input-field.col .prefix ~ label,
4035
+ .input-field.col .prefix ~ .validate ~ label {
4036
+ width: calc(100% - 3rem - 1.5rem); }
4037
+ .input-field label {
4038
+ color: #9e9e9e;
4039
+ position: absolute;
4040
+ top: 0;
4041
+ left: 0;
4042
+ height: 100%;
4043
+ font-size: 1rem;
4044
+ cursor: text;
4045
+ transition: transform .2s ease-out;
4046
+ transform-origin: 0% 100%;
4047
+ text-align: initial;
4048
+ transform: translateY(12px);
4049
+ pointer-events: none; }
4050
+ .input-field label:not(.label-icon).active {
4051
+ transform: translateY(-14px) scale(0.8);
4052
+ transform-origin: 0 0; }
4053
+ .input-field .prefix {
4054
+ position: absolute;
4055
+ width: 3rem;
4056
+ font-size: 2rem;
4057
+ transition: color .2s; }
4058
+ .input-field .prefix.active {
4059
+ color: #26a69a; }
4060
+ .input-field .prefix ~ input,
4061
+ .input-field .prefix ~ textarea,
4062
+ .input-field .prefix ~ label,
4063
+ .input-field .prefix ~ .validate ~ label,
4064
+ .input-field .prefix ~ .autocomplete-content {
4065
+ margin-left: 3rem;
4066
+ width: 92%;
4067
+ width: calc(100% - 3rem); }
4068
+ .input-field .prefix ~ label {
4069
+ margin-left: 3rem; }
4070
+ @media only screen and (max-width: 992px) {
4071
+ .input-field .prefix ~ input {
4072
+ width: 86%;
4073
+ width: calc(100% - 3rem); } }
4074
+ @media only screen and (max-width: 600px) {
4075
+ .input-field .prefix ~ input {
4076
+ width: 80%;
4077
+ width: calc(100% - 3rem); } }
4078
+
4079
+ /* Search Field */
4080
+ .input-field input[type=search] {
4081
+ display: block;
4082
+ line-height: inherit; }
4083
+ .nav-wrapper .input-field input[type=search] {
4084
+ height: inherit;
4085
+ padding-left: 4rem;
4086
+ width: calc(100% - 4rem);
4087
+ border: 0;
4088
+ box-shadow: none; }
4089
+ .input-field input[type=search]:focus {
4090
+ background-color: #fff;
4091
+ border: 0;
4092
+ box-shadow: none;
4093
+ color: #444; }
4094
+ .input-field input[type=search]:focus + label i,
4095
+ .input-field input[type=search]:focus ~ .mdi-navigation-close,
4096
+ .input-field input[type=search]:focus ~ .material-icons {
4097
+ color: #444; }
4098
+ .input-field input[type=search] + label {
4099
+ left: 1rem; }
4100
+ .input-field input[type=search] ~ .mdi-navigation-close,
4101
+ .input-field input[type=search] ~ .material-icons {
4102
+ position: absolute;
4103
+ top: 0;
4104
+ right: 1rem;
4105
+ color: transparent;
4106
+ cursor: pointer;
4107
+ font-size: 2rem;
4108
+ transition: .3s color; }
4109
+
4110
+ /* Textarea */
4111
+ textarea {
4112
+ width: 100%;
4113
+ height: 3rem;
4114
+ background-color: transparent; }
4115
+ textarea.materialize-textarea {
4116
+ overflow-y: hidden;
4117
+ /* prevents scroll bar flash */
4118
+ padding: .8rem 0 1.6rem 0;
4119
+ /* prevents text jump on Enter keypress */
4120
+ resize: none;
4121
+ min-height: 3rem; }
4122
+ textarea.materialize-textarea.validate + label {
4123
+ height: 100%; }
4124
+ textarea.materialize-textarea.validate + label::after {
4125
+ top: calc(100% - 12px); }
4126
+ textarea.materialize-textarea.validate + label:not(.label-icon).active {
4127
+ transform: translateY(-25px); }
4128
+
4129
+ .hiddendiv {
4130
+ display: none;
4131
+ white-space: pre-wrap;
4132
+ word-wrap: break-word;
4133
+ overflow-wrap: break-word;
4134
+ /* future version of deprecated 'word-wrap' */
4135
+ padding-top: 1.2rem;
4136
+ /* prevents text jump on Enter keypress */
4137
+ position: absolute;
4138
+ top: 0; }
4139
+
4140
+ /* Autocomplete */
4141
+ .autocomplete-content {
4142
+ margin-top: -20px;
4143
+ margin-bottom: 20px;
4144
+ display: block;
4145
+ opacity: 1;
4146
+ position: static; }
4147
+ .autocomplete-content li .highlight {
4148
+ color: #444; }
4149
+ .autocomplete-content li img {
4150
+ height: 40px;
4151
+ width: 40px;
4152
+ margin: 5px 15px; }
4153
+
4154
+ /* Radio Buttons
4155
+ ========================================================================== */
4156
+ [type="radio"]:not(:checked),
4157
+ [type="radio"]:checked {
4158
+ position: absolute;
4159
+ opacity: 0;
4160
+ pointer-events: none; }
4161
+
4162
+ [type="radio"]:not(:checked) + label,
4163
+ [type="radio"]:checked + label {
4164
+ position: relative;
4165
+ padding-left: 35px;
4166
+ cursor: pointer;
4167
+ display: inline-block;
4168
+ height: 25px;
4169
+ line-height: 25px;
4170
+ font-size: 1rem;
4171
+ transition: .28s ease;
4172
+ user-select: none; }
4173
+
4174
+ [type="radio"] + label:before,
4175
+ [type="radio"] + label:after {
4176
+ content: '';
4177
+ position: absolute;
4178
+ left: 0;
4179
+ top: 0;
4180
+ margin: 4px;
4181
+ width: 16px;
4182
+ height: 16px;
4183
+ z-index: 0;
4184
+ transition: .28s ease; }
4185
+
4186
+ /* Unchecked styles */
4187
+ [type="radio"]:not(:checked) + label:before,
4188
+ [type="radio"]:not(:checked) + label:after,
4189
+ [type="radio"]:checked + label:before,
4190
+ [type="radio"]:checked + label:after,
4191
+ [type="radio"].with-gap:checked + label:before,
4192
+ [type="radio"].with-gap:checked + label:after {
4193
+ border-radius: 50%; }
4194
+
4195
+ [type="radio"]:not(:checked) + label:before,
4196
+ [type="radio"]:not(:checked) + label:after {
4197
+ border: 2px solid #5a5a5a; }
4198
+
4199
+ [type="radio"]:not(:checked) + label:after {
4200
+ transform: scale(0); }
4201
+
4202
+ /* Checked styles */
4203
+ [type="radio"]:checked + label:before {
4204
+ border: 2px solid transparent; }
4205
+
4206
+ [type="radio"]:checked + label:after,
4207
+ [type="radio"].with-gap:checked + label:before,
4208
+ [type="radio"].with-gap:checked + label:after {
4209
+ border: 2px solid #26a69a; }
4210
+
4211
+ [type="radio"]:checked + label:after,
4212
+ [type="radio"].with-gap:checked + label:after {
4213
+ background-color: #26a69a; }
4214
+
4215
+ [type="radio"]:checked + label:after {
4216
+ transform: scale(1.02); }
4217
+
4218
+ /* Radio With gap */
4219
+ [type="radio"].with-gap:checked + label:after {
4220
+ transform: scale(0.5); }
4221
+
4222
+ /* Focused styles */
4223
+ [type="radio"].tabbed:focus + label:before {
4224
+ box-shadow: 0 0 0 10px rgba(0, 0, 0, 0.1); }
4225
+
4226
+ /* Disabled Radio With gap */
4227
+ [type="radio"].with-gap:disabled:checked + label:before {
4228
+ border: 2px solid rgba(0, 0, 0, 0.42); }
4229
+
4230
+ [type="radio"].with-gap:disabled:checked + label:after {
4231
+ border: none;
4232
+ background-color: rgba(0, 0, 0, 0.42); }
4233
+
4234
+ /* Disabled style */
4235
+ [type="radio"]:disabled:not(:checked) + label:before,
4236
+ [type="radio"]:disabled:checked + label:before {
4237
+ background-color: transparent;
4238
+ border-color: rgba(0, 0, 0, 0.42); }
4239
+
4240
+ [type="radio"]:disabled + label {
4241
+ color: rgba(0, 0, 0, 0.42); }
4242
+
4243
+ [type="radio"]:disabled:not(:checked) + label:before {
4244
+ border-color: rgba(0, 0, 0, 0.42); }
4245
+
4246
+ [type="radio"]:disabled:checked + label:after {
4247
+ background-color: rgba(0, 0, 0, 0.42);
4248
+ border-color: #949494; }
4249
+
4250
+ /* Checkboxes
4251
+ ========================================================================== */
4252
+ /* CUSTOM CSS CHECKBOXES */
4253
+ form p {
4254
+ margin-bottom: 10px;
4255
+ text-align: left; }
4256
+
4257
+ form p:last-child {
4258
+ margin-bottom: 0; }
4259
+
4260
+ /* Remove default checkbox */
4261
+ [type="checkbox"]:not(:checked),
4262
+ [type="checkbox"]:checked {
4263
+ position: absolute;
4264
+ opacity: 0;
4265
+ pointer-events: none; }
4266
+
4267
+ [type="checkbox"] {
4268
+ /* checkbox aspect */ }
4269
+ [type="checkbox"] + label {
4270
+ position: relative;
4271
+ padding-left: 35px;
4272
+ cursor: pointer;
4273
+ display: inline-block;
4274
+ height: 25px;
4275
+ line-height: 25px;
4276
+ font-size: 1rem;
4277
+ user-select: none; }
4278
+ [type="checkbox"] + label:before,
4279
+ [type="checkbox"]:not(.filled-in) + label:after {
4280
+ content: '';
4281
+ position: absolute;
4282
+ top: 0;
4283
+ left: 0;
4284
+ width: 18px;
4285
+ height: 18px;
4286
+ z-index: 0;
4287
+ border: 2px solid #5a5a5a;
4288
+ border-radius: 1px;
4289
+ margin-top: 2px;
4290
+ transition: .2s; }
4291
+ [type="checkbox"]:not(.filled-in) + label:after {
4292
+ border: 0;
4293
+ transform: scale(0); }
4294
+ [type="checkbox"]:not(:checked):disabled + label:before {
4295
+ border: none;
4296
+ background-color: rgba(0, 0, 0, 0.42); }
4297
+ [type="checkbox"].tabbed:focus + label:after {
4298
+ transform: scale(1);
4299
+ border: 0;
4300
+ border-radius: 50%;
4301
+ box-shadow: 0 0 0 10px rgba(0, 0, 0, 0.1);
4302
+ background-color: rgba(0, 0, 0, 0.1); }
4303
+
4304
+ [type="checkbox"]:checked + label:before {
4305
+ top: -4px;
4306
+ left: -5px;
4307
+ width: 12px;
4308
+ height: 22px;
4309
+ border-top: 2px solid transparent;
4310
+ border-left: 2px solid transparent;
4311
+ border-right: 2px solid #26a69a;
4312
+ border-bottom: 2px solid #26a69a;
4313
+ transform: rotate(40deg);
4314
+ backface-visibility: hidden;
4315
+ transform-origin: 100% 100%; }
4316
+
4317
+ [type="checkbox"]:checked:disabled + label:before {
4318
+ border-right: 2px solid rgba(0, 0, 0, 0.42);
4319
+ border-bottom: 2px solid rgba(0, 0, 0, 0.42); }
4320
+
4321
+ /* Indeterminate checkbox */
4322
+ [type="checkbox"]:indeterminate + label:before {
4323
+ top: -11px;
4324
+ left: -12px;
4325
+ width: 10px;
4326
+ height: 22px;
4327
+ border-top: none;
4328
+ border-left: none;
4329
+ border-right: 2px solid #26a69a;
4330
+ border-bottom: none;
4331
+ transform: rotate(90deg);
4332
+ backface-visibility: hidden;
4333
+ transform-origin: 100% 100%; }
4334
+
4335
+ [type="checkbox"]:indeterminate:disabled + label:before {
4336
+ border-right: 2px solid rgba(0, 0, 0, 0.42);
4337
+ background-color: transparent; }
4338
+
4339
+ [type="checkbox"].filled-in + label:after {
4340
+ border-radius: 2px; }
4341
+
4342
+ [type="checkbox"].filled-in + label:before,
4343
+ [type="checkbox"].filled-in + label:after {
4344
+ content: '';
4345
+ left: 0;
4346
+ position: absolute;
4347
+ /* .1s delay is for check animation */
4348
+ transition: border .25s, background-color .25s, width .20s .1s, height .20s .1s, top .20s .1s, left .20s .1s;
4349
+ z-index: 1; }
4350
+
4351
+ [type="checkbox"].filled-in:not(:checked) + label:before {
4352
+ width: 0;
4353
+ height: 0;
4354
+ border: 3px solid transparent;
4355
+ left: 6px;
4356
+ top: 10px;
4357
+ transform: rotateZ(37deg);
4358
+ transform-origin: 100% 100%; }
4359
+
4360
+ [type="checkbox"].filled-in:not(:checked) + label:after {
4361
+ height: 20px;
4362
+ width: 20px;
4363
+ background-color: transparent;
4364
+ border: 2px solid #5a5a5a;
4365
+ top: 0px;
4366
+ z-index: 0; }
4367
+
4368
+ [type="checkbox"].filled-in:checked + label:before {
4369
+ top: 0;
4370
+ left: 1px;
4371
+ width: 8px;
4372
+ height: 13px;
4373
+ border-top: 2px solid transparent;
4374
+ border-left: 2px solid transparent;
4375
+ border-right: 2px solid #fff;
4376
+ border-bottom: 2px solid #fff;
4377
+ transform: rotateZ(37deg);
4378
+ transform-origin: 100% 100%; }
4379
+
4380
+ [type="checkbox"].filled-in:checked + label:after {
4381
+ top: 0;
4382
+ width: 20px;
4383
+ height: 20px;
4384
+ border: 2px solid #26a69a;
4385
+ background-color: #26a69a;
4386
+ z-index: 0; }
4387
+
4388
+ [type="checkbox"].filled-in.tabbed:focus + label:after {
4389
+ border-radius: 2px;
4390
+ border-color: #5a5a5a;
4391
+ background-color: rgba(0, 0, 0, 0.1); }
4392
+
4393
+ [type="checkbox"].filled-in.tabbed:checked:focus + label:after {
4394
+ border-radius: 2px;
4395
+ background-color: #26a69a;
4396
+ border-color: #26a69a; }
4397
+
4398
+ [type="checkbox"].filled-in:disabled:not(:checked) + label:before {
4399
+ background-color: transparent;
4400
+ border: 2px solid transparent; }
4401
+
4402
+ [type="checkbox"].filled-in:disabled:not(:checked) + label:after {
4403
+ border-color: transparent;
4404
+ background-color: #949494; }
4405
+
4406
+ [type="checkbox"].filled-in:disabled:checked + label:before {
4407
+ background-color: transparent; }
4408
+
4409
+ [type="checkbox"].filled-in:disabled:checked + label:after {
4410
+ background-color: #949494;
4411
+ border-color: #949494; }
4412
+
4413
+ /* Switch
4414
+ ========================================================================== */
4415
+ .switch,
4416
+ .switch * {
4417
+ -webkit-tap-highlight-color: transparent;
4418
+ user-select: none; }
4419
+
4420
+ .switch label {
4421
+ cursor: pointer; }
4422
+
4423
+ .switch label input[type=checkbox] {
4424
+ opacity: 0;
4425
+ width: 0;
4426
+ height: 0; }
4427
+ .switch label input[type=checkbox]:checked + .lever {
4428
+ background-color: #84c7c1; }
4429
+ .switch label input[type=checkbox]:checked + .lever:before, .switch label input[type=checkbox]:checked + .lever:after {
4430
+ left: 18px; }
4431
+ .switch label input[type=checkbox]:checked + .lever:after {
4432
+ background-color: #26a69a; }
4433
+
4434
+ .switch label .lever {
4435
+ content: "";
4436
+ display: inline-block;
4437
+ position: relative;
4438
+ width: 36px;
4439
+ height: 14px;
4440
+ background-color: rgba(0, 0, 0, 0.38);
4441
+ border-radius: 15px;
4442
+ margin-right: 10px;
4443
+ transition: background 0.3s ease;
4444
+ vertical-align: middle;
4445
+ margin: 0 16px; }
4446
+ .switch label .lever:before, .switch label .lever:after {
4447
+ content: "";
4448
+ position: absolute;
4449
+ display: inline-block;
4450
+ width: 20px;
4451
+ height: 20px;
4452
+ border-radius: 50%;
4453
+ left: 0;
4454
+ top: -3px;
4455
+ transition: left 0.3s ease, background .3s ease, box-shadow 0.1s ease, transform .1s ease; }
4456
+ .switch label .lever:before {
4457
+ background-color: rgba(38, 166, 154, 0.15); }
4458
+ .switch label .lever:after {
4459
+ background-color: #F1F1F1;
4460
+ box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12); }
4461
+
4462
+ input[type=checkbox]:checked:not(:disabled) ~ .lever:active::before,
4463
+ input[type=checkbox]:checked:not(:disabled).tabbed:focus ~ .lever::before {
4464
+ transform: scale(2.4);
4465
+ background-color: rgba(38, 166, 154, 0.15); }
4466
+
4467
+ input[type=checkbox]:not(:disabled) ~ .lever:active:before,
4468
+ input[type=checkbox]:not(:disabled).tabbed:focus ~ .lever::before {
4469
+ transform: scale(2.4);
4470
+ background-color: rgba(0, 0, 0, 0.08); }
4471
+
4472
+ .switch input[type=checkbox][disabled] + .lever {
4473
+ cursor: default;
4474
+ background-color: rgba(0, 0, 0, 0.12); }
4475
+
4476
+ .switch label input[type=checkbox][disabled] + .lever:after,
4477
+ .switch label input[type=checkbox][disabled]:checked + .lever:after {
4478
+ background-color: #949494; }
4479
+
4480
+ /* Select Field
4481
+ ========================================================================== */
4482
+ select {
4483
+ display: none; }
4484
+
4485
+ select.browser-default {
4486
+ display: block; }
4487
+
4488
+ select {
4489
+ background-color: rgba(255, 255, 255, 0.9);
4490
+ width: 100%;
4491
+ padding: 5px;
4492
+ border: 1px solid #f2f2f2;
4493
+ border-radius: 2px;
4494
+ height: 3rem; }
4495
+
4496
+ .input-field select {
4497
+ display: block;
4498
+ position: absolute;
4499
+ width: 0;
4500
+ pointer-events: none;
4501
+ height: 0;
4502
+ top: 0;
4503
+ left: 0;
4504
+ opacity: 0; }
4505
+
4506
+ .select-label {
4507
+ position: absolute; }
4508
+
4509
+ .select-wrapper {
4510
+ position: relative; }
4511
+ .select-wrapper.valid + label,
4512
+ .select-wrapper.invalid + label {
4513
+ width: 100%;
4514
+ pointer-events: none; }
4515
+ .select-wrapper input.select-dropdown {
4516
+ position: relative;
4517
+ cursor: pointer;
4518
+ background-color: transparent;
4519
+ border: none;
4520
+ border-bottom: 1px solid #9e9e9e;
4521
+ outline: none;
4522
+ height: 3rem;
4523
+ line-height: 3rem;
4524
+ width: 100%;
4525
+ font-size: 1rem;
4526
+ margin: 0 0 20px 0;
4527
+ padding: 0;
4528
+ display: block;
4529
+ user-select: none; }
4530
+ .select-wrapper span.caret {
4531
+ color: initial;
4532
+ position: absolute;
4533
+ right: 0;
4534
+ top: 0;
4535
+ bottom: 0;
4536
+ height: 10px;
4537
+ margin: auto 0;
4538
+ font-size: 10px;
4539
+ line-height: 10px; }
4540
+ .select-wrapper + label {
4541
+ position: absolute;
4542
+ top: -26px;
4543
+ font-size: 0.8rem; }
4544
+
4545
+ select:disabled {
4546
+ color: rgba(0, 0, 0, 0.42); }
4547
+
4548
+ .select-wrapper.disabled span.caret,
4549
+ .select-wrapper.disabled + label {
4550
+ color: rgba(0, 0, 0, 0.42); }
4551
+
4552
+ .select-wrapper input.select-dropdown:disabled {
4553
+ color: rgba(0, 0, 0, 0.42);
4554
+ cursor: default;
4555
+ user-select: none; }
4556
+
4557
+ .select-wrapper i {
4558
+ color: rgba(0, 0, 0, 0.3); }
4559
+
4560
+ .select-dropdown li.disabled,
4561
+ .select-dropdown li.disabled > span,
4562
+ .select-dropdown li.optgroup {
4563
+ color: rgba(0, 0, 0, 0.3);
4564
+ background-color: transparent; }
4565
+
4566
+ .select-dropdown.dropdown-content li.active {
4567
+ background-color: transparent; }
4568
+
4569
+ .select-dropdown.dropdown-content li:hover {
4570
+ background-color: rgba(0, 0, 0, 0.06); }
4571
+
4572
+ .select-dropdown.dropdown-content li.selected {
4573
+ background-color: rgba(0, 0, 0, 0.03); }
4574
+
4575
+ .prefix ~ .select-wrapper {
4576
+ margin-left: 3rem;
4577
+ width: 92%;
4578
+ width: calc(100% - 3rem); }
4579
+
4580
+ .prefix ~ label {
4581
+ margin-left: 3rem; }
4582
+
4583
+ .select-dropdown li img {
4584
+ height: 40px;
4585
+ width: 40px;
4586
+ margin: 5px 15px;
4587
+ float: right; }
4588
+
4589
+ .select-dropdown li.optgroup {
4590
+ border-top: 1px solid #eee; }
4591
+ .select-dropdown li.optgroup.selected > span {
4592
+ color: rgba(0, 0, 0, 0.7); }
4593
+ .select-dropdown li.optgroup > span {
4594
+ color: rgba(0, 0, 0, 0.4); }
4595
+ .select-dropdown li.optgroup ~ li.optgroup-option {
4596
+ padding-left: 1rem; }
4597
+
4598
+ /* File Input
4599
+ ========================================================================== */
4600
+ .file-field {
4601
+ position: relative; }
4602
+ .file-field .file-path-wrapper {
4603
+ overflow: hidden;
4604
+ padding-left: 10px; }
4605
+ .file-field input.file-path {
4606
+ width: 100%; }
4607
+ .file-field .btn, .file-field .btn-large {
4608
+ float: left;
4609
+ height: 3rem;
4610
+ line-height: 3rem; }
4611
+ .file-field span {
4612
+ cursor: pointer; }
4613
+ .file-field input[type=file] {
4614
+ position: absolute;
4615
+ top: 0;
4616
+ right: 0;
4617
+ left: 0;
4618
+ bottom: 0;
4619
+ width: 100%;
4620
+ margin: 0;
4621
+ padding: 0;
4622
+ font-size: 20px;
4623
+ cursor: pointer;
4624
+ opacity: 0;
4625
+ filter: alpha(opacity=0); }
4626
+ .file-field input[type=file]::-webkit-file-upload-button {
4627
+ display: none; }
4628
+
4629
+ /* Range
4630
+ ========================================================================== */
4631
+ .range-field {
4632
+ position: relative; }
4633
+
4634
+ input[type=range],
4635
+ input[type=range] + .thumb {
4636
+ cursor: pointer; }
4637
+
4638
+ input[type=range] {
4639
+ position: relative;
4640
+ background-color: transparent;
4641
+ border: none;
4642
+ outline: none;
4643
+ width: 100%;
4644
+ margin: 15px 0;
4645
+ padding: 0; }
4646
+ input[type=range]:focus {
4647
+ outline: none; }
4648
+
4649
+ input[type=range] + .thumb {
4650
+ position: absolute;
4651
+ top: 10px;
4652
+ left: 0;
4653
+ border: none;
4654
+ height: 0;
4655
+ width: 0;
4656
+ border-radius: 50%;
4657
+ background-color: #26a69a;
4658
+ margin-left: 7px;
4659
+ transform-origin: 50% 50%;
4660
+ transform: rotate(-45deg); }
4661
+ input[type=range] + .thumb .value {
4662
+ display: block;
4663
+ width: 30px;
4664
+ text-align: center;
4665
+ color: #26a69a;
4666
+ font-size: 0;
4667
+ transform: rotate(45deg); }
4668
+ input[type=range] + .thumb.active {
4669
+ border-radius: 50% 50% 50% 0; }
4670
+ input[type=range] + .thumb.active .value {
4671
+ color: #fff;
4672
+ margin-left: -1px;
4673
+ margin-top: 8px;
4674
+ font-size: 10px; }
4675
+
4676
+ input[type=range] {
4677
+ -webkit-appearance: none; }
4678
+
4679
+ input[type=range]::-webkit-slider-runnable-track {
4680
+ height: 3px;
4681
+ background: #c2c0c2;
4682
+ border: none; }
4683
+
4684
+ input[type=range]::-webkit-slider-thumb {
4685
+ -webkit-appearance: none;
4686
+ border: none;
4687
+ height: 14px;
4688
+ width: 14px;
4689
+ border-radius: 50%;
4690
+ background-color: #26a69a;
4691
+ transform-origin: 50% 50%;
4692
+ margin: -5px 0 0 0;
4693
+ transition: .3s; }
4694
+
4695
+ input[type=range]:focus::-webkit-slider-runnable-track {
4696
+ background: #ccc; }
4697
+
4698
+ input[type=range] {
4699
+ /* fix for FF unable to apply focus style bug */
4700
+ border: 1px solid white;
4701
+ /*required for proper track sizing in FF*/ }
4702
+
4703
+ input[type=range]::-moz-range-track {
4704
+ height: 3px;
4705
+ background: #ddd;
4706
+ border: none; }
4707
+
4708
+ input[type=range]::-moz-range-thumb {
4709
+ border: none;
4710
+ height: 14px;
4711
+ width: 14px;
4712
+ border-radius: 50%;
4713
+ background: #26a69a;
4714
+ margin-top: -5px; }
4715
+
4716
+ input[type=range]:-moz-focusring {
4717
+ outline: 1px solid #fff;
4718
+ outline-offset: -1px; }
4719
+
4720
+ input[type=range]:focus::-moz-range-track {
4721
+ background: #ccc; }
4722
+
4723
+ input[type=range]::-ms-track {
4724
+ height: 3px;
4725
+ background: transparent;
4726
+ border-color: transparent;
4727
+ border-width: 6px 0;
4728
+ /*remove default tick marks*/
4729
+ color: transparent; }
4730
+
4731
+ input[type=range]::-ms-fill-lower {
4732
+ background: #777; }
4733
+
4734
+ input[type=range]::-ms-fill-upper {
4735
+ background: #ddd; }
4736
+
4737
+ input[type=range]::-ms-thumb {
4738
+ border: none;
4739
+ height: 14px;
4740
+ width: 14px;
4741
+ border-radius: 50%;
4742
+ background: #26a69a; }
4743
+
4744
+ input[type=range]:focus::-ms-fill-lower {
4745
+ background: #888; }
4746
+
4747
+ input[type=range]:focus::-ms-fill-upper {
4748
+ background: #ccc; }
4749
+
4750
+
4751
+
4752
+
4753
+ /* custom styles */
4754
+
4755
+ .display-none {
4756
+ display: none; }
4757
+
4758
+ .display-block {
4759
+ display: block; }
4760
+
4761
+ input.input-margin {
4762
+ margin: 0 0 3px 0 !important; }
4763
+
4764
+ .select-margin .select-1 input {
4765
+ margin: 0 0 3px 0 !important; }
assets/css/main.css ADDED
@@ -0,0 +1,3756 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*
2
+ * icons set
3
+ * Materializecss
4
+ * custom Code
5
+ */
6
+
7
+
8
+ /* ==== custom icons set ==== */
9
+ @font-face {
10
+ font-family: 'ccw';
11
+ src: url(../fonts/ccw.eot);
12
+ src: url(../fonts/ccw.eot#iefix) format('embedded-opentype'),
13
+ url(../fonts/ccw.ttf) format('truetype'),
14
+ url(../fonts/ccw.woff) format('woff'),
15
+ url(../fonts/ccw.svg#ccw) format('svg');
16
+ font-weight: normal;
17
+ font-style: normal;
18
+ }
19
+
20
+ .icon {
21
+ /* use !important to prevent issues with browser extensions that change fonts */
22
+ font-family: 'ccw' !important;
23
+ speak: none;
24
+ font-style: normal;
25
+ font-weight: normal;
26
+ font-variant: normal;
27
+ text-transform: none;
28
+ line-height: 1;
29
+
30
+ /* Better Font Rendering =========== */
31
+ -webkit-font-smoothing: antialiased;
32
+ -moz-osx-font-smoothing: grayscale;
33
+ }
34
+
35
+ .icon-whatsapp2:before {
36
+ content: "\E902";
37
+ }
38
+ .icon-brand:before {
39
+ content: "\E901";
40
+ color: #25d366;
41
+ }
42
+ .icon-send:before {
43
+ content: "\E900";
44
+ }
45
+ .icon-whatsapp:before {
46
+ content: "\EA93";
47
+ }
48
+
49
+ /* ==== Materializecss ==== */
50
+
51
+ /*
52
+ * Materilizecss - http://materializecss.com/
53
+ * To Make this Framework not to conflict with your Theme style,
54
+ * we wrap Materilizecss class with `css_plugin`,
55
+ * that's like adding a root 'ccw_plugin' node on every style
56
+ */
57
+
58
+ .ccw_plugin .materialize-red {
59
+ background-color: #e51c23 !important; }
60
+ .ccw_plugin .materialize-red-text {
61
+ color: #e51c23 !important; }
62
+ .ccw_plugin .materialize-red.lighten-5 {
63
+ background-color: #fdeaeb !important; }
64
+ .ccw_plugin .materialize-red-text.text-lighten-5 {
65
+ color: #fdeaeb !important; }
66
+ .ccw_plugin .materialize-red.lighten-4 {
67
+ background-color: #f8c1c3 !important; }
68
+ .ccw_plugin .materialize-red-text.text-lighten-4 {
69
+ color: #f8c1c3 !important; }
70
+ .ccw_plugin .materialize-red.lighten-3 {
71
+ background-color: #f3989b !important; }
72
+ .ccw_plugin .materialize-red-text.text-lighten-3 {
73
+ color: #f3989b !important; }
74
+ .ccw_plugin .materialize-red.lighten-2 {
75
+ background-color: #ee6e73 !important; }
76
+ .ccw_plugin .materialize-red-text.text-lighten-2 {
77
+ color: #ee6e73 !important; }
78
+ .ccw_plugin .materialize-red.lighten-1 {
79
+ background-color: #ea454b !important; }
80
+ .ccw_plugin .materialize-red-text.text-lighten-1 {
81
+ color: #ea454b !important; }
82
+ .ccw_plugin .materialize-red.darken-1 {
83
+ background-color: #d0181e !important; }
84
+ .ccw_plugin .materialize-red-text.text-darken-1 {
85
+ color: #d0181e !important; }
86
+ .ccw_plugin .materialize-red.darken-2 {
87
+ background-color: #b9151b !important; }
88
+ .ccw_plugin .materialize-red-text.text-darken-2 {
89
+ color: #b9151b !important; }
90
+ .ccw_plugin .materialize-red.darken-3 {
91
+ background-color: #a21318 !important; }
92
+ .ccw_plugin .materialize-red-text.text-darken-3 {
93
+ color: #a21318 !important; }
94
+ .ccw_plugin .materialize-red.darken-4 {
95
+ background-color: #8b1014 !important; }
96
+ .ccw_plugin .materialize-red-text.text-darken-4 {
97
+ color: #8b1014 !important; }
98
+ .ccw_plugin .red {
99
+ background-color: #F44336 !important; }
100
+ .ccw_plugin .red-text {
101
+ color: #F44336 !important; }
102
+ .ccw_plugin .red.lighten-5 {
103
+ background-color: #FFEBEE !important; }
104
+ .ccw_plugin .red-text.text-lighten-5 {
105
+ color: #FFEBEE !important; }
106
+ .ccw_plugin .red.lighten-4 {
107
+ background-color: #FFCDD2 !important; }
108
+ .ccw_plugin .red-text.text-lighten-4 {
109
+ color: #FFCDD2 !important; }
110
+ .ccw_plugin .red.lighten-3 {
111
+ background-color: #EF9A9A !important; }
112
+ .ccw_plugin .red-text.text-lighten-3 {
113
+ color: #EF9A9A !important; }
114
+ .ccw_plugin .red.lighten-2 {
115
+ background-color: #E57373 !important; }
116
+ .ccw_plugin .red-text.text-lighten-2 {
117
+ color: #E57373 !important; }
118
+ .ccw_plugin .red.lighten-1 {
119
+ background-color: #EF5350 !important; }
120
+ .ccw_plugin .red-text.text-lighten-1 {
121
+ color: #EF5350 !important; }
122
+ .ccw_plugin .red.darken-1 {
123
+ background-color: #E53935 !important; }
124
+ .ccw_plugin .red-text.text-darken-1 {
125
+ color: #E53935 !important; }
126
+ .ccw_plugin .red.darken-2 {
127
+ background-color: #D32F2F !important; }
128
+ .ccw_plugin .red-text.text-darken-2 {
129
+ color: #D32F2F !important; }
130
+ .ccw_plugin .red.darken-3 {
131
+ background-color: #C62828 !important; }
132
+ .ccw_plugin .red-text.text-darken-3 {
133
+ color: #C62828 !important; }
134
+ .ccw_plugin .red.darken-4 {
135
+ background-color: #B71C1C !important; }
136
+ .ccw_plugin .red-text.text-darken-4 {
137
+ color: #B71C1C !important; }
138
+ .ccw_plugin .red.accent-1 {
139
+ background-color: #FF8A80 !important; }
140
+ .ccw_plugin .red-text.text-accent-1 {
141
+ color: #FF8A80 !important; }
142
+ .ccw_plugin .red.accent-2 {
143
+ background-color: #FF5252 !important; }
144
+ .ccw_plugin .red-text.text-accent-2 {
145
+ color: #FF5252 !important; }
146
+ .ccw_plugin .red.accent-3 {
147
+ background-color: #FF1744 !important; }
148
+ .ccw_plugin .red-text.text-accent-3 {
149
+ color: #FF1744 !important; }
150
+ .ccw_plugin .red.accent-4 {
151
+ background-color: #D50000 !important; }
152
+ .ccw_plugin .red-text.text-accent-4 {
153
+ color: #D50000 !important; }
154
+ .ccw_plugin .pink {
155
+ background-color: #e91e63 !important; }
156
+ .ccw_plugin .pink-text {
157
+ color: #e91e63 !important; }
158
+ .ccw_plugin .pink.lighten-5 {
159
+ background-color: #fce4ec !important; }
160
+ .ccw_plugin .pink-text.text-lighten-5 {
161
+ color: #fce4ec !important; }
162
+ .ccw_plugin .pink.lighten-4 {
163
+ background-color: #f8bbd0 !important; }
164
+ .ccw_plugin .pink-text.text-lighten-4 {
165
+ color: #f8bbd0 !important; }
166
+ .ccw_plugin .pink.lighten-3 {
167
+ background-color: #f48fb1 !important; }
168
+ .ccw_plugin .pink-text.text-lighten-3 {
169
+ color: #f48fb1 !important; }
170
+ .ccw_plugin .pink.lighten-2 {
171
+ background-color: #f06292 !important; }
172
+ .ccw_plugin .pink-text.text-lighten-2 {
173
+ color: #f06292 !important; }
174
+ .ccw_plugin .pink.lighten-1 {
175
+ background-color: #ec407a !important; }
176
+ .ccw_plugin .pink-text.text-lighten-1 {
177
+ color: #ec407a !important; }
178
+ .ccw_plugin .pink.darken-1 {
179
+ background-color: #d81b60 !important; }
180
+ .ccw_plugin .pink-text.text-darken-1 {
181
+ color: #d81b60 !important; }
182
+ .ccw_plugin .pink.darken-2 {
183
+ background-color: #c2185b !important; }
184
+ .ccw_plugin .pink-text.text-darken-2 {
185
+ color: #c2185b !important; }
186
+ .ccw_plugin .pink.darken-3 {
187
+ background-color: #ad1457 !important; }
188
+ .ccw_plugin .pink-text.text-darken-3 {
189
+ color: #ad1457 !important; }
190
+ .ccw_plugin .pink.darken-4 {
191
+ background-color: #880e4f !important; }
192
+ .ccw_plugin .pink-text.text-darken-4 {
193
+ color: #880e4f !important; }
194
+ .ccw_plugin .pink.accent-1 {
195
+ background-color: #ff80ab !important; }
196
+ .ccw_plugin .pink-text.text-accent-1 {
197
+ color: #ff80ab !important; }
198
+ .ccw_plugin .pink.accent-2 {
199
+ background-color: #ff4081 !important; }
200
+ .ccw_plugin .pink-text.text-accent-2 {
201
+ color: #ff4081 !important; }
202
+ .ccw_plugin .pink.accent-3 {
203
+ background-color: #f50057 !important; }
204
+ .ccw_plugin .pink-text.text-accent-3 {
205
+ color: #f50057 !important; }
206
+ .ccw_plugin .pink.accent-4 {
207
+ background-color: #c51162 !important; }
208
+ .ccw_plugin .pink-text.text-accent-4 {
209
+ color: #c51162 !important; }
210
+ .ccw_plugin .purple {
211
+ background-color: #9c27b0 !important; }
212
+ .ccw_plugin .purple-text {
213
+ color: #9c27b0 !important; }
214
+ .ccw_plugin .purple.lighten-5 {
215
+ background-color: #f3e5f5 !important; }
216
+ .ccw_plugin .purple-text.text-lighten-5 {
217
+ color: #f3e5f5 !important; }
218
+ .ccw_plugin .purple.lighten-4 {
219
+ background-color: #e1bee7 !important; }
220
+ .ccw_plugin .purple-text.text-lighten-4 {
221
+ color: #e1bee7 !important; }
222
+ .ccw_plugin .purple.lighten-3 {
223
+ background-color: #ce93d8 !important; }
224
+ .ccw_plugin .purple-text.text-lighten-3 {
225
+ color: #ce93d8 !important; }
226
+ .ccw_plugin .purple.lighten-2 {
227
+ background-color: #ba68c8 !important; }
228
+ .ccw_plugin .purple-text.text-lighten-2 {
229
+ color: #ba68c8 !important; }
230
+ .ccw_plugin .purple.lighten-1 {
231
+ background-color: #ab47bc !important; }
232
+ .ccw_plugin .purple-text.text-lighten-1 {
233
+ color: #ab47bc !important; }
234
+ .ccw_plugin .purple.darken-1 {
235
+ background-color: #8e24aa !important; }
236
+ .ccw_plugin .purple-text.text-darken-1 {
237
+ color: #8e24aa !important; }
238
+ .ccw_plugin .purple.darken-2 {
239
+ background-color: #7b1fa2 !important; }
240
+ .ccw_plugin .purple-text.text-darken-2 {
241
+ color: #7b1fa2 !important; }
242
+ .ccw_plugin .purple.darken-3 {
243
+ background-color: #6a1b9a !important; }
244
+ .ccw_plugin .purple-text.text-darken-3 {
245
+ color: #6a1b9a !important; }
246
+ .ccw_plugin .purple.darken-4 {
247
+ background-color: #4a148c !important; }
248
+ .ccw_plugin .purple-text.text-darken-4 {
249
+ color: #4a148c !important; }
250
+ .ccw_plugin .purple.accent-1 {
251
+ background-color: #ea80fc !important; }
252
+ .ccw_plugin .purple-text.text-accent-1 {
253
+ color: #ea80fc !important; }
254
+ .ccw_plugin .purple.accent-2 {
255
+ background-color: #e040fb !important; }
256
+ .ccw_plugin .purple-text.text-accent-2 {
257
+ color: #e040fb !important; }
258
+ .ccw_plugin .purple.accent-3 {
259
+ background-color: #d500f9 !important; }
260
+ .ccw_plugin .purple-text.text-accent-3 {
261
+ color: #d500f9 !important; }
262
+ .ccw_plugin .purple.accent-4 {
263
+ background-color: #aa00ff !important; }
264
+ .ccw_plugin .purple-text.text-accent-4 {
265
+ color: #aa00ff !important; }
266
+ .ccw_plugin .deep-purple {
267
+ background-color: #673ab7 !important; }
268
+ .ccw_plugin .deep-purple-text {
269
+ color: #673ab7 !important; }
270
+ .ccw_plugin .deep-purple.lighten-5 {
271
+ background-color: #ede7f6 !important; }
272
+ .ccw_plugin .deep-purple-text.text-lighten-5 {
273
+ color: #ede7f6 !important; }
274
+ .ccw_plugin .deep-purple.lighten-4 {
275
+ background-color: #d1c4e9 !important; }
276
+ .ccw_plugin .deep-purple-text.text-lighten-4 {
277
+ color: #d1c4e9 !important; }
278
+ .ccw_plugin .deep-purple.lighten-3 {
279
+ background-color: #b39ddb !important; }
280
+ .ccw_plugin .deep-purple-text.text-lighten-3 {
281
+ color: #b39ddb !important; }
282
+ .ccw_plugin .deep-purple.lighten-2 {
283
+ background-color: #9575cd !important; }
284
+ .ccw_plugin .deep-purple-text.text-lighten-2 {
285
+ color: #9575cd !important; }
286
+ .ccw_plugin .deep-purple.lighten-1 {
287
+ background-color: #7e57c2 !important; }
288
+ .ccw_plugin .deep-purple-text.text-lighten-1 {
289
+ color: #7e57c2 !important; }
290
+ .ccw_plugin .deep-purple.darken-1 {
291
+ background-color: #5e35b1 !important; }
292
+ .ccw_plugin .deep-purple-text.text-darken-1 {
293
+ color: #5e35b1 !important; }
294
+ .ccw_plugin .deep-purple.darken-2 {
295
+ background-color: #512da8 !important; }
296
+ .ccw_plugin .deep-purple-text.text-darken-2 {
297
+ color: #512da8 !important; }
298
+ .ccw_plugin .deep-purple.darken-3 {
299
+ background-color: #4527a0 !important; }
300
+ .ccw_plugin .deep-purple-text.text-darken-3 {
301
+ color: #4527a0 !important; }
302
+ .ccw_plugin .deep-purple.darken-4 {
303
+ background-color: #311b92 !important; }
304
+ .ccw_plugin .deep-purple-text.text-darken-4 {
305
+ color: #311b92 !important; }
306
+ .ccw_plugin .deep-purple.accent-1 {
307
+ background-color: #b388ff !important; }
308
+ .ccw_plugin .deep-purple-text.text-accent-1 {
309
+ color: #b388ff !important; }
310
+ .ccw_plugin .deep-purple.accent-2 {
311
+ background-color: #7c4dff !important; }
312
+ .ccw_plugin .deep-purple-text.text-accent-2 {
313
+ color: #7c4dff !important; }
314
+ .ccw_plugin .deep-purple.accent-3 {
315
+ background-color: #651fff !important; }
316
+ .ccw_plugin .deep-purple-text.text-accent-3 {
317
+ color: #651fff !important; }
318
+ .ccw_plugin .deep-purple.accent-4 {
319
+ background-color: #6200ea !important; }
320
+ .ccw_plugin .deep-purple-text.text-accent-4 {
321
+ color: #6200ea !important; }
322
+ .ccw_plugin .indigo {
323
+ background-color: #3f51b5 !important; }
324
+ .ccw_plugin .indigo-text {
325
+ color: #3f51b5 !important; }
326
+ .ccw_plugin .indigo.lighten-5 {
327
+ background-color: #e8eaf6 !important; }
328
+ .ccw_plugin .indigo-text.text-lighten-5 {
329
+ color: #e8eaf6 !important; }
330
+ .ccw_plugin .indigo.lighten-4 {
331
+ background-color: #c5cae9 !important; }
332
+ .ccw_plugin .indigo-text.text-lighten-4 {
333
+ color: #c5cae9 !important; }
334
+ .ccw_plugin .indigo.lighten-3 {
335
+ background-color: #9fa8da !important; }
336
+ .ccw_plugin .indigo-text.text-lighten-3 {
337
+ color: #9fa8da !important; }
338
+ .ccw_plugin .indigo.lighten-2 {
339
+ background-color: #7986cb !important; }
340
+ .ccw_plugin .indigo-text.text-lighten-2 {
341
+ color: #7986cb !important; }
342
+ .ccw_plugin .indigo.lighten-1 {
343
+ background-color: #5c6bc0 !important; }
344
+ .ccw_plugin .indigo-text.text-lighten-1 {
345
+ color: #5c6bc0 !important; }
346
+ .ccw_plugin .indigo.darken-1 {
347
+ background-color: #3949ab !important; }
348
+ .ccw_plugin .indigo-text.text-darken-1 {
349
+ color: #3949ab !important; }
350
+ .ccw_plugin .indigo.darken-2 {
351
+ background-color: #303f9f !important; }
352
+ .ccw_plugin .indigo-text.text-darken-2 {
353
+ color: #303f9f !important; }
354
+ .ccw_plugin .indigo.darken-3 {
355
+ background-color: #283593 !important; }
356
+ .ccw_plugin .indigo-text.text-darken-3 {
357
+ color: #283593 !important; }
358
+ .ccw_plugin .indigo.darken-4 {
359
+ background-color: #1a237e !important; }
360
+ .ccw_plugin .indigo-text.text-darken-4 {
361
+ color: #1a237e !important; }
362
+ .ccw_plugin .indigo.accent-1 {
363
+ background-color: #8c9eff !important; }
364
+ .ccw_plugin .indigo-text.text-accent-1 {
365
+ color: #8c9eff !important; }
366
+ .ccw_plugin .indigo.accent-2 {
367
+ background-color: #536dfe !important; }
368
+ .ccw_plugin .indigo-text.text-accent-2 {
369
+ color: #536dfe !important; }
370
+ .ccw_plugin .indigo.accent-3 {
371
+ background-color: #3d5afe !important; }
372
+ .ccw_plugin .indigo-text.text-accent-3 {
373
+ color: #3d5afe !important; }
374
+ .ccw_plugin .indigo.accent-4 {
375
+ background-color: #304ffe !important; }
376
+ .ccw_plugin .indigo-text.text-accent-4 {
377
+ color: #304ffe !important; }
378
+ .ccw_plugin .blue {
379
+ background-color: #2196F3 !important; }
380
+ .ccw_plugin .blue-text {
381
+ color: #2196F3 !important; }
382
+ .ccw_plugin .blue.lighten-5 {
383
+ background-color: #E3F2FD !important; }
384
+ .ccw_plugin .blue-text.text-lighten-5 {
385
+ color: #E3F2FD !important; }
386
+ .ccw_plugin .blue.lighten-4 {
387
+ background-color: #BBDEFB !important; }
388
+ .ccw_plugin .blue-text.text-lighten-4 {
389
+ color: #BBDEFB !important; }
390
+ .ccw_plugin .blue.lighten-3 {
391
+ background-color: #90CAF9 !important; }
392
+ .ccw_plugin .blue-text.text-lighten-3 {
393
+ color: #90CAF9 !important; }
394
+ .ccw_plugin .blue.lighten-2 {
395
+ background-color: #64B5F6 !important; }
396
+ .ccw_plugin .blue-text.text-lighten-2 {
397
+ color: #64B5F6 !important; }
398
+ .ccw_plugin .blue.lighten-1 {
399
+ background-color: #42A5F5 !important; }
400
+ .ccw_plugin .blue-text.text-lighten-1 {
401
+ color: #42A5F5 !important; }
402
+ .ccw_plugin .blue.darken-1 {
403
+ background-color: #1E88E5 !important; }
404
+ .ccw_plugin .blue-text.text-darken-1 {
405
+ color: #1E88E5 !important; }
406
+ .ccw_plugin .blue.darken-2 {
407
+ background-color: #1976D2 !important; }
408
+ .ccw_plugin .blue-text.text-darken-2 {
409
+ color: #1976D2 !important; }
410
+ .ccw_plugin .blue.darken-3 {
411
+ background-color: #1565C0 !important; }
412
+ .ccw_plugin .blue-text.text-darken-3 {
413
+ color: #1565C0 !important; }
414
+ .ccw_plugin .blue.darken-4 {
415
+ background-color: #0D47A1 !important; }
416
+ .ccw_plugin .blue-text.text-darken-4 {
417
+ color: #0D47A1 !important; }
418
+ .ccw_plugin .blue.accent-1 {
419
+ background-color: #82B1FF !important; }
420
+ .ccw_plugin .blue-text.text-accent-1 {
421
+ color: #82B1FF !important; }
422
+ .ccw_plugin .blue.accent-2 {
423
+ background-color: #448AFF !important; }
424
+ .ccw_plugin .blue-text.text-accent-2 {
425
+ color: #448AFF !important; }
426
+ .ccw_plugin .blue.accent-3 {
427
+ background-color: #2979FF !important; }
428
+ .ccw_plugin .blue-text.text-accent-3 {
429
+ color: #2979FF !important; }
430
+ .ccw_plugin .blue.accent-4 {
431
+ background-color: #2962FF !important; }
432
+ .ccw_plugin .blue-text.text-accent-4 {
433
+ color: #2962FF !important; }
434
+ .ccw_plugin .light-blue {
435
+ background-color: #03a9f4 !important; }
436
+ .ccw_plugin .light-blue-text {
437
+ color: #03a9f4 !important; }
438
+ .ccw_plugin .light-blue.lighten-5 {
439
+ background-color: #e1f5fe !important; }
440
+ .ccw_plugin .light-blue-text.text-lighten-5 {
441
+ color: #e1f5fe !important; }
442
+ .ccw_plugin .light-blue.lighten-4 {
443
+ background-color: #b3e5fc !important; }
444
+ .ccw_plugin .light-blue-text.text-lighten-4 {
445
+ color: #b3e5fc !important; }
446
+ .ccw_plugin .light-blue.lighten-3 {
447
+ background-color: #81d4fa !important; }
448
+ .ccw_plugin .light-blue-text.text-lighten-3 {
449
+ color: #81d4fa !important; }
450
+ .ccw_plugin .light-blue.lighten-2 {
451
+ background-color: #4fc3f7 !important; }
452
+ .ccw_plugin .light-blue-text.text-lighten-2 {
453
+ color: #4fc3f7 !important; }
454
+ .ccw_plugin .light-blue.lighten-1 {
455
+ background-color: #29b6f6 !important; }
456
+ .ccw_plugin .light-blue-text.text-lighten-1 {
457
+ color: #29b6f6 !important; }
458
+ .ccw_plugin .light-blue.darken-1 {
459
+ background-color: #039be5 !important; }
460
+ .ccw_plugin .light-blue-text.text-darken-1 {
461
+ color: #039be5 !important; }
462
+ .ccw_plugin .light-blue.darken-2 {
463
+ background-color: #0288d1 !important; }
464
+ .ccw_plugin .light-blue-text.text-darken-2 {
465
+ color: #0288d1 !important; }
466
+ .ccw_plugin .light-blue.darken-3 {
467
+ background-color: #0277bd !important; }
468
+ .ccw_plugin .light-blue-text.text-darken-3 {
469
+ color: #0277bd !important; }
470
+ .ccw_plugin .light-blue.darken-4 {
471
+ background-color: #01579b !important; }
472
+ .ccw_plugin .light-blue-text.text-darken-4 {
473
+ color: #01579b !important; }
474
+ .ccw_plugin .light-blue.accent-1 {
475
+ background-color: #80d8ff !important; }
476
+ .ccw_plugin .light-blue-text.text-accent-1 {
477
+ color: #80d8ff !important; }
478
+ .ccw_plugin .light-blue.accent-2 {
479
+ background-color: #40c4ff !important; }
480
+ .ccw_plugin .light-blue-text.text-accent-2 {
481
+ color: #40c4ff !important; }
482
+ .ccw_plugin .light-blue.accent-3 {
483
+ background-color: #00b0ff !important; }
484
+ .ccw_plugin .light-blue-text.text-accent-3 {
485
+ color: #00b0ff !important; }
486
+ .ccw_plugin .light-blue.accent-4 {
487
+ background-color: #0091ea !important; }
488
+ .ccw_plugin .light-blue-text.text-accent-4 {
489
+ color: #0091ea !important; }
490
+ .ccw_plugin .cyan {
491
+ background-color: #00bcd4 !important; }
492
+ .ccw_plugin .cyan-text {
493
+ color: #00bcd4 !important; }
494
+ .ccw_plugin .cyan.lighten-5 {
495
+ background-color: #e0f7fa !important; }
496
+ .ccw_plugin .cyan-text.text-lighten-5 {
497
+ color: #e0f7fa !important; }
498
+ .ccw_plugin .cyan.lighten-4 {
499
+ background-color: #b2ebf2 !important; }
500
+ .ccw_plugin .cyan-text.text-lighten-4 {
501
+ color: #b2ebf2 !important; }
502
+ .ccw_plugin .cyan.lighten-3 {
503
+ background-color: #80deea !important; }
504
+ .ccw_plugin .cyan-text.text-lighten-3 {
505
+ color: #80deea !important; }
506
+ .ccw_plugin .cyan.lighten-2 {
507
+ background-color: #4dd0e1 !important; }
508
+ .ccw_plugin .cyan-text.text-lighten-2 {
509
+ color: #4dd0e1 !important; }
510
+ .ccw_plugin .cyan.lighten-1 {
511
+ background-color: #26c6da !important; }
512
+ .ccw_plugin .cyan-text.text-lighten-1 {
513
+ color: #26c6da !important; }
514
+ .ccw_plugin .cyan.darken-1 {
515
+ background-color: #00acc1 !important; }
516
+ .ccw_plugin .cyan-text.text-darken-1 {
517
+ color: #00acc1 !important; }
518
+ .ccw_plugin .cyan.darken-2 {
519
+ background-color: #0097a7 !important; }
520
+ .ccw_plugin .cyan-text.text-darken-2 {
521
+ color: #0097a7 !important; }
522
+ .ccw_plugin .cyan.darken-3 {
523
+ background-color: #00838f !important; }
524
+ .ccw_plugin .cyan-text.text-darken-3 {
525
+ color: #00838f !important; }
526
+ .ccw_plugin .cyan.darken-4 {
527
+ background-color: #006064 !important; }
528
+ .ccw_plugin .cyan-text.text-darken-4 {
529
+ color: #006064 !important; }
530
+ .ccw_plugin .cyan.accent-1 {
531
+ background-color: #84ffff !important; }
532
+ .ccw_plugin .cyan-text.text-accent-1 {
533
+ color: #84ffff !important; }
534
+ .ccw_plugin .cyan.accent-2 {
535
+ background-color: #18ffff !important; }
536
+ .ccw_plugin .cyan-text.text-accent-2 {
537
+ color: #18ffff !important; }
538
+ .ccw_plugin .cyan.accent-3 {
539
+ background-color: #00e5ff !important; }
540
+ .ccw_plugin .cyan-text.text-accent-3 {
541
+ color: #00e5ff !important; }
542
+ .ccw_plugin .cyan.accent-4 {
543
+ background-color: #00b8d4 !important; }
544
+ .ccw_plugin .cyan-text.text-accent-4 {
545
+ color: #00b8d4 !important; }
546
+ .ccw_plugin .teal {
547
+ background-color: #009688 !important; }
548
+ .ccw_plugin .teal-text {
549
+ color: #009688 !important; }
550
+ .ccw_plugin .teal.lighten-5 {
551
+ background-color: #e0f2f1 !important; }
552
+ .ccw_plugin .teal-text.text-lighten-5 {
553
+ color: #e0f2f1 !important; }
554
+ .ccw_plugin .teal.lighten-4 {
555
+ background-color: #b2dfdb !important; }
556
+ .ccw_plugin .teal-text.text-lighten-4 {
557
+ color: #b2dfdb !important; }
558
+ .ccw_plugin .teal.lighten-3 {
559
+ background-color: #80cbc4 !important; }
560
+ .ccw_plugin .teal-text.text-lighten-3 {
561
+ color: #80cbc4 !important; }
562
+ .ccw_plugin .teal.lighten-2 {
563
+ background-color: #4db6ac !important; }
564
+ .ccw_plugin .teal-text.text-lighten-2 {
565
+ color: #4db6ac !important; }
566
+ .ccw_plugin .teal.lighten-1 {
567
+ background-color: #26a69a !important; }
568
+ .ccw_plugin .teal-text.text-lighten-1 {
569
+ color: #26a69a !important; }
570
+ .ccw_plugin .teal.darken-1 {
571
+ background-color: #00897b !important; }
572
+ .ccw_plugin .teal-text.text-darken-1 {
573
+ color: #00897b !important; }
574
+ .ccw_plugin .teal.darken-2 {
575
+ background-color: #00796b !important; }
576
+ .ccw_plugin .teal-text.text-darken-2 {
577
+ color: #00796b !important; }
578
+ .ccw_plugin .teal.darken-3 {
579
+ background-color: #00695c !important; }
580
+ .ccw_plugin .teal-text.text-darken-3 {
581
+ color: #00695c !important; }
582
+ .ccw_plugin .teal.darken-4 {
583
+ background-color: #004d40 !important; }
584
+ .ccw_plugin .teal-text.text-darken-4 {
585
+ color: #004d40 !important; }
586
+ .ccw_plugin .teal.accent-1 {
587
+ background-color: #a7ffeb !important; }
588
+ .ccw_plugin .teal-text.text-accent-1 {
589
+ color: #a7ffeb !important; }
590
+ .ccw_plugin .teal.accent-2 {
591
+ background-color: #64ffda !important; }
592
+ .ccw_plugin .teal-text.text-accent-2 {
593
+ color: #64ffda !important; }
594
+ .ccw_plugin .teal.accent-3 {
595
+ background-color: #1de9b6 !important; }
596
+ .ccw_plugin .teal-text.text-accent-3 {
597
+ color: #1de9b6 !important; }
598
+ .ccw_plugin .teal.accent-4 {
599
+ background-color: #00bfa5 !important; }
600
+ .ccw_plugin .teal-text.text-accent-4 {
601
+ color: #00bfa5 !important; }
602
+ .ccw_plugin .green {
603
+ background-color: #4CAF50 !important; }
604
+ .ccw_plugin .green-text {
605
+ color: #4CAF50 !important; }
606
+ .ccw_plugin .green.lighten-5 {
607
+ background-color: #E8F5E9 !important; }
608
+ .ccw_plugin .green-text.text-lighten-5 {
609
+ color: #E8F5E9 !important; }
610
+ .ccw_plugin .green.lighten-4 {
611
+ background-color: #C8E6C9 !important; }
612
+ .ccw_plugin .green-text.text-lighten-4 {
613
+ color: #C8E6C9 !important; }
614
+ .ccw_plugin .green.lighten-3 {
615
+ background-color: #A5D6A7 !important; }
616
+ .ccw_plugin .green-text.text-lighten-3 {
617
+ color: #A5D6A7 !important; }
618
+ .ccw_plugin .green.lighten-2 {
619
+ background-color: #81C784 !important; }
620
+ .ccw_plugin .green-text.text-lighten-2 {
621
+ color: #81C784 !important; }
622
+ .ccw_plugin .green.lighten-1 {
623
+ background-color: #66BB6A !important; }
624
+ .ccw_plugin .green-text.text-lighten-1 {
625
+ color: #66BB6A !important; }
626
+ .ccw_plugin .green.darken-1 {
627
+ background-color: #43A047 !important; }
628
+ .ccw_plugin .green-text.text-darken-1 {
629
+ color: #43A047 !important; }
630
+ .ccw_plugin .green.darken-2 {
631
+ background-color: #388E3C !important; }
632
+ .ccw_plugin .green-text.text-darken-2 {
633
+ color: #388E3C !important; }
634
+ .ccw_plugin .green.darken-3 {
635
+ background-color: #2E7D32 !important; }
636
+ .ccw_plugin .green-text.text-darken-3 {
637
+ color: #2E7D32 !important; }
638
+ .ccw_plugin .green.darken-4 {
639
+ background-color: #1B5E20 !important; }
640
+ .ccw_plugin .green-text.text-darken-4 {
641
+ color: #1B5E20 !important; }
642
+ .ccw_plugin .green.accent-1 {
643
+ background-color: #B9F6CA !important; }
644
+ .ccw_plugin .green-text.text-accent-1 {
645
+ color: #B9F6CA !important; }
646
+ .ccw_plugin .green.accent-2 {
647
+ background-color: #69F0AE !important; }
648
+ .ccw_plugin .green-text.text-accent-2 {
649
+ color: #69F0AE !important; }
650
+ .ccw_plugin .green.accent-3 {
651
+ background-color: #00E676 !important; }
652
+ .ccw_plugin .green-text.text-accent-3 {
653
+ color: #00E676 !important; }
654
+ .ccw_plugin .green.accent-4 {
655
+ background-color: #00C853 !important; }
656
+ .ccw_plugin .green-text.text-accent-4 {
657
+ color: #00C853 !important; }
658
+ .ccw_plugin .light-green {
659
+ background-color: #8bc34a !important; }
660
+ .ccw_plugin .light-green-text {
661
+ color: #8bc34a !important; }
662
+ .ccw_plugin .light-green.lighten-5 {
663
+ background-color: #f1f8e9 !important; }
664
+ .ccw_plugin .light-green-text.text-lighten-5 {
665
+ color: #f1f8e9 !important; }
666
+ .ccw_plugin .light-green.lighten-4 {
667
+ background-color: #dcedc8 !important; }
668
+ .ccw_plugin .light-green-text.text-lighten-4 {
669
+ color: #dcedc8 !important; }
670
+ .ccw_plugin .light-green.lighten-3 {
671
+ background-color: #c5e1a5 !important; }
672
+ .ccw_plugin .light-green-text.text-lighten-3 {
673
+ color: #c5e1a5 !important; }
674
+ .ccw_plugin .light-green.lighten-2 {
675
+ background-color: #aed581 !important; }
676
+ .ccw_plugin .light-green-text.text-lighten-2 {
677
+ color: #aed581 !important; }
678
+ .ccw_plugin .light-green.lighten-1 {
679
+ background-color: #9ccc65 !important; }
680
+ .ccw_plugin .light-green-text.text-lighten-1 {
681
+ color: #9ccc65 !important; }
682
+ .ccw_plugin .light-green.darken-1 {
683
+ background-color: #7cb342 !important; }
684
+ .ccw_plugin .light-green-text.text-darken-1 {
685
+ color: #7cb342 !important; }
686
+ .ccw_plugin .light-green.darken-2 {
687
+ background-color: #689f38 !important; }
688
+ .ccw_plugin .light-green-text.text-darken-2 {
689
+ color: #689f38 !important; }
690
+ .ccw_plugin .light-green.darken-3 {
691
+ background-color: #558b2f !important; }
692
+ .ccw_plugin .light-green-text.text-darken-3 {
693
+ color: #558b2f !important; }
694
+ .ccw_plugin .light-green.darken-4 {
695
+ background-color: #33691e !important; }
696
+ .ccw_plugin .light-green-text.text-darken-4 {
697
+ color: #33691e !important; }
698
+ .ccw_plugin .light-green.accent-1 {
699
+ background-color: #ccff90 !important; }
700
+ .ccw_plugin .light-green-text.text-accent-1 {
701
+ color: #ccff90 !important; }
702
+ .ccw_plugin .light-green.accent-2 {
703
+ background-color: #b2ff59 !important; }
704
+ .ccw_plugin .light-green-text.text-accent-2 {
705
+ color: #b2ff59 !important; }
706
+ .ccw_plugin .light-green.accent-3 {
707
+ background-color: #76ff03 !important; }
708
+ .ccw_plugin .light-green-text.text-accent-3 {
709
+ color: #76ff03 !important; }
710
+ .ccw_plugin .light-green.accent-4 {
711
+ background-color: #64dd17 !important; }
712
+ .ccw_plugin .light-green-text.text-accent-4 {
713
+ color: #64dd17 !important; }
714
+ .ccw_plugin .lime {
715
+ background-color: #cddc39 !important; }
716
+ .ccw_plugin .lime-text {
717
+ color: #cddc39 !important; }
718
+ .ccw_plugin .lime.lighten-5 {
719
+ background-color: #f9fbe7 !important; }
720
+ .ccw_plugin .lime-text.text-lighten-5 {
721
+ color: #f9fbe7 !important; }
722
+ .ccw_plugin .lime.lighten-4 {
723
+ background-color: #f0f4c3 !important; }
724
+ .ccw_plugin .lime-text.text-lighten-4 {
725
+ color: #f0f4c3 !important; }
726
+ .ccw_plugin .lime.lighten-3 {
727
+ background-color: #e6ee9c !important; }
728
+ .ccw_plugin .lime-text.text-lighten-3 {
729
+ color: #e6ee9c !important; }
730
+ .ccw_plugin .lime.lighten-2 {
731
+ background-color: #dce775 !important; }
732
+ .ccw_plugin .lime-text.text-lighten-2 {
733
+ color: #dce775 !important; }
734
+ .ccw_plugin .lime.lighten-1 {
735
+ background-color: #d4e157 !important; }
736
+ .ccw_plugin .lime-text.text-lighten-1 {
737
+ color: #d4e157 !important; }
738
+ .ccw_plugin .lime.darken-1 {
739
+ background-color: #c0ca33 !important; }
740
+ .ccw_plugin .lime-text.text-darken-1 {
741
+ color: #c0ca33 !important; }
742
+ .ccw_plugin .lime.darken-2 {
743
+ background-color: #afb42b !important; }
744
+ .ccw_plugin .lime-text.text-darken-2 {
745
+ color: #afb42b !important; }
746
+ .ccw_plugin .lime.darken-3 {
747
+ background-color: #9e9d24 !important; }
748
+ .ccw_plugin .lime-text.text-darken-3 {
749
+ color: #9e9d24 !important; }
750
+ .ccw_plugin .lime.darken-4 {
751
+ background-color: #827717 !important; }
752
+ .ccw_plugin .lime-text.text-darken-4 {
753
+ color: #827717 !important; }
754
+ .ccw_plugin .lime.accent-1 {
755
+ background-color: #f4ff81 !important; }
756
+ .ccw_plugin .lime-text.text-accent-1 {
757
+ color: #f4ff81 !important; }
758
+ .ccw_plugin .lime.accent-2 {
759
+ background-color: #eeff41 !important; }
760
+ .ccw_plugin .lime-text.text-accent-2 {
761
+ color: #eeff41 !important; }
762
+ .ccw_plugin .lime.accent-3 {
763
+ background-color: #c6ff00 !important; }
764
+ .ccw_plugin .lime-text.text-accent-3 {
765
+ color: #c6ff00 !important; }
766
+ .ccw_plugin .lime.accent-4 {
767
+ background-color: #aeea00 !important; }
768
+ .ccw_plugin .lime-text.text-accent-4 {
769
+ color: #aeea00 !important; }
770
+ .ccw_plugin .yellow {
771
+ background-color: #ffeb3b !important; }
772
+ .ccw_plugin .yellow-text {
773
+ color: #ffeb3b !important; }
774
+ .ccw_plugin .yellow.lighten-5 {
775
+ background-color: #fffde7 !important; }
776
+ .ccw_plugin .yellow-text.text-lighten-5 {
777
+ color: #fffde7 !important; }
778
+ .ccw_plugin .yellow.lighten-4 {
779
+ background-color: #fff9c4 !important; }
780
+ .ccw_plugin .yellow-text.text-lighten-4 {
781
+ color: #fff9c4 !important; }
782
+ .ccw_plugin .yellow.lighten-3 {
783
+ background-color: #fff59d !important; }
784
+ .ccw_plugin .yellow-text.text-lighten-3 {
785
+ color: #fff59d !important; }
786
+ .ccw_plugin .yellow.lighten-2 {
787
+ background-color: #fff176 !important; }
788
+ .ccw_plugin .yellow-text.text-lighten-2 {
789
+ color: #fff176 !important; }
790
+ .ccw_plugin .yellow.lighten-1 {
791
+ background-color: #ffee58 !important; }
792
+ .ccw_plugin .yellow-text.text-lighten-1 {
793
+ color: #ffee58 !important; }
794
+ .ccw_plugin .yellow.darken-1 {
795
+ background-color: #fdd835 !important; }
796
+ .ccw_plugin .yellow-text.text-darken-1 {
797
+ color: #fdd835 !important; }
798
+ .ccw_plugin .yellow.darken-2 {
799
+ background-color: #fbc02d !important; }
800
+ .ccw_plugin .yellow-text.text-darken-2 {
801
+ color: #fbc02d !important; }
802
+ .ccw_plugin .yellow.darken-3 {
803
+ background-color: #f9a825 !important; }
804
+ .ccw_plugin .yellow-text.text-darken-3 {
805
+ color: #f9a825 !important; }
806
+ .ccw_plugin .yellow.darken-4 {
807
+ background-color: #f57f17 !important; }
808
+ .ccw_plugin .yellow-text.text-darken-4 {
809
+ color: #f57f17 !important; }
810
+ .ccw_plugin .yellow.accent-1 {
811
+ background-color: #ffff8d !important; }
812
+ .ccw_plugin .yellow-text.text-accent-1 {
813
+ color: #ffff8d !important; }
814
+ .ccw_plugin .yellow.accent-2 {
815
+ background-color: #ffff00 !important; }
816
+ .ccw_plugin .yellow-text.text-accent-2 {
817
+ color: #ffff00 !important; }
818
+ .ccw_plugin .yellow.accent-3 {
819
+ background-color: #ffea00 !important; }
820
+ .ccw_plugin .yellow-text.text-accent-3 {
821
+ color: #ffea00 !important; }
822
+ .ccw_plugin .yellow.accent-4 {
823
+ background-color: #ffd600 !important; }
824
+ .ccw_plugin .yellow-text.text-accent-4 {
825
+ color: #ffd600 !important; }
826
+ .ccw_plugin .amber {
827
+ background-color: #ffc107 !important; }
828
+ .ccw_plugin .amber-text {
829
+ color: #ffc107 !important; }
830
+ .ccw_plugin .amber.lighten-5 {
831
+ background-color: #fff8e1 !important; }
832
+ .ccw_plugin .amber-text.text-lighten-5 {
833
+ color: #fff8e1 !important; }
834
+ .ccw_plugin .amber.lighten-4 {
835
+ background-color: #ffecb3 !important; }
836
+ .ccw_plugin .amber-text.text-lighten-4 {
837
+ color: #ffecb3 !important; }
838
+ .ccw_plugin .amber.lighten-3 {
839
+ background-color: #ffe082 !important; }
840
+ .ccw_plugin .amber-text.text-lighten-3 {
841
+ color: #ffe082 !important; }
842
+ .ccw_plugin .amber.lighten-2 {
843
+ background-color: #ffd54f !important; }
844
+ .ccw_plugin .amber-text.text-lighten-2 {
845
+ color: #ffd54f !important; }
846
+ .ccw_plugin .amber.lighten-1 {
847
+ background-color: #ffca28 !important; }
848
+ .ccw_plugin .amber-text.text-lighten-1 {
849
+ color: #ffca28 !important; }
850
+ .ccw_plugin .amber.darken-1 {
851
+ background-color: #ffb300 !important; }
852
+ .ccw_plugin .amber-text.text-darken-1 {
853
+ color: #ffb300 !important; }
854
+ .ccw_plugin .amber.darken-2 {
855
+ background-color: #ffa000 !important; }
856
+ .ccw_plugin .amber-text.text-darken-2 {
857
+ color: #ffa000 !important; }
858
+ .ccw_plugin .amber.darken-3 {
859
+ background-color: #ff8f00 !important; }
860
+ .ccw_plugin .amber-text.text-darken-3 {
861
+ color: #ff8f00 !important; }
862
+ .ccw_plugin .amber.darken-4 {
863
+ background-color: #ff6f00 !important; }
864
+ .ccw_plugin .amber-text.text-darken-4 {
865
+ color: #ff6f00 !important; }
866
+ .ccw_plugin .amber.accent-1 {
867
+ background-color: #ffe57f !important; }
868
+ .ccw_plugin .amber-text.text-accent-1 {
869
+ color: #ffe57f !important; }
870
+ .ccw_plugin .amber.accent-2 {
871
+ background-color: #ffd740 !important; }
872
+ .ccw_plugin .amber-text.text-accent-2 {
873
+ color: #ffd740 !important; }
874
+ .ccw_plugin .amber.accent-3 {
875
+ background-color: #ffc400 !important; }
876
+ .ccw_plugin .amber-text.text-accent-3 {
877
+ color: #ffc400 !important; }
878
+ .ccw_plugin .amber.accent-4 {
879
+ background-color: #ffab00 !important; }
880
+ .ccw_plugin .amber-text.text-accent-4 {
881
+ color: #ffab00 !important; }
882
+ .ccw_plugin .orange {
883
+ background-color: #ff9800 !important; }
884
+ .ccw_plugin .orange-text {
885
+ color: #ff9800 !important; }
886
+ .ccw_plugin .orange.lighten-5 {
887
+ background-color: #fff3e0 !important; }
888
+ .ccw_plugin .orange-text.text-lighten-5 {
889
+ color: #fff3e0 !important; }
890
+ .ccw_plugin .orange.lighten-4 {
891
+ background-color: #ffe0b2 !important; }
892
+ .ccw_plugin .orange-text.text-lighten-4 {
893
+ color: #ffe0b2 !important; }
894
+ .ccw_plugin .orange.lighten-3 {
895
+ background-color: #ffcc80 !important; }
896
+ .ccw_plugin .orange-text.text-lighten-3 {
897
+ color: #ffcc80 !important; }
898
+ .ccw_plugin .orange.lighten-2 {
899
+ background-color: #ffb74d !important; }
900
+ .ccw_plugin .orange-text.text-lighten-2 {
901
+ color: #ffb74d !important; }
902
+ .ccw_plugin .orange.lighten-1 {
903
+ background-color: #ffa726 !important; }
904
+ .ccw_plugin .orange-text.text-lighten-1 {
905
+ color: #ffa726 !important; }
906
+ .ccw_plugin .orange.darken-1 {
907
+ background-color: #fb8c00 !important; }
908
+ .ccw_plugin .orange-text.text-darken-1 {
909
+ color: #fb8c00 !important; }
910
+ .ccw_plugin .orange.darken-2 {
911
+ background-color: #f57c00 !important; }
912
+ .ccw_plugin .orange-text.text-darken-2 {
913
+ color: #f57c00 !important; }
914
+ .ccw_plugin .orange.darken-3 {
915
+ background-color: #ef6c00 !important; }
916
+ .ccw_plugin .orange-text.text-darken-3 {
917
+ color: #ef6c00 !important; }
918
+ .ccw_plugin .orange.darken-4 {
919
+ background-color: #e65100 !important; }
920
+ .ccw_plugin .orange-text.text-darken-4 {
921
+ color: #e65100 !important; }
922
+ .ccw_plugin .orange.accent-1 {
923
+ background-color: #ffd180 !important; }
924
+ .ccw_plugin .orange-text.text-accent-1 {
925
+ color: #ffd180 !important; }
926
+ .ccw_plugin .orange.accent-2 {
927
+ background-color: #ffab40 !important; }
928
+ .ccw_plugin .orange-text.text-accent-2 {
929
+ color: #ffab40 !important; }
930
+ .ccw_plugin .orange.accent-3 {
931
+ background-color: #ff9100 !important; }
932
+ .ccw_plugin .orange-text.text-accent-3 {
933
+ color: #ff9100 !important; }
934
+ .ccw_plugin .orange.accent-4 {
935
+ background-color: #ff6d00 !important; }
936
+ .ccw_plugin .orange-text.text-accent-4 {
937
+ color: #ff6d00 !important; }
938
+ .ccw_plugin .deep-orange {
939
+ background-color: #ff5722 !important; }
940
+ .ccw_plugin .deep-orange-text {
941
+ color: #ff5722 !important; }
942
+ .ccw_plugin .deep-orange.lighten-5 {
943
+ background-color: #fbe9e7 !important; }
944
+ .ccw_plugin .deep-orange-text.text-lighten-5 {
945
+ color: #fbe9e7 !important; }
946
+ .ccw_plugin .deep-orange.lighten-4 {
947
+ background-color: #ffccbc !important; }
948
+ .ccw_plugin .deep-orange-text.text-lighten-4 {
949
+ color: #ffccbc !important; }
950
+ .ccw_plugin .deep-orange.lighten-3 {
951
+ background-color: #ffab91 !important; }
952
+ .ccw_plugin .deep-orange-text.text-lighten-3 {
953
+ color: #ffab91 !important; }
954
+ .ccw_plugin .deep-orange.lighten-2 {
955
+ background-color: #ff8a65 !important; }
956
+ .ccw_plugin .deep-orange-text.text-lighten-2 {
957
+ color: #ff8a65 !important; }
958
+ .ccw_plugin .deep-orange.lighten-1 {
959
+ background-color: #ff7043 !important; }
960
+ .ccw_plugin .deep-orange-text.text-lighten-1 {
961
+ color: #ff7043 !important; }
962
+ .ccw_plugin .deep-orange.darken-1 {
963
+ background-color: #f4511e !important; }
964
+ .ccw_plugin .deep-orange-text.text-darken-1 {
965
+ color: #f4511e !important; }
966
+ .ccw_plugin .deep-orange.darken-2 {
967
+ background-color: #e64a19 !important; }
968
+ .ccw_plugin .deep-orange-text.text-darken-2 {
969
+ color: #e64a19 !important; }
970
+ .ccw_plugin .deep-orange.darken-3 {
971
+ background-color: #d84315 !important; }
972
+ .ccw_plugin .deep-orange-text.text-darken-3 {
973
+ color: #d84315 !important; }
974
+ .ccw_plugin .deep-orange.darken-4 {
975
+ background-color: #bf360c !important; }
976
+ .ccw_plugin .deep-orange-text.text-darken-4 {
977
+ color: #bf360c !important; }
978
+ .ccw_plugin .deep-orange.accent-1 {
979
+ background-color: #ff9e80 !important; }
980
+ .ccw_plugin .deep-orange-text.text-accent-1 {
981
+ color: #ff9e80 !important; }
982
+ .ccw_plugin .deep-orange.accent-2 {
983
+ background-color: #ff6e40 !important; }
984
+ .ccw_plugin .deep-orange-text.text-accent-2 {
985
+ color: #ff6e40 !important; }
986
+ .ccw_plugin .deep-orange.accent-3 {
987
+ background-color: #ff3d00 !important; }
988
+ .ccw_plugin .deep-orange-text.text-accent-3 {
989
+ color: #ff3d00 !important; }
990
+ .ccw_plugin .deep-orange.accent-4 {
991
+ background-color: #dd2c00 !important; }
992
+ .ccw_plugin .deep-orange-text.text-accent-4 {
993
+ color: #dd2c00 !important; }
994
+ .ccw_plugin .brown {
995
+ background-color: #795548 !important; }
996
+ .ccw_plugin .brown-text {
997
+ color: #795548 !important; }
998
+ .ccw_plugin .brown.lighten-5 {
999
+ background-color: #efebe9 !important; }
1000
+ .ccw_plugin .brown-text.text-lighten-5 {
1001
+ color: #efebe9 !important; }
1002
+ .ccw_plugin .brown.lighten-4 {
1003
+ background-color: #d7ccc8 !important; }
1004
+ .ccw_plugin .brown-text.text-lighten-4 {
1005
+ color: #d7ccc8 !important; }
1006
+ .ccw_plugin .brown.lighten-3 {
1007
+ background-color: #bcaaa4 !important; }
1008
+ .ccw_plugin .brown-text.text-lighten-3 {
1009
+ color: #bcaaa4 !important; }
1010
+ .ccw_plugin .brown.lighten-2 {
1011
+ background-color: #a1887f !important; }
1012
+ .ccw_plugin .brown-text.text-lighten-2 {
1013
+ color: #a1887f !important; }
1014
+ .ccw_plugin .brown.lighten-1 {
1015
+ background-color: #8d6e63 !important; }
1016
+ .ccw_plugin .brown-text.text-lighten-1 {
1017
+ color: #8d6e63 !important; }
1018
+ .ccw_plugin .brown.darken-1 {
1019
+ background-color: #6d4c41 !important; }
1020
+ .ccw_plugin .brown-text.text-darken-1 {
1021
+ color: #6d4c41 !important; }
1022
+ .ccw_plugin .brown.darken-2 {
1023
+ background-color: #5d4037 !important; }
1024
+ .ccw_plugin .brown-text.text-darken-2 {
1025
+ color: #5d4037 !important; }
1026
+ .ccw_plugin .brown.darken-3 {
1027
+ background-color: #4e342e !important; }
1028
+ .ccw_plugin .brown-text.text-darken-3 {
1029
+ color: #4e342e !important; }
1030
+ .ccw_plugin .brown.darken-4 {
1031
+ background-color: #3e2723 !important; }
1032
+ .ccw_plugin .brown-text.text-darken-4 {
1033
+ color: #3e2723 !important; }
1034
+ .ccw_plugin .blue-grey {
1035
+ background-color: #607d8b !important; }
1036
+ .ccw_plugin .blue-grey-text {
1037
+ color: #607d8b !important; }
1038
+ .ccw_plugin .blue-grey.lighten-5 {
1039
+ background-color: #eceff1 !important; }
1040
+ .ccw_plugin .blue-grey-text.text-lighten-5 {
1041
+ color: #eceff1 !important; }
1042
+ .ccw_plugin .blue-grey.lighten-4 {
1043
+ background-color: #cfd8dc !important; }
1044
+ .ccw_plugin .blue-grey-text.text-lighten-4 {
1045
+ color: #cfd8dc !important; }
1046
+ .ccw_plugin .blue-grey.lighten-3 {
1047
+ background-color: #b0bec5 !important; }
1048
+ .ccw_plugin .blue-grey-text.text-lighten-3 {
1049
+ color: #b0bec5 !important; }
1050
+ .ccw_plugin .blue-grey.lighten-2 {
1051
+ background-color: #90a4ae !important; }
1052
+ .ccw_plugin .blue-grey-text.text-lighten-2 {
1053
+ color: #90a4ae !important; }
1054
+ .ccw_plugin .blue-grey.lighten-1 {
1055
+ background-color: #78909c !important; }
1056
+ .ccw_plugin .blue-grey-text.text-lighten-1 {
1057
+ color: #78909c !important; }
1058
+ .ccw_plugin .blue-grey.darken-1 {
1059
+ background-color: #546e7a !important; }
1060
+ .ccw_plugin .blue-grey-text.text-darken-1 {
1061
+ color: #546e7a !important; }
1062
+ .ccw_plugin .blue-grey.darken-2 {
1063
+ background-color: #455a64 !important; }
1064
+ .ccw_plugin .blue-grey-text.text-darken-2 {
1065
+ color: #455a64 !important; }
1066
+ .ccw_plugin .blue-grey.darken-3 {
1067
+ background-color: #37474f !important; }
1068
+ .ccw_plugin .blue-grey-text.text-darken-3 {
1069
+ color: #37474f !important; }
1070
+ .ccw_plugin .blue-grey.darken-4 {
1071
+ background-color: #263238 !important; }
1072
+ .ccw_plugin .blue-grey-text.text-darken-4 {
1073
+ color: #263238 !important; }
1074
+ .ccw_plugin .grey {
1075
+ background-color: #9e9e9e !important; }
1076
+ .ccw_plugin .grey-text {
1077
+ color: #9e9e9e !important; }
1078
+ .ccw_plugin .grey.lighten-5 {
1079
+ background-color: #fafafa !important; }
1080
+ .ccw_plugin .grey-text.text-lighten-5 {
1081
+ color: #fafafa !important; }
1082
+ .ccw_plugin .grey.lighten-4 {
1083
+ background-color: #f5f5f5 !important; }
1084
+ .ccw_plugin .grey-text.text-lighten-4 {
1085
+ color: #f5f5f5 !important; }
1086
+ .ccw_plugin .grey.lighten-3 {
1087
+ background-color: #eeeeee !important; }
1088
+ .ccw_plugin .grey-text.text-lighten-3 {
1089
+ color: #eeeeee !important; }
1090
+ .ccw_plugin .grey.lighten-2 {
1091
+ background-color: #e0e0e0 !important; }
1092
+ .ccw_plugin .grey-text.text-lighten-2 {
1093
+ color: #e0e0e0 !important; }
1094
+ .ccw_plugin .grey.lighten-1 {
1095
+ background-color: #bdbdbd !important; }
1096
+ .ccw_plugin .grey-text.text-lighten-1 {
1097
+ color: #bdbdbd !important; }
1098
+ .ccw_plugin .grey.darken-1 {
1099
+ background-color: #757575 !important; }
1100
+ .ccw_plugin .grey-text.text-darken-1 {
1101
+ color: #757575 !important; }
1102
+ .ccw_plugin .grey.darken-2 {
1103
+ background-color: #616161 !important; }
1104
+ .ccw_plugin .grey-text.text-darken-2 {
1105
+ color: #616161 !important; }
1106
+ .ccw_plugin .grey.darken-3 {
1107
+ background-color: #424242 !important; }
1108
+ .ccw_plugin .grey-text.text-darken-3 {
1109
+ color: #424242 !important; }
1110
+ .ccw_plugin .grey.darken-4 {
1111
+ background-color: #212121 !important; }
1112
+ .ccw_plugin .grey-text.text-darken-4 {
1113
+ color: #212121 !important; }
1114
+ .ccw_plugin .black {
1115
+ background-color: #000000 !important; }
1116
+ .ccw_plugin .black-text {
1117
+ color: #000000 !important; }
1118
+ .ccw_plugin .white {
1119
+ background-color: #FFFFFF !important; }
1120
+ .ccw_plugin .white-text {
1121
+ color: #FFFFFF !important; }
1122
+ .ccw_plugin .transparent {
1123
+ background-color: transparent !important; }
1124
+ .ccw_plugin .transparent-text {
1125
+ color: transparent !important; }
1126
+ .ccw_plugin html {
1127
+ font-family: sans-serif;
1128
+ /* 1 */
1129
+ -ms-text-size-adjust: 100%;
1130
+ /* 2 */
1131
+ -webkit-text-size-adjust: 100%;
1132
+ /* 2 */ }
1133
+ .ccw_plugin body {
1134
+ margin: 0; }
1135
+ .ccw_plugin article,
1136
+ .ccw_plugin aside,
1137
+ .ccw_plugin details,
1138
+ .ccw_plugin figcaption,
1139
+ .ccw_plugin figure,
1140
+ .ccw_plugin footer,
1141
+ .ccw_plugin header,
1142
+ .ccw_plugin hgroup,
1143
+ .ccw_plugin main,
1144
+ .ccw_plugin menu,
1145
+ .ccw_plugin nav,
1146
+ .ccw_plugin section,
1147
+ .ccw_plugin summary {
1148
+ display: block; }
1149
+ .ccw_plugin audio,
1150
+ .ccw_plugin canvas,
1151
+ .ccw_plugin progress,
1152
+ .ccw_plugin video {
1153
+ display: inline-block;
1154
+ /* 1 */
1155
+ vertical-align: baseline;
1156
+ /* 2 */ }
1157
+ .ccw_plugin audio:not([controls]) {
1158
+ display: none;
1159
+ height: 0; }
1160
+ .ccw_plugin [hidden],
1161
+ .ccw_plugin template {
1162
+ display: none; }
1163
+ .ccw_plugin a {
1164
+ background-color: transparent; }
1165
+ .ccw_plugin a:active,
1166
+ .ccw_plugin a:hover {
1167
+ outline: 0; }
1168
+ .ccw_plugin abbr[title] {
1169
+ border-bottom: 1px dotted; }
1170
+ .ccw_plugin b,
1171
+ .ccw_plugin strong {
1172
+ font-weight: bold; }
1173
+ .ccw_plugin dfn {
1174
+ font-style: italic; }
1175
+ .ccw_plugin h1 {
1176
+ font-size: 2em;
1177
+ margin: 0.67em 0; }
1178
+ .ccw_plugin mark {
1179
+ background: #ff0;
1180
+ color: #000; }
1181
+ .ccw_plugin small {
1182
+ font-size: 80%; }
1183
+ .ccw_plugin sub,
1184
+ .ccw_plugin sup {
1185
+ font-size: 75%;
1186
+ line-height: 0;
1187
+ position: relative;
1188
+ vertical-align: baseline; }
1189
+ .ccw_plugin sup {
1190
+ top: -0.5em; }
1191
+ .ccw_plugin sub {
1192
+ bottom: -0.25em; }
1193
+ .ccw_plugin img {
1194
+ border: 0; }
1195
+ .ccw_plugin svg:not(:root) {
1196
+ overflow: hidden; }
1197
+ .ccw_plugin figure {
1198
+ margin: 1em 40px; }
1199
+ .ccw_plugin hr {
1200
+ box-sizing: content-box;
1201
+ height: 0; }
1202
+ .ccw_plugin pre {
1203
+ overflow: auto; }
1204
+ .ccw_plugin code,
1205
+ .ccw_plugin kbd,
1206
+ .ccw_plugin pre,
1207
+ .ccw_plugin samp {
1208
+ font-family: monospace, monospace;
1209
+ font-size: 1em; }
1210
+ .ccw_plugin button,
1211
+ .ccw_plugin input,
1212
+ .ccw_plugin optgroup,
1213
+ .ccw_plugin select,
1214
+ .ccw_plugin textarea {
1215
+ color: inherit;
1216
+ /* 1 */
1217
+ font: inherit;
1218
+ /* 2 */
1219
+ margin: 0;
1220
+ /* 3 */ }
1221
+ .ccw_plugin button {
1222
+ overflow: visible; }
1223
+ .ccw_plugin button,
1224
+ .ccw_plugin select {
1225
+ text-transform: none; }
1226
+ .ccw_plugin button,
1227
+ .ccw_plugin html input[type="button"],
1228
+ .ccw_plugin input[type="reset"],
1229
+ .ccw_plugin input[type="submit"] {
1230
+ -webkit-appearance: button;
1231
+ /* 2 */
1232
+ cursor: pointer;
1233
+ /* 3 */ }
1234
+ .ccw_plugin button[disabled],
1235
+ .ccw_plugin html input[disabled] {
1236
+ cursor: default; }
1237
+ .ccw_plugin button::-moz-focus-inner,
1238
+ .ccw_plugin input::-moz-focus-inner {
1239
+ border: 0;
1240
+ padding: 0; }
1241
+ .ccw_plugin input {
1242
+ line-height: normal; }
1243
+ .ccw_plugin input[type="checkbox"],
1244
+ .ccw_plugin input[type="radio"] {
1245
+ box-sizing: border-box;
1246
+ /* 1 */
1247
+ padding: 0;
1248
+ /* 2 */ }
1249
+ .ccw_plugin input[type="number"]::-webkit-inner-spin-button,
1250
+ .ccw_plugin input[type="number"]::-webkit-outer-spin-button {
1251
+ height: auto; }
1252
+ .ccw_plugin input[type="search"] {
1253
+ -webkit-appearance: textfield;
1254
+ /* 1 */
1255
+ box-sizing: content-box;
1256
+ /* 2 */ }
1257
+ .ccw_plugin input[type="search"]::-webkit-search-cancel-button,
1258
+ .ccw_plugin input[type="search"]::-webkit-search-decoration {
1259
+ -webkit-appearance: none; }
1260
+ .ccw_plugin fieldset {
1261
+ border: 1px solid #c0c0c0;
1262
+ margin: 0 2px;
1263
+ padding: 0.35em 0.625em 0.75em; }
1264
+ .ccw_plugin legend {
1265
+ border: 0;
1266
+ /* 1 */
1267
+ padding: 0;
1268
+ /* 2 */ }
1269
+ .ccw_plugin textarea {
1270
+ overflow: auto; }
1271
+ .ccw_plugin optgroup {
1272
+ font-weight: bold; }
1273
+ .ccw_plugin table {
1274
+ border-collapse: collapse;
1275
+ border-spacing: 0; }
1276
+ .ccw_plugin td,
1277
+ .ccw_plugin th {
1278
+ padding: 0; }
1279
+ .ccw_plugin html {
1280
+ box-sizing: border-box; }
1281
+ .ccw_plugin *, .ccw_plugin *:before, .ccw_plugin *:after {
1282
+ box-sizing: inherit; }
1283
+ .ccw_plugin ul:not(.browser-default) {
1284
+ padding-left: 0;
1285
+ list-style-type: none; }
1286
+ .ccw_plugin ul:not(.browser-default) > li {
1287
+ list-style-type: none; }
1288
+ .ccw_plugin a {
1289
+ color: #039be5;
1290
+ text-decoration: none;
1291
+ -webkit-tap-highlight-color: transparent; }
1292
+ .ccw_plugin .valign-wrapper {
1293
+ display: flex;
1294
+ align-items: center; }
1295
+ .ccw_plugin .clearfix {
1296
+ clear: both; }
1297
+ .ccw_plugin .z-depth-0 {
1298
+ box-shadow: none !important; }
1299
+ .ccw_plugin .z-depth-1, .ccw_plugin .btn, .ccw_plugin .btn-large, .ccw_plugin .btn-floating, .ccw_plugin .dropdown-content, .ccw_plugin .collapsible {
1300
+ box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -2px rgba(0, 0, 0, 0.2); }
1301
+ .ccw_plugin .z-depth-1-half, .ccw_plugin .btn:hover, .ccw_plugin .btn-large:hover, .ccw_plugin .btn-floating:hover {
1302
+ box-shadow: 0 3px 3px 0 rgba(0, 0, 0, 0.14), 0 1px 7px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -1px rgba(0, 0, 0, 0.2); }
1303
+ .ccw_plugin .z-depth-2 {
1304
+ box-shadow: 0 4px 5px 0 rgba(0, 0, 0, 0.14), 0 1px 10px 0 rgba(0, 0, 0, 0.12), 0 2px 4px -1px rgba(0, 0, 0, 0.3); }
1305
+ .ccw_plugin .z-depth-3 {
1306
+ box-shadow: 0 6px 10px 0 rgba(0, 0, 0, 0.14), 0 1px 18px 0 rgba(0, 0, 0, 0.12), 0 3px 5px -1px rgba(0, 0, 0, 0.3); }
1307
+ .ccw_plugin .z-depth-4 {
1308
+ box-shadow: 0 8px 10px 1px rgba(0, 0, 0, 0.14), 0 3px 14px 2px rgba(0, 0, 0, 0.12), 0 5px 5px -3px rgba(0, 0, 0, 0.3); }
1309
+ .ccw_plugin .z-depth-5 {
1310
+ box-shadow: 0 16px 24px 2px rgba(0, 0, 0, 0.14), 0 6px 30px 5px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(0, 0, 0, 0.3); }
1311
+ .ccw_plugin .hoverable {
1312
+ transition: box-shadow .25s; }
1313
+ .ccw_plugin .hoverable:hover {
1314
+ box-shadow: 0 8px 17px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19); }
1315
+ .ccw_plugin .divider {
1316
+ height: 1px;
1317
+ overflow: hidden;
1318
+ background-color: #e0e0e0; }
1319
+ .ccw_plugin blockquote {
1320
+ margin: 20px 0;
1321
+ padding-left: 1.5rem;
1322
+ border-left: 5px solid #ee6e73; }
1323
+ .ccw_plugin i {
1324
+ line-height: inherit; }
1325
+ .ccw_plugin i.left {
1326
+ float: left;
1327
+ margin-right: 15px; }
1328
+ .ccw_plugin i.right {
1329
+ float: right;
1330
+ margin-left: 15px; }
1331
+ .ccw_plugin i.tiny {
1332
+ font-size: 1rem; }
1333
+ .ccw_plugin i.small {
1334
+ font-size: 2rem; }
1335
+ .ccw_plugin i.medium {
1336
+ font-size: 4rem; }
1337
+ .ccw_plugin i.large {
1338
+ font-size: 6rem; }
1339
+ .ccw_plugin img.responsive-img,
1340
+ .ccw_plugin video.responsive-video {
1341
+ max-width: 100%;
1342
+ height: auto; }
1343
+ .ccw_plugin .pagination li {
1344
+ display: inline-block;
1345
+ border-radius: 2px;
1346
+ text-align: center;
1347
+ vertical-align: top;
1348
+ height: 30px; }
1349
+ .ccw_plugin .pagination li a {
1350
+ color: #444;
1351
+ display: inline-block;
1352
+ font-size: 1.2rem;
1353
+ padding: 0 10px;
1354
+ line-height: 30px; }
1355
+ .ccw_plugin .pagination li.active a {
1356
+ color: #fff; }
1357
+ .ccw_plugin .pagination li.active {
1358
+ background-color: #ee6e73; }
1359
+ .ccw_plugin .pagination li.disabled a {
1360
+ cursor: default;
1361
+ color: #999; }
1362
+ .ccw_plugin .pagination li i {
1363
+ font-size: 2rem; }
1364
+ .ccw_plugin .pagination li.pages ul li {
1365
+ display: inline-block;
1366
+ float: none; }
1367
+ @media only screen and (max-width: 992px) {
1368
+ .ccw_plugin .pagination {
1369
+ width: 100%; }
1370
+ .ccw_plugin .pagination li.prev,
1371
+ .ccw_plugin .pagination li.next {
1372
+ width: 10%; }
1373
+ .ccw_plugin .pagination li.pages {
1374
+ width: 80%;
1375
+ overflow: hidden;
1376
+ white-space: nowrap; } }
1377
+ .ccw_plugin .breadcrumb {
1378
+ font-size: 18px;
1379
+ color: rgba(255, 255, 255, 0.7); }
1380
+ .ccw_plugin .breadcrumb i,
1381
+ .ccw_plugin .breadcrumb [class^="mdi-"], .ccw_plugin .breadcrumb [class*="mdi-"],
1382
+ .ccw_plugin .breadcrumb i.material-icons {
1383
+ display: inline-block;
1384
+ float: left;
1385
+ font-size: 24px; }
1386
+ .ccw_plugin .breadcrumb:before {
1387
+ content: '\E5CC';
1388
+ color: rgba(255, 255, 255, 0.7);
1389
+ vertical-align: top;
1390
+ display: inline-block;
1391
+ font-family: 'Material Icons';
1392
+ font-weight: normal;
1393
+ font-style: normal;
1394
+ font-size: 25px;
1395
+ margin: 0 10px 0 8px;
1396
+ -webkit-font-smoothing: antialiased; }
1397
+ .ccw_plugin .breadcrumb:first-child:before {
1398
+ display: none; }
1399
+ .ccw_plugin .breadcrumb:last-child {
1400
+ color: #fff; }
1401
+ .ccw_plugin .parallax-container {
1402
+ position: relative;
1403
+ overflow: hidden;
1404
+ height: 500px; }
1405
+ .ccw_plugin .parallax-container .parallax {
1406
+ position: absolute;
1407
+ top: 0;
1408
+ left: 0;
1409
+ right: 0;
1410
+ bottom: 0;
1411
+ z-index: -1; }
1412
+ .ccw_plugin .parallax-container .parallax img {
1413
+ display: none;
1414
+ position: absolute;
1415
+ left: 50%;
1416
+ bottom: 0;
1417
+ min-width: 100%;
1418
+ min-height: 100%;
1419
+ transform: translate3d(0, 0, 0);
1420
+ transform: translateX(-50%); }
1421
+ .ccw_plugin .pin-top, .ccw_plugin .pin-bottom {
1422
+ position: relative; }
1423
+ .ccw_plugin .pinned {
1424
+ position: fixed !important; }
1425
+ .ccw_plugin ul.staggered-list li {
1426
+ opacity: 0; }
1427
+ .ccw_plugin .fade-in {
1428
+ opacity: 0;
1429
+ transform-origin: 0 50%; }
1430
+ @media only screen and (max-width: 600px) {
1431
+ .ccw_plugin .hide-on-small-only, .ccw_plugin .hide-on-small-and-down {
1432
+ display: none !important; } }
1433
+ @media only screen and (max-width: 992px) {
1434
+ .ccw_plugin .hide-on-med-and-down {
1435
+ display: none !important; } }
1436
+ @media only screen and (min-width: 601px) {
1437
+ .ccw_plugin .hide-on-med-and-up {
1438
+ display: none !important; } }
1439
+ @media only screen and (min-width: 600px) and (max-width: 992px) {
1440
+ .ccw_plugin .hide-on-med-only {
1441
+ display: none !important; } }
1442
+ @media only screen and (min-width: 993px) {
1443
+ .ccw_plugin .hide-on-large-only {
1444
+ display: none !important; } }
1445
+ @media only screen and (min-width: 993px) {
1446
+ .ccw_plugin .show-on-large {
1447
+ display: block !important; } }
1448
+ @media only screen and (min-width: 600px) and (max-width: 992px) {
1449
+ .ccw_plugin .show-on-medium {
1450
+ display: block !important; } }
1451
+ @media only screen and (max-width: 600px) {
1452
+ .ccw_plugin .show-on-small {
1453
+ display: block !important; } }
1454
+ @media only screen and (min-width: 601px) {
1455
+ .ccw_plugin .show-on-medium-and-up {
1456
+ display: block !important; } }
1457
+ @media only screen and (max-width: 992px) {
1458
+ .ccw_plugin .show-on-medium-and-down {
1459
+ display: block !important; } }
1460
+ @media only screen and (max-width: 600px) {
1461
+ .ccw_plugin .center-on-small-only {
1462
+ text-align: center; } }
1463
+ .ccw_plugin .page-footer {
1464
+ padding-top: 20px;
1465
+ color: #fff;
1466
+ background-color: #ee6e73; }
1467
+ .ccw_plugin .page-footer .footer-copyright {
1468
+ overflow: hidden;
1469
+ min-height: 50px;
1470
+ display: flex;
1471
+ align-items: center;
1472
+ padding: 10px 0px;
1473
+ color: rgba(255, 255, 255, 0.8);
1474
+ background-color: rgba(51, 51, 51, 0.08); }
1475
+ .ccw_plugin table, .ccw_plugin th, .ccw_plugin td {
1476
+ border: none; }
1477
+ .ccw_plugin table {
1478
+ width: 100%;
1479
+ display: table; }
1480
+ .ccw_plugin table.bordered > thead > tr,
1481
+ .ccw_plugin table.bordered > tbody > tr {
1482
+ border-bottom: 1px solid #d0d0d0; }
1483
+ .ccw_plugin table.striped > tbody > tr:nth-child(odd) {
1484
+ background-color: #f2f2f2; }
1485
+ .ccw_plugin table.striped > tbody > tr > td {
1486
+ border-radius: 0; }
1487
+ .ccw_plugin table.highlight > tbody > tr {
1488
+ transition: background-color .25s ease; }
1489
+ .ccw_plugin table.highlight > tbody > tr:hover {
1490
+ background-color: #f2f2f2; }
1491
+ .ccw_plugin table.centered thead tr th, .ccw_plugin table.centered tbody tr td {
1492
+ text-align: center; }
1493
+ .ccw_plugin thead {
1494
+ border-bottom: 1px solid #d0d0d0; }
1495
+ .ccw_plugin td, .ccw_plugin th {
1496
+ padding: 15px 5px;
1497
+ display: table-cell;
1498
+ text-align: left;
1499
+ vertical-align: middle;
1500
+ border-radius: 2px; }
1501
+ @media only screen and (max-width: 992px) {
1502
+ .ccw_plugin table.responsive-table {
1503
+ width: 100%;
1504
+ border-collapse: collapse;
1505
+ border-spacing: 0;
1506
+ display: block;
1507
+ position: relative;
1508
+ /* sort out borders */ }
1509
+ .ccw_plugin table.responsive-table td:empty:before {
1510
+ content: '\A0'; }
1511
+ .ccw_plugin table.responsive-table th,
1512
+ .ccw_plugin table.responsive-table td {
1513
+ margin: 0;
1514
+ vertical-align: top; }
1515
+ .ccw_plugin table.responsive-table th {
1516
+ text-align: left; }
1517
+ .ccw_plugin table.responsive-table thead {
1518
+ display: block;
1519
+ float: left; }
1520
+ .ccw_plugin table.responsive-table thead tr {
1521
+ display: block;
1522
+ padding: 0 10px 0 0; }
1523
+ .ccw_plugin table.responsive-table thead tr th::before {
1524
+ content: "\A0"; }
1525
+ .ccw_plugin table.responsive-table tbody {
1526
+ display: block;
1527
+ width: auto;
1528
+ position: relative;
1529
+ overflow-x: auto;
1530
+ white-space: nowrap; }
1531
+ .ccw_plugin table.responsive-table tbody tr {
1532
+ display: inline-block;
1533
+ vertical-align: top; }
1534
+ .ccw_plugin table.responsive-table th {
1535
+ display: block;
1536
+ text-align: right; }
1537
+ .ccw_plugin table.responsive-table td {
1538
+ display: block;
1539
+ min-height: 1.25em;
1540
+ text-align: left; }
1541
+ .ccw_plugin table.responsive-table tr {
1542
+ padding: 0 10px; }
1543
+ .ccw_plugin table.responsive-table thead {
1544
+ border: 0;
1545
+ border-right: 1px solid #d0d0d0; }
1546
+ .ccw_plugin table.responsive-table.bordered th {
1547
+ border-bottom: 0;
1548
+ border-left: 0; }
1549
+ .ccw_plugin table.responsive-table.bordered td {
1550
+ border-left: 0;
1551
+ border-right: 0;
1552
+ border-bottom: 0; }
1553
+ .ccw_plugin table.responsive-table.bordered tr {
1554
+ border: 0; }
1555
+ .ccw_plugin table.responsive-table.bordered tbody tr {
1556
+ border-right: 1px solid #d0d0d0; } }
1557
+ .ccw_plugin .collection {
1558
+ margin: 0.5rem 0 1rem 0;
1559
+ border: 1px solid #e0e0e0;
1560
+ border-radius: 2px;
1561
+ overflow: hidden;
1562
+ position: relative; }
1563
+ .ccw_plugin .collection .collection-item {
1564
+ background-color: #fff;
1565
+ line-height: 1.5rem;
1566
+ padding: 10px 20px;
1567
+ margin: 0;
1568
+ border-bottom: 1px solid #e0e0e0; }
1569
+ .ccw_plugin .collection .collection-item.avatar {
1570
+ min-height: 84px;
1571
+ padding-left: 72px;
1572
+ position: relative; }
1573
+ .ccw_plugin .collection .collection-item.avatar:not(.circle-clipper) > .circle,
1574
+ .ccw_plugin .collection .collection-item.avatar :not(.circle-clipper) > .circle {
1575
+ position: absolute;
1576
+ width: 42px;
1577
+ height: 42px;
1578
+ overflow: hidden;
1579
+ left: 15px;
1580
+ display: inline-block;
1581
+ vertical-align: middle; }
1582
+ .ccw_plugin .collection .collection-item.avatar i.circle {
1583
+ font-size: 18px;
1584
+ line-height: 42px;
1585
+ color: #fff;
1586
+ background-color: #999;
1587
+ text-align: center; }
1588
+ .ccw_plugin .collection .collection-item.avatar .title {
1589
+ font-size: 16px; }
1590
+ .ccw_plugin .collection .collection-item.avatar p {
1591
+ margin: 0; }
1592
+ .ccw_plugin .collection .collection-item.avatar .secondary-content {
1593
+ position: absolute;
1594
+ top: 16px;
1595
+ right: 16px; }
1596
+ .ccw_plugin .collection .collection-item:last-child {
1597
+ border-bottom: none; }
1598
+ .ccw_plugin .collection .collection-item.active {
1599
+ background-color: #26a69a;
1600
+ color: #eafaf9; }
1601
+ .ccw_plugin .collection .collection-item.active .secondary-content {
1602
+ color: #fff; }
1603
+ .ccw_plugin .collection a.collection-item {
1604
+ display: block;
1605
+ transition: .25s;
1606
+ color: #26a69a; }
1607
+ .ccw_plugin .collection a.collection-item:not(.active):hover {
1608
+ background-color: #ddd; }
1609
+ .ccw_plugin .collection.with-header .collection-header {
1610
+ background-color: #fff;
1611
+ border-bottom: 1px solid #e0e0e0;
1612
+ padding: 10px 20px; }
1613
+ .ccw_plugin .collection.with-header .collection-item {
1614
+ padding-left: 30px; }
1615
+ .ccw_plugin .collection.with-header .collection-item.avatar {
1616
+ padding-left: 72px; }
1617
+ .ccw_plugin .secondary-content {
1618
+ float: right;
1619
+ color: #26a69a; }
1620
+ .ccw_plugin .collapsible .collection {
1621
+ margin: 0;
1622
+ border: none; }
1623
+ .ccw_plugin .video-container {
1624
+ position: relative;
1625
+ padding-bottom: 56.25%;
1626
+ height: 0;
1627
+ overflow: hidden; }
1628
+ .ccw_plugin .video-container iframe, .ccw_plugin .video-container object, .ccw_plugin .video-container embed {
1629
+ position: absolute;
1630
+ top: 0;
1631
+ left: 0;
1632
+ width: 100%;
1633
+ height: 100%; }
1634
+ .ccw_plugin .progress {
1635
+ position: relative;
1636
+ height: 4px;
1637
+ display: block;
1638
+ width: 100%;
1639
+ background-color: #acece6;
1640
+ border-radius: 2px;
1641
+ margin: 0.5rem 0 1rem 0;
1642
+ overflow: hidden; }
1643
+ .ccw_plugin .progress .determinate {
1644
+ position: absolute;
1645
+ top: 0;
1646
+ left: 0;
1647
+ bottom: 0;
1648
+ background-color: #26a69a;
1649
+ transition: width .3s linear; }
1650
+ .ccw_plugin .progress .indeterminate {
1651
+ background-color: #26a69a; }
1652
+ .ccw_plugin .progress .indeterminate:before {
1653
+ content: '';
1654
+ position: absolute;
1655
+ background-color: inherit;
1656
+ top: 0;
1657
+ left: 0;
1658
+ bottom: 0;
1659
+ will-change: left, right;
1660
+ animation: indeterminate 2.1s cubic-bezier(0.65, 0.815, 0.735, 0.395) infinite; }
1661
+ .ccw_plugin .progress .indeterminate:after {
1662
+ content: '';
1663
+ position: absolute;
1664
+ background-color: inherit;
1665
+ top: 0;
1666
+ left: 0;
1667
+ bottom: 0;
1668
+ will-change: left, right;
1669
+ animation: indeterminate-short 2.1s cubic-bezier(0.165, 0.84, 0.44, 1) infinite;
1670
+ animation-delay: 1.15s; }
1671
+
1672
+ @keyframes indeterminate {
1673
+ 0% {
1674
+ left: -35%;
1675
+ right: 100%; }
1676
+ 60% {
1677
+ left: 100%;
1678
+ right: -90%; }
1679
+ 100% {
1680
+ left: 100%;
1681
+ right: -90%; } }
1682
+
1683
+ @keyframes indeterminate-short {
1684
+ 0% {
1685
+ left: -200%;
1686
+ right: 100%; }
1687
+ 60% {
1688
+ left: 107%;
1689
+ right: -8%; }
1690
+ 100% {
1691
+ left: 107%;
1692
+ right: -8%; } }
1693
+ .ccw_plugin .hide {
1694
+ display: none !important; }
1695
+ .ccw_plugin .left-align {
1696
+ text-align: left; }
1697
+ .ccw_plugin .right-align {
1698
+ text-align: right; }
1699
+ .ccw_plugin .center, .ccw_plugin .center-align {
1700
+ text-align: center; }
1701
+ .ccw_plugin .left {
1702
+ float: left !important; }
1703
+ .ccw_plugin .right {
1704
+ float: right !important; }
1705
+ .ccw_plugin .no-select, .ccw_plugin input[type=range], .ccw_plugin input[type=range] + .thumb {
1706
+ user-select: none; }
1707
+ .ccw_plugin .circle {
1708
+ border-radius: 50%; }
1709
+ .ccw_plugin .center-block {
1710
+ display: block;
1711
+ margin-left: auto;
1712
+ margin-right: auto; }
1713
+ .ccw_plugin .truncate {
1714
+ display: block;
1715
+ white-space: nowrap;
1716
+ overflow: hidden;
1717
+ text-overflow: ellipsis; }
1718
+ .ccw_plugin .no-padding {
1719
+ padding: 0 !important; }
1720
+ .ccw_plugin .material-icons {
1721
+ text-rendering: optimizeLegibility;
1722
+ font-feature-settings: 'liga'; }
1723
+ .ccw_plugin .container {
1724
+ margin: 0 auto;
1725
+ max-width: 1280px;
1726
+ width: 90%; }
1727
+ @media only screen and (min-width: 601px) {
1728
+ .ccw_plugin .container {
1729
+ width: 85%; } }
1730
+ @media only screen and (min-width: 993px) {
1731
+ .ccw_plugin .container {
1732
+ width: 70%; } }
1733
+ .ccw_plugin .container .row {
1734
+ margin-left: -0.75rem;
1735
+ margin-right: -0.75rem; }
1736
+ .ccw_plugin .section {
1737
+ padding-top: 1rem;
1738
+ padding-bottom: 1rem; }
1739
+ .ccw_plugin .section.no-pad {
1740
+ padding: 0; }
1741
+ .ccw_plugin .section.no-pad-bot {
1742
+ padding-bottom: 0; }
1743
+ .ccw_plugin .section.no-pad-top {
1744
+ padding-top: 0; }
1745
+ .ccw_plugin .row {
1746
+ margin-left: auto;
1747
+ margin-right: auto;
1748
+ margin-bottom: 20px; }
1749
+ .ccw_plugin .row:after {
1750
+ content: "";
1751
+ display: table;
1752
+ clear: both; }
1753
+ .ccw_plugin .row .col {
1754
+ float: left;
1755
+ box-sizing: border-box;
1756
+ padding: 0 0.75rem;
1757
+ min-height: 1px; }
1758
+ .ccw_plugin .row .col[class*="push-"], .ccw_plugin .row .col[class*="pull-"] {
1759
+ position: relative; }
1760
+ .ccw_plugin .row .col.s1 {
1761
+ width: 8.33333%;
1762
+ margin-left: auto;
1763
+ left: auto;
1764
+ right: auto; }
1765
+ .ccw_plugin .row .col.s2 {
1766
+ width: 16.66667%;
1767
+ margin-left: auto;
1768
+ left: auto;
1769
+ right: auto; }
1770
+ .ccw_plugin .row .col.s3 {
1771
+ width: 25%;
1772
+ margin-left: auto;
1773
+ left: auto;
1774
+ right: auto; }
1775
+ .ccw_plugin .row .col.s4 {
1776
+ width: 33.33333%;
1777
+ margin-left: auto;
1778
+ left: auto;
1779
+ right: auto; }
1780
+ .ccw_plugin .row .col.s5 {
1781
+ width: 41.66667%;
1782
+ margin-left: auto;
1783
+ left: auto;
1784
+ right: auto; }
1785
+ .ccw_plugin .row .col.s6 {
1786
+ width: 50%;
1787
+ margin-left: auto;
1788
+ left: auto;
1789
+ right: auto; }
1790
+ .ccw_plugin .row .col.s7 {
1791
+ width: 58.33333%;
1792
+ margin-left: auto;
1793
+ left: auto;
1794
+ right: auto; }
1795
+ .ccw_plugin .row .col.s8 {
1796
+ width: 66.66667%;
1797
+ margin-left: auto;
1798
+ left: auto;
1799
+ right: auto; }
1800
+ .ccw_plugin .row .col.s9 {
1801
+ width: 75%;
1802
+ margin-left: auto;
1803
+ left: auto;
1804
+ right: auto; }
1805
+ .ccw_plugin .row .col.s10 {
1806
+ width: 83.33333%;
1807
+ margin-left: auto;
1808
+ left: auto;
1809
+ right: auto; }
1810
+ .ccw_plugin .row .col.s11 {
1811
+ width: 91.66667%;
1812
+ margin-left: auto;
1813
+ left: auto;
1814
+ right: auto; }
1815
+ .ccw_plugin .row .col.s12 {
1816
+ width: 100%;
1817
+ margin-left: auto;
1818
+ left: auto;
1819
+ right: auto; }
1820
+ .ccw_plugin .row .col.offset-s1 {
1821
+ margin-left: 8.33333%; }
1822
+ .ccw_plugin .row .col.pull-s1 {
1823
+ right: 8.33333%; }
1824
+ .ccw_plugin .row .col.push-s1 {
1825
+ left: 8.33333%; }
1826
+ .ccw_plugin .row .col.offset-s2 {
1827
+ margin-left: 16.66667%; }
1828
+ .ccw_plugin .row .col.pull-s2 {
1829
+ right: 16.66667%; }
1830
+ .ccw_plugin .row .col.push-s2 {
1831
+ left: 16.66667%; }
1832
+ .ccw_plugin .row .col.offset-s3 {
1833
+ margin-left: 25%; }
1834
+ .ccw_plugin .row .col.pull-s3 {
1835
+ right: 25%; }
1836
+ .ccw_plugin .row .col.push-s3 {
1837
+ left: 25%; }
1838
+ .ccw_plugin .row .col.offset-s4 {
1839
+ margin-left: 33.33333%; }
1840
+ .ccw_plugin .row .col.pull-s4 {
1841
+ right: 33.33333%; }
1842
+ .ccw_plugin .row .col.push-s4 {
1843
+ left: 33.33333%; }
1844
+ .ccw_plugin .row .col.offset-s5 {
1845
+ margin-left: 41.66667%; }
1846
+ .ccw_plugin .row .col.pull-s5 {
1847
+ right: 41.66667%; }
1848
+ .ccw_plugin .row .col.push-s5 {
1849
+ left: 41.66667%; }
1850
+ .ccw_plugin .row .col.offset-s6 {
1851
+ margin-left: 50%; }
1852
+ .ccw_plugin .row .col.pull-s6 {
1853
+ right: 50%; }
1854
+ .ccw_plugin .row .col.push-s6 {
1855
+ left: 50%; }
1856
+ .ccw_plugin .row .col.offset-s7 {
1857
+ margin-left: 58.33333%; }
1858
+ .ccw_plugin .row .col.pull-s7 {
1859
+ right: 58.33333%; }
1860
+ .ccw_plugin .row .col.push-s7 {
1861
+ left: 58.33333%; }
1862
+ .ccw_plugin .row .col.offset-s8 {
1863
+ margin-left: 66.66667%; }
1864
+ .ccw_plugin .row .col.pull-s8 {
1865
+ right: 66.66667%; }
1866
+ .ccw_plugin .row .col.push-s8 {
1867
+ left: 66.66667%; }
1868
+ .ccw_plugin .row .col.offset-s9 {
1869
+ margin-left: 75%; }
1870
+ .ccw_plugin .row .col.pull-s9 {
1871
+ right: 75%; }
1872
+ .ccw_plugin .row .col.push-s9 {
1873
+ left: 75%; }
1874
+ .ccw_plugin .row .col.offset-s10 {
1875
+ margin-left: 83.33333%; }
1876
+ .ccw_plugin .row .col.pull-s10 {
1877
+ right: 83.33333%; }
1878
+ .ccw_plugin .row .col.push-s10 {
1879
+ left: 83.33333%; }
1880
+ .ccw_plugin .row .col.offset-s11 {
1881
+ margin-left: 91.66667%; }
1882
+ .ccw_plugin .row .col.pull-s11 {
1883
+ right: 91.66667%; }
1884
+ .ccw_plugin .row .col.push-s11 {
1885
+ left: 91.66667%; }
1886
+ .ccw_plugin .row .col.offset-s12 {
1887
+ margin-left: 100%; }
1888
+ .ccw_plugin .row .col.pull-s12 {
1889
+ right: 100%; }
1890
+ .ccw_plugin .row .col.push-s12 {
1891
+ left: 100%; }
1892
+ @media only screen and (min-width: 601px) {
1893
+ .ccw_plugin .row .col.m1 {
1894
+ width: 8.33333%;
1895
+ margin-left: auto;
1896
+ left: auto;
1897
+ right: auto; }
1898
+ .ccw_plugin .row .col.m2 {
1899
+ width: 16.66667%;
1900
+ margin-left: auto;
1901
+ left: auto;
1902
+ right: auto; }
1903
+ .ccw_plugin .row .col.m3 {
1904
+ width: 25%;
1905
+ margin-left: auto;
1906
+ left: auto;
1907
+ right: auto; }
1908
+ .ccw_plugin .row .col.m4 {
1909
+ width: 33.33333%;
1910
+ margin-left: auto;
1911
+ left: auto;
1912
+ right: auto; }
1913
+ .ccw_plugin .row .col.m5 {
1914
+ width: 41.66667%;
1915
+ margin-left: auto;
1916
+ left: auto;
1917
+ right: auto; }
1918
+ .ccw_plugin .row .col.m6 {
1919
+ width: 50%;
1920
+ margin-left: auto;
1921
+ left: auto;
1922
+ right: auto; }
1923
+ .ccw_plugin .row .col.m7 {
1924
+ width: 58.33333%;
1925
+ margin-left: auto;
1926
+ left: auto;
1927
+ right: auto; }
1928
+ .ccw_plugin .row .col.m8 {
1929
+ width: 66.66667%;
1930
+ margin-left: auto;
1931
+ left: auto;
1932
+ right: auto; }
1933
+ .ccw_plugin .row .col.m9 {
1934
+ width: 75%;
1935
+ margin-left: auto;
1936
+ left: auto;
1937
+ right: auto; }
1938
+ .ccw_plugin .row .col.m10 {
1939
+ width: 83.33333%;
1940
+ margin-left: auto;
1941
+ left: auto;
1942
+ right: auto; }
1943
+ .ccw_plugin .row .col.m11 {
1944
+ width: 91.66667%;
1945
+ margin-left: auto;
1946
+ left: auto;
1947
+ right: auto; }
1948
+ .ccw_plugin .row .col.m12 {
1949
+ width: 100%;
1950
+ margin-left: auto;
1951
+ left: auto;
1952
+ right: auto; }
1953
+ .ccw_plugin .row .col.offset-m1 {
1954
+ margin-left: 8.33333%; }
1955
+ .ccw_plugin .row .col.pull-m1 {
1956
+ right: 8.33333%; }
1957
+ .ccw_plugin .row .col.push-m1 {
1958
+ left: 8.33333%; }
1959
+ .ccw_plugin .row .col.offset-m2 {
1960
+ margin-left: 16.66667%; }
1961
+ .ccw_plugin .row .col.pull-m2 {
1962
+ right: 16.66667%; }
1963
+ .ccw_plugin .row .col.push-m2 {
1964
+ left: 16.66667%; }
1965
+ .ccw_plugin .row .col.offset-m3 {
1966
+ margin-left: 25%; }
1967
+ .ccw_plugin .row .col.pull-m3 {
1968
+ right: 25%; }
1969
+ .ccw_plugin .row .col.push-m3 {
1970
+ left: 25%; }
1971
+ .ccw_plugin .row .col.offset-m4 {
1972
+ margin-left: 33.33333%; }
1973
+ .ccw_plugin .row .col.pull-m4 {
1974
+ right: 33.33333%; }
1975
+ .ccw_plugin .row .col.push-m4 {
1976
+ left: 33.33333%; }
1977
+ .ccw_plugin .row .col.offset-m5 {
1978
+ margin-left: 41.66667%; }
1979
+ .ccw_plugin .row .col.pull-m5 {
1980
+ right: 41.66667%; }
1981
+ .ccw_plugin .row .col.push-m5 {
1982
+ left: 41.66667%; }
1983
+ .ccw_plugin .row .col.offset-m6 {
1984
+ margin-left: 50%; }
1985
+ .ccw_plugin .row .col.pull-m6 {
1986
+ right: 50%; }
1987
+ .ccw_plugin .row .col.push-m6 {
1988
+ left: 50%; }
1989
+ .ccw_plugin .row .col.offset-m7 {
1990
+ margin-left: 58.33333%; }
1991
+ .ccw_plugin .row .col.pull-m7 {
1992
+ right: 58.33333%; }
1993
+ .ccw_plugin .row .col.push-m7 {
1994
+ left: 58.33333%; }
1995
+ .ccw_plugin .row .col.offset-m8 {
1996
+ margin-left: 66.66667%; }
1997
+ .ccw_plugin .row .col.pull-m8 {
1998
+ right: 66.66667%; }
1999
+ .ccw_plugin .row .col.push-m8 {
2000
+ left: 66.66667%; }
2001
+ .ccw_plugin .row .col.offset-m9 {
2002
+ margin-left: 75%; }
2003
+ .ccw_plugin .row .col.pull-m9 {
2004
+ right: 75%; }
2005
+ .ccw_plugin .row .col.push-m9 {
2006
+ left: 75%; }
2007
+ .ccw_plugin .row .col.offset-m10 {
2008
+ margin-left: 83.33333%; }
2009
+ .ccw_plugin .row .col.pull-m10 {
2010
+ right: 83.33333%; }
2011
+ .ccw_plugin .row .col.push-m10 {
2012
+ left: 83.33333%; }
2013
+ .ccw_plugin .row .col.offset-m11 {
2014
+ margin-left: 91.66667%; }
2015
+ .ccw_plugin .row .col.pull-m11 {
2016
+ right: 91.66667%; }
2017
+ .ccw_plugin .row .col.push-m11 {
2018
+ left: 91.66667%; }
2019
+ .ccw_plugin .row .col.offset-m12 {
2020
+ margin-left: 100%; }
2021
+ .ccw_plugin .row .col.pull-m12 {
2022
+ right: 100%; }
2023
+ .ccw_plugin .row .col.push-m12 {
2024
+ left: 100%; } }
2025
+ @media only screen and (min-width: 993px) {
2026
+ .ccw_plugin .row .col.l1 {
2027
+ width: 8.33333%;
2028
+ margin-left: auto;
2029
+ left: auto;
2030
+ right: auto; }
2031
+ .ccw_plugin .row .col.l2 {
2032
+ width: 16.66667%;
2033
+ margin-left: auto;
2034
+ left: auto;
2035
+ right: auto; }
2036
+ .ccw_plugin .row .col.l3 {
2037
+ width: 25%;
2038
+ margin-left: auto;
2039
+ left: auto;
2040
+ right: auto; }
2041
+ .ccw_plugin .row .col.l4 {
2042
+ width: 33.33333%;
2043
+ margin-left: auto;
2044
+ left: auto;
2045
+ right: auto; }
2046
+ .ccw_plugin .row .col.l5 {
2047
+ width: 41.66667%;
2048
+ margin-left: auto;
2049
+ left: auto;
2050
+ right: auto; }
2051
+ .ccw_plugin .row .col.l6 {
2052
+ width: 50%;
2053
+ margin-left: auto;
2054
+ left: auto;
2055
+ right: auto; }
2056
+ .ccw_plugin .row .col.l7 {
2057
+ width: 58.33333%;
2058
+ margin-left: auto;
2059
+ left: auto;
2060
+ right: auto; }
2061
+ .ccw_plugin .row .col.l8 {
2062
+ width: 66.66667%;
2063
+ margin-left: auto;
2064
+ left: auto;
2065
+ right: auto; }
2066
+ .ccw_plugin .row .col.l9 {
2067
+ width: 75%;
2068
+ margin-left: auto;
2069
+ left: auto;
2070
+ right: auto; }
2071
+ .ccw_plugin .row .col.l10 {
2072
+ width: 83.33333%;
2073
+ margin-left: auto;
2074
+ left: auto;
2075
+ right: auto; }
2076
+ .ccw_plugin .row .col.l11 {
2077
+ width: 91.66667%;
2078
+ margin-left: auto;
2079
+ left: auto;
2080
+ right: auto; }
2081
+ .ccw_plugin .row .col.l12 {
2082
+ width: 100%;
2083
+ margin-left: auto;
2084
+ left: auto;
2085
+ right: auto; }
2086
+ .ccw_plugin .row .col.offset-l1 {
2087
+ margin-left: 8.33333%; }
2088
+ .ccw_plugin .row .col.pull-l1 {
2089
+ right: 8.33333%; }
2090
+ .ccw_plugin .row .col.push-l1 {
2091
+ left: 8.33333%; }
2092
+ .ccw_plugin .row .col.offset-l2 {
2093
+ margin-left: 16.66667%; }
2094
+ .ccw_plugin .row .col.pull-l2 {
2095
+ right: 16.66667%; }
2096
+ .ccw_plugin .row .col.push-l2 {
2097
+ left: 16.66667%; }
2098
+ .ccw_plugin .row .col.offset-l3 {
2099
+ margin-left: 25%; }
2100
+ .ccw_plugin .row .col.pull-l3 {
2101
+ right: 25%; }
2102
+ .ccw_plugin .row .col.push-l3 {
2103
+ left: 25%; }
2104
+ .ccw_plugin .row .col.offset-l4 {
2105
+ margin-left: 33.33333%; }
2106
+ .ccw_plugin .row .col.pull-l4 {
2107
+ right: 33.33333%; }
2108
+ .ccw_plugin .row .col.push-l4 {
2109
+ left: 33.33333%; }
2110
+ .ccw_plugin .row .col.offset-l5 {
2111
+ margin-left: 41.66667%; }
2112
+ .ccw_plugin .row .col.pull-l5 {
2113
+ right: 41.66667%; }
2114
+ .ccw_plugin .row .col.push-l5 {
2115
+ left: 41.66667%; }
2116
+ .ccw_plugin .row .col.offset-l6 {
2117
+ margin-left: 50%; }
2118
+ .ccw_plugin .row .col.pull-l6 {
2119
+ right: 50%; }
2120
+ .ccw_plugin .row .col.push-l6 {
2121
+ left: 50%; }
2122
+ .ccw_plugin .row .col.offset-l7 {
2123
+ margin-left: 58.33333%; }
2124
+ .ccw_plugin .row .col.pull-l7 {
2125
+ right: 58.33333%; }
2126
+ .ccw_plugin .row .col.push-l7 {
2127
+ left: 58.33333%; }
2128
+ .ccw_plugin .row .col.offset-l8 {
2129
+ margin-left: 66.66667%; }
2130
+ .ccw_plugin .row .col.pull-l8 {
2131
+ right: 66.66667%; }
2132
+ .ccw_plugin .row .col.push-l8 {
2133
+ left: 66.66667%; }
2134
+ .ccw_plugin .row .col.offset-l9 {
2135
+ margin-left: 75%; }
2136
+ .ccw_plugin .row .col.pull-l9 {
2137
+ right: 75%; }
2138
+ .ccw_plugin .row .col.push-l9 {
2139
+ left: 75%; }
2140
+ .ccw_plugin .row .col.offset-l10 {
2141
+ margin-left: 83.33333%; }
2142
+ .ccw_plugin .row .col.pull-l10 {
2143
+ right: 83.33333%; }
2144
+ .ccw_plugin .row .col.push-l10 {
2145
+ left: 83.33333%; }
2146
+ .ccw_plugin .row .col.offset-l11 {
2147
+ margin-left: 91.66667%; }
2148
+ .ccw_plugin .row .col.pull-l11 {
2149
+ right: 91.66667%; }
2150
+ .ccw_plugin .row .col.push-l11 {
2151
+ left: 91.66667%; }
2152
+ .ccw_plugin .row .col.offset-l12 {
2153
+ margin-left: 100%; }
2154
+ .ccw_plugin .row .col.pull-l12 {
2155
+ right: 100%; }
2156
+ .ccw_plugin .row .col.push-l12 {
2157
+ left: 100%; } }
2158
+ @media only screen and (min-width: 1201px) {
2159
+ .ccw_plugin .row .col.xl1 {
2160
+ width: 8.33333%;
2161
+ margin-left: auto;
2162
+ left: auto;
2163
+ right: auto; }
2164
+ .ccw_plugin .row .col.xl2 {
2165
+ width: 16.66667%;
2166
+ margin-left: auto;
2167
+ left: auto;
2168
+ right: auto; }
2169
+ .ccw_plugin .row .col.xl3 {
2170
+ width: 25%;
2171
+ margin-left: auto;
2172
+ left: auto;
2173
+ right: auto; }
2174
+ .ccw_plugin .row .col.xl4 {
2175
+ width: 33.33333%;
2176
+ margin-left: auto;
2177
+ left: auto;
2178
+ right: auto; }
2179
+ .ccw_plugin .row .col.xl5 {
2180
+ width: 41.66667%;
2181
+ margin-left: auto;
2182
+ left: auto;
2183
+ right: auto; }
2184
+ .ccw_plugin .row .col.xl6 {
2185
+ width: 50%;
2186
+ margin-left: auto;
2187
+ left: auto;
2188
+ right: auto; }
2189
+ .ccw_plugin .row .col.xl7 {
2190
+ width: 58.33333%;
2191
+ margin-left: auto;
2192
+ left: auto;
2193
+ right: auto; }
2194
+ .ccw_plugin .row .col.xl8 {
2195
+ width: 66.66667%;
2196
+ margin-left: auto;
2197
+ left: auto;
2198
+ right: auto; }
2199
+ .ccw_plugin .row .col.xl9 {
2200
+ width: 75%;
2201
+ margin-left: auto;
2202
+ left: auto;
2203
+ right: auto; }
2204
+ .ccw_plugin .row .col.xl10 {
2205
+ width: 83.33333%;
2206
+ margin-left: auto;
2207
+ left: auto;
2208
+ right: auto; }
2209
+ .ccw_plugin .row .col.xl11 {
2210
+ width: 91.66667%;
2211
+ margin-left: auto;
2212
+ left: auto;
2213
+ right: auto; }
2214
+ .ccw_plugin .row .col.xl12 {
2215
+ width: 100%;
2216
+ margin-left: auto;
2217
+ left: auto;
2218
+ right: auto; }
2219
+ .ccw_plugin .row .col.offset-xl1 {
2220
+ margin-left: 8.33333%; }
2221
+ .ccw_plugin .row .col.pull-xl1 {
2222
+ right: 8.33333%; }
2223
+ .ccw_plugin .row .col.push-xl1 {
2224
+ left: 8.33333%; }
2225
+ .ccw_plugin .row .col.offset-xl2 {
2226
+ margin-left: 16.66667%; }
2227
+ .ccw_plugin .row .col.pull-xl2 {
2228
+ right: 16.66667%; }
2229
+ .ccw_plugin .row .col.push-xl2 {
2230
+ left: 16.66667%; }
2231
+ .ccw_plugin .row .col.offset-xl3 {
2232
+ margin-left: 25%; }
2233
+ .ccw_plugin .row .col.pull-xl3 {
2234
+ right: 25%; }
2235
+ .ccw_plugin .row .col.push-xl3 {
2236
+ left: 25%; }
2237
+ .ccw_plugin .row .col.offset-xl4 {
2238
+ margin-left: 33.33333%; }
2239
+ .ccw_plugin .row .col.pull-xl4 {
2240
+ right: 33.33333%; }
2241
+ .ccw_plugin .row .col.push-xl4 {
2242
+ left: 33.33333%; }
2243
+ .ccw_plugin .row .col.offset-xl5 {
2244
+ margin-left: 41.66667%; }
2245
+ .ccw_plugin .row .col.pull-xl5 {
2246
+ right: 41.66667%; }
2247
+ .ccw_plugin .row .col.push-xl5 {
2248
+ left: 41.66667%; }
2249
+ .ccw_plugin .row .col.offset-xl6 {
2250
+ margin-left: 50%; }
2251
+ .ccw_plugin .row .col.pull-xl6 {
2252
+ right: 50%; }
2253
+ .ccw_plugin .row .col.push-xl6 {
2254
+ left: 50%; }
2255
+ .ccw_plugin .row .col.offset-xl7 {
2256
+ margin-left: 58.33333%; }
2257
+ .ccw_plugin .row .col.pull-xl7 {
2258
+ right: 58.33333%; }
2259
+ .ccw_plugin .row .col.push-xl7 {
2260
+ left: 58.33333%; }
2261
+ .ccw_plugin .row .col.offset-xl8 {
2262
+ margin-left: 66.66667%; }
2263
+ .ccw_plugin .row .col.pull-xl8 {
2264
+ right: 66.66667%; }
2265
+ .ccw_plugin .row .col.push-xl8 {
2266
+ left: 66.66667%; }
2267
+ .ccw_plugin .row .col.offset-xl9 {
2268
+ margin-left: 75%; }
2269
+ .ccw_plugin .row .col.pull-xl9 {
2270
+ right: 75%; }
2271
+ .ccw_plugin .row .col.push-xl9 {
2272
+ left: 75%; }
2273
+ .ccw_plugin .row .col.offset-xl10 {
2274
+ margin-left: 83.33333%; }
2275
+ .ccw_plugin .row .col.pull-xl10 {
2276
+ right: 83.33333%; }
2277
+ .ccw_plugin .row .col.push-xl10 {
2278
+ left: 83.33333%; }
2279
+ .ccw_plugin .row .col.offset-xl11 {
2280
+ margin-left: 91.66667%; }
2281
+ .ccw_plugin .row .col.pull-xl11 {
2282
+ right: 91.66667%; }
2283
+ .ccw_plugin .row .col.push-xl11 {
2284
+ left: 91.66667%; }
2285
+ .ccw_plugin .row .col.offset-xl12 {
2286
+ margin-left: 100%; }
2287
+ .ccw_plugin .row .col.pull-xl12 {
2288
+ right: 100%; }
2289
+ .ccw_plugin .row .col.push-xl12 {
2290
+ left: 100%; } }
2291
+ .ccw_plugin a {
2292
+ text-decoration: none; }
2293
+ .ccw_plugin html {
2294
+ line-height: 1.5;
2295
+ font-family: "Roboto", sans-serif;
2296
+ font-weight: normal;
2297
+ color: rgba(0, 0, 0, 0.87); }
2298
+ @media only screen and (min-width: 0) {
2299
+ .ccw_plugin html {
2300
+ font-size: 14px; } }
2301
+ @media only screen and (min-width: 992px) {
2302
+ .ccw_plugin html {
2303
+ font-size: 14.5px; } }
2304
+ @media only screen and (min-width: 1200px) {
2305
+ .ccw_plugin html {
2306
+ font-size: 15px; } }
2307
+ .ccw_plugin h1, .ccw_plugin h2, .ccw_plugin h3, .ccw_plugin h4, .ccw_plugin h5, .ccw_plugin h6 {
2308
+ font-weight: 400;
2309
+ line-height: 1.1; }
2310
+ .ccw_plugin h1 a, .ccw_plugin h2 a, .ccw_plugin h3 a, .ccw_plugin h4 a, .ccw_plugin h5 a, .ccw_plugin h6 a {
2311
+ font-weight: inherit; }
2312
+ .ccw_plugin h1 {
2313
+ font-size: 4.2rem;
2314
+ line-height: 110%;
2315
+ margin: 2.1rem 0 1.68rem 0; }
2316
+ .ccw_plugin h2 {
2317
+ font-size: 3.56rem;
2318
+ line-height: 110%;
2319
+ margin: 1.78rem 0 1.424rem 0; }
2320
+ .ccw_plugin h3 {
2321
+ font-size: 2.92rem;
2322
+ line-height: 110%;
2323
+ margin: 1.46rem 0 1.168rem 0; }
2324
+ .ccw_plugin h4 {
2325
+ font-size: 2.28rem;
2326
+ line-height: 110%;
2327
+ margin: 1.14rem 0 0.912rem 0; }
2328
+ .ccw_plugin h5 {
2329
+ font-size: 1.64rem;
2330
+ line-height: 110%;
2331
+ margin: 0.82rem 0 0.656rem 0; }
2332
+ .ccw_plugin h6 {
2333
+ font-size: 1rem;
2334
+ line-height: 110%;
2335
+ margin: 0.5rem 0 0.4rem 0; }
2336
+ .ccw_plugin em {
2337
+ font-style: italic; }
2338
+ .ccw_plugin strong {
2339
+ font-weight: 500; }
2340
+ .ccw_plugin small {
2341
+ font-size: 75%; }
2342
+ .ccw_plugin .light, .ccw_plugin .page-footer .footer-copyright {
2343
+ font-weight: 300; }
2344
+ .ccw_plugin .thin {
2345
+ font-weight: 200; }
2346
+ .ccw_plugin .flow-text {
2347
+ font-weight: 300; }
2348
+ @media only screen and (min-width: 360px) {
2349
+ .ccw_plugin .flow-text {
2350
+ font-size: 1.2rem; } }
2351
+ @media only screen and (min-width: 390px) {
2352
+ .ccw_plugin .flow-text {
2353
+ font-size: 1.224rem; } }
2354
+ @media only screen and (min-width: 420px) {
2355
+ .ccw_plugin .flow-text {
2356
+ font-size: 1.248rem; } }
2357
+ @media only screen and (min-width: 450px) {
2358
+ .ccw_plugin .flow-text {
2359
+ font-size: 1.272rem; } }
2360
+ @media only screen and (min-width: 480px) {
2361
+ .ccw_plugin .flow-text {
2362
+ font-size: 1.296rem; } }
2363
+ @media only screen and (min-width: 510px) {
2364
+ .ccw_plugin .flow-text {
2365
+ font-size: 1.32rem; } }
2366
+ @media only screen and (min-width: 540px) {
2367
+ .ccw_plugin .flow-text {
2368
+ font-size: 1.344rem; } }
2369
+ @media only screen and (min-width: 570px) {
2370
+ .ccw_plugin .flow-text {
2371
+ font-size: 1.368rem; } }
2372
+ @media only screen and (min-width: 600px) {
2373
+ .ccw_plugin .flow-text {
2374
+ font-size: 1.392rem; } }
2375
+ @media only screen and (min-width: 630px) {
2376
+ .ccw_plugin .flow-text {
2377
+ font-size: 1.416rem; } }
2378
+ @media only screen and (min-width: 660px) {
2379
+ .ccw_plugin .flow-text {
2380
+ font-size: 1.44rem; } }
2381
+ @media only screen and (min-width: 690px) {
2382
+ .ccw_plugin .flow-text {
2383
+ font-size: 1.464rem; } }
2384
+ @media only screen and (min-width: 720px) {
2385
+ .ccw_plugin .flow-text {
2386
+ font-size: 1.488rem; } }
2387
+ @media only screen and (min-width: 750px) {
2388
+ .ccw_plugin .flow-text {
2389
+ font-size: 1.512rem; } }
2390
+ @media only screen and (min-width: 780px) {
2391
+ .ccw_plugin .flow-text {
2392
+ font-size: 1.536rem; } }
2393
+ @media only screen and (min-width: 810px) {
2394
+ .ccw_plugin .flow-text {
2395
+ font-size: 1.56rem; } }
2396
+ @media only screen and (min-width: 840px) {
2397
+ .ccw_plugin .flow-text {
2398
+ font-size: 1.584rem; } }
2399
+ @media only screen and (min-width: 870px) {
2400
+ .ccw_plugin .flow-text {
2401
+ font-size: 1.608rem; } }
2402
+ @media only screen and (min-width: 900px) {
2403
+ .ccw_plugin .flow-text {
2404
+ font-size: 1.632rem; } }
2405
+ @media only screen and (min-width: 930px) {
2406
+ .ccw_plugin .flow-text {
2407
+ font-size: 1.656rem; } }
2408
+ @media only screen and (min-width: 960px) {
2409
+ .ccw_plugin .flow-text {
2410
+ font-size: 1.68rem; } }
2411
+ @media only screen and (max-width: 360px) {
2412
+ .ccw_plugin .flow-text {
2413
+ font-size: 1.2rem; } }
2414
+ .ccw_plugin .btn, .ccw_plugin .btn-large,
2415
+ .ccw_plugin .btn-flat {
2416
+ border: none;
2417
+ border-radius: 2px;
2418
+ display: inline-block;
2419
+ height: 36px;
2420
+ line-height: 36px;
2421
+ padding: 0 2rem;
2422
+ text-transform: uppercase;
2423
+ vertical-align: middle;
2424
+ -webkit-tap-highlight-color: transparent; }
2425
+ .ccw_plugin .btn.disabled, .ccw_plugin .disabled.btn-large,
2426
+ .ccw_plugin .btn-floating.disabled,
2427
+ .ccw_plugin .btn-large.disabled,
2428
+ .ccw_plugin .btn-flat.disabled,
2429
+ .ccw_plugin .btn:disabled, .ccw_plugin .btn-large:disabled,
2430
+ .ccw_plugin .btn-floating:disabled,
2431
+ .ccw_plugin .btn-large:disabled,
2432
+ .ccw_plugin .btn-flat:disabled,
2433
+ .ccw_plugin .btn[disabled], .ccw_plugin [disabled].btn-large,
2434
+ .ccw_plugin .btn-floating[disabled],
2435
+ .ccw_plugin .btn-large[disabled],
2436
+ .ccw_plugin .btn-flat[disabled] {
2437
+ pointer-events: none;
2438
+ background-color: #DFDFDF !important;
2439
+ box-shadow: none;
2440
+ color: #9F9F9F !important;
2441
+ cursor: default; }
2442
+ .ccw_plugin .btn.disabled:hover, .ccw_plugin .disabled.btn-large:hover,
2443
+ .ccw_plugin .btn-floating.disabled:hover,
2444
+ .ccw_plugin .btn-large.disabled:hover,
2445
+ .ccw_plugin .btn-flat.disabled:hover,
2446
+ .ccw_plugin .btn:disabled:hover, .ccw_plugin .btn-large:disabled:hover,
2447
+ .ccw_plugin .btn-floating:disabled:hover,
2448
+ .ccw_plugin .btn-large:disabled:hover,
2449
+ .ccw_plugin .btn-flat:disabled:hover,
2450
+ .ccw_plugin .btn[disabled]:hover, .ccw_plugin [disabled].btn-large:hover,
2451
+ .ccw_plugin .btn-floating[disabled]:hover,
2452
+ .ccw_plugin .btn-large[disabled]:hover,
2453
+ .ccw_plugin .btn-flat[disabled]:hover {
2454
+ background-color: #DFDFDF !important;
2455
+ color: #9F9F9F !important; }
2456
+ .ccw_plugin .btn, .ccw_plugin .btn-large,
2457
+ .ccw_plugin .btn-floating,
2458
+ .ccw_plugin .btn-large,
2459
+ .ccw_plugin .btn-flat {
2460
+ font-size: 1rem;
2461
+ outline: 0; }
2462
+ .ccw_plugin .btn i, .ccw_plugin .btn-large i,
2463
+ .ccw_plugin .btn-floating i,
2464
+ .ccw_plugin .btn-large i,
2465
+ .ccw_plugin .btn-flat i {
2466
+ font-size: 1.3rem;
2467
+ line-height: inherit; }
2468
+ .ccw_plugin .btn:focus, .ccw_plugin .btn-large:focus,
2469
+ .ccw_plugin .btn-floating:focus {
2470
+ background-color: #1d7d74; }
2471
+ .ccw_plugin .btn, .ccw_plugin .btn-large {
2472
+ text-decoration: none;
2473
+ color: #fff;
2474
+ background-color: #26a69a;
2475
+ text-align: center;
2476
+ letter-spacing: .5px;
2477
+ transition: .2s ease-out;
2478
+ cursor: pointer; }
2479
+ .ccw_plugin .btn:hover, .ccw_plugin .btn-large:hover {
2480
+ background-color: #2bbbad; }
2481
+ .ccw_plugin .btn-floating {
2482
+ display: inline-block;
2483
+ color: #fff;
2484
+ position: relative;
2485
+ overflow: hidden;
2486
+ z-index: 1;
2487
+ width: 40px;
2488
+ height: 40px;
2489
+ line-height: 40px;
2490
+ padding: 0;
2491
+ background-color: #26a69a;
2492
+ border-radius: 50%;
2493
+ transition: .3s;
2494
+ cursor: pointer;
2495
+ vertical-align: middle; }
2496
+ .ccw_plugin .btn-floating:hover {
2497
+ background-color: #26a69a; }
2498
+ .ccw_plugin .btn-floating:before {
2499
+ border-radius: 0; }
2500
+ .ccw_plugin .btn-floating.btn-large {
2501
+ width: 56px;
2502
+ height: 56px; }
2503
+ .ccw_plugin .btn-floating.btn-large.halfway-fab {
2504
+ bottom: -28px; }
2505
+ .ccw_plugin .btn-floating.btn-large i {
2506
+ line-height: 56px; }
2507
+ .ccw_plugin .btn-floating.halfway-fab {
2508
+ position: absolute;
2509
+ right: 24px;
2510
+ bottom: -20px; }
2511
+ .ccw_plugin .btn-floating.halfway-fab.left {
2512
+ right: auto;
2513
+ left: 24px; }
2514
+ .ccw_plugin .btn-floating i {
2515
+ width: inherit;
2516
+ display: inline-block;
2517
+ text-align: center;
2518
+ color: #fff;
2519
+ font-size: 1.6rem;
2520
+ line-height: 40px; }
2521
+ .ccw_plugin button.btn-floating {
2522
+ border: none; }
2523
+ .ccw_plugin .fixed-action-btn {
2524
+ position: fixed;
2525
+ right: 23px;
2526
+ bottom: 23px;
2527
+ padding-top: 15px;
2528
+ margin-bottom: 0;
2529
+ z-index: 997; }
2530
+ .ccw_plugin .fixed-action-btn.active ul {
2531
+ visibility: visible; }
2532
+ .ccw_plugin .fixed-action-btn.horizontal {
2533
+ padding: 0 0 0 15px; }
2534
+ .ccw_plugin .fixed-action-btn.horizontal ul {
2535
+ text-align: right;
2536
+ right: 64px;
2537
+ top: 50%;
2538
+ transform: translateY(-50%);
2539
+ height: 100%;
2540
+ left: auto;
2541
+ width: 500px;
2542
+ /*width 100% only goes to width of button container */ }
2543
+ .ccw_plugin .fixed-action-btn.horizontal ul li {
2544
+ display: inline-block;
2545
+ margin: 15px 15px 0 0; }
2546
+ .ccw_plugin .fixed-action-btn.toolbar {
2547
+ padding: 0;
2548
+ height: 56px; }
2549
+ .ccw_plugin .fixed-action-btn.toolbar.active > a i {
2550
+ opacity: 0; }
2551
+ .ccw_plugin .fixed-action-btn.toolbar ul {
2552
+ display: flex;
2553
+ top: 0;
2554
+ bottom: 0;
2555
+ z-index: 1; }
2556
+ .ccw_plugin .fixed-action-btn.toolbar ul li {
2557
+ flex: 1;
2558
+ display: inline-block;
2559
+ margin: 0;
2560
+ height: 100%;
2561
+ transition: none; }
2562
+ .ccw_plugin .fixed-action-btn.toolbar ul li a {
2563
+ display: block;
2564
+ overflow: hidden;
2565
+ position: relative;
2566
+ width: 100%;
2567
+ height: 100%;
2568
+ background-color: transparent;
2569
+ box-shadow: none;
2570
+ color: #fff;
2571
+ line-height: 56px;
2572
+ z-index: 1; }
2573
+ .ccw_plugin .fixed-action-btn.toolbar ul li a i {
2574
+ line-height: inherit; }
2575
+ .ccw_plugin .fixed-action-btn ul {
2576
+ left: 0;
2577
+ right: 0;
2578
+ text-align: center;
2579
+ position: absolute;
2580
+ bottom: 64px;
2581
+ margin: 0;
2582
+ visibility: hidden; }
2583
+ .ccw_plugin .fixed-action-btn ul li {
2584
+ margin-bottom: 15px; }
2585
+ .ccw_plugin .fixed-action-btn ul a.btn-floating {
2586
+ opacity: 0; }
2587
+ .ccw_plugin .fixed-action-btn .fab-backdrop {
2588
+ position: absolute;
2589
+ top: 0;
2590
+ left: 0;
2591
+ z-index: -1;
2592
+ width: 40px;
2593
+ height: 40px;
2594
+ background-color: #26a69a;
2595
+ border-radius: 50%;
2596
+ transform: scale(0); }
2597
+ .ccw_plugin .btn-flat {
2598
+ box-shadow: none;
2599
+ background-color: transparent;
2600
+ color: #343434;
2601
+ cursor: pointer;
2602
+ transition: background-color .2s; }
2603
+ .ccw_plugin .btn-flat:focus, .ccw_plugin .btn-flat:hover {
2604
+ box-shadow: none; }
2605
+ .ccw_plugin .btn-flat:focus {
2606
+ background-color: rgba(0, 0, 0, 0.1); }
2607
+ .ccw_plugin .btn-flat.disabled {
2608
+ background-color: transparent !important;
2609
+ color: #b3b3b3 !important;
2610
+ cursor: default; }
2611
+ .ccw_plugin .btn-large {
2612
+ height: 54px;
2613
+ line-height: 54px; }
2614
+ .ccw_plugin .btn-large i {
2615
+ font-size: 1.6rem; }
2616
+ .ccw_plugin .btn-block {
2617
+ display: block; }
2618
+ .ccw_plugin .dropdown-content {
2619
+ background-color: #fff;
2620
+ margin: 0;
2621
+ display: none;
2622
+ min-width: 100px;
2623
+ max-height: 650px;
2624
+ overflow-y: auto;
2625
+ opacity: 0;
2626
+ position: absolute;
2627
+ z-index: 999;
2628
+ will-change: width, height; }
2629
+ .ccw_plugin .dropdown-content li {
2630
+ clear: both;
2631
+ color: rgba(0, 0, 0, 0.87);
2632
+ cursor: pointer;
2633
+ min-height: 50px;
2634
+ line-height: 1.5rem;
2635
+ width: 100%;
2636
+ text-align: left;
2637
+ text-transform: none; }
2638
+ .ccw_plugin .dropdown-content li:hover, .ccw_plugin .dropdown-content li.active, .ccw_plugin .dropdown-content li.selected {
2639
+ background-color: #eee; }
2640
+ .ccw_plugin .dropdown-content li.active.selected {
2641
+ background-color: #e1e1e1; }
2642
+ .ccw_plugin .dropdown-content li.divider {
2643
+ min-height: 0;
2644
+ height: 1px; }
2645
+ .ccw_plugin .dropdown-content li > a, .ccw_plugin .dropdown-content li > span {
2646
+ font-size: 16px;
2647
+ color: #26a69a;
2648
+ display: block;
2649
+ line-height: 22px;
2650
+ padding: 14px 16px; }
2651
+ .ccw_plugin .dropdown-content li > span > label {
2652
+ top: 1px;
2653
+ left: 0;
2654
+ height: 18px; }
2655
+ .ccw_plugin .dropdown-content li > a > i {
2656
+ height: inherit;
2657
+ line-height: inherit;
2658
+ float: left;
2659
+ margin: 0 24px 0 0;
2660
+ width: 24px; }
2661
+ .ccw_plugin .input-field.col .dropdown-content [type="checkbox"] + label {
2662
+ top: 1px;
2663
+ left: 0;
2664
+ height: 18px; }
2665
+ .ccw_plugin .waves-effect {
2666
+ position: relative;
2667
+ cursor: pointer;
2668
+ display: inline-block;
2669
+ overflow: hidden;
2670
+ user-select: none;
2671
+ -webkit-tap-highlight-color: transparent;
2672
+ vertical-align: middle;
2673
+ z-index: 1;
2674
+ transition: .3s ease-out; }
2675
+ .ccw_plugin .waves-effect .waves-ripple {
2676
+ position: absolute;
2677
+ border-radius: 50%;
2678
+ width: 20px;
2679
+ height: 20px;
2680
+ margin-top: -10px;
2681
+ margin-left: -10px;
2682
+ opacity: 0;
2683
+ background: rgba(0, 0, 0, 0.2);
2684
+ transition: all 0.7s ease-out;
2685
+ transition-property: transform, opacity;
2686
+ transform: scale(0);
2687
+ pointer-events: none; }
2688
+ .ccw_plugin .waves-effect.waves-light .waves-ripple {
2689
+ background-color: rgba(255, 255, 255, 0.45); }
2690
+ .ccw_plugin .waves-effect.waves-red .waves-ripple {
2691
+ background-color: rgba(244, 67, 54, 0.7); }
2692
+ .ccw_plugin .waves-effect.waves-yellow .waves-ripple {
2693
+ background-color: rgba(255, 235, 59, 0.7); }
2694
+ .ccw_plugin .waves-effect.waves-orange .waves-ripple {
2695
+ background-color: rgba(255, 152, 0, 0.7); }
2696
+ .ccw_plugin .waves-effect.waves-purple .waves-ripple {
2697
+ background-color: rgba(156, 39, 176, 0.7); }
2698
+ .ccw_plugin .waves-effect.waves-green .waves-ripple {
2699
+ background-color: rgba(76, 175, 80, 0.7); }
2700
+ .ccw_plugin .waves-effect.waves-teal .waves-ripple {
2701
+ background-color: rgba(0, 150, 136, 0.7); }
2702
+ .ccw_plugin .waves-effect input[type="button"], .ccw_plugin .waves-effect input[type="reset"], .ccw_plugin .waves-effect input[type="submit"] {
2703
+ border: 0;
2704
+ font-style: normal;
2705
+ font-size: inherit;
2706
+ text-transform: inherit;
2707
+ background: none; }
2708
+ .ccw_plugin .waves-effect img {
2709
+ position: relative;
2710
+ z-index: -1; }
2711
+ .ccw_plugin .waves-notransition {
2712
+ transition: none !important; }
2713
+ .ccw_plugin .waves-circle {
2714
+ transform: translateZ(0);
2715
+ -webkit-mask-image: -webkit-radial-gradient(circle, white 100%, black 100%); }
2716
+ .ccw_plugin .waves-input-wrapper {
2717
+ border-radius: 0.2em;
2718
+ vertical-align: bottom; }
2719
+ .ccw_plugin .waves-input-wrapper .waves-button-input {
2720
+ position: relative;
2721
+ top: 0;
2722
+ left: 0;
2723
+ z-index: 1; }
2724
+ .ccw_plugin .waves-circle {
2725
+ text-align: center;
2726
+ width: 2.5em;
2727
+ height: 2.5em;
2728
+ line-height: 2.5em;
2729
+ border-radius: 50%;
2730
+ -webkit-mask-image: none; }
2731
+ .ccw_plugin .waves-block {
2732
+ display: block; }
2733
+ .ccw_plugin .waves-effect .waves-ripple {
2734
+ z-index: -1; }
2735
+ .ccw_plugin .collapsible {
2736
+ border-top: 1px solid #ddd;
2737
+ border-right: 1px solid #ddd;
2738
+ border-left: 1px solid #ddd;
2739
+ margin: 0.5rem 0 1rem 0; }
2740
+ .ccw_plugin .collapsible-header {
2741
+ display: flex;
2742
+ cursor: pointer;
2743
+ -webkit-tap-highlight-color: transparent;
2744
+ line-height: 1.5;
2745
+ padding: 1rem;
2746
+ background-color: #fff;
2747
+ border-bottom: 1px solid #ddd; }
2748
+ .ccw_plugin .collapsible-header i {
2749
+ width: 2rem;
2750
+ font-size: 1.6rem;
2751
+ display: inline-block;
2752
+ text-align: center;
2753
+ margin-right: 1rem; }
2754
+ .ccw_plugin .collapsible-body {
2755
+ display: none;
2756
+ border-bottom: 1px solid #ddd;
2757
+ box-sizing: border-box;
2758
+ padding: 2rem; }
2759
+ .ccw_plugin .side-nav .collapsible,
2760
+ .ccw_plugin .side-nav.fixed .collapsible {
2761
+ border: none;
2762
+ box-shadow: none; }
2763
+ .ccw_plugin .side-nav .collapsible li,
2764
+ .ccw_plugin .side-nav.fixed .collapsible li {
2765
+ padding: 0; }
2766
+ .ccw_plugin .side-nav .collapsible-header,
2767
+ .ccw_plugin .side-nav.fixed .collapsible-header {
2768
+ background-color: transparent;
2769
+ border: none;
2770
+ line-height: inherit;
2771
+ height: inherit;
2772
+ padding: 0 16px; }
2773
+ .ccw_plugin .side-nav .collapsible-header:hover,
2774
+ .ccw_plugin .side-nav.fixed .collapsible-header:hover {
2775
+ background-color: rgba(0, 0, 0, 0.05); }
2776
+ .ccw_plugin .side-nav .collapsible-header i,
2777
+ .ccw_plugin .side-nav.fixed .collapsible-header i {
2778
+ line-height: inherit; }
2779
+ .ccw_plugin .side-nav .collapsible-body,
2780
+ .ccw_plugin .side-nav.fixed .collapsible-body {
2781
+ border: 0;
2782
+ background-color: #fff; }
2783
+ .ccw_plugin .side-nav .collapsible-body li a,
2784
+ .ccw_plugin .side-nav.fixed .collapsible-body li a {
2785
+ padding: 0 23.5px 0 31px; }
2786
+ .ccw_plugin .collapsible.popout {
2787
+ border: none;
2788
+ box-shadow: none; }
2789
+ .ccw_plugin .collapsible.popout > li {
2790
+ box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12);
2791
+ margin: 0 24px;
2792
+ transition: margin 0.35s cubic-bezier(0.25, 0.46, 0.45, 0.94); }
2793
+ .ccw_plugin .collapsible.popout > li.active {
2794
+ box-shadow: 0 5px 11px 0 rgba(0, 0, 0, 0.18), 0 4px 15px 0 rgba(0, 0, 0, 0.15);
2795
+ margin: 16px 0; }
2796
+ .ccw_plugin .chip {
2797
+ display: inline-block;
2798
+ height: 32px;
2799
+ font-size: 13px;
2800
+ font-weight: 500;
2801
+ color: rgba(0, 0, 0, 0.6);
2802
+ line-height: 32px;
2803
+ padding: 0 12px;
2804
+ border-radius: 16px;
2805
+ background-color: #e4e4e4;
2806
+ margin-bottom: 5px;
2807
+ margin-right: 5px; }
2808
+ .ccw_plugin .chip > img {
2809
+ float: left;
2810
+ margin: 0 8px 0 -12px;
2811
+ height: 32px;
2812
+ width: 32px;
2813
+ border-radius: 50%; }
2814
+ .ccw_plugin .chip .close {
2815
+ cursor: pointer;
2816
+ float: right;
2817
+ font-size: 16px;
2818
+ line-height: 32px;
2819
+ padding-left: 8px; }
2820
+ .ccw_plugin .chips {
2821
+ border: none;
2822
+ border-bottom: 1px solid #9e9e9e;
2823
+ box-shadow: none;
2824
+ margin: 0 0 20px 0;
2825
+ min-height: 45px;
2826
+ outline: none;
2827
+ transition: all .3s; }
2828
+ .ccw_plugin .chips.focus {
2829
+ border-bottom: 1px solid #26a69a;
2830
+ box-shadow: 0 1px 0 0 #26a69a; }
2831
+ .ccw_plugin .chips:hover {
2832
+ cursor: text; }
2833
+ .ccw_plugin .chips .chip.selected {
2834
+ background-color: #26a69a;
2835
+ color: #fff; }
2836
+ .ccw_plugin .chips .input {
2837
+ background: none;
2838
+ border: 0;
2839
+ color: rgba(0, 0, 0, 0.6);
2840
+ display: inline-block;
2841
+ font-size: 1rem;
2842
+ height: 3rem;
2843
+ line-height: 32px;
2844
+ outline: 0;
2845
+ margin: 0;
2846
+ padding: 0 !important;
2847
+ width: 120px !important; }
2848
+ .ccw_plugin .chips .input:focus {
2849
+ border: 0 !important;
2850
+ box-shadow: none !important; }
2851
+ .ccw_plugin .chips .autocomplete-content {
2852
+ margin-top: 0;
2853
+ margin-bottom: 0; }
2854
+ .ccw_plugin .prefix ~ .chips {
2855
+ margin-left: 3rem;
2856
+ width: 92%;
2857
+ width: calc(100% - 3rem); }
2858
+ .ccw_plugin .chips:empty ~ label {
2859
+ font-size: 0.8rem;
2860
+ transform: translateY(-140%); }
2861
+ .ccw_plugin select:focus {
2862
+ outline: 1px solid #c9f3ef; }
2863
+ .ccw_plugin button:focus {
2864
+ outline: none;
2865
+ background-color: #2ab7a9; }
2866
+ .ccw_plugin label {
2867
+ font-size: 0.8rem;
2868
+ color: #9e9e9e; }
2869
+ .ccw_plugin ::placeholder {
2870
+ color: #d1d1d1; }
2871
+ .ccw_plugin input:not([type]),
2872
+ .ccw_plugin input[type=text]:not(.browser-default),
2873
+ .ccw_plugin input[type=password]:not(.browser-default),
2874
+ .ccw_plugin input[type=email]:not(.browser-default),
2875
+ .ccw_plugin input[type=url]:not(.browser-default),
2876
+ .ccw_plugin input[type=time]:not(.browser-default),
2877
+ .ccw_plugin input[type=date]:not(.browser-default),
2878
+ .ccw_plugin input[type=datetime]:not(.browser-default),
2879
+ .ccw_plugin input[type=datetime-local]:not(.browser-default),
2880
+ .ccw_plugin input[type=tel]:not(.browser-default),
2881
+ .ccw_plugin input[type=number]:not(.browser-default),
2882
+ .ccw_plugin input[type=search]:not(.browser-default),
2883
+ .ccw_plugin textarea.materialize-textarea {
2884
+ background-color: transparent;
2885
+ border: none;
2886
+ border-bottom: 1px solid #9e9e9e;
2887
+ border-radius: 0;
2888
+ outline: none;
2889
+ height: 3rem;
2890
+ width: 100%;
2891
+ font-size: 1rem;
2892
+ margin: 0 0 20px 0;
2893
+ padding: 0;
2894
+ box-shadow: none;
2895
+ box-sizing: content-box;
2896
+ transition: all 0.3s; }
2897
+ .ccw_plugin input:not([type]):disabled, .ccw_plugin input:not([type])[readonly="readonly"],
2898
+ .ccw_plugin input[type=text]:not(.browser-default):disabled,
2899
+ .ccw_plugin input[type=text]:not(.browser-default)[readonly="readonly"],
2900
+ .ccw_plugin input[type=password]:not(.browser-default):disabled,
2901
+ .ccw_plugin input[type=password]:not(.browser-default)[readonly="readonly"],
2902
+ .ccw_plugin input[type=email]:not(.browser-default):disabled,
2903
+ .ccw_plugin input[type=email]:not(.browser-default)[readonly="readonly"],
2904
+ .ccw_plugin input[type=url]:not(.browser-default):disabled,
2905
+ .ccw_plugin input[type=url]:not(.browser-default)[readonly="readonly"],
2906
+ .ccw_plugin input[type=time]:not(.browser-default):disabled,
2907
+ .ccw_plugin input[type=time]:not(.browser-default)[readonly="readonly"],
2908
+ .ccw_plugin input[type=date]:not(.browser-default):disabled,
2909
+ .ccw_plugin input[type=date]:not(.browser-default)[readonly="readonly"],
2910
+ .ccw_plugin input[type=datetime]:not(.browser-default):disabled,
2911
+ .ccw_plugin input[type=datetime]:not(.browser-default)[readonly="readonly"],
2912
+ .ccw_plugin input[type=datetime-local]:not(.browser-default):disabled,
2913
+ .ccw_plugin input[type=datetime-local]:not(.browser-default)[readonly="readonly"],
2914
+ .ccw_plugin input[type=tel]:not(.browser-default):disabled,
2915
+ .ccw_plugin input[type=tel]:not(.browser-default)[readonly="readonly"],
2916
+ .ccw_plugin input[type=number]:not(.browser-default):disabled,
2917
+ .ccw_plugin input[type=number]:not(.browser-default)[readonly="readonly"],
2918
+ .ccw_plugin input[type=search]:not(.browser-default):disabled,
2919
+ .ccw_plugin input[type=search]:not(.browser-default)[readonly="readonly"],
2920
+ .ccw_plugin textarea.materialize-textarea:disabled,
2921
+ .ccw_plugin textarea.materialize-textarea[readonly="readonly"] {
2922
+ color: rgba(0, 0, 0, 0.42);
2923
+ border-bottom: 1px dotted rgba(0, 0, 0, 0.42); }
2924
+ .ccw_plugin input:not([type]):disabled + label,
2925
+ .ccw_plugin input:not([type])[readonly="readonly"] + label,
2926
+ .ccw_plugin input[type=text]:not(.browser-default):disabled + label,
2927
+ .ccw_plugin input[type=text]:not(.browser-default)[readonly="readonly"] + label,
2928
+ .ccw_plugin input[type=password]:not(.browser-default):disabled + label,
2929
+ .ccw_plugin input[type=password]:not(.browser-default)[readonly="readonly"] + label,
2930
+ .ccw_plugin input[type=email]:not(.browser-default):disabled + label,
2931
+ .ccw_plugin input[type=email]:not(.browser-default)[readonly="readonly"] + label,
2932
+ .ccw_plugin input[type=url]:not(.browser-default):disabled + label,
2933
+ .ccw_plugin input[type=url]:not(.browser-default)[readonly="readonly"] + label,
2934
+ .ccw_plugin input[type=time]:not(.browser-default):disabled + label,
2935
+ .ccw_plugin input[type=time]:not(.browser-default)[readonly="readonly"] + label,
2936
+ .ccw_plugin input[type=date]:not(.browser-default):disabled + label,
2937
+ .ccw_plugin input[type=date]:not(.browser-default)[readonly="readonly"] + label,
2938
+ .ccw_plugin input[type=datetime]:not(.browser-default):disabled + label,
2939
+ .ccw_plugin input[type=datetime]:not(.browser-default)[readonly="readonly"] + label,
2940
+ .ccw_plugin input[type=datetime-local]:not(.browser-default):disabled + label,
2941
+ .ccw_plugin input[type=datetime-local]:not(.browser-default)[readonly="readonly"] + label,
2942
+ .ccw_plugin input[type=tel]:not(.browser-default):disabled + label,
2943
+ .ccw_plugin input[type=tel]:not(.browser-default)[readonly="readonly"] + label,
2944
+ .ccw_plugin input[type=number]:not(.browser-default):disabled + label,
2945
+ .ccw_plugin input[type=number]:not(.browser-default)[readonly="readonly"] + label,
2946
+ .ccw_plugin input[type=search]:not(.browser-default):disabled + label,
2947
+ .ccw_plugin input[type=search]:not(.browser-default)[readonly="readonly"] + label,
2948
+ .ccw_plugin textarea.materialize-textarea:disabled + label,
2949
+ .ccw_plugin textarea.materialize-textarea[readonly="readonly"] + label {
2950
+ color: rgba(0, 0, 0, 0.42); }
2951
+ .ccw_plugin input:not([type]):focus:not([readonly]),
2952
+ .ccw_plugin input[type=text]:not(.browser-default):focus:not([readonly]),
2953
+ .ccw_plugin input[type=password]:not(.browser-default):focus:not([readonly]),
2954
+ .ccw_plugin input[type=email]:not(.browser-default):focus:not([readonly]),
2955
+ .ccw_plugin input[type=url]:not(.browser-default):focus:not([readonly]),
2956
+ .ccw_plugin input[type=time]:not(.browser-default):focus:not([readonly]),
2957
+ .ccw_plugin input[type=date]:not(.browser-default):focus:not([readonly]),
2958
+ .ccw_plugin input[type=datetime]:not(.browser-default):focus:not([readonly]),
2959
+ .ccw_plugin input[type=datetime-local]:not(.browser-default):focus:not([readonly]),
2960
+ .ccw_plugin input[type=tel]:not(.browser-default):focus:not([readonly]),
2961
+ .ccw_plugin input[type=number]:not(.browser-default):focus:not([readonly]),
2962
+ .ccw_plugin input[type=search]:not(.browser-default):focus:not([readonly]),
2963
+ .ccw_plugin textarea.materialize-textarea:focus:not([readonly]) {
2964
+ border-bottom: 1px solid #26a69a;
2965
+ box-shadow: 0 1px 0 0 #26a69a; }
2966
+ .ccw_plugin input:not([type]):focus:not([readonly]) + label,
2967
+ .ccw_plugin input[type=text]:not(.browser-default):focus:not([readonly]) + label,
2968
+ .ccw_plugin input[type=password]:not(.browser-default):focus:not([readonly]) + label,
2969
+ .ccw_plugin input[type=email]:not(.browser-default):focus:not([readonly]) + label,
2970
+ .ccw_plugin input[type=url]:not(.browser-default):focus:not([readonly]) + label,
2971
+ .ccw_plugin input[type=time]:not(.browser-default):focus:not([readonly]) + label,
2972
+ .ccw_plugin input[type=date]:not(.browser-default):focus:not([readonly]) + label,
2973
+ .ccw_plugin input[type=datetime]:not(.browser-default):focus:not([readonly]) + label,
2974
+ .ccw_plugin input[type=datetime-local]:not(.browser-default):focus:not([readonly]) + label,
2975
+ .ccw_plugin input[type=tel]:not(.browser-default):focus:not([readonly]) + label,
2976
+ .ccw_plugin input[type=number]:not(.browser-default):focus:not([readonly]) + label,
2977
+ .ccw_plugin input[type=search]:not(.browser-default):focus:not([readonly]) + label,
2978
+ .ccw_plugin textarea.materialize-textarea:focus:not([readonly]) + label {
2979
+ color: #26a69a; }
2980
+ .ccw_plugin input:not([type]).validate + label,
2981
+ .ccw_plugin input[type=text]:not(.browser-default).validate + label,
2982
+ .ccw_plugin input[type=password]:not(.browser-default).validate + label,
2983
+ .ccw_plugin input[type=email]:not(.browser-default).validate + label,
2984
+ .ccw_plugin input[type=url]:not(.browser-default).validate + label,
2985
+ .ccw_plugin input[type=time]:not(.browser-default).validate + label,
2986
+ .ccw_plugin input[type=date]:not(.browser-default).validate + label,
2987
+ .ccw_plugin input[type=datetime]:not(.browser-default).validate + label,
2988
+ .ccw_plugin input[type=datetime-local]:not(.browser-default).validate + label,
2989
+ .ccw_plugin input[type=tel]:not(.browser-default).validate + label,
2990
+ .ccw_plugin input[type=number]:not(.browser-default).validate + label,
2991
+ .ccw_plugin input[type=search]:not(.browser-default).validate + label,
2992
+ .ccw_plugin textarea.materialize-textarea.validate + label {
2993
+ width: 100%; }
2994
+ .ccw_plugin input:not([type]).invalid + label:after,
2995
+ .ccw_plugin input:not([type]).valid + label:after,
2996
+ .ccw_plugin input[type=text]:not(.browser-default).invalid + label:after,
2997
+ .ccw_plugin input[type=text]:not(.browser-default).valid + label:after,
2998
+ .ccw_plugin input[type=password]:not(.browser-default).invalid + label:after,
2999
+ .ccw_plugin input[type=password]:not(.browser-default).valid + label:after,
3000
+ .ccw_plugin input[type=email]:not(.browser-default).invalid + label:after,
3001
+ .ccw_plugin input[type=email]:not(.browser-default).valid + label:after,
3002
+ .ccw_plugin input[type=url]:not(.browser-default).invalid + label:after,
3003
+ .ccw_plugin input[type=url]:not(.browser-default).valid + label:after,
3004
+ .ccw_plugin input[type=time]:not(.browser-default).invalid + label:after,
3005
+ .ccw_plugin input[type=time]:not(.browser-default).valid + label:after,
3006
+ .ccw_plugin input[type=date]:not(.browser-default).invalid + label:after,
3007
+ .ccw_plugin input[type=date]:not(.browser-default).valid + label:after,
3008
+ .ccw_plugin input[type=datetime]:not(.browser-default).invalid + label:after,
3009
+ .ccw_plugin input[type=datetime]:not(.browser-default).valid + label:after,
3010
+ .ccw_plugin input[type=datetime-local]:not(.browser-default).invalid + label:after,
3011
+ .ccw_plugin input[type=datetime-local]:not(.browser-default).valid + label:after,
3012
+ .ccw_plugin input[type=tel]:not(.browser-default).invalid + label:after,
3013
+ .ccw_plugin input[type=tel]:not(.browser-default).valid + label:after,
3014
+ .ccw_plugin input[type=number]:not(.browser-default).invalid + label:after,
3015
+ .ccw_plugin input[type=number]:not(.browser-default).valid + label:after,
3016
+ .ccw_plugin input[type=search]:not(.browser-default).invalid + label:after,
3017
+ .ccw_plugin input[type=search]:not(.browser-default).valid + label:after,
3018
+ .ccw_plugin textarea.materialize-textarea.invalid + label:after,
3019
+ .ccw_plugin textarea.materialize-textarea.valid + label:after {
3020
+ display: none; }
3021
+ .ccw_plugin input:not([type]).invalid + label.active:after,
3022
+ .ccw_plugin input:not([type]).valid + label.active:after,
3023
+ .ccw_plugin input[type=text]:not(.browser-default).invalid + label.active:after,
3024
+ .ccw_plugin input[type=text]:not(.browser-default).valid + label.active:after,
3025
+ .ccw_plugin input[type=password]:not(.browser-default).invalid + label.active:after,
3026
+ .ccw_plugin input[type=password]:not(.browser-default).valid + label.active:after,
3027
+ .ccw_plugin input[type=email]:not(.browser-default).invalid + label.active:after,
3028
+ .ccw_plugin input[type=email]:not(.browser-default).valid + label.active:after,
3029
+ .ccw_plugin input[type=url]:not(.browser-default).invalid + label.active:after,
3030
+ .ccw_plugin input[type=url]:not(.browser-default).valid + label.active:after,
3031
+ .ccw_plugin input[type=time]:not(.browser-default).invalid + label.active:after,
3032
+ .ccw_plugin input[type=time]:not(.browser-default).valid + label.active:after,
3033
+ .ccw_plugin input[type=date]:not(.browser-default).invalid + label.active:after,
3034
+ .ccw_plugin input[type=date]:not(.browser-default).valid + label.active:after,
3035
+ .ccw_plugin input[type=datetime]:not(.browser-default).invalid + label.active:after,
3036
+ .ccw_plugin input[type=datetime]:not(.browser-default).valid + label.active:after,
3037
+ .ccw_plugin input[type=datetime-local]:not(.browser-default).invalid + label.active:after,
3038
+ .ccw_plugin input[type=datetime-local]:not(.browser-default).valid + label.active:after,
3039
+ .ccw_plugin input[type=tel]:not(.browser-default).invalid + label.active:after,
3040
+ .ccw_plugin input[type=tel]:not(.browser-default).valid + label.active:after,
3041
+ .ccw_plugin input[type=number]:not(.browser-default).invalid + label.active:after,
3042
+ .ccw_plugin input[type=number]:not(.browser-default).valid + label.active:after,
3043
+ .ccw_plugin input[type=search]:not(.browser-default).invalid + label.active:after,
3044
+ .ccw_plugin input[type=search]:not(.browser-default).valid + label.active:after,
3045
+ .ccw_plugin textarea.materialize-textarea.invalid + label.active:after,
3046
+ .ccw_plugin textarea.materialize-textarea.valid + label.active:after {
3047
+ display: block; }
3048
+ .ccw_plugin input.valid:not([type]), .ccw_plugin input.valid:not([type]):focus, .ccw_plugin input[type=text].valid:not(.browser-default), .ccw_plugin input[type=text].valid:not(.browser-default):focus, .ccw_plugin input[type=password].valid:not(.browser-default), .ccw_plugin input[type=password].valid:not(.browser-default):focus, .ccw_plugin input[type=email].valid:not(.browser-default), .ccw_plugin input[type=email].valid:not(.browser-default):focus, .ccw_plugin input[type=url].valid:not(.browser-default), .ccw_plugin input[type=url].valid:not(.browser-default):focus, .ccw_plugin input[type=time].valid:not(.browser-default), .ccw_plugin input[type=time].valid:not(.browser-default):focus, .ccw_plugin input[type=date].valid:not(.browser-default), .ccw_plugin input[type=date].valid:not(.browser-default):focus, .ccw_plugin input[type=datetime].valid:not(.browser-default), .ccw_plugin input[type=datetime].valid:not(.browser-default):focus, .ccw_plugin input[type=datetime-local].valid:not(.browser-default), .ccw_plugin input[type=datetime-local].valid:not(.browser-default):focus, .ccw_plugin input[type=tel].valid:not(.browser-default), .ccw_plugin input[type=tel].valid:not(.browser-default):focus, .ccw_plugin input[type=number].valid:not(.browser-default), .ccw_plugin input[type=number].valid:not(.browser-default):focus, .ccw_plugin input[type=search].valid:not(.browser-default), .ccw_plugin input[type=search].valid:not(.browser-default):focus, .ccw_plugin textarea.materialize-textarea.valid, .ccw_plugin textarea.materialize-textarea.valid:focus, .ccw_plugin .select-wrapper.valid > input.select-dropdown {
3049
+ border-bottom: 1px solid #4CAF50;
3050
+ box-shadow: 0 1px 0 0 #4CAF50; }
3051
+ .ccw_plugin input.invalid:not([type]), .ccw_plugin input.invalid:not([type]):focus, .ccw_plugin input[type=text].invalid:not(.browser-default), .ccw_plugin input[type=text].invalid:not(.browser-default):focus, .ccw_plugin input[type=password].invalid:not(.browser-default), .ccw_plugin input[type=password].invalid:not(.browser-default):focus, .ccw_plugin input[type=email].invalid:not(.browser-default), .ccw_plugin input[type=email].invalid:not(.browser-default):focus, .ccw_plugin input[type=url].invalid:not(.browser-default), .ccw_plugin input[type=url].invalid:not(.browser-default):focus, .ccw_plugin input[type=time].invalid:not(.browser-default), .ccw_plugin input[type=time].invalid:not(.browser-default):focus, .ccw_plugin input[type=date].invalid:not(.browser-default), .ccw_plugin input[type=date].invalid:not(.browser-default):focus, .ccw_plugin input[type=datetime].invalid:not(.browser-default), .ccw_plugin input[type=datetime].invalid:not(.browser-default):focus, .ccw_plugin input[type=datetime-local].invalid:not(.browser-default), .ccw_plugin input[type=datetime-local].invalid:not(.browser-default):focus, .ccw_plugin input[type=tel].invalid:not(.browser-default), .ccw_plugin input[type=tel].invalid:not(.browser-default):focus, .ccw_plugin input[type=number].invalid:not(.browser-default), .ccw_plugin input[type=number].invalid:not(.browser-default):focus, .ccw_plugin input[type=search].invalid:not(.browser-default), .ccw_plugin input[type=search].invalid:not(.browser-default):focus, .ccw_plugin textarea.materialize-textarea.invalid, .ccw_plugin textarea.materialize-textarea.invalid:focus, .ccw_plugin .select-wrapper.invalid > input.select-dropdown {
3052
+ border-bottom: 1px solid #F44336;
3053
+ box-shadow: 0 1px 0 0 #F44336; }
3054
+ .ccw_plugin input:not([type]).valid + label:after, .ccw_plugin input:not([type]):focus.valid + label:after, .ccw_plugin input[type=text]:not(.browser-default).valid + label:after, .ccw_plugin input[type=text]:not(.browser-default):focus.valid + label:after, .ccw_plugin input[type=password]:not(.browser-default).valid + label:after, .ccw_plugin input[type=password]:not(.browser-default):focus.valid + label:after, .ccw_plugin input[type=email]:not(.browser-default).valid + label:after, .ccw_plugin input[type=email]:not(.browser-default):focus.valid + label:after, .ccw_plugin input[type=url]:not(.browser-default).valid + label:after, .ccw_plugin input[type=url]:not(.browser-default):focus.valid + label:after, .ccw_plugin input[type=time]:not(.browser-default).valid + label:after, .ccw_plugin input[type=time]:not(.browser-default):focus.valid + label:after, .ccw_plugin input[type=date]:not(.browser-default).valid + label:after, .ccw_plugin input[type=date]:not(.browser-default):focus.valid + label:after, .ccw_plugin input[type=datetime]:not(.browser-default).valid + label:after, .ccw_plugin input[type=datetime]:not(.browser-default):focus.valid + label:after, .ccw_plugin input[type=datetime-local]:not(.browser-default).valid + label:after, .ccw_plugin input[type=datetime-local]:not(.browser-default):focus.valid + label:after, .ccw_plugin input[type=tel]:not(.browser-default).valid + label:after, .ccw_plugin input[type=tel]:not(.browser-default):focus.valid + label:after, .ccw_plugin input[type=number]:not(.browser-default).valid + label:after, .ccw_plugin input[type=number]:not(.browser-default):focus.valid + label:after, .ccw_plugin input[type=search]:not(.browser-default).valid + label:after, .ccw_plugin input[type=search]:not(.browser-default):focus.valid + label:after, .ccw_plugin textarea.materialize-textarea.valid + label:after, .ccw_plugin textarea.materialize-textarea:focus.valid + label:after, .ccw_plugin .select-wrapper.valid + label:after {
3055
+ content: attr(data-success);
3056
+ color: #4CAF50;
3057
+ opacity: 1;
3058
+ transform: translateY(9px); }
3059
+ .ccw_plugin input:not([type]).invalid + label:after, .ccw_plugin input:not([type]):focus.invalid + label:after, .ccw_plugin input[type=text]:not(.browser-default).invalid + label:after, .ccw_plugin input[type=text]:not(.browser-default):focus.invalid + label:after, .ccw_plugin input[type=password]:not(.browser-default).invalid + label:after, .ccw_plugin input[type=password]:not(.browser-default):focus.invalid + label:after, .ccw_plugin input[type=email]:not(.browser-default).invalid + label:after, .ccw_plugin input[type=email]:not(.browser-default):focus.invalid + label:after, .ccw_plugin input[type=url]:not(.browser-default).invalid + label:after, .ccw_plugin input[type=url]:not(.browser-default):focus.invalid + label:after, .ccw_plugin input[type=time]:not(.browser-default).invalid + label:after, .ccw_plugin input[type=time]:not(.browser-default):focus.invalid + label:after, .ccw_plugin input[type=date]:not(.browser-default).invalid + label:after, .ccw_plugin input[type=date]:not(.browser-default):focus.invalid + label:after, .ccw_plugin input[type=datetime]:not(.browser-default).invalid + label:after, .ccw_plugin input[type=datetime]:not(.browser-default):focus.invalid + label:after, .ccw_plugin input[type=datetime-local]:not(.browser-default).invalid + label:after, .ccw_plugin input[type=datetime-local]:not(.browser-default):focus.invalid + label:after, .ccw_plugin input[type=tel]:not(.browser-default).invalid + label:after, .ccw_plugin input[type=tel]:not(.browser-default):focus.invalid + label:after, .ccw_plugin input[type=number]:not(.browser-default).invalid + label:after, .ccw_plugin input[type=number]:not(.browser-default):focus.invalid + label:after, .ccw_plugin input[type=search]:not(.browser-default).invalid + label:after, .ccw_plugin input[type=search]:not(.browser-default):focus.invalid + label:after, .ccw_plugin textarea.materialize-textarea.invalid + label:after, .ccw_plugin textarea.materialize-textarea:focus.invalid + label:after, .ccw_plugin .select-wrapper.invalid + label:after {
3060
+ content: attr(data-error);
3061
+ color: #F44336;
3062
+ opacity: 1;
3063
+ transform: translateY(9px); }
3064
+ .ccw_plugin input:not([type]) + label:after, .ccw_plugin input[type=text]:not(.browser-default) + label:after, .ccw_plugin input[type=password]:not(.browser-default) + label:after, .ccw_plugin input[type=email]:not(.browser-default) + label:after, .ccw_plugin input[type=url]:not(.browser-default) + label:after, .ccw_plugin input[type=time]:not(.browser-default) + label:after, .ccw_plugin input[type=date]:not(.browser-default) + label:after, .ccw_plugin input[type=datetime]:not(.browser-default) + label:after, .ccw_plugin input[type=datetime-local]:not(.browser-default) + label:after, .ccw_plugin input[type=tel]:not(.browser-default) + label:after, .ccw_plugin input[type=number]:not(.browser-default) + label:after, .ccw_plugin input[type=search]:not(.browser-default) + label:after, .ccw_plugin textarea.materialize-textarea + label:after, .ccw_plugin .select-wrapper + label:after {
3065
+ display: block;
3066
+ content: "";
3067
+ position: absolute;
3068
+ top: 100%;
3069
+ left: 0;
3070
+ opacity: 0;
3071
+ transition: .2s opacity ease-out, .2s color ease-out; }
3072
+ .ccw_plugin .input-field {
3073
+ position: relative;
3074
+ margin-top: 1rem; }
3075
+ .ccw_plugin .input-field.inline {
3076
+ display: inline-block;
3077
+ vertical-align: middle;
3078
+ margin-left: 5px; }
3079
+ .ccw_plugin .input-field.inline input,
3080
+ .ccw_plugin .input-field.inline .select-dropdown {
3081
+ margin-bottom: 1rem; }
3082
+ .ccw_plugin .input-field.col label {
3083
+ left: 0.75rem; }
3084
+ .ccw_plugin .input-field.col .prefix ~ label,
3085
+ .ccw_plugin .input-field.col .prefix ~ .validate ~ label {
3086
+ width: calc(100% - 3rem - 1.5rem); }
3087
+ .ccw_plugin .input-field label {
3088
+ color: #9e9e9e;
3089
+ position: absolute;
3090
+ top: 0;
3091
+ left: 0;
3092
+ height: 100%;
3093
+ font-size: 1rem;
3094
+ cursor: text;
3095
+ transition: transform .2s ease-out;
3096
+ transform-origin: 0% 100%;
3097
+ text-align: initial;
3098
+ transform: translateY(12px);
3099
+ pointer-events: none; }
3100
+ .ccw_plugin .input-field label:not(.label-icon).active {
3101
+ transform: translateY(-14px) scale(0.8);
3102
+ transform-origin: 0 0; }
3103
+ .ccw_plugin .input-field .prefix {
3104
+ position: absolute;
3105
+ width: 3rem;
3106
+ font-size: 2rem;
3107
+ transition: color .2s; }
3108
+ .ccw_plugin .input-field .prefix.active {
3109
+ color: #26a69a; }
3110
+ .ccw_plugin .input-field .prefix ~ input,
3111
+ .ccw_plugin .input-field .prefix ~ textarea,
3112
+ .ccw_plugin .input-field .prefix ~ label,
3113
+ .ccw_plugin .input-field .prefix ~ .validate ~ label,
3114
+ .ccw_plugin .input-field .prefix ~ .autocomplete-content {
3115
+ margin-left: 3rem;
3116
+ width: 92%;
3117
+ width: calc(100% - 3rem); }
3118
+ .ccw_plugin .input-field .prefix ~ label {
3119
+ margin-left: 3rem; }
3120
+ @media only screen and (max-width: 992px) {
3121
+ .ccw_plugin .input-field .prefix ~ input {
3122
+ width: 86%;
3123
+ width: calc(100% - 3rem); } }
3124
+ @media only screen and (max-width: 600px) {
3125
+ .ccw_plugin .input-field .prefix ~ input {
3126
+ width: 80%;
3127
+ width: calc(100% - 3rem); } }
3128
+ .ccw_plugin .input-field input[type=search] {
3129
+ display: block;
3130
+ line-height: inherit; }
3131
+ .nav-wrapper .ccw_plugin .input-field input[type=search] {
3132
+ height: inherit;
3133
+ padding-left: 4rem;
3134
+ width: calc(100% - 4rem);
3135
+ border: 0;
3136
+ box-shadow: none; }
3137
+ .ccw_plugin .input-field input[type=search]:focus {
3138
+ background-color: #fff;
3139
+ border: 0;
3140
+ box-shadow: none;
3141
+ color: #444; }
3142
+ .ccw_plugin .input-field input[type=search]:focus + label i,
3143
+ .ccw_plugin .input-field input[type=search]:focus ~ .mdi-navigation-close,
3144
+ .ccw_plugin .input-field input[type=search]:focus ~ .material-icons {
3145
+ color: #444; }
3146
+ .ccw_plugin .input-field input[type=search] + label {
3147
+ left: 1rem; }
3148
+ .ccw_plugin .input-field input[type=search] ~ .mdi-navigation-close,
3149
+ .ccw_plugin .input-field input[type=search] ~ .material-icons {
3150
+ position: absolute;
3151
+ top: 0;
3152
+ right: 1rem;
3153
+ color: transparent;
3154
+ cursor: pointer;
3155
+ font-size: 2rem;
3156
+ transition: .3s color; }
3157
+ .ccw_plugin textarea {
3158
+ width: 100%;
3159
+ height: 3rem;
3160
+ background-color: transparent; }
3161
+ .ccw_plugin textarea.materialize-textarea {
3162
+ overflow-y: hidden;
3163
+ /* prevents scroll bar flash */
3164
+ padding: .8rem 0 1.6rem 0;
3165
+ /* prevents text jump on Enter keypress */
3166
+ resize: none;
3167
+ min-height: 3rem; }
3168
+ .ccw_plugin textarea.materialize-textarea.validate + label {
3169
+ height: 100%; }
3170
+ .ccw_plugin textarea.materialize-textarea.validate + label::after {
3171
+ top: calc(100% - 12px); }
3172
+ .ccw_plugin textarea.materialize-textarea.validate + label:not(.label-icon).active {
3173
+ transform: translateY(-25px); }
3174
+ .ccw_plugin .hiddendiv {
3175
+ display: none;
3176
+ white-space: pre-wrap;
3177
+ word-wrap: break-word;
3178
+ overflow-wrap: break-word;
3179
+ /* future version of deprecated 'word-wrap' */
3180
+ padding-top: 1.2rem;
3181
+ /* prevents text jump on Enter keypress */
3182
+ position: absolute;
3183
+ top: 0; }
3184
+ .ccw_plugin .autocomplete-content {
3185
+ margin-top: -20px;
3186
+ margin-bottom: 20px;
3187
+ display: block;
3188
+ opacity: 1;
3189
+ position: static; }
3190
+ .ccw_plugin .autocomplete-content li .highlight {
3191
+ color: #444; }
3192
+ .ccw_plugin .autocomplete-content li img {
3193
+ height: 40px;
3194
+ width: 40px;
3195
+ margin: 5px 15px; }
3196
+ .ccw_plugin [type="radio"]:not(:checked),
3197
+ .ccw_plugin [type="radio"]:checked {
3198
+ position: absolute;
3199
+ opacity: 0;
3200
+ pointer-events: none; }
3201
+ .ccw_plugin [type="radio"]:not(:checked) + label,
3202
+ .ccw_plugin [type="radio"]:checked + label {
3203
+ position: relative;
3204
+ padding-left: 35px;
3205
+ cursor: pointer;
3206
+ display: inline-block;
3207
+ height: 25px;
3208
+ line-height: 25px;
3209
+ font-size: 1rem;
3210
+ transition: .28s ease;
3211
+ user-select: none; }
3212
+ .ccw_plugin [type="radio"] + label:before,
3213
+ .ccw_plugin [type="radio"] + label:after {
3214
+ content: '';
3215
+ position: absolute;
3216
+ left: 0;
3217
+ top: 0;
3218
+ margin: 4px;
3219
+ width: 16px;
3220
+ height: 16px;
3221
+ z-index: 0;
3222
+ transition: .28s ease; }
3223
+ .ccw_plugin [type="radio"]:not(:checked) + label:before,
3224
+ .ccw_plugin [type="radio"]:not(:checked) + label:after,
3225
+ .ccw_plugin [type="radio"]:checked + label:before,
3226
+ .ccw_plugin [type="radio"]:checked + label:after,
3227
+ .ccw_plugin [type="radio"].with-gap:checked + label:before,
3228
+ .ccw_plugin [type="radio"].with-gap:checked + label:after {
3229
+ border-radius: 50%; }
3230
+ .ccw_plugin [type="radio"]:not(:checked) + label:before,
3231
+ .ccw_plugin [type="radio"]:not(:checked) + label:after {
3232
+ border: 2px solid #5a5a5a; }
3233
+ .ccw_plugin [type="radio"]:not(:checked) + label:after {
3234
+ transform: scale(0); }
3235
+ .ccw_plugin [type="radio"]:checked + label:before {
3236
+ border: 2px solid transparent; }
3237
+ .ccw_plugin [type="radio"]:checked + label:after,
3238
+ .ccw_plugin [type="radio"].with-gap:checked + label:before,
3239
+ .ccw_plugin [type="radio"].with-gap:checked + label:after {
3240
+ border: 2px solid #26a69a; }
3241
+ .ccw_plugin [type="radio"]:checked + label:after,
3242
+ .ccw_plugin [type="radio"].with-gap:checked + label:after {
3243
+ background-color: #26a69a; }
3244
+ .ccw_plugin [type="radio"]:checked + label:after {
3245
+ transform: scale(1.02); }
3246
+ .ccw_plugin [type="radio"].with-gap:checked + label:after {
3247
+ transform: scale(0.5); }
3248
+ .ccw_plugin [type="radio"].tabbed:focus + label:before {
3249
+ box-shadow: 0 0 0 10px rgba(0, 0, 0, 0.1); }
3250
+ .ccw_plugin [type="radio"].with-gap:disabled:checked + label:before {
3251
+ border: 2px solid rgba(0, 0, 0, 0.42); }
3252
+ .ccw_plugin [type="radio"].with-gap:disabled:checked + label:after {
3253
+ border: none;
3254
+ background-color: rgba(0, 0, 0, 0.42); }
3255
+ .ccw_plugin [type="radio"]:disabled:not(:checked) + label:before,
3256
+ .ccw_plugin [type="radio"]:disabled:checked + label:before {
3257
+ background-color: transparent;
3258
+ border-color: rgba(0, 0, 0, 0.42); }
3259
+ .ccw_plugin [type="radio"]:disabled + label {
3260
+ color: rgba(0, 0, 0, 0.42); }
3261
+ .ccw_plugin [type="radio"]:disabled:not(:checked) + label:before {
3262
+ border-color: rgba(0, 0, 0, 0.42); }
3263
+ .ccw_plugin [type="radio"]:disabled:checked + label:after {
3264
+ background-color: rgba(0, 0, 0, 0.42);
3265
+ border-color: #949494; }
3266
+ .ccw_plugin form p {
3267
+ margin-bottom: 10px;
3268
+ text-align: left; }
3269
+ .ccw_plugin form p:last-child {
3270
+ margin-bottom: 0; }
3271
+ .ccw_plugin [type="checkbox"]:not(:checked),
3272
+ .ccw_plugin [type="checkbox"]:checked {
3273
+ position: absolute;
3274
+ opacity: 0;
3275
+ pointer-events: none; }
3276
+ .ccw_plugin [type="checkbox"] {
3277
+ /* checkbox aspect */ }
3278
+ .ccw_plugin [type="checkbox"] + label {
3279
+ position: relative;
3280
+ padding-left: 35px;
3281
+ cursor: pointer;
3282
+ display: inline-block;
3283
+ height: 25px;
3284
+ line-height: 25px;
3285
+ font-size: 1rem;
3286
+ user-select: none; }
3287
+ .ccw_plugin [type="checkbox"] + label:before,
3288
+ .ccw_plugin [type="checkbox"]:not(.filled-in) + label:after {
3289
+ content: '';
3290
+ position: absolute;
3291
+ top: 0;
3292
+ left: 0;
3293
+ width: 18px;
3294
+ height: 18px;
3295
+ z-index: 0;
3296
+ border: 2px solid #5a5a5a;
3297
+ border-radius: 1px;
3298
+ margin-top: 2px;
3299
+ transition: .2s; }
3300
+ .ccw_plugin [type="checkbox"]:not(.filled-in) + label:after {
3301
+ border: 0;
3302
+ transform: scale(0); }
3303
+ .ccw_plugin [type="checkbox"]:not(:checked):disabled + label:before {
3304
+ border: none;
3305
+ background-color: rgba(0, 0, 0, 0.42); }
3306
+ .ccw_plugin [type="checkbox"].tabbed:focus + label:after {
3307
+ transform: scale(1);
3308
+ border: 0;
3309
+ border-radius: 50%;
3310
+ box-shadow: 0 0 0 10px rgba(0, 0, 0, 0.1);
3311
+ background-color: rgba(0, 0, 0, 0.1); }
3312
+ .ccw_plugin [type="checkbox"]:checked + label:before {
3313
+ top: -4px;
3314
+ left: -5px;
3315
+ width: 12px;
3316
+ height: 22px;
3317
+ border-top: 2px solid transparent;
3318
+ border-left: 2px solid transparent;
3319
+ border-right: 2px solid #26a69a;
3320
+ border-bottom: 2px solid #26a69a;
3321
+ transform: rotate(40deg);
3322
+ backface-visibility: hidden;
3323
+ transform-origin: 100% 100%; }
3324
+ .ccw_plugin [type="checkbox"]:checked:disabled + label:before {
3325
+ border-right: 2px solid rgba(0, 0, 0, 0.42);
3326
+ border-bottom: 2px solid rgba(0, 0, 0, 0.42); }
3327
+ .ccw_plugin [type="checkbox"]:indeterminate + label:before {
3328
+ top: -11px;
3329
+ left: -12px;
3330
+ width: 10px;
3331
+ height: 22px;
3332
+ border-top: none;
3333
+ border-left: none;
3334
+ border-right: 2px solid #26a69a;
3335
+ border-bottom: none;
3336
+ transform: rotate(90deg);
3337
+ backface-visibility: hidden;
3338
+ transform-origin: 100% 100%; }
3339
+ .ccw_plugin [type="checkbox"]:indeterminate:disabled + label:before {
3340
+ border-right: 2px solid rgba(0, 0, 0, 0.42);
3341
+ background-color: transparent; }
3342
+ .ccw_plugin [type="checkbox"].filled-in + label:after {
3343
+ border-radius: 2px; }
3344
+ .ccw_plugin [type="checkbox"].filled-in + label:before,
3345
+ .ccw_plugin [type="checkbox"].filled-in + label:after {
3346
+ content: '';
3347
+ left: 0;
3348
+ position: absolute;
3349
+ /* .1s delay is for check animation */
3350
+ transition: border .25s, background-color .25s, width .20s .1s, height .20s .1s, top .20s .1s, left .20s .1s;
3351
+ z-index: 1; }
3352
+ .ccw_plugin [type="checkbox"].filled-in:not(:checked) + label:before {
3353
+ width: 0;
3354
+ height: 0;
3355
+ border: 3px solid transparent;
3356
+ left: 6px;
3357
+ top: 10px;
3358
+ transform: rotateZ(37deg);
3359
+ transform-origin: 100% 100%; }
3360
+ .ccw_plugin [type="checkbox"].filled-in:not(:checked) + label:after {
3361
+ height: 20px;
3362
+ width: 20px;
3363
+ background-color: transparent;
3364
+ border: 2px solid #5a5a5a;
3365
+ top: 0px;
3366
+ z-index: 0; }
3367
+ .ccw_plugin [type="checkbox"].filled-in:checked + label:before {
3368
+ top: 0;
3369
+ left: 1px;
3370
+ width: 8px;
3371
+ height: 13px;
3372
+ border-top: 2px solid transparent;
3373
+ border-left: 2px solid transparent;
3374
+ border-right: 2px solid #fff;
3375
+ border-bottom: 2px solid #fff;
3376
+ transform: rotateZ(37deg);
3377
+ transform-origin: 100% 100%; }
3378
+ .ccw_plugin [type="checkbox"].filled-in:checked + label:after {
3379
+ top: 0;
3380
+ width: 20px;
3381
+ height: 20px;
3382
+ border: 2px solid #26a69a;
3383
+ background-color: #26a69a;
3384
+ z-index: 0; }
3385
+ .ccw_plugin [type="checkbox"].filled-in.tabbed:focus + label:after {
3386
+ border-radius: 2px;
3387
+ border-color: #5a5a5a;
3388
+ background-color: rgba(0, 0, 0, 0.1); }
3389
+ .ccw_plugin [type="checkbox"].filled-in.tabbed:checked:focus + label:after {
3390
+ border-radius: 2px;
3391
+ background-color: #26a69a;
3392
+ border-color: #26a69a; }
3393
+ .ccw_plugin [type="checkbox"].filled-in:disabled:not(:checked) + label:before {
3394
+ background-color: transparent;
3395
+ border: 2px solid transparent; }
3396
+ .ccw_plugin [type="checkbox"].filled-in:disabled:not(:checked) + label:after {
3397
+ border-color: transparent;
3398
+ background-color: #949494; }
3399
+ .ccw_plugin [type="checkbox"].filled-in:disabled:checked + label:before {
3400
+ background-color: transparent; }
3401
+ .ccw_plugin [type="checkbox"].filled-in:disabled:checked + label:after {
3402
+ background-color: #949494;
3403
+ border-color: #949494; }
3404
+ .ccw_plugin .switch,
3405
+ .ccw_plugin .switch * {
3406
+ -webkit-tap-highlight-color: transparent;
3407
+ user-select: none; }
3408
+ .ccw_plugin .switch label {
3409
+ cursor: pointer; }
3410
+ .ccw_plugin .switch label input[type=checkbox] {
3411
+ opacity: 0;
3412
+ width: 0;
3413
+ height: 0; }
3414
+ .ccw_plugin .switch label input[type=checkbox]:checked + .lever {
3415
+ background-color: #84c7c1; }
3416
+ .ccw_plugin .switch label input[type=checkbox]:checked + .lever:before, .ccw_plugin .switch label input[type=checkbox]:checked + .lever:after {
3417
+ left: 18px; }
3418
+ .ccw_plugin .switch label input[type=checkbox]:checked + .lever:after {
3419
+ background-color: #26a69a; }
3420
+ .ccw_plugin .switch label .lever {
3421
+ content: "";
3422
+ display: inline-block;
3423
+ position: relative;
3424
+ width: 36px;
3425
+ height: 14px;
3426
+ background-color: rgba(0, 0, 0, 0.38);
3427
+ border-radius: 15px;
3428
+ margin-right: 10px;
3429
+ transition: background 0.3s ease;
3430
+ vertical-align: middle;
3431
+ margin: 0 16px; }
3432
+ .ccw_plugin .switch label .lever:before, .ccw_plugin .switch label .lever:after {
3433
+ content: "";
3434
+ position: absolute;
3435
+ display: inline-block;
3436
+ width: 20px;
3437
+ height: 20px;
3438
+ border-radius: 50%;
3439
+ left: 0;
3440
+ top: -3px;
3441
+ transition: left 0.3s ease, background .3s ease, box-shadow 0.1s ease, transform .1s ease; }
3442
+ .ccw_plugin .switch label .lever:before {
3443
+ background-color: rgba(38, 166, 154, 0.15); }
3444
+ .ccw_plugin .switch label .lever:after {
3445
+ background-color: #F1F1F1;
3446
+ box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12); }
3447
+ .ccw_plugin input[type=checkbox]:checked:not(:disabled) ~ .lever:active::before,
3448
+ .ccw_plugin input[type=checkbox]:checked:not(:disabled).tabbed:focus ~ .lever::before {
3449
+ transform: scale(2.4);
3450
+ background-color: rgba(38, 166, 154, 0.15); }
3451
+ .ccw_plugin input[type=checkbox]:not(:disabled) ~ .lever:active:before,
3452
+ .ccw_plugin input[type=checkbox]:not(:disabled).tabbed:focus ~ .lever::before {
3453
+ transform: scale(2.4);
3454
+ background-color: rgba(0, 0, 0, 0.08); }
3455
+ .ccw_plugin .switch input[type=checkbox][disabled] + .lever {
3456
+ cursor: default;
3457
+ background-color: rgba(0, 0, 0, 0.12); }
3458
+ .ccw_plugin .switch label input[type=checkbox][disabled] + .lever:after,
3459
+ .ccw_plugin .switch label input[type=checkbox][disabled]:checked + .lever:after {
3460
+ background-color: #949494; }
3461
+ .ccw_plugin select {
3462
+ display: none; }
3463
+ .ccw_plugin select.browser-default {
3464
+ display: block; }
3465
+ .ccw_plugin select {
3466
+ background-color: rgba(255, 255, 255, 0.9);
3467
+ width: 100%;
3468
+ padding: 5px;
3469
+ border: 1px solid #f2f2f2;
3470
+ border-radius: 2px;
3471
+ height: 3rem; }
3472
+ .ccw_plugin .input-field select {
3473
+ display: block;
3474
+ position: absolute;
3475
+ width: 0;
3476
+ pointer-events: none;
3477
+ height: 0;
3478
+ top: 0;
3479
+ left: 0;
3480
+ opacity: 0; }
3481
+ .ccw_plugin .select-label {
3482
+ position: absolute; }
3483
+ .ccw_plugin .select-wrapper {
3484
+ position: relative; }
3485
+ .ccw_plugin .select-wrapper.valid + label,
3486
+ .ccw_plugin .select-wrapper.invalid + label {
3487
+ width: 100%;
3488
+ pointer-events: none; }
3489
+ .ccw_plugin .select-wrapper input.select-dropdown {
3490
+ position: relative;
3491
+ cursor: pointer;
3492
+ background-color: transparent;
3493
+ border: none;
3494
+ border-bottom: 1px solid #9e9e9e;
3495
+ outline: none;
3496
+ height: 3rem;
3497
+ line-height: 3rem;
3498
+ width: 100%;
3499
+ font-size: 1rem;
3500
+ margin: 0 0 20px 0;
3501
+ padding: 0;
3502
+ display: block;
3503
+ user-select: none; }
3504
+ .ccw_plugin .select-wrapper span.caret {
3505
+ color: initial;
3506
+ position: absolute;
3507
+ right: 0;
3508
+ top: 0;
3509
+ bottom: 0;
3510
+ height: 10px;
3511
+ margin: auto 0;
3512
+ font-size: 10px;
3513
+ line-height: 10px; }
3514
+ .ccw_plugin .select-wrapper + label {
3515
+ position: absolute;
3516
+ top: -26px;
3517
+ font-size: 0.8rem; }
3518
+ .ccw_plugin select:disabled {
3519
+ color: rgba(0, 0, 0, 0.42); }
3520
+ .ccw_plugin .select-wrapper.disabled span.caret,
3521
+ .ccw_plugin .select-wrapper.disabled + label {
3522
+ color: rgba(0, 0, 0, 0.42); }
3523
+ .ccw_plugin .select-wrapper input.select-dropdown:disabled {
3524
+ color: rgba(0, 0, 0, 0.42);
3525
+ cursor: default;
3526
+ user-select: none; }
3527
+ .ccw_plugin .select-wrapper i {
3528
+ color: rgba(0, 0, 0, 0.3); }
3529
+ .ccw_plugin .select-dropdown li.disabled,
3530
+ .ccw_plugin .select-dropdown li.disabled > span,
3531
+ .ccw_plugin .select-dropdown li.optgroup {
3532
+ color: rgba(0, 0, 0, 0.3);
3533
+ background-color: transparent; }
3534
+ .ccw_plugin .select-dropdown.dropdown-content li.active {
3535
+ background-color: transparent; }
3536
+ .ccw_plugin .select-dropdown.dropdown-content li:hover {
3537
+ background-color: rgba(0, 0, 0, 0.06); }
3538
+ .ccw_plugin .select-dropdown.dropdown-content li.selected {
3539
+ background-color: rgba(0, 0, 0, 0.03); }
3540
+ .ccw_plugin .prefix ~ .select-wrapper {
3541
+ margin-left: 3rem;
3542
+ width: 92%;
3543
+ width: calc(100% - 3rem); }
3544
+ .ccw_plugin .prefix ~ label {
3545
+ margin-left: 3rem; }
3546
+ .ccw_plugin .select-dropdown li img {
3547
+ height: 40px;
3548
+ width: 40px;
3549
+ margin: 5px 15px;
3550
+ float: right; }
3551
+ .ccw_plugin .select-dropdown li.optgroup {
3552
+ border-top: 1px solid #eee; }
3553
+ .ccw_plugin .select-dropdown li.optgroup.selected > span {
3554
+ color: rgba(0, 0, 0, 0.7); }
3555
+ .ccw_plugin .select-dropdown li.optgroup > span {
3556
+ color: rgba(0, 0, 0, 0.4); }
3557
+ .ccw_plugin .select-dropdown li.optgroup ~ li.optgroup-option {
3558
+ padding-left: 1rem; }
3559
+ .ccw_plugin .file-field {
3560
+ position: relative; }
3561
+ .ccw_plugin .file-field .file-path-wrapper {
3562
+ overflow: hidden;
3563
+ padding-left: 10px; }
3564
+ .ccw_plugin .file-field input.file-path {
3565
+ width: 100%; }
3566
+ .ccw_plugin .file-field .btn, .ccw_plugin .file-field .btn-large {
3567
+ float: left;
3568
+ height: 3rem;
3569
+ line-height: 3rem; }
3570
+ .ccw_plugin .file-field span {
3571
+ cursor: pointer; }
3572
+ .ccw_plugin .file-field input[type=file] {
3573
+ position: absolute;
3574
+ top: 0;
3575
+ right: 0;
3576
+ left: 0;
3577
+ bottom: 0;
3578
+ width: 100%;
3579
+ margin: 0;
3580
+ padding: 0;
3581
+ font-size: 20px;
3582
+ cursor: pointer;
3583
+ opacity: 0;
3584
+ filter: alpha(opacity=0); }
3585
+ .ccw_plugin .file-field input[type=file]::-webkit-file-upload-button {
3586
+ display: none; }
3587
+ .ccw_plugin .range-field {
3588
+ position: relative; }
3589
+ .ccw_plugin input[type=range],
3590
+ .ccw_plugin input[type=range] + .thumb {
3591
+ cursor: pointer; }
3592
+ .ccw_plugin input[type=range] {
3593
+ position: relative;
3594
+ background-color: transparent;
3595
+ border: none;
3596
+ outline: none;
3597
+ width: 100%;
3598
+ margin: 15px 0;
3599
+ padding: 0; }
3600
+ .ccw_plugin input[type=range]:focus {
3601
+ outline: none; }
3602
+ .ccw_plugin input[type=range] + .thumb {
3603
+ position: absolute;
3604
+ top: 10px;
3605
+ left: 0;
3606
+ border: none;
3607
+ height: 0;
3608
+ width: 0;
3609
+ border-radius: 50%;
3610
+ background-color: #26a69a;
3611
+ margin-left: 7px;
3612
+ transform-origin: 50% 50%;
3613
+ transform: rotate(-45deg); }
3614
+ .ccw_plugin input[type=range] + .thumb .value {
3615
+ display: block;
3616
+ width: 30px;
3617
+ text-align: center;
3618
+ color: #26a69a;
3619
+ font-size: 0;
3620
+ transform: rotate(45deg); }
3621
+ .ccw_plugin input[type=range] + .thumb.active {
3622
+ border-radius: 50% 50% 50% 0; }
3623
+ .ccw_plugin input[type=range] + .thumb.active .value {
3624
+ color: #fff;
3625
+ margin-left: -1px;
3626
+ margin-top: 8px;
3627
+ font-size: 10px; }
3628
+ .ccw_plugin input[type=range] {
3629
+ -webkit-appearance: none; }
3630
+ .ccw_plugin input[type=range]::-webkit-slider-runnable-track {
3631
+ height: 3px;
3632
+ background: #c2c0c2;
3633
+ border: none; }
3634
+ .ccw_plugin input[type=range]::-webkit-slider-thumb {
3635
+ -webkit-appearance: none;
3636
+ border: none;
3637
+ height: 14px;
3638
+ width: 14px;
3639
+ border-radius: 50%;
3640
+ background-color: #26a69a;
3641
+ transform-origin: 50% 50%;
3642
+ margin: -5px 0 0 0;
3643
+ transition: .3s; }
3644
+ .ccw_plugin input[type=range]:focus::-webkit-slider-runnable-track {
3645
+ background: #ccc; }
3646
+ .ccw_plugin input[type=range] {
3647
+ /* fix for FF unable to apply focus style bug */
3648
+ border: 1px solid white;
3649
+ /*required for proper track sizing in FF*/ }
3650
+ .ccw_plugin input[type=range]::-moz-range-track {
3651
+ height: 3px;
3652
+ background: #ddd;
3653
+ border: none; }
3654
+ .ccw_plugin input[type=range]::-moz-range-thumb {
3655
+ border: none;
3656
+ height: 14px;
3657
+ width: 14px;
3658
+ border-radius: 50%;
3659
+ background: #26a69a;
3660
+ margin-top: -5px; }
3661
+ .ccw_plugin input[type=range]:-moz-focusring {
3662
+ outline: 1px solid #fff;
3663
+ outline-offset: -1px; }
3664
+ .ccw_plugin input[type=range]:focus::-moz-range-track {
3665
+ background: #ccc; }
3666
+ .ccw_plugin input[type=range]::-ms-track {
3667
+ height: 3px;
3668
+ background: transparent;
3669
+ border-color: transparent;
3670
+ border-width: 6px 0;
3671
+ /*remove default tick marks*/
3672
+ color: transparent; }
3673
+ .ccw_plugin input[type=range]::-ms-fill-lower {
3674
+ background: #777; }
3675
+ .ccw_plugin input[type=range]::-ms-fill-upper {
3676
+ background: #ddd; }
3677
+ .ccw_plugin input[type=range]::-ms-thumb {
3678
+ border: none;
3679
+ height: 14px;
3680
+ width: 14px;
3681
+ border-radius: 50%;
3682
+ background: #26a69a; }
3683
+ .ccw_plugin input[type=range]:focus::-ms-fill-lower {
3684
+ background: #888; }
3685
+ .ccw_plugin input[type=range]:focus::-ms-fill-upper {
3686
+ background: #ccc; }
3687
+
3688
+
3689
+
3690
+
3691
+ /* ==== custom styles ==== */
3692
+
3693
+ div.ccw_plugin,
3694
+ .inline {
3695
+ display: inline; }
3696
+
3697
+ .inline-block {
3698
+ display: inline-block; }
3699
+
3700
+ .chatbot {
3701
+ position: fixed;
3702
+ z-index: 99; }
3703
+
3704
+ .img-icon {
3705
+ height: 48px; }
3706
+
3707
+ .nofocus:focus {
3708
+ outline: none; }
3709
+
3710
+ .pointer {
3711
+ cursor: pointer; }
3712
+
3713
+ .sc_item {
3714
+ z-index: 99; }
3715
+
3716
+ .style-3-sc {
3717
+ height: 20px; }
3718
+
3719
+ .img-icon-5 {
3720
+ height: 80%;
3721
+ vertical-align: middle; }
3722
+
3723
+ .img-icon-6 {
3724
+ height: 63%;
3725
+ vertical-align: middle;
3726
+ margin-left: 7px; }
3727
+
3728
+ .style-6-img {
3729
+ max-height: 40px;
3730
+ text-decoration: overline; }
3731
+
3732
+ .icon-2 {
3733
+ font-size: 2rem; }
3734
+
3735
+ .btn_only_style_div_circle {
3736
+ border-radius: 50%;
3737
+ text-align: center; }
3738
+
3739
+ .btn_only_style_div_circle_sc {
3740
+ background-color: orange;
3741
+ border-radius: 50%;
3742
+ height: 48px;
3743
+ width: 48px;
3744
+ line-height: 48px;
3745
+ text-align: center; }
3746
+
3747
+ .btn_only_style_div {
3748
+ background-color: orange;
3749
+ height: 48px;
3750
+ width: 48px;
3751
+ line-height: 48px;
3752
+ text-align: center; }
3753
+
3754
+ /* customize styles */
3755
+ .style8 span {
3756
+ text-transform: none; }
assets/fonts/ccw.eot ADDED
Binary file
assets/fonts/ccw.svg ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" standalone="no"?>
2
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
3
+ <svg xmlns="http://www.w3.org/2000/svg">
4
+ <metadata>Generated by IcoMoon</metadata>
5
+ <defs>
6
+ <font id="ccw" horiz-adv-x="1024">
7
+ <font-face units-per-em="1024" ascent="960" descent="-64" />
8
+ <missing-glyph horiz-adv-x="1024" />
9
+ <glyph unicode="&#x20;" horiz-adv-x="512" d="" />
10
+ <glyph unicode="&#xe900;" glyph-name="send" d="M64 64v298l640 86-640 86v298l896-384z" />
11
+ <glyph unicode="&#xe901;" glyph-name="brand" d="M746.56 346.368c-12.8 6.4-75.328 36.992-87.040 41.216-11.648 4.288-20.16 6.4-28.672-6.4-8.448-12.608-32.896-41.152-40.32-49.6-7.424-8.32-14.848-8.96-27.52-3.2-12.8 6.4-53.888 19.84-102.528 63.36-37.888 33.92-63.36 75.52-70.848 88.32-7.424 12.8-0.832 19.84 5.568 26.24 5.76 5.76 12.8 14.72 19.2 22.4 6.272 7.68 8.32 12.8 12.672 21.12 4.224 8.96 2.112 16-1.088 22.4s-28.672 69.12-39.296 94.080c-10.24 24.96-20.8 21.76-28.672 21.76-7.36 0.64-15.872 0.64-24.32 0.64-8.576 0-22.4-3.2-34.048-15.36-11.648-12.8-44.544-43.52-44.544-105.6s45.632-122.24 51.968-131.2c6.4-8.32 89.856-136.32 217.6-191.36 30.464-12.8 54.144-20.48 72.704-26.88 30.464-9.6 58.24-8.32 80.192-5.12 24.512 3.84 75.392 30.72 86.016 60.8 10.88 30.080 10.88 55.040 7.68 60.8s-11.52 8.96-24.32 14.72zM514.56 32h-0.64c-75.52 0-150.4 20.48-215.68 58.88l-15.36 9.152-160-41.6 42.88 155.52-10.24 16c-42.24 67.2-64.64 144.64-64.64 224.384 0 232.32 190.080 421.76 424.192 421.76 113.28 0 219.52-44.16 299.52-124.16 80-79.36 124.16-185.6 124.16-298.24-0.192-232.32-190.272-421.76-423.872-421.76zM875.52 812.8c-97.28 94.080-225.28 147.2-361.6 147.2-280.832 0-509.44-227.584-509.632-507.392 0-89.408 23.424-176.64 68.032-253.696l-72.32-262.912 270.272 70.528c74.496-40.32 158.336-61.696 243.648-61.76h0.256c280.96 0 509.696 227.648 509.824 507.52 0 135.488-52.928 263.040-149.12 358.912z" />
12
+ <glyph unicode="&#xe902;" glyph-name="whatsapp2" horiz-adv-x="878" d="M562.857 394.286c9.714 0 102.857-48.571 106.857-55.429 1.143-2.857 1.143-6.286 1.143-8.571 0-14.286-4.571-30.286-9.714-43.429-13.143-32-66.286-52.571-98.857-52.571-27.429 0-84 24-108.571 35.429-81.714 37.143-132.571 100.571-181.714 173.143-21.714 32-41.143 71.429-40.571 110.857v4.571c1.143 37.714 14.857 64.571 42.286 90.286 8.571 8 17.714 12.571 29.714 12.571 6.857 0 13.714-1.714 21.143-1.714 15.429 0 18.286-4.571 24-19.429 4-9.714 33.143-87.429 33.143-93.143 0-21.714-39.429-46.286-39.429-59.429 0-2.857 1.143-5.714 2.857-8.571 12.571-26.857 36.571-57.714 58.286-78.286 26.286-25.143 54.286-41.714 86.286-57.714 4-2.286 8-4 12.571-4 17.143 0 45.714 55.429 60.571 55.429zM446.857 91.428c197.714 0 358.857 161.143 358.857 358.857s-161.143 358.857-358.857 358.857-358.857-161.143-358.857-358.857c0-75.429 24-149.143 68.571-210.286l-45.143-133.143 138.286 44c58.286-38.286 127.429-59.429 197.143-59.429zM446.857 881.143c237.714 0 430.857-193.143 430.857-430.857s-193.143-430.857-430.857-430.857c-72.571 0-144.571 18.286-208.571 53.714l-238.286-76.571 77.714 231.429c-40.571 66.857-61.714 144-61.714 222.286 0 237.714 193.143 430.857 430.857 430.857z" />
13
+ <glyph unicode="&#xea93;" glyph-name="whatsapp" d="M873 811.2c-95.8 96-223.2 148.8-359 148.8-279.6 0-507.2-227.6-507.2-507.4 0-89.4 23.4-176.8 67.8-253.6l-72-263 269 70.6c74.2-40.4 157.6-61.8 242.4-61.8h0.2c0 0 0 0 0 0 279.6 0 507.4 227.6 507.4 507.4 0 135.6-52.8 263-148.6 359zM514.2 30.4v0c-75.8 0-150 20.4-214.8 58.8l-15.4 9.2-159.6-41.8 42.6 155.6-10 16c-42.4 67-64.6 144.6-64.6 224.4 0 232.6 189.2 421.8 422 421.8 112.6 0 218.6-44 298.2-123.6 79.6-79.8 123.4-185.6 123.4-298.4-0.2-232.8-189.4-422-421.8-422zM745.4 346.4c-12.6 6.4-75 37-86.6 41.2s-20 6.4-28.6-6.4c-8.4-12.6-32.8-41.2-40.2-49.8-7.4-8.4-14.8-9.6-27.4-3.2s-53.6 19.8-102 63c-37.6 33.6-63.2 75.2-70.6 87.8s-0.8 19.6 5.6 25.8c5.8 5.6 12.6 14.8 19 22.2s8.4 12.6 12.6 21.2c4.2 8.4 2.2 15.8-1 22.2s-28.6 68.8-39 94.2c-10.2 24.8-20.8 21.4-28.6 21.8-7.4 0.4-15.8 0.4-24.2 0.4s-22.2-3.2-33.8-15.8c-11.6-12.6-44.4-43.4-44.4-105.8s45.4-122.6 51.8-131.2c6.4-8.4 89.4-136.6 216.6-191.4 30.2-13 53.8-20.8 72.2-26.8 30.4-9.6 58-8.2 79.8-5 24.4 3.6 75 30.6 85.6 60.2s10.6 55 7.4 60.2c-3 5.6-11.4 8.8-24.2 15.2z" />
14
+ </font></defs></svg>
assets/fonts/ccw.ttf ADDED
Binary file
assets/fonts/ccw.woff ADDED
Binary file
assets/img/WhatsApp_logo_12.png ADDED
Binary file
assets/img/send.svg ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ <!-- Generated by IcoMoon.io -->
2
+ <svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="768" height="768" viewBox="0 0 768 768">
3
+ <title></title>
4
+ <g id="icomoon-ignore">
5
+ </g>
6
+ <path fill="#fff" d="M64.5 672v-223.5l480-64.5-480-64.5v-223.5l672 288z"></path>
7
+ </svg>
assets/img/send_16.svg ADDED
@@ -0,0 +1,4 @@
 
 
 
 
1
+ <!-- Generated by IcoMoon.io -->
2
+ <svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="512" height="512" viewBox="0 0 512 512">
3
+ <path fill="#fff" d="M32 448v-149l320-43-320-43v-149l448 192z"></path>
4
+ </svg>
assets/img/whatsapp.svg ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ <!-- Generated by IcoMoon.io -->
2
+ <svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="384" height="448" viewBox="0 0 384 448">
3
+ <title></title>
4
+ <g id="icomoon-ignore">
5
+ </g>
6
+ <path fill="#000" d="M246.25 243.5c4.25 0 45 21.25 46.75 24.25 0.5 1.25 0.5 2.75 0.5 3.75 0 6.25-2 13.25-4.25 19-5.75 14-29 23-43.25 23-12 0-36.75-10.5-47.5-15.5-35.75-16.25-58-44-79.5-75.75-9.5-14-18-31.25-17.75-48.5v-2c0.5-16.5 6.5-28.25 18.5-39.5 3.75-3.5 7.75-5.5 13-5.5 3 0 6 0.75 9.25 0.75 6.75 0 8 2 10.5 8.5 1.75 4.25 14.5 38.25 14.5 40.75 0 9.5-17.25 20.25-17.25 26 0 1.25 0.5 2.5 1.25 3.75 5.5 11.75 16 25.25 25.5 34.25 11.5 11 23.75 18.25 37.75 25.25 1.75 1 3.5 1.75 5.5 1.75 7.5 0 20-24.25 26.5-24.25zM195.5 376c86.5 0 157-70.5 157-157s-70.5-157-157-157-157 70.5-157 157c0 33 10.5 65.25 30 92l-19.75 58.25 60.5-19.25c25.5 16.75 55.75 26 86.25 26zM195.5 30.5c104 0 188.5 84.5 188.5 188.5s-84.5 188.5-188.5 188.5c-31.75 0-63.25-8-91.25-23.5l-104.25 33.5 34-101.25c-17.75-29.25-27-63-27-97.25 0-104 84.5-188.5 188.5-188.5z"></path>
7
+ </svg>
assets/js/admin_app.js ADDED
@@ -0,0 +1,23107 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /******/ (function(modules) { // webpackBootstrap
2
+ /******/ // The module cache
3
+ /******/ var installedModules = {};
4
+ /******/
5
+ /******/ // The require function
6
+ /******/ function __webpack_require__(moduleId) {
7
+ /******/
8
+ /******/ // Check if module is in cache
9
+ /******/ if(installedModules[moduleId]) {
10
+ /******/ return installedModules[moduleId].exports;
11
+ /******/ }
12
+ /******/ // Create a new module (and put it into the cache)
13
+ /******/ var module = installedModules[moduleId] = {
14
+ /******/ i: moduleId,
15
+ /******/ l: false,
16
+ /******/ exports: {}
17
+ /******/ };
18
+ /******/
19
+ /******/ // Execute the module function
20
+ /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
21
+ /******/
22
+ /******/ // Flag the module as loaded
23
+ /******/ module.l = true;
24
+ /******/
25
+ /******/ // Return the exports of the module
26
+ /******/ return module.exports;
27
+ /******/ }
28
+ /******/
29
+ /******/
30
+ /******/ // expose the modules object (__webpack_modules__)
31
+ /******/ __webpack_require__.m = modules;
32
+ /******/
33
+ /******/ // expose the module cache
34
+ /******/ __webpack_require__.c = installedModules;
35
+ /******/
36
+ /******/ // define getter function for harmony exports
37
+ /******/ __webpack_require__.d = function(exports, name, getter) {
38
+ /******/ if(!__webpack_require__.o(exports, name)) {
39
+ /******/ Object.defineProperty(exports, name, {
40
+ /******/ configurable: false,
41
+ /******/ enumerable: true,
42
+ /******/ get: getter
43
+ /******/ });
44
+ /******/ }
45
+ /******/ };
46
+ /******/
47
+ /******/ // getDefaultExport function for compatibility with non-harmony modules
48
+ /******/ __webpack_require__.n = function(module) {
49
+ /******/ var getter = module && module.__esModule ?
50
+ /******/ function getDefault() { return module['default']; } :
51
+ /******/ function getModuleExports() { return module; };
52
+ /******/ __webpack_require__.d(getter, 'a', getter);
53
+ /******/ return getter;
54
+ /******/ };
55
+ /******/
56
+ /******/ // Object.prototype.hasOwnProperty.call
57
+ /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
58
+ /******/
59
+ /******/ // __webpack_public_path__
60
+ /******/ __webpack_require__.p = "";
61
+ /******/
62
+ /******/ // Load entry module and return exports
63
+ /******/ return __webpack_require__(__webpack_require__.s = 5);
64
+ /******/ })
65
+ /************************************************************************/
66
+ /******/ ([
67
+ /* 0 */
68
+ /***/ (function(module, exports, __webpack_require__) {
69
+
70
+ var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!
71
+ * jQuery JavaScript Library v3.2.1
72
+ * https://jquery.com/
73
+ *
74
+ * Includes Sizzle.js
75
+ * https://sizzlejs.com/
76
+ *
77
+ * Copyright JS Foundation and other contributors
78
+ * Released under the MIT license
79
+ * https://jquery.org/license
80
+ *
81
+ * Date: 2017-03-20T18:59Z
82
+ */
83
+ ( function( global, factory ) {
84
+
85
+ "use strict";
86
+
87
+ if ( typeof module === "object" && typeof module.exports === "object" ) {
88
+
89
+ // For CommonJS and CommonJS-like environments where a proper `window`
90
+ // is present, execute the factory and get jQuery.
91
+ // For environments that do not have a `window` with a `document`
92
+ // (such as Node.js), expose a factory as module.exports.
93
+ // This accentuates the need for the creation of a real `window`.
94
+ // e.g. var jQuery = require("jquery")(window);
95
+ // See ticket #14549 for more info.
96
+ module.exports = global.document ?
97
+ factory( global, true ) :
98
+ function( w ) {
99
+ if ( !w.document ) {
100
+ throw new Error( "jQuery requires a window with a document" );
101
+ }
102
+ return factory( w );
103
+ };
104
+ } else {
105
+ factory( global );
106
+ }
107
+
108
+ // Pass this if window is not defined yet
109
+ } )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
110
+
111
+ // Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1
112
+ // throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode
113
+ // arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common
114
+ // enough that all such attempts are guarded in a try block.
115
+ "use strict";
116
+
117
+ var arr = [];
118
+
119
+ var document = window.document;
120
+
121
+ var getProto = Object.getPrototypeOf;
122
+
123
+ var slice = arr.slice;
124
+
125
+ var concat = arr.concat;
126
+
127
+ var push = arr.push;
128
+
129
+ var indexOf = arr.indexOf;
130
+
131
+ var class2type = {};
132
+
133
+ var toString = class2type.toString;
134
+
135
+ var hasOwn = class2type.hasOwnProperty;
136
+
137
+ var fnToString = hasOwn.toString;
138
+
139
+ var ObjectFunctionString = fnToString.call( Object );
140
+
141
+ var support = {};
142
+
143
+
144
+
145
+ function DOMEval( code, doc ) {
146
+ doc = doc || document;
147
+
148
+ var script = doc.createElement( "script" );
149
+
150
+ script.text = code;
151
+ doc.head.appendChild( script ).parentNode.removeChild( script );
152
+ }
153
+ /* global Symbol */
154
+ // Defining this global in .eslintrc.json would create a danger of using the global
155
+ // unguarded in another place, it seems safer to define global only for this module
156
+
157
+
158
+
159
+ var
160
+ version = "3.2.1",
161
+
162
+ // Define a local copy of jQuery
163
+ jQuery = function( selector, context ) {
164
+
165
+ // The jQuery object is actually just the init constructor 'enhanced'
166
+ // Need init if jQuery is called (just allow error to be thrown if not included)
167
+ return new jQuery.fn.init( selector, context );
168
+ },
169
+
170
+ // Support: Android <=4.0 only
171
+ // Make sure we trim BOM and NBSP
172
+ rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
173
+
174
+ // Matches dashed string for camelizing
175
+ rmsPrefix = /^-ms-/,
176
+ rdashAlpha = /-([a-z])/g,
177
+
178
+ // Used by jQuery.camelCase as callback to replace()
179
+ fcamelCase = function( all, letter ) {
180
+ return letter.toUpperCase();
181
+ };
182
+
183
+ jQuery.fn = jQuery.prototype = {
184
+
185
+ // The current version of jQuery being used
186
+ jquery: version,
187
+
188
+ constructor: jQuery,
189
+
190
+ // The default length of a jQuery object is 0
191
+ length: 0,
192
+
193
+ toArray: function() {
194
+ return slice.call( this );
195
+ },
196
+
197
+ // Get the Nth element in the matched element set OR
198
+ // Get the whole matched element set as a clean array
199
+ get: function( num ) {
200
+
201
+ // Return all the elements in a clean array
202
+ if ( num == null ) {
203
+ return slice.call( this );
204
+ }
205
+
206
+ // Return just the one element from the set
207
+ return num < 0 ? this[ num + this.length ] : this[ num ];
208
+ },
209
+
210
+ // Take an array of elements and push it onto the stack
211
+ // (returning the new matched element set)
212
+ pushStack: function( elems ) {
213
+
214
+ // Build a new jQuery matched element set
215
+ var ret = jQuery.merge( this.constructor(), elems );
216
+
217
+ // Add the old object onto the stack (as a reference)
218
+ ret.prevObject = this;
219
+
220
+ // Return the newly-formed element set
221
+ return ret;
222
+ },
223
+
224
+ // Execute a callback for every element in the matched set.
225
+ each: function( callback ) {
226
+ return jQuery.each( this, callback );
227
+ },
228
+
229
+ map: function( callback ) {
230
+ return this.pushStack( jQuery.map( this, function( elem, i ) {
231
+ return callback.call( elem, i, elem );
232
+ } ) );
233
+ },
234
+
235
+ slice: function() {
236
+ return this.pushStack( slice.apply( this, arguments ) );
237
+ },
238
+
239
+ first: function() {
240
+ return this.eq( 0 );
241
+ },
242
+
243
+ last: function() {
244
+ return this.eq( -1 );
245
+ },
246
+
247
+ eq: function( i ) {
248
+ var len = this.length,
249
+ j = +i + ( i < 0 ? len : 0 );
250
+ return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
251
+ },
252
+
253
+ end: function() {
254
+ return this.prevObject || this.constructor();
255
+ },
256
+
257
+ // For internal use only.
258
+ // Behaves like an Array's method, not like a jQuery method.
259
+ push: push,
260
+ sort: arr.sort,
261
+ splice: arr.splice
262
+ };
263
+
264
+ jQuery.extend = jQuery.fn.extend = function() {
265
+ var options, name, src, copy, copyIsArray, clone,
266
+ target = arguments[ 0 ] || {},
267
+ i = 1,
268
+ length = arguments.length,
269
+ deep = false;
270
+
271
+ // Handle a deep copy situation
272
+ if ( typeof target === "boolean" ) {
273
+ deep = target;
274
+
275
+ // Skip the boolean and the target
276
+ target = arguments[ i ] || {};
277
+ i++;
278
+ }
279
+
280
+ // Handle case when target is a string or something (possible in deep copy)
281
+ if ( typeof target !== "object" && !jQuery.isFunction( target ) ) {
282
+ target = {};
283
+ }
284
+
285
+ // Extend jQuery itself if only one argument is passed
286
+ if ( i === length ) {
287
+ target = this;
288
+ i--;
289
+ }
290
+
291
+ for ( ; i < length; i++ ) {
292
+
293
+ // Only deal with non-null/undefined values
294
+ if ( ( options = arguments[ i ] ) != null ) {
295
+
296
+ // Extend the base object
297
+ for ( name in options ) {
298
+ src = target[ name ];
299
+ copy = options[ name ];
300
+
301
+ // Prevent never-ending loop
302
+ if ( target === copy ) {
303
+ continue;
304
+ }
305
+
306
+ // Recurse if we're merging plain objects or arrays
307
+ if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
308
+ ( copyIsArray = Array.isArray( copy ) ) ) ) {
309
+
310
+ if ( copyIsArray ) {
311
+ copyIsArray = false;
312
+ clone = src && Array.isArray( src ) ? src : [];
313
+
314
+ } else {
315
+ clone = src && jQuery.isPlainObject( src ) ? src : {};
316
+ }
317
+
318
+ // Never move original objects, clone them
319
+ target[ name ] = jQuery.extend( deep, clone, copy );
320
+
321
+ // Don't bring in undefined values
322
+ } else if ( copy !== undefined ) {
323
+ target[ name ] = copy;
324
+ }
325
+ }
326
+ }
327
+ }
328
+
329
+ // Return the modified object
330
+ return target;
331
+ };
332
+
333
+ jQuery.extend( {
334
+
335
+ // Unique for each copy of jQuery on the page
336
+ expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
337
+
338
+ // Assume jQuery is ready without the ready module
339
+ isReady: true,
340
+
341
+ error: function( msg ) {
342
+ throw new Error( msg );
343
+ },
344
+
345
+ noop: function() {},
346
+
347
+ isFunction: function( obj ) {
348
+ return jQuery.type( obj ) === "function";
349
+ },
350
+
351
+ isWindow: function( obj ) {
352
+ return obj != null && obj === obj.window;
353
+ },
354
+
355
+ isNumeric: function( obj ) {
356
+
357
+ // As of jQuery 3.0, isNumeric is limited to
358
+ // strings and numbers (primitives or objects)
359
+ // that can be coerced to finite numbers (gh-2662)
360
+ var type = jQuery.type( obj );
361
+ return ( type === "number" || type === "string" ) &&
362
+
363
+ // parseFloat NaNs numeric-cast false positives ("")
364
+ // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
365
+ // subtraction forces infinities to NaN
366
+ !isNaN( obj - parseFloat( obj ) );
367
+ },
368
+
369
+ isPlainObject: function( obj ) {
370
+ var proto, Ctor;
371
+
372
+ // Detect obvious negatives
373
+ // Use toString instead of jQuery.type to catch host objects
374
+ if ( !obj || toString.call( obj ) !== "[object Object]" ) {
375
+ return false;
376
+ }
377
+
378
+ proto = getProto( obj );
379
+
380
+ // Objects with no prototype (e.g., `Object.create( null )`) are plain
381
+ if ( !proto ) {
382
+ return true;
383
+ }
384
+
385
+ // Objects with prototype are plain iff they were constructed by a global Object function
386
+ Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor;
387
+ return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString;
388
+ },
389
+
390
+ isEmptyObject: function( obj ) {
391
+
392
+ /* eslint-disable no-unused-vars */
393
+ // See https://github.com/eslint/eslint/issues/6125
394
+ var name;
395
+
396
+ for ( name in obj ) {
397
+ return false;
398
+ }
399
+ return true;
400
+ },
401
+
402
+ type: function( obj ) {
403
+ if ( obj == null ) {
404
+ return obj + "";
405
+ }
406
+
407
+ // Support: Android <=2.3 only (functionish RegExp)
408
+ return typeof obj === "object" || typeof obj === "function" ?
409
+ class2type[ toString.call( obj ) ] || "object" :
410
+ typeof obj;
411
+ },
412
+
413
+ // Evaluates a script in a global context
414
+ globalEval: function( code ) {
415
+ DOMEval( code );
416
+ },
417
+
418
+ // Convert dashed to camelCase; used by the css and data modules
419
+ // Support: IE <=9 - 11, Edge 12 - 13
420
+ // Microsoft forgot to hump their vendor prefix (#9572)
421
+ camelCase: function( string ) {
422
+ return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
423
+ },
424
+
425
+ each: function( obj, callback ) {
426
+ var length, i = 0;
427
+
428
+ if ( isArrayLike( obj ) ) {
429
+ length = obj.length;
430
+ for ( ; i < length; i++ ) {
431
+ if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
432
+ break;
433
+ }
434
+ }
435
+ } else {
436
+ for ( i in obj ) {
437
+ if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
438
+ break;
439
+ }
440
+ }
441
+ }
442
+
443
+ return obj;
444
+ },
445
+
446
+ // Support: Android <=4.0 only
447
+ trim: function( text ) {
448
+ return text == null ?
449
+ "" :
450
+ ( text + "" ).replace( rtrim, "" );
451
+ },
452
+
453
+ // results is for internal usage only
454
+ makeArray: function( arr, results ) {
455
+ var ret = results || [];
456
+
457
+ if ( arr != null ) {
458
+ if ( isArrayLike( Object( arr ) ) ) {
459
+ jQuery.merge( ret,
460
+ typeof arr === "string" ?
461
+ [ arr ] : arr
462
+ );
463
+ } else {
464
+ push.call( ret, arr );
465
+ }
466
+ }
467
+
468
+ return ret;
469
+ },
470
+
471
+ inArray: function( elem, arr, i ) {
472
+ return arr == null ? -1 : indexOf.call( arr, elem, i );
473
+ },
474
+
475
+ // Support: Android <=4.0 only, PhantomJS 1 only
476
+ // push.apply(_, arraylike) throws on ancient WebKit
477
+ merge: function( first, second ) {
478
+ var len = +second.length,
479
+ j = 0,
480
+ i = first.length;
481
+
482
+ for ( ; j < len; j++ ) {
483
+ first[ i++ ] = second[ j ];
484
+ }
485
+
486
+ first.length = i;
487
+
488
+ return first;
489
+ },
490
+
491
+ grep: function( elems, callback, invert ) {
492
+ var callbackInverse,
493
+ matches = [],
494
+ i = 0,
495
+ length = elems.length,
496
+ callbackExpect = !invert;
497
+
498
+ // Go through the array, only saving the items
499
+ // that pass the validator function
500
+ for ( ; i < length; i++ ) {
501
+ callbackInverse = !callback( elems[ i ], i );
502
+ if ( callbackInverse !== callbackExpect ) {
503
+ matches.push( elems[ i ] );
504
+ }
505
+ }
506
+
507
+ return matches;
508
+ },
509
+
510
+ // arg is for internal usage only
511
+ map: function( elems, callback, arg ) {
512
+ var length, value,
513
+ i = 0,
514
+ ret = [];
515
+
516
+ // Go through the array, translating each of the items to their new values
517
+ if ( isArrayLike( elems ) ) {
518
+ length = elems.length;
519
+ for ( ; i < length; i++ ) {
520
+ value = callback( elems[ i ], i, arg );
521
+
522
+ if ( value != null ) {
523
+ ret.push( value );
524
+ }
525
+ }
526
+
527
+ // Go through every key on the object,
528
+ } else {
529
+ for ( i in elems ) {
530
+ value = callback( elems[ i ], i, arg );
531
+
532
+ if ( value != null ) {
533
+ ret.push( value );
534
+ }
535
+ }
536
+ }
537
+
538
+ // Flatten any nested arrays
539
+ return concat.apply( [], ret );
540
+ },
541
+
542
+ // A global GUID counter for objects
543
+ guid: 1,
544
+
545
+ // Bind a function to a context, optionally partially applying any
546
+ // arguments.
547
+ proxy: function( fn, context ) {
548
+ var tmp, args, proxy;
549
+
550
+ if ( typeof context === "string" ) {
551
+ tmp = fn[ context ];
552
+ context = fn;
553
+ fn = tmp;
554
+ }
555
+
556
+ // Quick check to determine if target is callable, in the spec
557
+ // this throws a TypeError, but we will just return undefined.
558
+ if ( !jQuery.isFunction( fn ) ) {
559
+ return undefined;
560
+ }
561
+
562
+ // Simulated bind
563
+ args = slice.call( arguments, 2 );
564
+ proxy = function() {
565
+ return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
566
+ };
567
+
568
+ // Set the guid of unique handler to the same of original handler, so it can be removed
569
+ proxy.guid = fn.guid = fn.guid || jQuery.guid++;
570
+
571
+ return proxy;
572
+ },
573
+
574
+ now: Date.now,
575
+
576
+ // jQuery.support is not used in Core but other projects attach their
577
+ // properties to it so it needs to exist.
578
+ support: support
579
+ } );
580
+
581
+ if ( typeof Symbol === "function" ) {
582
+ jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
583
+ }
584
+
585
+ // Populate the class2type map
586
+ jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
587
+ function( i, name ) {
588
+ class2type[ "[object " + name + "]" ] = name.toLowerCase();
589
+ } );
590
+
591
+ function isArrayLike( obj ) {
592
+
593
+ // Support: real iOS 8.2 only (not reproducible in simulator)
594
+ // `in` check used to prevent JIT error (gh-2145)
595
+ // hasOwn isn't used here due to false negatives
596
+ // regarding Nodelist length in IE
597
+ var length = !!obj && "length" in obj && obj.length,
598
+ type = jQuery.type( obj );
599
+
600
+ if ( type === "function" || jQuery.isWindow( obj ) ) {
601
+ return false;
602
+ }
603
+
604
+ return type === "array" || length === 0 ||
605
+ typeof length === "number" && length > 0 && ( length - 1 ) in obj;
606
+ }
607
+ var Sizzle =
608
+ /*!
609
+ * Sizzle CSS Selector Engine v2.3.3
610
+ * https://sizzlejs.com/
611
+ *
612
+ * Copyright jQuery Foundation and other contributors
613
+ * Released under the MIT license
614
+ * http://jquery.org/license
615
+ *
616
+ * Date: 2016-08-08
617
+ */
618
+ (function( window ) {
619
+
620
+ var i,
621
+ support,
622
+ Expr,
623
+ getText,
624
+ isXML,
625
+ tokenize,
626
+ compile,
627
+ select,
628
+ outermostContext,
629
+ sortInput,
630
+ hasDuplicate,
631
+
632
+ // Local document vars
633
+ setDocument,
634
+ document,
635
+ docElem,
636
+ documentIsHTML,
637
+ rbuggyQSA,
638
+ rbuggyMatches,
639
+ matches,
640
+ contains,
641
+
642
+ // Instance-specific data
643
+ expando = "sizzle" + 1 * new Date(),
644
+ preferredDoc = window.document,
645
+ dirruns = 0,
646
+ done = 0,
647
+ classCache = createCache(),
648
+ tokenCache = createCache(),
649
+ compilerCache = createCache(),
650
+ sortOrder = function( a, b ) {
651
+ if ( a === b ) {
652
+ hasDuplicate = true;
653
+ }
654
+ return 0;
655
+ },
656
+
657
+ // Instance methods
658
+ hasOwn = ({}).hasOwnProperty,
659
+ arr = [],
660
+ pop = arr.pop,
661
+ push_native = arr.push,
662
+ push = arr.push,
663
+ slice = arr.slice,
664
+ // Use a stripped-down indexOf as it's faster than native
665
+ // https://jsperf.com/thor-indexof-vs-for/5
666
+ indexOf = function( list, elem ) {
667
+ var i = 0,
668
+ len = list.length;
669
+ for ( ; i < len; i++ ) {
670
+ if ( list[i] === elem ) {
671
+ return i;
672
+ }
673
+ }
674
+ return -1;
675
+ },
676
+
677
+ booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
678
+
679
+ // Regular expressions
680
+
681
+ // http://www.w3.org/TR/css3-selectors/#whitespace
682
+ whitespace = "[\\x20\\t\\r\\n\\f]",
683
+
684
+ // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
685
+ identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+",
686
+
687
+ // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
688
+ attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
689
+ // Operator (capture 2)
690
+ "*([*^$|!~]?=)" + whitespace +
691
+ // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
692
+ "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
693
+ "*\\]",
694
+
695
+ pseudos = ":(" + identifier + ")(?:\\((" +
696
+ // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
697
+ // 1. quoted (capture 3; capture 4 or capture 5)
698
+ "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
699
+ // 2. simple (capture 6)
700
+ "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
701
+ // 3. anything else (capture 2)
702
+ ".*" +
703
+ ")\\)|)",
704
+
705
+ // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
706
+ rwhitespace = new RegExp( whitespace + "+", "g" ),
707
+ rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
708
+
709
+ rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
710
+ rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
711
+
712
+ rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
713
+
714
+ rpseudo = new RegExp( pseudos ),
715
+ ridentifier = new RegExp( "^" + identifier + "$" ),
716
+
717
+ matchExpr = {
718
+ "ID": new RegExp( "^#(" + identifier + ")" ),
719
+ "CLASS": new RegExp( "^\\.(" + identifier + ")" ),
720
+ "TAG": new RegExp( "^(" + identifier + "|[*])" ),
721
+ "ATTR": new RegExp( "^" + attributes ),
722
+ "PSEUDO": new RegExp( "^" + pseudos ),
723
+ "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
724
+ "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
725
+ "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
726
+ "bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
727
+ // For use in libraries implementing .is()
728
+ // We use this for POS matching in `select`
729
+ "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
730
+ whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
731
+ },
732
+
733
+ rinputs = /^(?:input|select|textarea|button)$/i,
734
+ rheader = /^h\d$/i,
735
+
736
+ rnative = /^[^{]+\{\s*\[native \w/,
737
+
738
+ // Easily-parseable/retrievable ID or TAG or CLASS selectors
739
+ rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
740
+
741
+ rsibling = /[+~]/,
742
+
743
+ // CSS escapes
744
+ // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
745
+ runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
746
+ funescape = function( _, escaped, escapedWhitespace ) {
747
+ var high = "0x" + escaped - 0x10000;
748
+ // NaN means non-codepoint
749
+ // Support: Firefox<24
750
+ // Workaround erroneous numeric interpretation of +"0x"
751
+ return high !== high || escapedWhitespace ?
752
+ escaped :
753
+ high < 0 ?
754
+ // BMP codepoint
755
+ String.fromCharCode( high + 0x10000 ) :
756
+ // Supplemental Plane codepoint (surrogate pair)
757
+ String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
758
+ },
759
+
760
+ // CSS string/identifier serialization
761
+ // https://drafts.csswg.org/cssom/#common-serializing-idioms
762
+ rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,
763
+ fcssescape = function( ch, asCodePoint ) {
764
+ if ( asCodePoint ) {
765
+
766
+ // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
767
+ if ( ch === "\0" ) {
768
+ return "\uFFFD";
769
+ }
770
+
771
+ // Control characters and (dependent upon position) numbers get escaped as code points
772
+ return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
773
+ }
774
+
775
+ // Other potentially-special ASCII characters get backslash-escaped
776
+ return "\\" + ch;
777
+ },
778
+
779
+ // Used for iframes
780
+ // See setDocument()
781
+ // Removing the function wrapper causes a "Permission Denied"
782
+ // error in IE
783
+ unloadHandler = function() {
784
+ setDocument();
785
+ },
786
+
787
+ disabledAncestor = addCombinator(
788
+ function( elem ) {
789
+ return elem.disabled === true && ("form" in elem || "label" in elem);
790
+ },
791
+ { dir: "parentNode", next: "legend" }
792
+ );
793
+
794
+ // Optimize for push.apply( _, NodeList )
795
+ try {
796
+ push.apply(
797
+ (arr = slice.call( preferredDoc.childNodes )),
798
+ preferredDoc.childNodes
799
+ );
800
+ // Support: Android<4.0
801
+ // Detect silently failing push.apply
802
+ arr[ preferredDoc.childNodes.length ].nodeType;
803
+ } catch ( e ) {
804
+ push = { apply: arr.length ?
805
+
806
+ // Leverage slice if possible
807
+ function( target, els ) {
808
+ push_native.apply( target, slice.call(els) );
809
+ } :
810
+
811
+ // Support: IE<9
812
+ // Otherwise append directly
813
+ function( target, els ) {
814
+ var j = target.length,
815
+ i = 0;
816
+ // Can't trust NodeList.length
817
+ while ( (target[j++] = els[i++]) ) {}
818
+ target.length = j - 1;
819
+ }
820
+ };
821
+ }
822
+
823
+ function Sizzle( selector, context, results, seed ) {
824
+ var m, i, elem, nid, match, groups, newSelector,
825
+ newContext = context && context.ownerDocument,
826
+
827
+ // nodeType defaults to 9, since context defaults to document
828
+ nodeType = context ? context.nodeType : 9;
829
+
830
+ results = results || [];
831
+
832
+ // Return early from calls with invalid selector or context
833
+ if ( typeof selector !== "string" || !selector ||
834
+ nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
835
+
836
+ return results;
837
+ }
838
+
839
+ // Try to shortcut find operations (as opposed to filters) in HTML documents
840
+ if ( !seed ) {
841
+
842
+ if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
843
+ setDocument( context );
844
+ }
845
+ context = context || document;
846
+
847
+ if ( documentIsHTML ) {
848
+
849
+ // If the selector is sufficiently simple, try using a "get*By*" DOM method
850
+ // (excepting DocumentFragment context, where the methods don't exist)
851
+ if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
852
+
853
+ // ID selector
854
+ if ( (m = match[1]) ) {
855
+
856
+ // Document context
857
+ if ( nodeType === 9 ) {
858
+ if ( (elem = context.getElementById( m )) ) {
859
+
860
+ // Support: IE, Opera, Webkit
861
+ // TODO: identify versions
862
+ // getElementById can match elements by name instead of ID
863
+ if ( elem.id === m ) {
864
+ results.push( elem );
865
+ return results;
866
+ }
867
+ } else {
868
+ return results;
869
+ }
870
+
871
+ // Element context
872
+ } else {
873
+
874
+ // Support: IE, Opera, Webkit
875
+ // TODO: identify versions
876
+ // getElementById can match elements by name instead of ID
877
+ if ( newContext && (elem = newContext.getElementById( m )) &&
878
+ contains( context, elem ) &&
879
+ elem.id === m ) {
880
+
881
+ results.push( elem );
882
+ return results;
883
+ }
884
+ }
885
+
886
+ // Type selector
887
+ } else if ( match[2] ) {
888
+ push.apply( results, context.getElementsByTagName( selector ) );
889
+ return results;
890
+
891
+ // Class selector
892
+ } else if ( (m = match[3]) && support.getElementsByClassName &&
893
+ context.getElementsByClassName ) {
894
+
895
+ push.apply( results, context.getElementsByClassName( m ) );
896
+ return results;
897
+ }
898
+ }
899
+
900
+ // Take advantage of querySelectorAll
901
+ if ( support.qsa &&
902
+ !compilerCache[ selector + " " ] &&
903
+ (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
904
+
905
+ if ( nodeType !== 1 ) {
906
+ newContext = context;
907
+ newSelector = selector;
908
+
909
+ // qSA looks outside Element context, which is not what we want
910
+ // Thanks to Andrew Dupont for this workaround technique
911
+ // Support: IE <=8
912
+ // Exclude object elements
913
+ } else if ( context.nodeName.toLowerCase() !== "object" ) {
914
+
915
+ // Capture the context ID, setting it first if necessary
916
+ if ( (nid = context.getAttribute( "id" )) ) {
917
+ nid = nid.replace( rcssescape, fcssescape );
918
+ } else {
919
+ context.setAttribute( "id", (nid = expando) );
920
+ }
921
+
922
+ // Prefix every selector in the list
923
+ groups = tokenize( selector );
924
+ i = groups.length;
925
+ while ( i-- ) {
926
+ groups[i] = "#" + nid + " " + toSelector( groups[i] );
927
+ }
928
+ newSelector = groups.join( "," );
929
+
930
+ // Expand context for sibling selectors
931
+ newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
932
+ context;
933
+ }
934
+
935
+ if ( newSelector ) {
936
+ try {
937
+ push.apply( results,
938
+ newContext.querySelectorAll( newSelector )
939
+ );
940
+ return results;
941
+ } catch ( qsaError ) {
942
+ } finally {
943
+ if ( nid === expando ) {
944
+ context.removeAttribute( "id" );
945
+ }
946
+ }
947
+ }
948
+ }
949
+ }
950
+ }
951
+
952
+ // All others
953
+ return select( selector.replace( rtrim, "$1" ), context, results, seed );
954
+ }
955
+
956
+ /**
957
+ * Create key-value caches of limited size
958
+ * @returns {function(string, object)} Returns the Object data after storing it on itself with
959
+ * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
960
+ * deleting the oldest entry
961
+ */
962
+ function createCache() {
963
+ var keys = [];
964
+
965
+ function cache( key, value ) {
966
+ // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
967
+ if ( keys.push( key + " " ) > Expr.cacheLength ) {
968
+ // Only keep the most recent entries
969
+ delete cache[ keys.shift() ];
970
+ }
971
+ return (cache[ key + " " ] = value);
972
+ }
973
+ return cache;
974
+ }
975
+
976
+ /**
977
+ * Mark a function for special use by Sizzle
978
+ * @param {Function} fn The function to mark
979
+ */
980
+ function markFunction( fn ) {
981
+ fn[ expando ] = true;
982
+ return fn;
983
+ }
984
+
985
+ /**
986
+ * Support testing using an element
987
+ * @param {Function} fn Passed the created element and returns a boolean result
988
+ */
989
+ function assert( fn ) {
990
+ var el = document.createElement("fieldset");
991
+
992
+ try {
993
+ return !!fn( el );
994
+ } catch (e) {
995
+ return false;
996
+ } finally {
997
+ // Remove from its parent by default
998
+ if ( el.parentNode ) {
999
+ el.parentNode.removeChild( el );
1000
+ }
1001
+ // release memory in IE
1002
+ el = null;
1003
+ }
1004
+ }
1005
+
1006
+ /**
1007
+ * Adds the same handler for all of the specified attrs
1008
+ * @param {String} attrs Pipe-separated list of attributes
1009
+ * @param {Function} handler The method that will be applied
1010
+ */
1011
+ function addHandle( attrs, handler ) {
1012
+ var arr = attrs.split("|"),
1013
+ i = arr.length;
1014
+
1015
+ while ( i-- ) {
1016
+ Expr.attrHandle[ arr[i] ] = handler;
1017
+ }
1018
+ }
1019
+
1020
+ /**
1021
+ * Checks document order of two siblings
1022
+ * @param {Element} a
1023
+ * @param {Element} b
1024
+ * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
1025
+ */
1026
+ function siblingCheck( a, b ) {
1027
+ var cur = b && a,
1028
+ diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
1029
+ a.sourceIndex - b.sourceIndex;
1030
+
1031
+ // Use IE sourceIndex if available on both nodes
1032
+ if ( diff ) {
1033
+ return diff;
1034
+ }
1035
+
1036
+ // Check if b follows a
1037
+ if ( cur ) {
1038
+ while ( (cur = cur.nextSibling) ) {
1039
+ if ( cur === b ) {
1040
+ return -1;
1041
+ }
1042
+ }
1043
+ }
1044
+
1045
+ return a ? 1 : -1;
1046
+ }
1047
+
1048
+ /**
1049
+ * Returns a function to use in pseudos for input types
1050
+ * @param {String} type
1051
+ */
1052
+ function createInputPseudo( type ) {
1053
+ return function( elem ) {
1054
+ var name = elem.nodeName.toLowerCase();
1055
+ return name === "input" && elem.type === type;
1056
+ };
1057
+ }
1058
+
1059
+ /**
1060
+ * Returns a function to use in pseudos for buttons
1061
+ * @param {String} type
1062
+ */
1063
+ function createButtonPseudo( type ) {
1064
+ return function( elem ) {
1065
+ var name = elem.nodeName.toLowerCase();
1066
+ return (name === "input" || name === "button") && elem.type === type;
1067
+ };
1068
+ }
1069
+
1070
+ /**
1071
+ * Returns a function to use in pseudos for :enabled/:disabled
1072
+ * @param {Boolean} disabled true for :disabled; false for :enabled
1073
+ */
1074
+ function createDisabledPseudo( disabled ) {
1075
+
1076
+ // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable
1077
+ return function( elem ) {
1078
+
1079
+ // Only certain elements can match :enabled or :disabled
1080
+ // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled
1081
+ // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled
1082
+ if ( "form" in elem ) {
1083
+
1084
+ // Check for inherited disabledness on relevant non-disabled elements:
1085
+ // * listed form-associated elements in a disabled fieldset
1086
+ // https://html.spec.whatwg.org/multipage/forms.html#category-listed
1087
+ // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled
1088
+ // * option elements in a disabled optgroup
1089
+ // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled
1090
+ // All such elements have a "form" property.
1091
+ if ( elem.parentNode && elem.disabled === false ) {
1092
+
1093
+ // Option elements defer to a parent optgroup if present
1094
+ if ( "label" in elem ) {
1095
+ if ( "label" in elem.parentNode ) {
1096
+ return elem.parentNode.disabled === disabled;
1097
+ } else {
1098
+ return elem.disabled === disabled;
1099
+ }
1100
+ }
1101
+
1102
+ // Support: IE 6 - 11
1103
+ // Use the isDisabled shortcut property to check for disabled fieldset ancestors
1104
+ return elem.isDisabled === disabled ||
1105
+
1106
+ // Where there is no isDisabled, check manually
1107
+ /* jshint -W018 */
1108
+ elem.isDisabled !== !disabled &&
1109
+ disabledAncestor( elem ) === disabled;
1110
+ }
1111
+
1112
+ return elem.disabled === disabled;
1113
+
1114
+ // Try to winnow out elements that can't be disabled before trusting the disabled property.
1115
+ // Some victims get caught in our net (label, legend, menu, track), but it shouldn't
1116
+ // even exist on them, let alone have a boolean value.
1117
+ } else if ( "label" in elem ) {
1118
+ return elem.disabled === disabled;
1119
+ }
1120
+
1121
+ // Remaining elements are neither :enabled nor :disabled
1122
+ return false;
1123
+ };
1124
+ }
1125
+
1126
+ /**
1127
+ * Returns a function to use in pseudos for positionals
1128
+ * @param {Function} fn
1129
+ */
1130
+ function createPositionalPseudo( fn ) {
1131
+ return markFunction(function( argument ) {
1132
+ argument = +argument;
1133
+ return markFunction(function( seed, matches ) {
1134
+ var j,
1135
+ matchIndexes = fn( [], seed.length, argument ),
1136
+ i = matchIndexes.length;
1137
+
1138
+ // Match elements found at the specified indexes
1139
+ while ( i-- ) {
1140
+ if ( seed[ (j = matchIndexes[i]) ] ) {
1141
+ seed[j] = !(matches[j] = seed[j]);
1142
+ }
1143
+ }
1144
+ });
1145
+ });
1146
+ }
1147
+
1148
+ /**
1149
+ * Checks a node for validity as a Sizzle context
1150
+ * @param {Element|Object=} context
1151
+ * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
1152
+ */
1153
+ function testContext( context ) {
1154
+ return context && typeof context.getElementsByTagName !== "undefined" && context;
1155
+ }
1156
+
1157
+ // Expose support vars for convenience
1158
+ support = Sizzle.support = {};
1159
+
1160
+ /**
1161
+ * Detects XML nodes
1162
+ * @param {Element|Object} elem An element or a document
1163
+ * @returns {Boolean} True iff elem is a non-HTML XML node
1164
+ */
1165
+ isXML = Sizzle.isXML = function( elem ) {
1166
+ // documentElement is verified for cases where it doesn't yet exist
1167
+ // (such as loading iframes in IE - #4833)
1168
+ var documentElement = elem && (elem.ownerDocument || elem).documentElement;
1169
+ return documentElement ? documentElement.nodeName !== "HTML" : false;
1170
+ };
1171
+
1172
+ /**
1173
+ * Sets document-related variables once based on the current document
1174
+ * @param {Element|Object} [doc] An element or document object to use to set the document
1175
+ * @returns {Object} Returns the current document
1176
+ */
1177
+ setDocument = Sizzle.setDocument = function( node ) {
1178
+ var hasCompare, subWindow,
1179
+ doc = node ? node.ownerDocument || node : preferredDoc;
1180
+
1181
+ // Return early if doc is invalid or already selected
1182
+ if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
1183
+ return document;
1184
+ }
1185
+
1186
+ // Update global variables
1187
+ document = doc;
1188
+ docElem = document.documentElement;
1189
+ documentIsHTML = !isXML( document );
1190
+
1191
+ // Support: IE 9-11, Edge
1192
+ // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
1193
+ if ( preferredDoc !== document &&
1194
+ (subWindow = document.defaultView) && subWindow.top !== subWindow ) {
1195
+
1196
+ // Support: IE 11, Edge
1197
+ if ( subWindow.addEventListener ) {
1198
+ subWindow.addEventListener( "unload", unloadHandler, false );
1199
+
1200
+ // Support: IE 9 - 10 only
1201
+ } else if ( subWindow.attachEvent ) {
1202
+ subWindow.attachEvent( "onunload", unloadHandler );
1203
+ }
1204
+ }
1205
+
1206
+ /* Attributes
1207
+ ---------------------------------------------------------------------- */
1208
+
1209
+ // Support: IE<8
1210
+ // Verify that getAttribute really returns attributes and not properties
1211
+ // (excepting IE8 booleans)
1212
+ support.attributes = assert(function( el ) {
1213
+ el.className = "i";
1214
+ return !el.getAttribute("className");
1215
+ });
1216
+
1217
+ /* getElement(s)By*
1218
+ ---------------------------------------------------------------------- */
1219
+
1220
+ // Check if getElementsByTagName("*") returns only elements
1221
+ support.getElementsByTagName = assert(function( el ) {
1222
+ el.appendChild( document.createComment("") );
1223
+ return !el.getElementsByTagName("*").length;
1224
+ });
1225
+
1226
+ // Support: IE<9
1227
+ support.getElementsByClassName = rnative.test( document.getElementsByClassName );
1228
+
1229
+ // Support: IE<10
1230
+ // Check if getElementById returns elements by name
1231
+ // The broken getElementById methods don't pick up programmatically-set names,
1232
+ // so use a roundabout getElementsByName test
1233
+ support.getById = assert(function( el ) {
1234
+ docElem.appendChild( el ).id = expando;
1235
+ return !document.getElementsByName || !document.getElementsByName( expando ).length;
1236
+ });
1237
+
1238
+ // ID filter and find
1239
+ if ( support.getById ) {
1240
+ Expr.filter["ID"] = function( id ) {
1241
+ var attrId = id.replace( runescape, funescape );
1242
+ return function( elem ) {
1243
+ return elem.getAttribute("id") === attrId;
1244
+ };
1245
+ };
1246
+ Expr.find["ID"] = function( id, context ) {
1247
+ if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
1248
+ var elem = context.getElementById( id );
1249
+ return elem ? [ elem ] : [];
1250
+ }
1251
+ };
1252
+ } else {
1253
+ Expr.filter["ID"] = function( id ) {
1254
+ var attrId = id.replace( runescape, funescape );
1255
+ return function( elem ) {
1256
+ var node = typeof elem.getAttributeNode !== "undefined" &&
1257
+ elem.getAttributeNode("id");
1258
+ return node && node.value === attrId;
1259
+ };
1260
+ };
1261
+
1262
+ // Support: IE 6 - 7 only
1263
+ // getElementById is not reliable as a find shortcut
1264
+ Expr.find["ID"] = function( id, context ) {
1265
+ if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
1266
+ var node, i, elems,
1267
+ elem = context.getElementById( id );
1268
+
1269
+ if ( elem ) {
1270
+
1271
+ // Verify the id attribute
1272
+ node = elem.getAttributeNode("id");
1273
+ if ( node && node.value === id ) {
1274
+ return [ elem ];
1275
+ }
1276
+
1277
+ // Fall back on getElementsByName
1278
+ elems = context.getElementsByName( id );
1279
+ i = 0;
1280
+ while ( (elem = elems[i++]) ) {
1281
+ node = elem.getAttributeNode("id");
1282
+ if ( node && node.value === id ) {
1283
+ return [ elem ];
1284
+ }
1285
+ }
1286
+ }
1287
+
1288
+ return [];
1289
+ }
1290
+ };
1291
+ }
1292
+
1293
+ // Tag
1294
+ Expr.find["TAG"] = support.getElementsByTagName ?
1295
+ function( tag, context ) {
1296
+ if ( typeof context.getElementsByTagName !== "undefined" ) {
1297
+ return context.getElementsByTagName( tag );
1298
+
1299
+ // DocumentFragment nodes don't have gEBTN
1300
+ } else if ( support.qsa ) {
1301
+ return context.querySelectorAll( tag );
1302
+ }
1303
+ } :
1304
+
1305
+ function( tag, context ) {
1306
+ var elem,
1307
+ tmp = [],
1308
+ i = 0,
1309
+ // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
1310
+ results = context.getElementsByTagName( tag );
1311
+
1312
+ // Filter out possible comments
1313
+ if ( tag === "*" ) {
1314
+ while ( (elem = results[i++]) ) {
1315
+ if ( elem.nodeType === 1 ) {
1316
+ tmp.push( elem );
1317
+ }
1318
+ }
1319
+
1320
+ return tmp;
1321
+ }
1322
+ return results;
1323
+ };
1324
+
1325
+ // Class
1326
+ Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
1327
+ if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
1328
+ return context.getElementsByClassName( className );
1329
+ }
1330
+ };
1331
+
1332
+ /* QSA/matchesSelector
1333
+ ---------------------------------------------------------------------- */
1334
+
1335
+ // QSA and matchesSelector support
1336
+
1337
+ // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
1338
+ rbuggyMatches = [];
1339
+
1340
+ // qSa(:focus) reports false when true (Chrome 21)
1341
+ // We allow this because of a bug in IE8/9 that throws an error
1342
+ // whenever `document.activeElement` is accessed on an iframe
1343
+ // So, we allow :focus to pass through QSA all the time to avoid the IE error
1344
+ // See https://bugs.jquery.com/ticket/13378
1345
+ rbuggyQSA = [];
1346
+
1347
+ if ( (support.qsa = rnative.test( document.querySelectorAll )) ) {
1348
+ // Build QSA regex
1349
+ // Regex strategy adopted from Diego Perini
1350
+ assert(function( el ) {
1351
+ // Select is set to empty string on purpose
1352
+ // This is to test IE's treatment of not explicitly
1353
+ // setting a boolean content attribute,
1354
+ // since its presence should be enough
1355
+ // https://bugs.jquery.com/ticket/12359
1356
+ docElem.appendChild( el ).innerHTML = "<a id='" + expando + "'></a>" +
1357
+ "<select id='" + expando + "-\r\\' msallowcapture=''>" +
1358
+ "<option selected=''></option></select>";
1359
+
1360
+ // Support: IE8, Opera 11-12.16
1361
+ // Nothing should be selected when empty strings follow ^= or $= or *=
1362
+ // The test attribute must be unknown in Opera but "safe" for WinRT
1363
+ // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
1364
+ if ( el.querySelectorAll("[msallowcapture^='']").length ) {
1365
+ rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
1366
+ }
1367
+
1368
+ // Support: IE8
1369
+ // Boolean attributes and "value" are not treated correctly
1370
+ if ( !el.querySelectorAll("[selected]").length ) {
1371
+ rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
1372
+ }
1373
+
1374
+ // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
1375
+ if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
1376
+ rbuggyQSA.push("~=");
1377
+ }
1378
+
1379
+ // Webkit/Opera - :checked should return selected option elements
1380
+ // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
1381
+ // IE8 throws error here and will not see later tests
1382
+ if ( !el.querySelectorAll(":checked").length ) {
1383
+ rbuggyQSA.push(":checked");
1384
+ }
1385
+
1386
+ // Support: Safari 8+, iOS 8+
1387
+ // https://bugs.webkit.org/show_bug.cgi?id=136851
1388
+ // In-page `selector#id sibling-combinator selector` fails
1389
+ if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
1390
+ rbuggyQSA.push(".#.+[+~]");
1391
+ }
1392
+ });
1393
+
1394
+ assert(function( el ) {
1395
+ el.innerHTML = "<a href='' disabled='disabled'></a>" +
1396
+ "<select disabled='disabled'><option/></select>";
1397
+
1398
+ // Support: Windows 8 Native Apps
1399
+ // The type and name attributes are restricted during .innerHTML assignment
1400
+ var input = document.createElement("input");
1401
+ input.setAttribute( "type", "hidden" );
1402
+ el.appendChild( input ).setAttribute( "name", "D" );
1403
+
1404
+ // Support: IE8
1405
+ // Enforce case-sensitivity of name attribute
1406
+ if ( el.querySelectorAll("[name=d]").length ) {
1407
+ rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
1408
+ }
1409
+
1410
+ // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
1411
+ // IE8 throws error here and will not see later tests
1412
+ if ( el.querySelectorAll(":enabled").length !== 2 ) {
1413
+ rbuggyQSA.push( ":enabled", ":disabled" );
1414
+ }
1415
+
1416
+ // Support: IE9-11+
1417
+ // IE's :disabled selector does not pick up the children of disabled fieldsets
1418
+ docElem.appendChild( el ).disabled = true;
1419
+ if ( el.querySelectorAll(":disabled").length !== 2 ) {
1420
+ rbuggyQSA.push( ":enabled", ":disabled" );
1421
+ }
1422
+
1423
+ // Opera 10-11 does not throw on post-comma invalid pseudos
1424
+ el.querySelectorAll("*,:x");
1425
+ rbuggyQSA.push(",.*:");
1426
+ });
1427
+ }
1428
+
1429
+ if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
1430
+ docElem.webkitMatchesSelector ||
1431
+ docElem.mozMatchesSelector ||
1432
+ docElem.oMatchesSelector ||
1433
+ docElem.msMatchesSelector) )) ) {
1434
+
1435
+ assert(function( el ) {
1436
+ // Check to see if it's possible to do matchesSelector
1437
+ // on a disconnected node (IE 9)
1438
+ support.disconnectedMatch = matches.call( el, "*" );
1439
+
1440
+ // This should fail with an exception
1441
+ // Gecko does not error, returns false instead
1442
+ matches.call( el, "[s!='']:x" );
1443
+ rbuggyMatches.push( "!=", pseudos );
1444
+ });
1445
+ }
1446
+
1447
+ rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
1448
+ rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
1449
+
1450
+ /* Contains
1451
+ ---------------------------------------------------------------------- */
1452
+ hasCompare = rnative.test( docElem.compareDocumentPosition );
1453
+
1454
+ // Element contains another
1455
+ // Purposefully self-exclusive
1456
+ // As in, an element does not contain itself
1457
+ contains = hasCompare || rnative.test( docElem.contains ) ?
1458
+ function( a, b ) {
1459
+ var adown = a.nodeType === 9 ? a.documentElement : a,
1460
+ bup = b && b.parentNode;
1461
+ return a === bup || !!( bup && bup.nodeType === 1 && (
1462
+ adown.contains ?
1463
+ adown.contains( bup ) :
1464
+ a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
1465
+ ));
1466
+ } :
1467
+ function( a, b ) {
1468
+ if ( b ) {
1469
+ while ( (b = b.parentNode) ) {
1470
+ if ( b === a ) {
1471
+ return true;
1472
+ }
1473
+ }
1474
+ }
1475
+ return false;
1476
+ };
1477
+
1478
+ /* Sorting
1479
+ ---------------------------------------------------------------------- */
1480
+
1481
+ // Document order sorting
1482
+ sortOrder = hasCompare ?
1483
+ function( a, b ) {
1484
+
1485
+ // Flag for duplicate removal
1486
+ if ( a === b ) {
1487
+ hasDuplicate = true;
1488
+ return 0;
1489
+ }
1490
+
1491
+ // Sort on method existence if only one input has compareDocumentPosition
1492
+ var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
1493
+ if ( compare ) {
1494
+ return compare;
1495
+ }
1496
+
1497
+ // Calculate position if both inputs belong to the same document
1498
+ compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
1499
+ a.compareDocumentPosition( b ) :
1500
+
1501
+ // Otherwise we know they are disconnected
1502
+ 1;
1503
+
1504
+ // Disconnected nodes
1505
+ if ( compare & 1 ||
1506
+ (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
1507
+
1508
+ // Choose the first element that is related to our preferred document
1509
+ if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
1510
+ return -1;
1511
+ }
1512
+ if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
1513
+ return 1;
1514
+ }
1515
+
1516
+ // Maintain original order
1517
+ return sortInput ?
1518
+ ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
1519
+ 0;
1520
+ }
1521
+
1522
+ return compare & 4 ? -1 : 1;
1523
+ } :
1524
+ function( a, b ) {
1525
+ // Exit early if the nodes are identical
1526
+ if ( a === b ) {
1527
+ hasDuplicate = true;
1528
+ return 0;
1529
+ }
1530
+
1531
+ var cur,
1532
+ i = 0,
1533
+ aup = a.parentNode,
1534
+ bup = b.parentNode,
1535
+ ap = [ a ],
1536
+ bp = [ b ];
1537
+
1538
+ // Parentless nodes are either documents or disconnected
1539
+ if ( !aup || !bup ) {
1540
+ return a === document ? -1 :
1541
+ b === document ? 1 :
1542
+ aup ? -1 :
1543
+ bup ? 1 :
1544
+ sortInput ?
1545
+ ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
1546
+ 0;
1547
+
1548
+ // If the nodes are siblings, we can do a quick check
1549
+ } else if ( aup === bup ) {
1550
+ return siblingCheck( a, b );
1551
+ }
1552
+
1553
+ // Otherwise we need full lists of their ancestors for comparison
1554
+ cur = a;
1555
+ while ( (cur = cur.parentNode) ) {
1556
+ ap.unshift( cur );
1557
+ }
1558
+ cur = b;
1559
+ while ( (cur = cur.parentNode) ) {
1560
+ bp.unshift( cur );
1561
+ }
1562
+
1563
+ // Walk down the tree looking for a discrepancy
1564
+ while ( ap[i] === bp[i] ) {
1565
+ i++;
1566
+ }
1567
+
1568
+ return i ?
1569
+ // Do a sibling check if the nodes have a common ancestor
1570
+ siblingCheck( ap[i], bp[i] ) :
1571
+
1572
+ // Otherwise nodes in our document sort first
1573
+ ap[i] === preferredDoc ? -1 :
1574
+ bp[i] === preferredDoc ? 1 :
1575
+ 0;
1576
+ };
1577
+
1578
+ return document;
1579
+ };
1580
+
1581
+ Sizzle.matches = function( expr, elements ) {
1582
+ return Sizzle( expr, null, null, elements );
1583
+ };
1584
+
1585
+ Sizzle.matchesSelector = function( elem, expr ) {
1586
+ // Set document vars if needed
1587
+ if ( ( elem.ownerDocument || elem ) !== document ) {
1588
+ setDocument( elem );
1589
+ }
1590
+
1591
+ // Make sure that attribute selectors are quoted
1592
+ expr = expr.replace( rattributeQuotes, "='$1']" );
1593
+
1594
+ if ( support.matchesSelector && documentIsHTML &&
1595
+ !compilerCache[ expr + " " ] &&
1596
+ ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
1597
+ ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {
1598
+
1599
+ try {
1600
+ var ret = matches.call( elem, expr );
1601
+
1602
+ // IE 9's matchesSelector returns false on disconnected nodes
1603
+ if ( ret || support.disconnectedMatch ||
1604
+ // As well, disconnected nodes are said to be in a document
1605
+ // fragment in IE 9
1606
+ elem.document && elem.document.nodeType !== 11 ) {
1607
+ return ret;
1608
+ }
1609
+ } catch (e) {}
1610
+ }
1611
+
1612
+ return Sizzle( expr, document, null, [ elem ] ).length > 0;
1613
+ };
1614
+
1615
+ Sizzle.contains = function( context, elem ) {
1616
+ // Set document vars if needed
1617
+ if ( ( context.ownerDocument || context ) !== document ) {
1618
+ setDocument( context );
1619
+ }
1620
+ return contains( context, elem );
1621
+ };
1622
+
1623
+ Sizzle.attr = function( elem, name ) {
1624
+ // Set document vars if needed
1625
+ if ( ( elem.ownerDocument || elem ) !== document ) {
1626
+ setDocument( elem );
1627
+ }
1628
+
1629
+ var fn = Expr.attrHandle[ name.toLowerCase() ],
1630
+ // Don't get fooled by Object.prototype properties (jQuery #13807)
1631
+ val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
1632
+ fn( elem, name, !documentIsHTML ) :
1633
+ undefined;
1634
+
1635
+ return val !== undefined ?
1636
+ val :
1637
+ support.attributes || !documentIsHTML ?
1638
+ elem.getAttribute( name ) :
1639
+ (val = elem.getAttributeNode(name)) && val.specified ?
1640
+ val.value :
1641
+ null;
1642
+ };
1643
+
1644
+ Sizzle.escape = function( sel ) {
1645
+ return (sel + "").replace( rcssescape, fcssescape );
1646
+ };
1647
+
1648
+ Sizzle.error = function( msg ) {
1649
+ throw new Error( "Syntax error, unrecognized expression: " + msg );
1650
+ };
1651
+
1652
+ /**
1653
+ * Document sorting and removing duplicates
1654
+ * @param {ArrayLike} results
1655
+ */
1656
+ Sizzle.uniqueSort = function( results ) {
1657
+ var elem,
1658
+ duplicates = [],
1659
+ j = 0,
1660
+ i = 0;
1661
+
1662
+ // Unless we *know* we can detect duplicates, assume their presence
1663
+ hasDuplicate = !support.detectDuplicates;
1664
+ sortInput = !support.sortStable && results.slice( 0 );
1665
+ results.sort( sortOrder );
1666
+
1667
+ if ( hasDuplicate ) {
1668
+ while ( (elem = results[i++]) ) {
1669
+ if ( elem === results[ i ] ) {
1670
+ j = duplicates.push( i );
1671
+ }
1672
+ }
1673
+ while ( j-- ) {
1674
+ results.splice( duplicates[ j ], 1 );
1675
+ }
1676
+ }
1677
+
1678
+ // Clear input after sorting to release objects
1679
+ // See https://github.com/jquery/sizzle/pull/225
1680
+ sortInput = null;
1681
+
1682
+ return results;
1683
+ };
1684
+
1685
+ /**
1686
+ * Utility function for retrieving the text value of an array of DOM nodes
1687
+ * @param {Array|Element} elem
1688
+ */
1689
+ getText = Sizzle.getText = function( elem ) {
1690
+ var node,
1691
+ ret = "",
1692
+ i = 0,
1693
+ nodeType = elem.nodeType;
1694
+
1695
+ if ( !nodeType ) {
1696
+ // If no nodeType, this is expected to be an array
1697
+ while ( (node = elem[i++]) ) {
1698
+ // Do not traverse comment nodes
1699
+ ret += getText( node );
1700
+ }
1701
+ } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
1702
+ // Use textContent for elements
1703
+ // innerText usage removed for consistency of new lines (jQuery #11153)
1704
+ if ( typeof elem.textContent === "string" ) {
1705
+ return elem.textContent;
1706
+ } else {
1707
+ // Traverse its children
1708
+ for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
1709
+ ret += getText( elem );
1710
+ }
1711
+ }
1712
+ } else if ( nodeType === 3 || nodeType === 4 ) {
1713
+ return elem.nodeValue;
1714
+ }
1715
+ // Do not include comment or processing instruction nodes
1716
+
1717
+ return ret;
1718
+ };
1719
+
1720
+ Expr = Sizzle.selectors = {
1721
+
1722
+ // Can be adjusted by the user
1723
+ cacheLength: 50,
1724
+
1725
+ createPseudo: markFunction,
1726
+
1727
+ match: matchExpr,
1728
+
1729
+ attrHandle: {},
1730
+
1731
+ find: {},
1732
+
1733
+ relative: {
1734
+ ">": { dir: "parentNode", first: true },
1735
+ " ": { dir: "parentNode" },
1736
+ "+": { dir: "previousSibling", first: true },
1737
+ "~": { dir: "previousSibling" }
1738
+ },
1739
+
1740
+ preFilter: {
1741
+ "ATTR": function( match ) {
1742
+ match[1] = match[1].replace( runescape, funescape );
1743
+
1744
+ // Move the given value to match[3] whether quoted or unquoted
1745
+ match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
1746
+
1747
+ if ( match[2] === "~=" ) {
1748
+ match[3] = " " + match[3] + " ";
1749
+ }
1750
+
1751
+ return match.slice( 0, 4 );
1752
+ },
1753
+
1754
+ "CHILD": function( match ) {
1755
+ /* matches from matchExpr["CHILD"]
1756
+ 1 type (only|nth|...)
1757
+ 2 what (child|of-type)
1758
+ 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
1759
+ 4 xn-component of xn+y argument ([+-]?\d*n|)
1760
+ 5 sign of xn-component
1761
+ 6 x of xn-component
1762
+ 7 sign of y-component
1763
+ 8 y of y-component
1764
+ */
1765
+ match[1] = match[1].toLowerCase();
1766
+
1767
+ if ( match[1].slice( 0, 3 ) === "nth" ) {
1768
+ // nth-* requires argument
1769
+ if ( !match[3] ) {
1770
+ Sizzle.error( match[0] );
1771
+ }
1772
+
1773
+ // numeric x and y parameters for Expr.filter.CHILD
1774
+ // remember that false/true cast respectively to 0/1
1775
+ match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
1776
+ match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
1777
+
1778
+ // other types prohibit arguments
1779
+ } else if ( match[3] ) {
1780
+ Sizzle.error( match[0] );
1781
+ }
1782
+
1783
+ return match;
1784
+ },
1785
+
1786
+ "PSEUDO": function( match ) {
1787
+ var excess,
1788
+ unquoted = !match[6] && match[2];
1789
+
1790
+ if ( matchExpr["CHILD"].test( match[0] ) ) {
1791
+ return null;
1792
+ }
1793
+
1794
+ // Accept quoted arguments as-is
1795
+ if ( match[3] ) {
1796
+ match[2] = match[4] || match[5] || "";
1797
+
1798
+ // Strip excess characters from unquoted arguments
1799
+ } else if ( unquoted && rpseudo.test( unquoted ) &&
1800
+ // Get excess from tokenize (recursively)
1801
+ (excess = tokenize( unquoted, true )) &&
1802
+ // advance to the next closing parenthesis
1803
+ (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
1804
+
1805
+ // excess is a negative index
1806
+ match[0] = match[0].slice( 0, excess );
1807
+ match[2] = unquoted.slice( 0, excess );
1808
+ }
1809
+
1810
+ // Return only captures needed by the pseudo filter method (type and argument)
1811
+ return match.slice( 0, 3 );
1812
+ }
1813
+ },
1814
+
1815
+ filter: {
1816
+
1817
+ "TAG": function( nodeNameSelector ) {
1818
+ var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
1819
+ return nodeNameSelector === "*" ?
1820
+ function() { return true; } :
1821
+ function( elem ) {
1822
+ return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
1823
+ };
1824
+ },
1825
+
1826
+ "CLASS": function( className ) {
1827
+ var pattern = classCache[ className + " " ];
1828
+
1829
+ return pattern ||
1830
+ (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
1831
+ classCache( className, function( elem ) {
1832
+ return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
1833
+ });
1834
+ },
1835
+
1836
+ "ATTR": function( name, operator, check ) {
1837
+ return function( elem ) {
1838
+ var result = Sizzle.attr( elem, name );
1839
+
1840
+ if ( result == null ) {
1841
+ return operator === "!=";
1842
+ }
1843
+ if ( !operator ) {
1844
+ return true;
1845
+ }
1846
+
1847
+ result += "";
1848
+
1849
+ return operator === "=" ? result === check :
1850
+ operator === "!=" ? result !== check :
1851
+ operator === "^=" ? check && result.indexOf( check ) === 0 :
1852
+ operator === "*=" ? check && result.indexOf( check ) > -1 :
1853
+ operator === "$=" ? check && result.slice( -check.length ) === check :
1854
+ operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
1855
+ operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
1856
+ false;
1857
+ };
1858
+ },
1859
+
1860
+ "CHILD": function( type, what, argument, first, last ) {
1861
+ var simple = type.slice( 0, 3 ) !== "nth",
1862
+ forward = type.slice( -4 ) !== "last",
1863
+ ofType = what === "of-type";
1864
+
1865
+ return first === 1 && last === 0 ?
1866
+
1867
+ // Shortcut for :nth-*(n)
1868
+ function( elem ) {
1869
+ return !!elem.parentNode;
1870
+ } :
1871
+
1872
+ function( elem, context, xml ) {
1873
+ var cache, uniqueCache, outerCache, node, nodeIndex, start,
1874
+ dir = simple !== forward ? "nextSibling" : "previousSibling",
1875
+ parent = elem.parentNode,
1876
+ name = ofType && elem.nodeName.toLowerCase(),
1877
+ useCache = !xml && !ofType,
1878
+ diff = false;
1879
+
1880
+ if ( parent ) {
1881
+
1882
+ // :(first|last|only)-(child|of-type)
1883
+ if ( simple ) {
1884
+ while ( dir ) {
1885
+ node = elem;
1886
+ while ( (node = node[ dir ]) ) {
1887
+ if ( ofType ?
1888
+ node.nodeName.toLowerCase() === name :
1889
+ node.nodeType === 1 ) {
1890
+
1891
+ return false;
1892
+ }
1893
+ }
1894
+ // Reverse direction for :only-* (if we haven't yet done so)
1895
+ start = dir = type === "only" && !start && "nextSibling";
1896
+ }
1897
+ return true;
1898
+ }
1899
+
1900
+ start = [ forward ? parent.firstChild : parent.lastChild ];
1901
+
1902
+ // non-xml :nth-child(...) stores cache data on `parent`
1903
+ if ( forward && useCache ) {
1904
+
1905
+ // Seek `elem` from a previously-cached index
1906
+
1907
+ // ...in a gzip-friendly way
1908
+ node = parent;
1909
+ outerCache = node[ expando ] || (node[ expando ] = {});
1910
+
1911
+ // Support: IE <9 only
1912
+ // Defend against cloned attroperties (jQuery gh-1709)
1913
+ uniqueCache = outerCache[ node.uniqueID ] ||
1914
+ (outerCache[ node.uniqueID ] = {});
1915
+
1916
+ cache = uniqueCache[ type ] || [];
1917
+ nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
1918
+ diff = nodeIndex && cache[ 2 ];
1919
+ node = nodeIndex && parent.childNodes[ nodeIndex ];
1920
+
1921
+ while ( (node = ++nodeIndex && node && node[ dir ] ||
1922
+
1923
+ // Fallback to seeking `elem` from the start
1924
+ (diff = nodeIndex = 0) || start.pop()) ) {
1925
+
1926
+ // When found, cache indexes on `parent` and break
1927
+ if ( node.nodeType === 1 && ++diff && node === elem ) {
1928
+ uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
1929
+ break;
1930
+ }
1931
+ }
1932
+
1933
+ } else {
1934
+ // Use previously-cached element index if available
1935
+ if ( useCache ) {
1936
+ // ...in a gzip-friendly way
1937
+ node = elem;
1938
+ outerCache = node[ expando ] || (node[ expando ] = {});
1939
+
1940
+ // Support: IE <9 only
1941
+ // Defend against cloned attroperties (jQuery gh-1709)
1942
+ uniqueCache = outerCache[ node.uniqueID ] ||
1943
+ (outerCache[ node.uniqueID ] = {});
1944
+
1945
+ cache = uniqueCache[ type ] || [];
1946
+ nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
1947
+ diff = nodeIndex;
1948
+ }
1949
+
1950
+ // xml :nth-child(...)
1951
+ // or :nth-last-child(...) or :nth(-last)?-of-type(...)
1952
+ if ( diff === false ) {
1953
+ // Use the same loop as above to seek `elem` from the start
1954
+ while ( (node = ++nodeIndex && node && node[ dir ] ||
1955
+ (diff = nodeIndex = 0) || start.pop()) ) {
1956
+
1957
+ if ( ( ofType ?
1958
+ node.nodeName.toLowerCase() === name :
1959
+ node.nodeType === 1 ) &&
1960
+ ++diff ) {
1961
+
1962
+ // Cache the index of each encountered element
1963
+ if ( useCache ) {
1964
+ outerCache = node[ expando ] || (node[ expando ] = {});
1965
+
1966
+ // Support: IE <9 only
1967
+ // Defend against cloned attroperties (jQuery gh-1709)
1968
+ uniqueCache = outerCache[ node.uniqueID ] ||
1969
+ (outerCache[ node.uniqueID ] = {});
1970
+
1971
+ uniqueCache[ type ] = [ dirruns, diff ];
1972
+ }
1973
+
1974
+ if ( node === elem ) {
1975
+ break;
1976
+ }
1977
+ }
1978
+ }
1979
+ }
1980
+ }
1981
+
1982
+ // Incorporate the offset, then check against cycle size
1983
+ diff -= last;
1984
+ return diff === first || ( diff % first === 0 && diff / first >= 0 );
1985
+ }
1986
+ };
1987
+ },
1988
+
1989
+ "PSEUDO": function( pseudo, argument ) {
1990
+ // pseudo-class names are case-insensitive
1991
+ // http://www.w3.org/TR/selectors/#pseudo-classes
1992
+ // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
1993
+ // Remember that setFilters inherits from pseudos
1994
+ var args,
1995
+ fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
1996
+ Sizzle.error( "unsupported pseudo: " + pseudo );
1997
+
1998
+ // The user may use createPseudo to indicate that
1999
+ // arguments are needed to create the filter function
2000
+ // just as Sizzle does
2001
+ if ( fn[ expando ] ) {
2002
+ return fn( argument );
2003
+ }
2004
+
2005
+ // But maintain support for old signatures
2006
+ if ( fn.length > 1 ) {
2007
+ args = [ pseudo, pseudo, "", argument ];
2008
+ return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
2009
+ markFunction(function( seed, matches ) {
2010
+ var idx,
2011
+ matched = fn( seed, argument ),
2012
+ i = matched.length;
2013
+ while ( i-- ) {
2014
+ idx = indexOf( seed, matched[i] );
2015
+ seed[ idx ] = !( matches[ idx ] = matched[i] );
2016
+ }
2017
+ }) :
2018
+ function( elem ) {
2019
+ return fn( elem, 0, args );
2020
+ };
2021
+ }
2022
+
2023
+ return fn;
2024
+ }
2025
+ },
2026
+
2027
+ pseudos: {
2028
+ // Potentially complex pseudos
2029
+ "not": markFunction(function( selector ) {
2030
+ // Trim the selector passed to compile
2031
+ // to avoid treating leading and trailing
2032
+ // spaces as combinators
2033
+ var input = [],
2034
+ results = [],
2035
+ matcher = compile( selector.replace( rtrim, "$1" ) );
2036
+
2037
+ return matcher[ expando ] ?
2038
+ markFunction(function( seed, matches, context, xml ) {
2039
+ var elem,
2040
+ unmatched = matcher( seed, null, xml, [] ),
2041
+ i = seed.length;
2042
+
2043
+ // Match elements unmatched by `matcher`
2044
+ while ( i-- ) {
2045
+ if ( (elem = unmatched[i]) ) {
2046
+ seed[i] = !(matches[i] = elem);
2047
+ }
2048
+ }
2049
+ }) :
2050
+ function( elem, context, xml ) {
2051
+ input[0] = elem;
2052
+ matcher( input, null, xml, results );
2053
+ // Don't keep the element (issue #299)
2054
+ input[0] = null;
2055
+ return !results.pop();
2056
+ };
2057
+ }),
2058
+
2059
+ "has": markFunction(function( selector ) {
2060
+ return function( elem ) {
2061
+ return Sizzle( selector, elem ).length > 0;
2062
+ };
2063
+ }),
2064
+
2065
+ "contains": markFunction(function( text ) {
2066
+ text = text.replace( runescape, funescape );
2067
+ return function( elem ) {
2068
+ return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
2069
+ };
2070
+ }),
2071
+
2072
+ // "Whether an element is represented by a :lang() selector
2073
+ // is based solely on the element's language value
2074
+ // being equal to the identifier C,
2075
+ // or beginning with the identifier C immediately followed by "-".
2076
+ // The matching of C against the element's language value is performed case-insensitively.
2077
+ // The identifier C does not have to be a valid language name."
2078
+ // http://www.w3.org/TR/selectors/#lang-pseudo
2079
+ "lang": markFunction( function( lang ) {
2080
+ // lang value must be a valid identifier
2081
+ if ( !ridentifier.test(lang || "") ) {
2082
+ Sizzle.error( "unsupported lang: " + lang );
2083
+ }
2084
+ lang = lang.replace( runescape, funescape ).toLowerCase();
2085
+ return function( elem ) {
2086
+ var elemLang;
2087
+ do {
2088
+ if ( (elemLang = documentIsHTML ?
2089
+ elem.lang :
2090
+ elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
2091
+
2092
+ elemLang = elemLang.toLowerCase();
2093
+ return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
2094
+ }
2095
+ } while ( (elem = elem.parentNode) && elem.nodeType === 1 );
2096
+ return false;
2097
+ };
2098
+ }),
2099
+
2100
+ // Miscellaneous
2101
+ "target": function( elem ) {
2102
+ var hash = window.location && window.location.hash;
2103
+ return hash && hash.slice( 1 ) === elem.id;
2104
+ },
2105
+
2106
+ "root": function( elem ) {
2107
+ return elem === docElem;
2108
+ },
2109
+
2110
+ "focus": function( elem ) {
2111
+ return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
2112
+ },
2113
+
2114
+ // Boolean properties
2115
+ "enabled": createDisabledPseudo( false ),
2116
+ "disabled": createDisabledPseudo( true ),
2117
+
2118
+ "checked": function( elem ) {
2119
+ // In CSS3, :checked should return both checked and selected elements
2120
+ // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
2121
+ var nodeName = elem.nodeName.toLowerCase();
2122
+ return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
2123
+ },
2124
+
2125
+ "selected": function( elem ) {
2126
+ // Accessing this property makes selected-by-default
2127
+ // options in Safari work properly
2128
+ if ( elem.parentNode ) {
2129
+ elem.parentNode.selectedIndex;
2130
+ }
2131
+
2132
+ return elem.selected === true;
2133
+ },
2134
+
2135
+ // Contents
2136
+ "empty": function( elem ) {
2137
+ // http://www.w3.org/TR/selectors/#empty-pseudo
2138
+ // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
2139
+ // but not by others (comment: 8; processing instruction: 7; etc.)
2140
+ // nodeType < 6 works because attributes (2) do not appear as children
2141
+ for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
2142
+ if ( elem.nodeType < 6 ) {
2143
+ return false;
2144
+ }
2145
+ }
2146
+ return true;
2147
+ },
2148
+
2149
+ "parent": function( elem ) {
2150
+ return !Expr.pseudos["empty"]( elem );
2151
+ },
2152
+
2153
+ // Element/input types
2154
+ "header": function( elem ) {
2155
+ return rheader.test( elem.nodeName );
2156
+ },
2157
+
2158
+ "input": function( elem ) {
2159
+ return rinputs.test( elem.nodeName );
2160
+ },
2161
+
2162
+ "button": function( elem ) {
2163
+ var name = elem.nodeName.toLowerCase();
2164
+ return name === "input" && elem.type === "button" || name === "button";
2165
+ },
2166
+
2167
+ "text": function( elem ) {
2168
+ var attr;
2169
+ return elem.nodeName.toLowerCase() === "input" &&
2170
+ elem.type === "text" &&
2171
+
2172
+ // Support: IE<8
2173
+ // New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
2174
+ ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
2175
+ },
2176
+
2177
+ // Position-in-collection
2178
+ "first": createPositionalPseudo(function() {
2179
+ return [ 0 ];
2180
+ }),
2181
+
2182
+ "last": createPositionalPseudo(function( matchIndexes, length ) {
2183
+ return [ length - 1 ];
2184
+ }),
2185
+
2186
+ "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
2187
+ return [ argument < 0 ? argument + length : argument ];
2188
+ }),
2189
+
2190
+ "even": createPositionalPseudo(function( matchIndexes, length ) {
2191
+ var i = 0;
2192
+ for ( ; i < length; i += 2 ) {
2193
+ matchIndexes.push( i );
2194
+ }
2195
+ return matchIndexes;
2196
+ }),
2197
+
2198
+ "odd": createPositionalPseudo(function( matchIndexes, length ) {
2199
+ var i = 1;
2200
+ for ( ; i < length; i += 2 ) {
2201
+ matchIndexes.push( i );
2202
+ }
2203
+ return matchIndexes;
2204
+ }),
2205
+
2206
+ "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
2207
+ var i = argument < 0 ? argument + length : argument;
2208
+ for ( ; --i >= 0; ) {
2209
+ matchIndexes.push( i );
2210
+ }
2211
+ return matchIndexes;
2212
+ }),
2213
+
2214
+ "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
2215
+ var i = argument < 0 ? argument + length : argument;
2216
+ for ( ; ++i < length; ) {
2217
+ matchIndexes.push( i );
2218
+ }
2219
+ return matchIndexes;
2220
+ })
2221
+ }
2222
+ };
2223
+
2224
+ Expr.pseudos["nth"] = Expr.pseudos["eq"];
2225
+
2226
+ // Add button/input type pseudos
2227
+ for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
2228
+ Expr.pseudos[ i ] = createInputPseudo( i );
2229
+ }
2230
+ for ( i in { submit: true, reset: true } ) {
2231
+ Expr.pseudos[ i ] = createButtonPseudo( i );
2232
+ }
2233
+
2234
+ // Easy API for creating new setFilters
2235
+ function setFilters() {}
2236
+ setFilters.prototype = Expr.filters = Expr.pseudos;
2237
+ Expr.setFilters = new setFilters();
2238
+
2239
+ tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
2240
+ var matched, match, tokens, type,
2241
+ soFar, groups, preFilters,
2242
+ cached = tokenCache[ selector + " " ];
2243
+
2244
+ if ( cached ) {
2245
+ return parseOnly ? 0 : cached.slice( 0 );
2246
+ }
2247
+
2248
+ soFar = selector;
2249
+ groups = [];
2250
+ preFilters = Expr.preFilter;
2251
+
2252
+ while ( soFar ) {
2253
+
2254
+ // Comma and first run
2255
+ if ( !matched || (match = rcomma.exec( soFar )) ) {
2256
+ if ( match ) {
2257
+ // Don't consume trailing commas as valid
2258
+ soFar = soFar.slice( match[0].length ) || soFar;
2259
+ }
2260
+ groups.push( (tokens = []) );
2261
+ }
2262
+
2263
+ matched = false;
2264
+
2265
+ // Combinators
2266
+ if ( (match = rcombinators.exec( soFar )) ) {
2267
+ matched = match.shift();
2268
+ tokens.push({
2269
+ value: matched,
2270
+ // Cast descendant combinators to space
2271
+ type: match[0].replace( rtrim, " " )
2272
+ });
2273
+ soFar = soFar.slice( matched.length );
2274
+ }
2275
+
2276
+ // Filters
2277
+ for ( type in Expr.filter ) {
2278
+ if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
2279
+ (match = preFilters[ type ]( match ))) ) {
2280
+ matched = match.shift();
2281
+ tokens.push({
2282
+ value: matched,
2283
+ type: type,
2284
+ matches: match
2285
+ });
2286
+ soFar = soFar.slice( matched.length );
2287
+ }
2288
+ }
2289
+
2290
+ if ( !matched ) {
2291
+ break;
2292
+ }
2293
+ }
2294
+
2295
+ // Return the length of the invalid excess
2296
+ // if we're just parsing
2297
+ // Otherwise, throw an error or return tokens
2298
+ return parseOnly ?
2299
+ soFar.length :
2300
+ soFar ?
2301
+ Sizzle.error( selector ) :
2302
+ // Cache the tokens
2303
+ tokenCache( selector, groups ).slice( 0 );
2304
+ };
2305
+
2306
+ function toSelector( tokens ) {
2307
+ var i = 0,
2308
+ len = tokens.length,
2309
+ selector = "";
2310
+ for ( ; i < len; i++ ) {
2311
+ selector += tokens[i].value;
2312
+ }
2313
+ return selector;
2314
+ }
2315
+
2316
+ function addCombinator( matcher, combinator, base ) {
2317
+ var dir = combinator.dir,
2318
+ skip = combinator.next,
2319
+ key = skip || dir,
2320
+ checkNonElements = base && key === "parentNode",
2321
+ doneName = done++;
2322
+
2323
+ return combinator.first ?
2324
+ // Check against closest ancestor/preceding element
2325
+ function( elem, context, xml ) {
2326
+ while ( (elem = elem[ dir ]) ) {
2327
+ if ( elem.nodeType === 1 || checkNonElements ) {
2328
+ return matcher( elem, context, xml );
2329
+ }
2330
+ }
2331
+ return false;
2332
+ } :
2333
+
2334
+ // Check against all ancestor/preceding elements
2335
+ function( elem, context, xml ) {
2336
+ var oldCache, uniqueCache, outerCache,
2337
+ newCache = [ dirruns, doneName ];
2338
+
2339
+ // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
2340
+ if ( xml ) {
2341
+ while ( (elem = elem[ dir ]) ) {
2342
+ if ( elem.nodeType === 1 || checkNonElements ) {
2343
+ if ( matcher( elem, context, xml ) ) {
2344
+ return true;
2345
+ }
2346
+ }
2347
+ }
2348
+ } else {
2349
+ while ( (elem = elem[ dir ]) ) {
2350
+ if ( elem.nodeType === 1 || checkNonElements ) {
2351
+ outerCache = elem[ expando ] || (elem[ expando ] = {});
2352
+
2353
+ // Support: IE <9 only
2354
+ // Defend against cloned attroperties (jQuery gh-1709)
2355
+ uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});
2356
+
2357
+ if ( skip && skip === elem.nodeName.toLowerCase() ) {
2358
+ elem = elem[ dir ] || elem;
2359
+ } else if ( (oldCache = uniqueCache[ key ]) &&
2360
+ oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
2361
+
2362
+ // Assign to newCache so results back-propagate to previous elements
2363
+ return (newCache[ 2 ] = oldCache[ 2 ]);
2364
+ } else {
2365
+ // Reuse newcache so results back-propagate to previous elements
2366
+ uniqueCache[ key ] = newCache;
2367
+
2368
+ // A match means we're done; a fail means we have to keep checking
2369
+ if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
2370
+ return true;
2371
+ }
2372
+ }
2373
+ }
2374
+ }
2375
+ }
2376
+ return false;
2377
+ };
2378
+ }
2379
+
2380
+ function elementMatcher( matchers ) {
2381
+ return matchers.length > 1 ?
2382
+ function( elem, context, xml ) {
2383
+ var i = matchers.length;
2384
+ while ( i-- ) {
2385
+ if ( !matchers[i]( elem, context, xml ) ) {
2386
+ return false;
2387
+ }
2388
+ }
2389
+ return true;
2390
+ } :
2391
+ matchers[0];
2392
+ }
2393
+
2394
+ function multipleContexts( selector, contexts, results ) {
2395
+ var i = 0,
2396
+ len = contexts.length;
2397
+ for ( ; i < len; i++ ) {
2398
+ Sizzle( selector, contexts[i], results );
2399
+ }
2400
+ return results;
2401
+ }
2402
+
2403
+ function condense( unmatched, map, filter, context, xml ) {
2404
+ var elem,
2405
+ newUnmatched = [],
2406
+ i = 0,
2407
+ len = unmatched.length,
2408
+ mapped = map != null;
2409
+
2410
+ for ( ; i < len; i++ ) {
2411
+ if ( (elem = unmatched[i]) ) {
2412
+ if ( !filter || filter( elem, context, xml ) ) {
2413
+ newUnmatched.push( elem );
2414
+ if ( mapped ) {
2415
+ map.push( i );
2416
+ }
2417
+ }
2418
+ }
2419
+ }
2420
+
2421
+ return newUnmatched;
2422
+ }
2423
+
2424
+ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
2425
+ if ( postFilter && !postFilter[ expando ] ) {
2426
+ postFilter = setMatcher( postFilter );
2427
+ }
2428
+ if ( postFinder && !postFinder[ expando ] ) {
2429
+ postFinder = setMatcher( postFinder, postSelector );
2430
+ }
2431
+ return markFunction(function( seed, results, context, xml ) {
2432
+ var temp, i, elem,
2433
+ preMap = [],
2434
+ postMap = [],
2435
+ preexisting = results.length,
2436
+
2437
+ // Get initial elements from seed or context
2438
+ elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
2439
+
2440
+ // Prefilter to get matcher input, preserving a map for seed-results synchronization
2441
+ matcherIn = preFilter && ( seed || !selector ) ?
2442
+ condense( elems, preMap, preFilter, context, xml ) :
2443
+ elems,
2444
+
2445
+ matcherOut = matcher ?
2446
+ // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
2447
+ postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
2448
+
2449
+ // ...intermediate processing is necessary
2450
+ [] :
2451
+
2452
+ // ...otherwise use results directly
2453
+ results :
2454
+ matcherIn;
2455
+
2456
+ // Find primary matches
2457
+ if ( matcher ) {
2458
+ matcher( matcherIn, matcherOut, context, xml );
2459
+ }
2460
+
2461
+ // Apply postFilter
2462
+ if ( postFilter ) {
2463
+ temp = condense( matcherOut, postMap );
2464
+ postFilter( temp, [], context, xml );
2465
+
2466
+ // Un-match failing elements by moving them back to matcherIn
2467
+ i = temp.length;
2468
+ while ( i-- ) {
2469
+ if ( (elem = temp[i]) ) {
2470
+ matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
2471
+ }
2472
+ }
2473
+ }
2474
+
2475
+ if ( seed ) {
2476
+ if ( postFinder || preFilter ) {
2477
+ if ( postFinder ) {
2478
+ // Get the final matcherOut by condensing this intermediate into postFinder contexts
2479
+ temp = [];
2480
+ i = matcherOut.length;
2481
+ while ( i-- ) {
2482
+ if ( (elem = matcherOut[i]) ) {
2483
+ // Restore matcherIn since elem is not yet a final match
2484
+ temp.push( (matcherIn[i] = elem) );
2485
+ }
2486
+ }
2487
+ postFinder( null, (matcherOut = []), temp, xml );
2488
+ }
2489
+
2490
+ // Move matched elements from seed to results to keep them synchronized
2491
+ i = matcherOut.length;
2492
+ while ( i-- ) {
2493
+ if ( (elem = matcherOut[i]) &&
2494
+ (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
2495
+
2496
+ seed[temp] = !(results[temp] = elem);
2497
+ }
2498
+ }
2499
+ }
2500
+
2501
+ // Add elements to results, through postFinder if defined
2502
+ } else {
2503
+ matcherOut = condense(
2504
+ matcherOut === results ?
2505
+ matcherOut.splice( preexisting, matcherOut.length ) :
2506
+ matcherOut
2507
+ );
2508
+ if ( postFinder ) {
2509
+ postFinder( null, results, matcherOut, xml );
2510
+ } else {
2511
+ push.apply( results, matcherOut );
2512
+ }
2513
+ }
2514
+ });
2515
+ }
2516
+
2517
+ function matcherFromTokens( tokens ) {
2518
+ var checkContext, matcher, j,
2519
+ len = tokens.length,
2520
+ leadingRelative = Expr.relative[ tokens[0].type ],
2521
+ implicitRelative = leadingRelative || Expr.relative[" "],
2522
+ i = leadingRelative ? 1 : 0,
2523
+
2524
+ // The foundational matcher ensures that elements are reachable from top-level context(s)
2525
+ matchContext = addCombinator( function( elem ) {
2526
+ return elem === checkContext;
2527
+ }, implicitRelative, true ),
2528
+ matchAnyContext = addCombinator( function( elem ) {
2529
+ return indexOf( checkContext, elem ) > -1;
2530
+ }, implicitRelative, true ),
2531
+ matchers = [ function( elem, context, xml ) {
2532
+ var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
2533
+ (checkContext = context).nodeType ?
2534
+ matchContext( elem, context, xml ) :
2535
+ matchAnyContext( elem, context, xml ) );
2536
+ // Avoid hanging onto element (issue #299)
2537
+ checkContext = null;
2538
+ return ret;
2539
+ } ];
2540
+
2541
+ for ( ; i < len; i++ ) {
2542
+ if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
2543
+ matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
2544
+ } else {
2545
+ matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
2546
+
2547
+ // Return special upon seeing a positional matcher
2548
+ if ( matcher[ expando ] ) {
2549
+ // Find the next relative operator (if any) for proper handling
2550
+ j = ++i;
2551
+ for ( ; j < len; j++ ) {
2552
+ if ( Expr.relative[ tokens[j].type ] ) {
2553
+ break;
2554
+ }
2555
+ }
2556
+ return setMatcher(
2557
+ i > 1 && elementMatcher( matchers ),
2558
+ i > 1 && toSelector(
2559
+ // If the preceding token was a descendant combinator, insert an implicit any-element `*`
2560
+ tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
2561
+ ).replace( rtrim, "$1" ),
2562
+ matcher,
2563
+ i < j && matcherFromTokens( tokens.slice( i, j ) ),
2564
+ j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
2565
+ j < len && toSelector( tokens )
2566
+ );
2567
+ }
2568
+ matchers.push( matcher );
2569
+ }
2570
+ }
2571
+
2572
+ return elementMatcher( matchers );
2573
+ }
2574
+
2575
+ function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
2576
+ var bySet = setMatchers.length > 0,
2577
+ byElement = elementMatchers.length > 0,
2578
+ superMatcher = function( seed, context, xml, results, outermost ) {
2579
+ var elem, j, matcher,
2580
+ matchedCount = 0,
2581
+ i = "0",
2582
+ unmatched = seed && [],
2583
+ setMatched = [],
2584
+ contextBackup = outermostContext,
2585
+ // We must always have either seed elements or outermost context
2586
+ elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
2587
+ // Use integer dirruns iff this is the outermost matcher
2588
+ dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
2589
+ len = elems.length;
2590
+
2591
+ if ( outermost ) {
2592
+ outermostContext = context === document || context || outermost;
2593
+ }
2594
+
2595
+ // Add elements passing elementMatchers directly to results
2596
+ // Support: IE<9, Safari
2597
+ // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
2598
+ for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
2599
+ if ( byElement && elem ) {
2600
+ j = 0;
2601
+ if ( !context && elem.ownerDocument !== document ) {
2602
+ setDocument( elem );
2603
+ xml = !documentIsHTML;
2604
+ }
2605
+ while ( (matcher = elementMatchers[j++]) ) {
2606
+ if ( matcher( elem, context || document, xml) ) {
2607
+ results.push( elem );
2608
+ break;
2609
+ }
2610
+ }
2611
+ if ( outermost ) {
2612
+ dirruns = dirrunsUnique;
2613
+ }
2614
+ }
2615
+
2616
+ // Track unmatched elements for set filters
2617
+ if ( bySet ) {
2618
+ // They will have gone through all possible matchers
2619
+ if ( (elem = !matcher && elem) ) {
2620
+ matchedCount--;
2621
+ }
2622
+
2623
+ // Lengthen the array for every element, matched or not
2624
+ if ( seed ) {
2625
+ unmatched.push( elem );
2626
+ }
2627
+ }
2628
+ }
2629
+
2630
+ // `i` is now the count of elements visited above, and adding it to `matchedCount`
2631
+ // makes the latter nonnegative.
2632
+ matchedCount += i;
2633
+
2634
+ // Apply set filters to unmatched elements
2635
+ // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
2636
+ // equals `i`), unless we didn't visit _any_ elements in the above loop because we have
2637
+ // no element matchers and no seed.
2638
+ // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
2639
+ // case, which will result in a "00" `matchedCount` that differs from `i` but is also
2640
+ // numerically zero.
2641
+ if ( bySet && i !== matchedCount ) {
2642
+ j = 0;
2643
+ while ( (matcher = setMatchers[j++]) ) {
2644
+ matcher( unmatched, setMatched, context, xml );
2645
+ }
2646
+
2647
+ if ( seed ) {
2648
+ // Reintegrate element matches to eliminate the need for sorting
2649
+ if ( matchedCount > 0 ) {
2650
+ while ( i-- ) {
2651
+ if ( !(unmatched[i] || setMatched[i]) ) {
2652
+ setMatched[i] = pop.call( results );
2653
+ }
2654
+ }
2655
+ }
2656
+
2657
+ // Discard index placeholder values to get only actual matches
2658
+ setMatched = condense( setMatched );
2659
+ }
2660
+
2661
+ // Add matches to results
2662
+ push.apply( results, setMatched );
2663
+
2664
+ // Seedless set matches succeeding multiple successful matchers stipulate sorting
2665
+ if ( outermost && !seed && setMatched.length > 0 &&
2666
+ ( matchedCount + setMatchers.length ) > 1 ) {
2667
+
2668
+ Sizzle.uniqueSort( results );
2669
+ }
2670
+ }
2671
+
2672
+ // Override manipulation of globals by nested matchers
2673
+ if ( outermost ) {
2674
+ dirruns = dirrunsUnique;
2675
+ outermostContext = contextBackup;
2676
+ }
2677
+
2678
+ return unmatched;
2679
+ };
2680
+
2681
+ return bySet ?
2682
+ markFunction( superMatcher ) :
2683
+ superMatcher;
2684
+ }
2685
+
2686
+ compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
2687
+ var i,
2688
+ setMatchers = [],
2689
+ elementMatchers = [],
2690
+ cached = compilerCache[ selector + " " ];
2691
+
2692
+ if ( !cached ) {
2693
+ // Generate a function of recursive functions that can be used to check each element
2694
+ if ( !match ) {
2695
+ match = tokenize( selector );
2696
+ }
2697
+ i = match.length;
2698
+ while ( i-- ) {
2699
+ cached = matcherFromTokens( match[i] );
2700
+ if ( cached[ expando ] ) {
2701
+ setMatchers.push( cached );
2702
+ } else {
2703
+ elementMatchers.push( cached );
2704
+ }
2705
+ }
2706
+
2707
+ // Cache the compiled function
2708
+ cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
2709
+
2710
+ // Save selector and tokenization
2711
+ cached.selector = selector;
2712
+ }
2713
+ return cached;
2714
+ };
2715
+
2716
+ /**
2717
+ * A low-level selection function that works with Sizzle's compiled
2718
+ * selector functions
2719
+ * @param {String|Function} selector A selector or a pre-compiled
2720
+ * selector function built with Sizzle.compile
2721
+ * @param {Element} context
2722
+ * @param {Array} [results]
2723
+ * @param {Array} [seed] A set of elements to match against
2724
+ */
2725
+ select = Sizzle.select = function( selector, context, results, seed ) {
2726
+ var i, tokens, token, type, find,
2727
+ compiled = typeof selector === "function" && selector,
2728
+ match = !seed && tokenize( (selector = compiled.selector || selector) );
2729
+
2730
+ results = results || [];
2731
+
2732
+ // Try to minimize operations if there is only one selector in the list and no seed
2733
+ // (the latter of which guarantees us context)
2734
+ if ( match.length === 1 ) {
2735
+
2736
+ // Reduce context if the leading compound selector is an ID
2737
+ tokens = match[0] = match[0].slice( 0 );
2738
+ if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
2739
+ context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) {
2740
+
2741
+ context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
2742
+ if ( !context ) {
2743
+ return results;
2744
+
2745
+ // Precompiled matchers will still verify ancestry, so step up a level
2746
+ } else if ( compiled ) {
2747
+ context = context.parentNode;
2748
+ }
2749
+
2750
+ selector = selector.slice( tokens.shift().value.length );
2751
+ }
2752
+
2753
+ // Fetch a seed set for right-to-left matching
2754
+ i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
2755
+ while ( i-- ) {
2756
+ token = tokens[i];
2757
+
2758
+ // Abort if we hit a combinator
2759
+ if ( Expr.relative[ (type = token.type) ] ) {
2760
+ break;
2761
+ }
2762
+ if ( (find = Expr.find[ type ]) ) {
2763
+ // Search, expanding context for leading sibling combinators
2764
+ if ( (seed = find(
2765
+ token.matches[0].replace( runescape, funescape ),
2766
+ rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
2767
+ )) ) {
2768
+
2769
+ // If seed is empty or no tokens remain, we can return early
2770
+ tokens.splice( i, 1 );
2771
+ selector = seed.length && toSelector( tokens );
2772
+ if ( !selector ) {
2773
+ push.apply( results, seed );
2774
+ return results;
2775
+ }
2776
+
2777
+ break;
2778
+ }
2779
+ }
2780
+ }
2781
+ }
2782
+
2783
+ // Compile and execute a filtering function if one is not provided
2784
+ // Provide `match` to avoid retokenization if we modified the selector above
2785
+ ( compiled || compile( selector, match ) )(
2786
+ seed,
2787
+ context,
2788
+ !documentIsHTML,
2789
+ results,
2790
+ !context || rsibling.test( selector ) && testContext( context.parentNode ) || context
2791
+ );
2792
+ return results;
2793
+ };
2794
+
2795
+ // One-time assignments
2796
+
2797
+ // Sort stability
2798
+ support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
2799
+
2800
+ // Support: Chrome 14-35+
2801
+ // Always assume duplicates if they aren't passed to the comparison function
2802
+ support.detectDuplicates = !!hasDuplicate;
2803
+
2804
+ // Initialize against the default document
2805
+ setDocument();
2806
+
2807
+ // Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
2808
+ // Detached nodes confoundingly follow *each other*
2809
+ support.sortDetached = assert(function( el ) {
2810
+ // Should return 1, but returns 4 (following)
2811
+ return el.compareDocumentPosition( document.createElement("fieldset") ) & 1;
2812
+ });
2813
+
2814
+ // Support: IE<8
2815
+ // Prevent attribute/property "interpolation"
2816
+ // https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
2817
+ if ( !assert(function( el ) {
2818
+ el.innerHTML = "<a href='#'></a>";
2819
+ return el.firstChild.getAttribute("href") === "#" ;
2820
+ }) ) {
2821
+ addHandle( "type|href|height|width", function( elem, name, isXML ) {
2822
+ if ( !isXML ) {
2823
+ return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
2824
+ }
2825
+ });
2826
+ }
2827
+
2828
+ // Support: IE<9
2829
+ // Use defaultValue in place of getAttribute("value")
2830
+ if ( !support.attributes || !assert(function( el ) {
2831
+ el.innerHTML = "<input/>";
2832
+ el.firstChild.setAttribute( "value", "" );
2833
+ return el.firstChild.getAttribute( "value" ) === "";
2834
+ }) ) {
2835
+ addHandle( "value", function( elem, name, isXML ) {
2836
+ if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
2837
+ return elem.defaultValue;
2838
+ }
2839
+ });
2840
+ }
2841
+
2842
+ // Support: IE<9
2843
+ // Use getAttributeNode to fetch booleans when getAttribute lies
2844
+ if ( !assert(function( el ) {
2845
+ return el.getAttribute("disabled") == null;
2846
+ }) ) {
2847
+ addHandle( booleans, function( elem, name, isXML ) {
2848
+ var val;
2849
+ if ( !isXML ) {
2850
+ return elem[ name ] === true ? name.toLowerCase() :
2851
+ (val = elem.getAttributeNode( name )) && val.specified ?
2852
+ val.value :
2853
+ null;
2854
+ }
2855
+ });
2856
+ }
2857
+
2858
+ return Sizzle;
2859
+
2860
+ })( window );
2861
+
2862
+
2863
+
2864
+ jQuery.find = Sizzle;
2865
+ jQuery.expr = Sizzle.selectors;
2866
+
2867
+ // Deprecated
2868
+ jQuery.expr[ ":" ] = jQuery.expr.pseudos;
2869
+ jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
2870
+ jQuery.text = Sizzle.getText;
2871
+ jQuery.isXMLDoc = Sizzle.isXML;
2872
+ jQuery.contains = Sizzle.contains;
2873
+ jQuery.escapeSelector = Sizzle.escape;
2874
+
2875
+
2876
+
2877
+
2878
+ var dir = function( elem, dir, until ) {
2879
+ var matched = [],
2880
+ truncate = until !== undefined;
2881
+
2882
+ while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
2883
+ if ( elem.nodeType === 1 ) {
2884
+ if ( truncate && jQuery( elem ).is( until ) ) {
2885
+ break;
2886
+ }
2887
+ matched.push( elem );
2888
+ }
2889
+ }
2890
+ return matched;
2891
+ };
2892
+
2893
+
2894
+ var siblings = function( n, elem ) {
2895
+ var matched = [];
2896
+
2897
+ for ( ; n; n = n.nextSibling ) {
2898
+ if ( n.nodeType === 1 && n !== elem ) {
2899
+ matched.push( n );
2900
+ }
2901
+ }
2902
+
2903
+ return matched;
2904
+ };
2905
+
2906
+
2907
+ var rneedsContext = jQuery.expr.match.needsContext;
2908
+
2909
+
2910
+
2911
+ function nodeName( elem, name ) {
2912
+
2913
+ return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
2914
+
2915
+ };
2916
+ var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
2917
+
2918
+
2919
+
2920
+ var risSimple = /^.[^:#\[\.,]*$/;
2921
+
2922
+ // Implement the identical functionality for filter and not
2923
+ function winnow( elements, qualifier, not ) {
2924
+ if ( jQuery.isFunction( qualifier ) ) {
2925
+ return jQuery.grep( elements, function( elem, i ) {
2926
+ return !!qualifier.call( elem, i, elem ) !== not;
2927
+ } );
2928
+ }
2929
+
2930
+ // Single element
2931
+ if ( qualifier.nodeType ) {
2932
+ return jQuery.grep( elements, function( elem ) {
2933
+ return ( elem === qualifier ) !== not;
2934
+ } );
2935
+ }
2936
+
2937
+ // Arraylike of elements (jQuery, arguments, Array)
2938
+ if ( typeof qualifier !== "string" ) {
2939
+ return jQuery.grep( elements, function( elem ) {
2940
+ return ( indexOf.call( qualifier, elem ) > -1 ) !== not;
2941
+ } );
2942
+ }
2943
+
2944
+ // Simple selector that can be filtered directly, removing non-Elements
2945
+ if ( risSimple.test( qualifier ) ) {
2946
+ return jQuery.filter( qualifier, elements, not );
2947
+ }
2948
+
2949
+ // Complex selector, compare the two sets, removing non-Elements
2950
+ qualifier = jQuery.filter( qualifier, elements );
2951
+ return jQuery.grep( elements, function( elem ) {
2952
+ return ( indexOf.call( qualifier, elem ) > -1 ) !== not && elem.nodeType === 1;
2953
+ } );
2954
+ }
2955
+
2956
+ jQuery.filter = function( expr, elems, not ) {
2957
+ var elem = elems[ 0 ];
2958
+
2959
+ if ( not ) {
2960
+ expr = ":not(" + expr + ")";
2961
+ }
2962
+
2963
+ if ( elems.length === 1 && elem.nodeType === 1 ) {
2964
+ return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];
2965
+ }
2966
+
2967
+ return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
2968
+ return elem.nodeType === 1;
2969
+ } ) );
2970
+ };
2971
+
2972
+ jQuery.fn.extend( {
2973
+ find: function( selector ) {
2974
+ var i, ret,
2975
+ len = this.length,
2976
+ self = this;
2977
+
2978
+ if ( typeof selector !== "string" ) {
2979
+ return this.pushStack( jQuery( selector ).filter( function() {
2980
+ for ( i = 0; i < len; i++ ) {
2981
+ if ( jQuery.contains( self[ i ], this ) ) {
2982
+ return true;
2983
+ }
2984
+ }
2985
+ } ) );
2986
+ }
2987
+
2988
+ ret = this.pushStack( [] );
2989
+
2990
+ for ( i = 0; i < len; i++ ) {
2991
+ jQuery.find( selector, self[ i ], ret );
2992
+ }
2993
+
2994
+ return len > 1 ? jQuery.uniqueSort( ret ) : ret;
2995
+ },
2996
+ filter: function( selector ) {
2997
+ return this.pushStack( winnow( this, selector || [], false ) );
2998
+ },
2999
+ not: function( selector ) {
3000
+ return this.pushStack( winnow( this, selector || [], true ) );
3001
+ },
3002
+ is: function( selector ) {
3003
+ return !!winnow(
3004
+ this,
3005
+
3006
+ // If this is a positional/relative selector, check membership in the returned set
3007
+ // so $("p:first").is("p:last") won't return true for a doc with two "p".
3008
+ typeof selector === "string" && rneedsContext.test( selector ) ?
3009
+ jQuery( selector ) :
3010
+ selector || [],
3011
+ false
3012
+ ).length;
3013
+ }
3014
+ } );
3015
+
3016
+
3017
+ // Initialize a jQuery object
3018
+
3019
+
3020
+ // A central reference to the root jQuery(document)
3021
+ var rootjQuery,
3022
+
3023
+ // A simple way to check for HTML strings
3024
+ // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
3025
+ // Strict HTML recognition (#11290: must start with <)
3026
+ // Shortcut simple #id case for speed
3027
+ rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,
3028
+
3029
+ init = jQuery.fn.init = function( selector, context, root ) {
3030
+ var match, elem;
3031
+
3032
+ // HANDLE: $(""), $(null), $(undefined), $(false)
3033
+ if ( !selector ) {
3034
+ return this;
3035
+ }
3036
+
3037
+ // Method init() accepts an alternate rootjQuery
3038
+ // so migrate can support jQuery.sub (gh-2101)
3039
+ root = root || rootjQuery;
3040
+
3041
+ // Handle HTML strings
3042
+ if ( typeof selector === "string" ) {
3043
+ if ( selector[ 0 ] === "<" &&
3044
+ selector[ selector.length - 1 ] === ">" &&
3045
+ selector.length >= 3 ) {
3046
+
3047
+ // Assume that strings that start and end with <> are HTML and skip the regex check
3048
+ match = [ null, selector, null ];
3049
+
3050
+ } else {
3051
+ match = rquickExpr.exec( selector );
3052
+ }
3053
+
3054
+ // Match html or make sure no context is specified for #id
3055
+ if ( match && ( match[ 1 ] || !context ) ) {
3056
+
3057
+ // HANDLE: $(html) -> $(array)
3058
+ if ( match[ 1 ] ) {
3059
+ context = context instanceof jQuery ? context[ 0 ] : context;
3060
+
3061
+ // Option to run scripts is true for back-compat
3062
+ // Intentionally let the error be thrown if parseHTML is not present
3063
+ jQuery.merge( this, jQuery.parseHTML(
3064
+ match[ 1 ],
3065
+ context && context.nodeType ? context.ownerDocument || context : document,
3066
+ true
3067
+ ) );
3068
+
3069
+ // HANDLE: $(html, props)
3070
+ if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
3071
+ for ( match in context ) {
3072
+
3073
+ // Properties of context are called as methods if possible
3074
+ if ( jQuery.isFunction( this[ match ] ) ) {
3075
+ this[ match ]( context[ match ] );
3076
+
3077
+ // ...and otherwise set as attributes
3078
+ } else {
3079
+ this.attr( match, context[ match ] );
3080
+ }
3081
+ }
3082
+ }
3083
+
3084
+ return this;
3085
+
3086
+ // HANDLE: $(#id)
3087
+ } else {
3088
+ elem = document.getElementById( match[ 2 ] );
3089
+
3090
+ if ( elem ) {
3091
+
3092
+ // Inject the element directly into the jQuery object
3093
+ this[ 0 ] = elem;
3094
+ this.length = 1;
3095
+ }
3096
+ return this;
3097
+ }
3098
+
3099
+ // HANDLE: $(expr, $(...))
3100
+ } else if ( !context || context.jquery ) {
3101
+ return ( context || root ).find( selector );
3102
+
3103
+ // HANDLE: $(expr, context)
3104
+ // (which is just equivalent to: $(context).find(expr)
3105
+ } else {
3106
+ return this.constructor( context ).find( selector );
3107
+ }
3108
+
3109
+ // HANDLE: $(DOMElement)
3110
+ } else if ( selector.nodeType ) {
3111
+ this[ 0 ] = selector;
3112
+ this.length = 1;
3113
+ return this;
3114
+
3115
+ // HANDLE: $(function)
3116
+ // Shortcut for document ready
3117
+ } else if ( jQuery.isFunction( selector ) ) {
3118
+ return root.ready !== undefined ?
3119
+ root.ready( selector ) :
3120
+
3121
+ // Execute immediately if ready is not present
3122
+ selector( jQuery );
3123
+ }
3124
+
3125
+ return jQuery.makeArray( selector, this );
3126
+ };
3127
+
3128
+ // Give the init function the jQuery prototype for later instantiation
3129
+ init.prototype = jQuery.fn;
3130
+
3131
+ // Initialize central reference
3132
+ rootjQuery = jQuery( document );
3133
+
3134
+
3135
+ var rparentsprev = /^(?:parents|prev(?:Until|All))/,
3136
+
3137
+ // Methods guaranteed to produce a unique set when starting from a unique set
3138
+ guaranteedUnique = {
3139
+ children: true,
3140
+ contents: true,
3141
+ next: true,
3142
+ prev: true
3143
+ };
3144
+
3145
+ jQuery.fn.extend( {
3146
+ has: function( target ) {
3147
+ var targets = jQuery( target, this ),
3148
+ l = targets.length;
3149
+
3150
+ return this.filter( function() {
3151
+ var i = 0;
3152
+ for ( ; i < l; i++ ) {
3153
+ if ( jQuery.contains( this, targets[ i ] ) ) {
3154
+ return true;
3155
+ }
3156
+ }
3157
+ } );
3158
+ },
3159
+
3160
+ closest: function( selectors, context ) {
3161
+ var cur,
3162
+ i = 0,
3163
+ l = this.length,
3164
+ matched = [],
3165
+ targets = typeof selectors !== "string" && jQuery( selectors );
3166
+
3167
+ // Positional selectors never match, since there's no _selection_ context
3168
+ if ( !rneedsContext.test( selectors ) ) {
3169
+ for ( ; i < l; i++ ) {
3170
+ for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
3171
+
3172
+ // Always skip document fragments
3173
+ if ( cur.nodeType < 11 && ( targets ?
3174
+ targets.index( cur ) > -1 :
3175
+
3176
+ // Don't pass non-elements to Sizzle
3177
+ cur.nodeType === 1 &&
3178
+ jQuery.find.matchesSelector( cur, selectors ) ) ) {
3179
+
3180
+ matched.push( cur );
3181
+ break;
3182
+ }
3183
+ }
3184
+ }
3185
+ }
3186
+
3187
+ return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
3188
+ },
3189
+
3190
+ // Determine the position of an element within the set
3191
+ index: function( elem ) {
3192
+
3193
+ // No argument, return index in parent
3194
+ if ( !elem ) {
3195
+ return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
3196
+ }
3197
+
3198
+ // Index in selector
3199
+ if ( typeof elem === "string" ) {
3200
+ return indexOf.call( jQuery( elem ), this[ 0 ] );
3201
+ }
3202
+
3203
+ // Locate the position of the desired element
3204
+ return indexOf.call( this,
3205
+
3206
+ // If it receives a jQuery object, the first element is used
3207
+ elem.jquery ? elem[ 0 ] : elem
3208
+ );
3209
+ },
3210
+
3211
+ add: function( selector, context ) {
3212
+ return this.pushStack(
3213
+ jQuery.uniqueSort(
3214
+ jQuery.merge( this.get(), jQuery( selector, context ) )
3215
+ )
3216
+ );
3217
+ },
3218
+
3219
+ addBack: function( selector ) {
3220
+ return this.add( selector == null ?
3221
+ this.prevObject : this.prevObject.filter( selector )
3222
+ );
3223
+ }
3224
+ } );
3225
+
3226
+ function sibling( cur, dir ) {
3227
+ while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}
3228
+ return cur;
3229
+ }
3230
+
3231
+ jQuery.each( {
3232
+ parent: function( elem ) {
3233
+ var parent = elem.parentNode;
3234
+ return parent && parent.nodeType !== 11 ? parent : null;
3235
+ },
3236
+ parents: function( elem ) {
3237
+ return dir( elem, "parentNode" );
3238
+ },
3239
+ parentsUntil: function( elem, i, until ) {
3240
+ return dir( elem, "parentNode", until );
3241
+ },
3242
+ next: function( elem ) {
3243
+ return sibling( elem, "nextSibling" );
3244
+ },
3245
+ prev: function( elem ) {
3246
+ return sibling( elem, "previousSibling" );
3247
+ },
3248
+ nextAll: function( elem ) {
3249
+ return dir( elem, "nextSibling" );
3250
+ },
3251
+ prevAll: function( elem ) {
3252
+ return dir( elem, "previousSibling" );
3253
+ },
3254
+ nextUntil: function( elem, i, until ) {
3255
+ return dir( elem, "nextSibling", until );
3256
+ },
3257
+ prevUntil: function( elem, i, until ) {
3258
+ return dir( elem, "previousSibling", until );
3259
+ },
3260
+ siblings: function( elem ) {
3261
+ return siblings( ( elem.parentNode || {} ).firstChild, elem );
3262
+ },
3263
+ children: function( elem ) {
3264
+ return siblings( elem.firstChild );
3265
+ },
3266
+ contents: function( elem ) {
3267
+ if ( nodeName( elem, "iframe" ) ) {
3268
+ return elem.contentDocument;
3269
+ }
3270
+
3271
+ // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only
3272
+ // Treat the template element as a regular one in browsers that
3273
+ // don't support it.
3274
+ if ( nodeName( elem, "template" ) ) {
3275
+ elem = elem.content || elem;
3276
+ }
3277
+
3278
+ return jQuery.merge( [], elem.childNodes );
3279
+ }
3280
+ }, function( name, fn ) {
3281
+ jQuery.fn[ name ] = function( until, selector ) {
3282
+ var matched = jQuery.map( this, fn, until );
3283
+
3284
+ if ( name.slice( -5 ) !== "Until" ) {
3285
+ selector = until;
3286
+ }
3287
+
3288
+ if ( selector && typeof selector === "string" ) {
3289
+ matched = jQuery.filter( selector, matched );
3290
+ }
3291
+
3292
+ if ( this.length > 1 ) {
3293
+
3294
+ // Remove duplicates
3295
+ if ( !guaranteedUnique[ name ] ) {
3296
+ jQuery.uniqueSort( matched );
3297
+ }
3298
+
3299
+ // Reverse order for parents* and prev-derivatives
3300
+ if ( rparentsprev.test( name ) ) {
3301
+ matched.reverse();
3302
+ }
3303
+ }
3304
+
3305
+ return this.pushStack( matched );
3306
+ };
3307
+ } );
3308
+ var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g );
3309
+
3310
+
3311
+
3312
+ // Convert String-formatted options into Object-formatted ones
3313
+ function createOptions( options ) {
3314
+ var object = {};
3315
+ jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {
3316
+ object[ flag ] = true;
3317
+ } );
3318
+ return object;
3319
+ }
3320
+
3321
+ /*
3322
+ * Create a callback list using the following parameters:
3323
+ *
3324
+ * options: an optional list of space-separated options that will change how
3325
+ * the callback list behaves or a more traditional option object
3326
+ *
3327
+ * By default a callback list will act like an event callback list and can be
3328
+ * "fired" multiple times.
3329
+ *
3330
+ * Possible options:
3331
+ *
3332
+ * once: will ensure the callback list can only be fired once (like a Deferred)
3333
+ *
3334
+ * memory: will keep track of previous values and will call any callback added
3335
+ * after the list has been fired right away with the latest "memorized"
3336
+ * values (like a Deferred)
3337
+ *
3338
+ * unique: will ensure a callback can only be added once (no duplicate in the list)
3339
+ *
3340
+ * stopOnFalse: interrupt callings when a callback returns false
3341
+ *
3342
+ */
3343
+ jQuery.Callbacks = function( options ) {
3344
+
3345
+ // Convert options from String-formatted to Object-formatted if needed
3346
+ // (we check in cache first)
3347
+ options = typeof options === "string" ?
3348
+ createOptions( options ) :
3349
+ jQuery.extend( {}, options );
3350
+
3351
+ var // Flag to know if list is currently firing
3352
+ firing,
3353
+
3354
+ // Last fire value for non-forgettable lists
3355
+ memory,
3356
+
3357
+ // Flag to know if list was already fired
3358
+ fired,
3359
+
3360
+ // Flag to prevent firing
3361
+ locked,
3362
+
3363
+ // Actual callback list
3364
+ list = [],
3365
+
3366
+ // Queue of execution data for repeatable lists
3367
+ queue = [],
3368
+
3369
+ // Index of currently firing callback (modified by add/remove as needed)
3370
+ firingIndex = -1,
3371
+
3372
+ // Fire callbacks
3373
+ fire = function() {
3374
+
3375
+ // Enforce single-firing
3376
+ locked = locked || options.once;
3377
+
3378
+ // Execute callbacks for all pending executions,
3379
+ // respecting firingIndex overrides and runtime changes
3380
+ fired = firing = true;
3381
+ for ( ; queue.length; firingIndex = -1 ) {
3382
+ memory = queue.shift();
3383
+ while ( ++firingIndex < list.length ) {
3384
+
3385
+ // Run callback and check for early termination
3386
+ if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
3387
+ options.stopOnFalse ) {
3388
+
3389
+ // Jump to end and forget the data so .add doesn't re-fire
3390
+ firingIndex = list.length;
3391
+ memory = false;
3392
+ }
3393
+ }
3394
+ }
3395
+
3396
+ // Forget the data if we're done with it
3397
+ if ( !options.memory ) {
3398
+ memory = false;
3399
+ }
3400
+
3401
+ firing = false;
3402
+
3403
+ // Clean up if we're done firing for good
3404
+ if ( locked ) {
3405
+
3406
+ // Keep an empty list if we have data for future add calls
3407
+ if ( memory ) {
3408
+ list = [];
3409
+
3410
+ // Otherwise, this object is spent
3411
+ } else {
3412
+ list = "";
3413
+ }
3414
+ }
3415
+ },
3416
+
3417
+ // Actual Callbacks object
3418
+ self = {
3419
+
3420
+ // Add a callback or a collection of callbacks to the list
3421
+ add: function() {
3422
+ if ( list ) {
3423
+
3424
+ // If we have memory from a past run, we should fire after adding
3425
+ if ( memory && !firing ) {
3426
+ firingIndex = list.length - 1;
3427
+ queue.push( memory );
3428
+ }
3429
+
3430
+ ( function add( args ) {
3431
+ jQuery.each( args, function( _, arg ) {
3432
+ if ( jQuery.isFunction( arg ) ) {
3433
+ if ( !options.unique || !self.has( arg ) ) {
3434
+ list.push( arg );
3435
+ }
3436
+ } else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) {
3437
+
3438
+ // Inspect recursively
3439
+ add( arg );
3440
+ }
3441
+ } );
3442
+ } )( arguments );
3443
+
3444
+ if ( memory && !firing ) {
3445
+ fire();
3446
+ }
3447
+ }
3448
+ return this;
3449
+ },
3450
+
3451
+ // Remove a callback from the list
3452
+ remove: function() {
3453
+ jQuery.each( arguments, function( _, arg ) {
3454
+ var index;
3455
+ while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
3456
+ list.splice( index, 1 );
3457
+
3458
+ // Handle firing indexes
3459
+ if ( index <= firingIndex ) {
3460
+ firingIndex--;
3461
+ }
3462
+ }
3463
+ } );
3464
+ return this;
3465
+ },
3466
+
3467
+ // Check if a given callback is in the list.
3468
+ // If no argument is given, return whether or not list has callbacks attached.
3469
+ has: function( fn ) {
3470
+ return fn ?
3471
+ jQuery.inArray( fn, list ) > -1 :
3472
+ list.length > 0;
3473
+ },
3474
+
3475
+ // Remove all callbacks from the list
3476
+ empty: function() {
3477
+ if ( list ) {
3478
+ list = [];
3479
+ }
3480
+ return this;
3481
+ },
3482
+
3483
+ // Disable .fire and .add
3484
+ // Abort any current/pending executions
3485
+ // Clear all callbacks and values
3486
+ disable: function() {
3487
+ locked = queue = [];
3488
+ list = memory = "";
3489
+ return this;
3490
+ },
3491
+ disabled: function() {
3492
+ return !list;
3493
+ },
3494
+
3495
+ // Disable .fire
3496
+ // Also disable .add unless we have memory (since it would have no effect)
3497
+ // Abort any pending executions
3498
+ lock: function() {
3499
+ locked = queue = [];
3500
+ if ( !memory && !firing ) {
3501
+ list = memory = "";
3502
+ }
3503
+ return this;
3504
+ },
3505
+ locked: function() {
3506
+ return !!locked;
3507
+ },
3508
+
3509
+ // Call all callbacks with the given context and arguments
3510
+ fireWith: function( context, args ) {
3511
+ if ( !locked ) {
3512
+ args = args || [];
3513
+ args = [ context, args.slice ? args.slice() : args ];
3514
+ queue.push( args );
3515
+ if ( !firing ) {
3516
+ fire();
3517
+ }
3518
+ }
3519
+ return this;
3520
+ },
3521
+
3522
+ // Call all the callbacks with the given arguments
3523
+ fire: function() {
3524
+ self.fireWith( this, arguments );
3525
+ return this;
3526
+ },
3527
+
3528
+ // To know if the callbacks have already been called at least once
3529
+ fired: function() {
3530
+ return !!fired;
3531
+ }
3532
+ };
3533
+
3534
+ return self;
3535
+ };
3536
+
3537
+
3538
+ function Identity( v ) {
3539
+ return v;
3540
+ }
3541
+ function Thrower( ex ) {
3542
+ throw ex;
3543
+ }
3544
+
3545
+ function adoptValue( value, resolve, reject, noValue ) {
3546
+ var method;
3547
+
3548
+ try {
3549
+
3550
+ // Check for promise aspect first to privilege synchronous behavior
3551
+ if ( value && jQuery.isFunction( ( method = value.promise ) ) ) {
3552
+ method.call( value ).done( resolve ).fail( reject );
3553
+
3554
+ // Other thenables
3555
+ } else if ( value && jQuery.isFunction( ( method = value.then ) ) ) {
3556
+ method.call( value, resolve, reject );
3557
+
3558
+ // Other non-thenables
3559
+ } else {
3560
+
3561
+ // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:
3562
+ // * false: [ value ].slice( 0 ) => resolve( value )
3563
+ // * true: [ value ].slice( 1 ) => resolve()
3564
+ resolve.apply( undefined, [ value ].slice( noValue ) );
3565
+ }
3566
+
3567
+ // For Promises/A+, convert exceptions into rejections
3568
+ // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in
3569
+ // Deferred#then to conditionally suppress rejection.
3570
+ } catch ( value ) {
3571
+
3572
+ // Support: Android 4.0 only
3573
+ // Strict mode functions invoked without .call/.apply get global-object context
3574
+ reject.apply( undefined, [ value ] );
3575
+ }
3576
+ }
3577
+
3578
+ jQuery.extend( {
3579
+
3580
+ Deferred: function( func ) {
3581
+ var tuples = [
3582
+
3583
+ // action, add listener, callbacks,
3584
+ // ... .then handlers, argument index, [final state]
3585
+ [ "notify", "progress", jQuery.Callbacks( "memory" ),
3586
+ jQuery.Callbacks( "memory" ), 2 ],
3587
+ [ "resolve", "done", jQuery.Callbacks( "once memory" ),
3588
+ jQuery.Callbacks( "once memory" ), 0, "resolved" ],
3589
+ [ "reject", "fail", jQuery.Callbacks( "once memory" ),
3590
+ jQuery.Callbacks( "once memory" ), 1, "rejected" ]
3591
+ ],
3592
+ state = "pending",
3593
+ promise = {
3594
+ state: function() {
3595
+ return state;
3596
+ },
3597
+ always: function() {
3598
+ deferred.done( arguments ).fail( arguments );
3599
+ return this;
3600
+ },
3601
+ "catch": function( fn ) {
3602
+ return promise.then( null, fn );
3603
+ },
3604
+
3605
+ // Keep pipe for back-compat
3606
+ pipe: function( /* fnDone, fnFail, fnProgress */ ) {
3607
+ var fns = arguments;
3608
+
3609
+ return jQuery.Deferred( function( newDefer ) {
3610
+ jQuery.each( tuples, function( i, tuple ) {
3611
+
3612
+ // Map tuples (progress, done, fail) to arguments (done, fail, progress)
3613
+ var fn = jQuery.isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];
3614
+
3615
+ // deferred.progress(function() { bind to newDefer or newDefer.notify })
3616
+ // deferred.done(function() { bind to newDefer or newDefer.resolve })
3617
+ // deferred.fail(function() { bind to newDefer or newDefer.reject })
3618
+ deferred[ tuple[ 1 ] ]( function() {
3619
+ var returned = fn && fn.apply( this, arguments );
3620
+ if ( returned && jQuery.isFunction( returned.promise ) ) {
3621
+ returned.promise()
3622
+ .progress( newDefer.notify )
3623
+ .done( newDefer.resolve )
3624
+ .fail( newDefer.reject );
3625
+ } else {
3626
+ newDefer[ tuple[ 0 ] + "With" ](
3627
+ this,
3628
+ fn ? [ returned ] : arguments
3629
+ );
3630
+ }
3631
+ } );
3632
+ } );
3633
+ fns = null;
3634
+ } ).promise();
3635
+ },
3636
+ then: function( onFulfilled, onRejected, onProgress ) {
3637
+ var maxDepth = 0;
3638
+ function resolve( depth, deferred, handler, special ) {
3639
+ return function() {
3640
+ var that = this,
3641
+ args = arguments,
3642
+ mightThrow = function() {
3643
+ var returned, then;
3644
+
3645
+ // Support: Promises/A+ section 2.3.3.3.3
3646
+ // https://promisesaplus.com/#point-59
3647
+ // Ignore double-resolution attempts
3648
+ if ( depth < maxDepth ) {
3649
+ return;
3650
+ }
3651
+
3652
+ returned = handler.apply( that, args );
3653
+
3654
+ // Support: Promises/A+ section 2.3.1
3655
+ // https://promisesaplus.com/#point-48
3656
+ if ( returned === deferred.promise() ) {
3657
+ throw new TypeError( "Thenable self-resolution" );
3658
+ }
3659
+
3660
+ // Support: Promises/A+ sections 2.3.3.1, 3.5
3661
+ // https://promisesaplus.com/#point-54
3662
+ // https://promisesaplus.com/#point-75
3663
+ // Retrieve `then` only once
3664
+ then = returned &&
3665
+
3666
+ // Support: Promises/A+ section 2.3.4
3667
+ // https://promisesaplus.com/#point-64
3668
+ // Only check objects and functions for thenability
3669
+ ( typeof returned === "object" ||
3670
+ typeof returned === "function" ) &&
3671
+ returned.then;
3672
+
3673
+ // Handle a returned thenable
3674
+ if ( jQuery.isFunction( then ) ) {
3675
+
3676
+ // Special processors (notify) just wait for resolution
3677
+ if ( special ) {
3678
+ then.call(
3679
+ returned,
3680
+ resolve( maxDepth, deferred, Identity, special ),
3681
+ resolve( maxDepth, deferred, Thrower, special )
3682
+ );
3683
+
3684
+ // Normal processors (resolve) also hook into progress
3685
+ } else {
3686
+
3687
+ // ...and disregard older resolution values
3688
+ maxDepth++;
3689
+
3690
+ then.call(
3691
+ returned,
3692
+ resolve( maxDepth, deferred, Identity, special ),
3693
+ resolve( maxDepth, deferred, Thrower, special ),
3694
+ resolve( maxDepth, deferred, Identity,
3695
+ deferred.notifyWith )
3696
+ );
3697
+ }
3698
+
3699
+ // Handle all other returned values
3700
+ } else {
3701
+
3702
+ // Only substitute handlers pass on context
3703
+ // and multiple values (non-spec behavior)
3704
+ if ( handler !== Identity ) {
3705
+ that = undefined;
3706
+ args = [ returned ];
3707
+ }
3708
+
3709
+ // Process the value(s)
3710
+ // Default process is resolve
3711
+ ( special || deferred.resolveWith )( that, args );
3712
+ }
3713
+ },
3714
+
3715
+ // Only normal processors (resolve) catch and reject exceptions
3716
+ process = special ?
3717
+ mightThrow :
3718
+ function() {
3719
+ try {
3720
+ mightThrow();
3721
+ } catch ( e ) {
3722
+
3723
+ if ( jQuery.Deferred.exceptionHook ) {
3724
+ jQuery.Deferred.exceptionHook( e,
3725
+ process.stackTrace );
3726
+ }
3727
+
3728
+ // Support: Promises/A+ section 2.3.3.3.4.1
3729
+ // https://promisesaplus.com/#point-61
3730
+ // Ignore post-resolution exceptions
3731
+ if ( depth + 1 >= maxDepth ) {
3732
+
3733
+ // Only substitute handlers pass on context
3734
+ // and multiple values (non-spec behavior)
3735
+ if ( handler !== Thrower ) {
3736
+ that = undefined;
3737
+ args = [ e ];
3738
+ }
3739
+
3740
+ deferred.rejectWith( that, args );
3741
+ }
3742
+ }
3743
+ };
3744
+
3745
+ // Support: Promises/A+ section 2.3.3.3.1
3746
+ // https://promisesaplus.com/#point-57
3747
+ // Re-resolve promises immediately to dodge false rejection from
3748
+ // subsequent errors
3749
+ if ( depth ) {
3750
+ process();
3751
+ } else {
3752
+
3753
+ // Call an optional hook to record the stack, in case of exception
3754
+ // since it's otherwise lost when execution goes async
3755
+ if ( jQuery.Deferred.getStackHook ) {
3756
+ process.stackTrace = jQuery.Deferred.getStackHook();
3757
+ }
3758
+ window.setTimeout( process );
3759
+ }
3760
+ };
3761
+ }
3762
+
3763
+ return jQuery.Deferred( function( newDefer ) {
3764
+
3765
+ // progress_handlers.add( ... )
3766
+ tuples[ 0 ][ 3 ].add(
3767
+ resolve(
3768
+ 0,
3769
+ newDefer,
3770
+ jQuery.isFunction( onProgress ) ?
3771
+ onProgress :
3772
+ Identity,
3773
+ newDefer.notifyWith
3774
+ )
3775
+ );
3776
+
3777
+ // fulfilled_handlers.add( ... )
3778
+ tuples[ 1 ][ 3 ].add(
3779
+ resolve(
3780
+ 0,
3781
+ newDefer,
3782
+ jQuery.isFunction( onFulfilled ) ?
3783
+ onFulfilled :
3784
+ Identity
3785
+ )
3786
+ );
3787
+
3788
+ // rejected_handlers.add( ... )
3789
+ tuples[ 2 ][ 3 ].add(
3790
+ resolve(
3791
+ 0,
3792
+ newDefer,
3793
+ jQuery.isFunction( onRejected ) ?
3794
+ onRejected :
3795
+ Thrower
3796
+ )
3797
+ );
3798
+ } ).promise();
3799
+ },
3800
+
3801
+ // Get a promise for this deferred
3802
+ // If obj is provided, the promise aspect is added to the object
3803
+ promise: function( obj ) {
3804
+ return obj != null ? jQuery.extend( obj, promise ) : promise;
3805
+ }
3806
+ },
3807
+ deferred = {};
3808
+
3809
+ // Add list-specific methods
3810
+ jQuery.each( tuples, function( i, tuple ) {
3811
+ var list = tuple[ 2 ],
3812
+ stateString = tuple[ 5 ];
3813
+
3814
+ // promise.progress = list.add
3815
+ // promise.done = list.add
3816
+ // promise.fail = list.add
3817
+ promise[ tuple[ 1 ] ] = list.add;
3818
+
3819
+ // Handle state
3820
+ if ( stateString ) {
3821
+ list.add(
3822
+ function() {
3823
+
3824
+ // state = "resolved" (i.e., fulfilled)
3825
+ // state = "rejected"
3826
+ state = stateString;
3827
+ },
3828
+
3829
+ // rejected_callbacks.disable
3830
+ // fulfilled_callbacks.disable
3831
+ tuples[ 3 - i ][ 2 ].disable,
3832
+
3833
+ // progress_callbacks.lock
3834
+ tuples[ 0 ][ 2 ].lock
3835
+ );
3836
+ }
3837
+
3838
+ // progress_handlers.fire
3839
+ // fulfilled_handlers.fire
3840
+ // rejected_handlers.fire
3841
+ list.add( tuple[ 3 ].fire );
3842
+
3843
+ // deferred.notify = function() { deferred.notifyWith(...) }
3844
+ // deferred.resolve = function() { deferred.resolveWith(...) }
3845
+ // deferred.reject = function() { deferred.rejectWith(...) }
3846
+ deferred[ tuple[ 0 ] ] = function() {
3847
+ deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments );
3848
+ return this;
3849
+ };
3850
+
3851
+ // deferred.notifyWith = list.fireWith
3852
+ // deferred.resolveWith = list.fireWith
3853
+ // deferred.rejectWith = list.fireWith
3854
+ deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
3855
+ } );
3856
+
3857
+ // Make the deferred a promise
3858
+ promise.promise( deferred );
3859
+
3860
+ // Call given func if any
3861
+ if ( func ) {
3862
+ func.call( deferred, deferred );
3863
+ }
3864
+
3865
+ // All done!
3866
+ return deferred;
3867
+ },
3868
+
3869
+ // Deferred helper
3870
+ when: function( singleValue ) {
3871
+ var
3872
+
3873
+ // count of uncompleted subordinates
3874
+ remaining = arguments.length,
3875
+
3876
+ // count of unprocessed arguments
3877
+ i = remaining,
3878
+
3879
+ // subordinate fulfillment data
3880
+ resolveContexts = Array( i ),
3881
+ resolveValues = slice.call( arguments ),
3882
+
3883
+ // the master Deferred
3884
+ master = jQuery.Deferred(),
3885
+
3886
+ // subordinate callback factory
3887
+ updateFunc = function( i ) {
3888
+ return function( value ) {
3889
+ resolveContexts[ i ] = this;
3890
+ resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
3891
+ if ( !( --remaining ) ) {
3892
+ master.resolveWith( resolveContexts, resolveValues );
3893
+ }
3894
+ };
3895
+ };
3896
+
3897
+ // Single- and empty arguments are adopted like Promise.resolve
3898
+ if ( remaining <= 1 ) {
3899
+ adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,
3900
+ !remaining );
3901
+
3902
+ // Use .then() to unwrap secondary thenables (cf. gh-3000)
3903
+ if ( master.state() === "pending" ||
3904
+ jQuery.isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
3905
+
3906
+ return master.then();
3907
+ }
3908
+ }
3909
+
3910
+ // Multiple arguments are aggregated like Promise.all array elements
3911
+ while ( i-- ) {
3912
+ adoptValue( resolveValues[ i ], updateFunc( i ), master.reject );
3913
+ }
3914
+
3915
+ return master.promise();
3916
+ }
3917
+ } );
3918
+
3919
+
3920
+ // These usually indicate a programmer mistake during development,
3921
+ // warn about them ASAP rather than swallowing them by default.
3922
+ var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
3923
+
3924
+ jQuery.Deferred.exceptionHook = function( error, stack ) {
3925
+
3926
+ // Support: IE 8 - 9 only
3927
+ // Console exists when dev tools are open, which can happen at any time
3928
+ if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {
3929
+ window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack );
3930
+ }
3931
+ };
3932
+
3933
+
3934
+
3935
+
3936
+ jQuery.readyException = function( error ) {
3937
+ window.setTimeout( function() {
3938
+ throw error;
3939
+ } );
3940
+ };
3941
+
3942
+
3943
+
3944
+
3945
+ // The deferred used on DOM ready
3946
+ var readyList = jQuery.Deferred();
3947
+
3948
+ jQuery.fn.ready = function( fn ) {
3949
+
3950
+ readyList
3951
+ .then( fn )
3952
+
3953
+ // Wrap jQuery.readyException in a function so that the lookup
3954
+ // happens at the time of error handling instead of callback
3955
+ // registration.
3956
+ .catch( function( error ) {
3957
+ jQuery.readyException( error );
3958
+ } );
3959
+
3960
+ return this;
3961
+ };
3962
+
3963
+ jQuery.extend( {
3964
+
3965
+ // Is the DOM ready to be used? Set to true once it occurs.
3966
+ isReady: false,
3967
+
3968
+ // A counter to track how many items to wait for before
3969
+ // the ready event fires. See #6781
3970
+ readyWait: 1,
3971
+
3972
+ // Handle when the DOM is ready
3973
+ ready: function( wait ) {
3974
+
3975
+ // Abort if there are pending holds or we're already ready
3976
+ if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
3977
+ return;
3978
+ }
3979
+
3980
+ // Remember that the DOM is ready
3981
+ jQuery.isReady = true;
3982
+
3983
+ // If a normal DOM Ready event fired, decrement, and wait if need be
3984
+ if ( wait !== true && --jQuery.readyWait > 0 ) {
3985
+ return;
3986
+ }
3987
+
3988
+ // If there are functions bound, to execute
3989
+ readyList.resolveWith( document, [ jQuery ] );
3990
+ }
3991
+ } );
3992
+
3993
+ jQuery.ready.then = readyList.then;
3994
+
3995
+ // The ready event handler and self cleanup method
3996
+ function completed() {
3997
+ document.removeEventListener( "DOMContentLoaded", completed );
3998
+ window.removeEventListener( "load", completed );
3999
+ jQuery.ready();
4000
+ }
4001
+
4002
+ // Catch cases where $(document).ready() is called
4003
+ // after the browser event has already occurred.
4004
+ // Support: IE <=9 - 10 only
4005
+ // Older IE sometimes signals "interactive" too soon
4006
+ if ( document.readyState === "complete" ||
4007
+ ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
4008
+
4009
+ // Handle it asynchronously to allow scripts the opportunity to delay ready
4010
+ window.setTimeout( jQuery.ready );
4011
+
4012
+ } else {
4013
+
4014
+ // Use the handy event callback
4015
+ document.addEventListener( "DOMContentLoaded", completed );
4016
+
4017
+ // A fallback to window.onload, that will always work
4018
+ window.addEventListener( "load", completed );
4019
+ }
4020
+
4021
+
4022
+
4023
+
4024
+ // Multifunctional method to get and set values of a collection
4025
+ // The value/s can optionally be executed if it's a function
4026
+ var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
4027
+ var i = 0,
4028
+ len = elems.length,
4029
+ bulk = key == null;
4030
+
4031
+ // Sets many values
4032
+ if ( jQuery.type( key ) === "object" ) {
4033
+ chainable = true;
4034
+ for ( i in key ) {
4035
+ access( elems, fn, i, key[ i ], true, emptyGet, raw );
4036
+ }
4037
+
4038
+ // Sets one value
4039
+ } else if ( value !== undefined ) {
4040
+ chainable = true;
4041
+
4042
+ if ( !jQuery.isFunction( value ) ) {
4043
+ raw = true;
4044
+ }
4045
+
4046
+ if ( bulk ) {
4047
+
4048
+ // Bulk operations run against the entire set
4049
+ if ( raw ) {
4050
+ fn.call( elems, value );
4051
+ fn = null;
4052
+
4053
+ // ...except when executing function values
4054
+ } else {
4055
+ bulk = fn;
4056
+ fn = function( elem, key, value ) {
4057
+ return bulk.call( jQuery( elem ), value );
4058
+ };
4059
+ }
4060
+ }
4061
+
4062
+ if ( fn ) {
4063
+ for ( ; i < len; i++ ) {
4064
+ fn(
4065
+ elems[ i ], key, raw ?
4066
+ value :
4067
+ value.call( elems[ i ], i, fn( elems[ i ], key ) )
4068
+ );
4069
+ }
4070
+ }
4071
+ }
4072
+
4073
+ if ( chainable ) {
4074
+ return elems;
4075
+ }
4076
+
4077
+ // Gets
4078
+ if ( bulk ) {
4079
+ return fn.call( elems );
4080
+ }
4081
+
4082
+ return len ? fn( elems[ 0 ], key ) : emptyGet;
4083
+ };
4084
+ var acceptData = function( owner ) {
4085
+
4086
+ // Accepts only:
4087
+ // - Node
4088
+ // - Node.ELEMENT_NODE
4089
+ // - Node.DOCUMENT_NODE
4090
+ // - Object
4091
+ // - Any
4092
+ return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
4093
+ };
4094
+
4095
+
4096
+
4097
+
4098
+ function Data() {
4099
+ this.expando = jQuery.expando + Data.uid++;
4100
+ }
4101
+
4102
+ Data.uid = 1;
4103
+
4104
+ Data.prototype = {
4105
+
4106
+ cache: function( owner ) {
4107
+
4108
+ // Check if the owner object already has a cache
4109
+ var value = owner[ this.expando ];
4110
+
4111
+ // If not, create one
4112
+ if ( !value ) {
4113
+ value = {};
4114
+
4115
+ // We can accept data for non-element nodes in modern browsers,
4116
+ // but we should not, see #8335.
4117
+ // Always return an empty object.
4118
+ if ( acceptData( owner ) ) {
4119
+
4120
+ // If it is a node unlikely to be stringify-ed or looped over
4121
+ // use plain assignment
4122
+ if ( owner.nodeType ) {
4123
+ owner[ this.expando ] = value;
4124
+
4125
+ // Otherwise secure it in a non-enumerable property
4126
+ // configurable must be true to allow the property to be
4127
+ // deleted when data is removed
4128
+ } else {
4129
+ Object.defineProperty( owner, this.expando, {
4130
+ value: value,
4131
+ configurable: true
4132
+ } );
4133
+ }
4134
+ }
4135
+ }
4136
+
4137
+ return value;
4138
+ },
4139
+ set: function( owner, data, value ) {
4140
+ var prop,
4141
+ cache = this.cache( owner );
4142
+
4143
+ // Handle: [ owner, key, value ] args
4144
+ // Always use camelCase key (gh-2257)
4145
+ if ( typeof data === "string" ) {
4146
+ cache[ jQuery.camelCase( data ) ] = value;
4147
+
4148
+ // Handle: [ owner, { properties } ] args
4149
+ } else {
4150
+
4151
+ // Copy the properties one-by-one to the cache object
4152
+ for ( prop in data ) {
4153
+ cache[ jQuery.camelCase( prop ) ] = data[ prop ];
4154
+ }
4155
+ }
4156
+ return cache;
4157
+ },
4158
+ get: function( owner, key ) {
4159
+ return key === undefined ?
4160
+ this.cache( owner ) :
4161
+
4162
+ // Always use camelCase key (gh-2257)
4163
+ owner[ this.expando ] && owner[ this.expando ][ jQuery.camelCase( key ) ];
4164
+ },
4165
+ access: function( owner, key, value ) {
4166
+
4167
+ // In cases where either:
4168
+ //
4169
+ // 1. No key was specified
4170
+ // 2. A string key was specified, but no value provided
4171
+ //
4172
+ // Take the "read" path and allow the get method to determine
4173
+ // which value to return, respectively either:
4174
+ //
4175
+ // 1. The entire cache object
4176
+ // 2. The data stored at the key
4177
+ //
4178
+ if ( key === undefined ||
4179
+ ( ( key && typeof key === "string" ) && value === undefined ) ) {
4180
+
4181
+ return this.get( owner, key );
4182
+ }
4183
+
4184
+ // When the key is not a string, or both a key and value
4185
+ // are specified, set or extend (existing objects) with either:
4186
+ //
4187
+ // 1. An object of properties
4188
+ // 2. A key and value
4189
+ //
4190
+ this.set( owner, key, value );
4191
+
4192
+ // Since the "set" path can have two possible entry points
4193
+ // return the expected data based on which path was taken[*]
4194
+ return value !== undefined ? value : key;
4195
+ },
4196
+ remove: function( owner, key ) {
4197
+ var i,
4198
+ cache = owner[ this.expando ];
4199
+
4200
+ if ( cache === undefined ) {
4201
+ return;
4202
+ }
4203
+
4204
+ if ( key !== undefined ) {
4205
+
4206
+ // Support array or space separated string of keys
4207
+ if ( Array.isArray( key ) ) {
4208
+
4209
+ // If key is an array of keys...
4210
+ // We always set camelCase keys, so remove that.
4211
+ key = key.map( jQuery.camelCase );
4212
+ } else {
4213
+ key = jQuery.camelCase( key );
4214
+
4215
+ // If a key with the spaces exists, use it.
4216
+ // Otherwise, create an array by matching non-whitespace
4217
+ key = key in cache ?
4218
+ [ key ] :
4219
+ ( key.match( rnothtmlwhite ) || [] );
4220
+ }
4221
+
4222
+ i = key.length;
4223
+
4224
+ while ( i-- ) {
4225
+ delete cache[ key[ i ] ];
4226
+ }
4227
+ }
4228
+
4229
+ // Remove the expando if there's no more data
4230
+ if ( key === undefined || jQuery.isEmptyObject( cache ) ) {
4231
+
4232
+ // Support: Chrome <=35 - 45
4233
+ // Webkit & Blink performance suffers when deleting properties
4234
+ // from DOM nodes, so set to undefined instead
4235
+ // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)
4236
+ if ( owner.nodeType ) {
4237
+ owner[ this.expando ] = undefined;
4238
+ } else {
4239
+ delete owner[ this.expando ];
4240
+ }
4241
+ }
4242
+ },
4243
+ hasData: function( owner ) {
4244
+ var cache = owner[ this.expando ];
4245
+ return cache !== undefined && !jQuery.isEmptyObject( cache );
4246
+ }
4247
+ };
4248
+ var dataPriv = new Data();
4249
+
4250
+ var dataUser = new Data();
4251
+
4252
+
4253
+
4254
+ // Implementation Summary
4255
+ //
4256
+ // 1. Enforce API surface and semantic compatibility with 1.9.x branch
4257
+ // 2. Improve the module's maintainability by reducing the storage
4258
+ // paths to a single mechanism.
4259
+ // 3. Use the same single mechanism to support "private" and "user" data.
4260
+ // 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
4261
+ // 5. Avoid exposing implementation details on user objects (eg. expando properties)
4262
+ // 6. Provide a clear path for implementation upgrade to WeakMap in 2014
4263
+
4264
+ var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
4265
+ rmultiDash = /[A-Z]/g;
4266
+
4267
+ function getData( data ) {
4268
+ if ( data === "true" ) {
4269
+ return true;
4270
+ }
4271
+
4272
+ if ( data === "false" ) {
4273
+ return false;
4274
+ }
4275
+
4276
+ if ( data === "null" ) {
4277
+ return null;
4278
+ }
4279
+
4280
+ // Only convert to a number if it doesn't change the string
4281
+ if ( data === +data + "" ) {
4282
+ return +data;
4283
+ }
4284
+
4285
+ if ( rbrace.test( data ) ) {
4286
+ return JSON.parse( data );
4287
+ }
4288
+
4289
+ return data;
4290
+ }
4291
+
4292
+ function dataAttr( elem, key, data ) {
4293
+ var name;
4294
+
4295
+ // If nothing was found internally, try to fetch any
4296
+ // data from the HTML5 data-* attribute
4297
+ if ( data === undefined && elem.nodeType === 1 ) {
4298
+ name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase();
4299
+ data = elem.getAttribute( name );
4300
+
4301
+ if ( typeof data === "string" ) {
4302
+ try {
4303
+ data = getData( data );
4304
+ } catch ( e ) {}
4305
+
4306
+ // Make sure we set the data so it isn't changed later
4307
+ dataUser.set( elem, key, data );
4308
+ } else {
4309
+ data = undefined;
4310
+ }
4311
+ }
4312
+ return data;
4313
+ }
4314
+
4315
+ jQuery.extend( {
4316
+ hasData: function( elem ) {
4317
+ return dataUser.hasData( elem ) || dataPriv.hasData( elem );
4318
+ },
4319
+
4320
+ data: function( elem, name, data ) {
4321
+ return dataUser.access( elem, name, data );
4322
+ },
4323
+
4324
+ removeData: function( elem, name ) {
4325
+ dataUser.remove( elem, name );
4326
+ },
4327
+
4328
+ // TODO: Now that all calls to _data and _removeData have been replaced
4329
+ // with direct calls to dataPriv methods, these can be deprecated.
4330
+ _data: function( elem, name, data ) {
4331
+ return dataPriv.access( elem, name, data );
4332
+ },
4333
+
4334
+ _removeData: function( elem, name ) {
4335
+ dataPriv.remove( elem, name );
4336
+ }
4337
+ } );
4338
+
4339
+ jQuery.fn.extend( {
4340
+ data: function( key, value ) {
4341
+ var i, name, data,
4342
+ elem = this[ 0 ],
4343
+ attrs = elem && elem.attributes;
4344
+
4345
+ // Gets all values
4346
+ if ( key === undefined ) {
4347
+ if ( this.length ) {
4348
+ data = dataUser.get( elem );
4349
+
4350
+ if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) {
4351
+ i = attrs.length;
4352
+ while ( i-- ) {
4353
+
4354
+ // Support: IE 11 only
4355
+ // The attrs elements can be null (#14894)
4356
+ if ( attrs[ i ] ) {
4357
+ name = attrs[ i ].name;
4358
+ if ( name.indexOf( "data-" ) === 0 ) {
4359
+ name = jQuery.camelCase( name.slice( 5 ) );
4360
+ dataAttr( elem, name, data[ name ] );
4361
+ }
4362
+ }
4363
+ }
4364
+ dataPriv.set( elem, "hasDataAttrs", true );
4365
+ }
4366
+ }
4367
+
4368
+ return data;
4369
+ }
4370
+
4371
+ // Sets multiple values
4372
+ if ( typeof key === "object" ) {
4373
+ return this.each( function() {
4374
+ dataUser.set( this, key );
4375
+ } );
4376
+ }
4377
+
4378
+ return access( this, function( value ) {
4379
+ var data;
4380
+
4381
+ // The calling jQuery object (element matches) is not empty
4382
+ // (and therefore has an element appears at this[ 0 ]) and the
4383
+ // `value` parameter was not undefined. An empty jQuery object
4384
+ // will result in `undefined` for elem = this[ 0 ] which will
4385
+ // throw an exception if an attempt to read a data cache is made.
4386
+ if ( elem && value === undefined ) {
4387
+
4388
+ // Attempt to get data from the cache
4389
+ // The key will always be camelCased in Data
4390
+ data = dataUser.get( elem, key );
4391
+ if ( data !== undefined ) {
4392
+ return data;
4393
+ }
4394
+
4395
+ // Attempt to "discover" the data in
4396
+ // HTML5 custom data-* attrs
4397
+ data = dataAttr( elem, key );
4398
+ if ( data !== undefined ) {
4399
+ return data;
4400
+ }
4401
+
4402
+ // We tried really hard, but the data doesn't exist.
4403
+ return;
4404
+ }
4405
+
4406
+ // Set the data...
4407
+ this.each( function() {
4408
+
4409
+ // We always store the camelCased key
4410
+ dataUser.set( this, key, value );
4411
+ } );
4412
+ }, null, value, arguments.length > 1, null, true );
4413
+ },
4414
+
4415
+ removeData: function( key ) {
4416
+ return this.each( function() {
4417
+ dataUser.remove( this, key );
4418
+ } );
4419
+ }
4420
+ } );
4421
+
4422
+
4423
+ jQuery.extend( {
4424
+ queue: function( elem, type, data ) {
4425
+ var queue;
4426
+
4427
+ if ( elem ) {
4428
+ type = ( type || "fx" ) + "queue";
4429
+ queue = dataPriv.get( elem, type );
4430
+
4431
+ // Speed up dequeue by getting out quickly if this is just a lookup
4432
+ if ( data ) {
4433
+ if ( !queue || Array.isArray( data ) ) {
4434
+ queue = dataPriv.access( elem, type, jQuery.makeArray( data ) );
4435
+ } else {
4436
+ queue.push( data );
4437
+ }
4438
+ }
4439
+ return queue || [];
4440
+ }
4441
+ },
4442
+
4443
+ dequeue: function( elem, type ) {
4444
+ type = type || "fx";
4445
+
4446
+ var queue = jQuery.queue( elem, type ),
4447
+ startLength = queue.length,
4448
+ fn = queue.shift(),
4449
+ hooks = jQuery._queueHooks( elem, type ),
4450
+ next = function() {
4451
+ jQuery.dequeue( elem, type );
4452
+ };
4453
+
4454
+ // If the fx queue is dequeued, always remove the progress sentinel
4455
+ if ( fn === "inprogress" ) {
4456
+ fn = queue.shift();
4457
+ startLength--;
4458
+ }
4459
+
4460
+ if ( fn ) {
4461
+
4462
+ // Add a progress sentinel to prevent the fx queue from being
4463
+ // automatically dequeued
4464
+ if ( type === "fx" ) {
4465
+ queue.unshift( "inprogress" );
4466
+ }
4467
+
4468
+ // Clear up the last queue stop function
4469
+ delete hooks.stop;
4470
+ fn.call( elem, next, hooks );
4471
+ }
4472
+
4473
+ if ( !startLength && hooks ) {
4474
+ hooks.empty.fire();
4475
+ }
4476
+ },
4477
+
4478
+ // Not public - generate a queueHooks object, or return the current one
4479
+ _queueHooks: function( elem, type ) {
4480
+ var key = type + "queueHooks";
4481
+ return dataPriv.get( elem, key ) || dataPriv.access( elem, key, {
4482
+ empty: jQuery.Callbacks( "once memory" ).add( function() {
4483
+ dataPriv.remove( elem, [ type + "queue", key ] );
4484
+ } )
4485
+ } );
4486
+ }
4487
+ } );
4488
+
4489
+ jQuery.fn.extend( {
4490
+ queue: function( type, data ) {
4491
+ var setter = 2;
4492
+
4493
+ if ( typeof type !== "string" ) {
4494
+ data = type;
4495
+ type = "fx";
4496
+ setter--;
4497
+ }
4498
+
4499
+ if ( arguments.length < setter ) {
4500
+ return jQuery.queue( this[ 0 ], type );
4501
+ }
4502
+
4503
+ return data === undefined ?
4504
+ this :
4505
+ this.each( function() {
4506
+ var queue = jQuery.queue( this, type, data );
4507
+
4508
+ // Ensure a hooks for this queue
4509
+ jQuery._queueHooks( this, type );
4510
+
4511
+ if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
4512
+ jQuery.dequeue( this, type );
4513
+ }
4514
+ } );
4515
+ },
4516
+ dequeue: function( type ) {
4517
+ return this.each( function() {
4518
+ jQuery.dequeue( this, type );
4519
+ } );
4520
+ },
4521
+ clearQueue: function( type ) {
4522
+ return this.queue( type || "fx", [] );
4523
+ },
4524
+
4525
+ // Get a promise resolved when queues of a certain type
4526
+ // are emptied (fx is the type by default)
4527
+ promise: function( type, obj ) {
4528
+ var tmp,
4529
+ count = 1,
4530
+ defer = jQuery.Deferred(),
4531
+ elements = this,
4532
+ i = this.length,
4533
+ resolve = function() {
4534
+ if ( !( --count ) ) {
4535
+ defer.resolveWith( elements, [ elements ] );
4536
+ }
4537
+ };
4538
+
4539
+ if ( typeof type !== "string" ) {
4540
+ obj = type;
4541
+ type = undefined;
4542
+ }
4543
+ type = type || "fx";
4544
+
4545
+ while ( i-- ) {
4546
+ tmp = dataPriv.get( elements[ i ], type + "queueHooks" );
4547
+ if ( tmp && tmp.empty ) {
4548
+ count++;
4549
+ tmp.empty.add( resolve );
4550
+ }
4551
+ }
4552
+ resolve();
4553
+ return defer.promise( obj );
4554
+ }
4555
+ } );
4556
+ var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
4557
+
4558
+ var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
4559
+
4560
+
4561
+ var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
4562
+
4563
+ var isHiddenWithinTree = function( elem, el ) {
4564
+
4565
+ // isHiddenWithinTree might be called from jQuery#filter function;
4566
+ // in that case, element will be second argument
4567
+ elem = el || elem;
4568
+
4569
+ // Inline style trumps all
4570
+ return elem.style.display === "none" ||
4571
+ elem.style.display === "" &&
4572
+
4573
+ // Otherwise, check computed style
4574
+ // Support: Firefox <=43 - 45
4575
+ // Disconnected elements can have computed display: none, so first confirm that elem is
4576
+ // in the document.
4577
+ jQuery.contains( elem.ownerDocument, elem ) &&
4578
+
4579
+ jQuery.css( elem, "display" ) === "none";
4580
+ };
4581
+
4582
+ var swap = function( elem, options, callback, args ) {
4583
+ var ret, name,
4584
+ old = {};
4585
+
4586
+ // Remember the old values, and insert the new ones
4587
+ for ( name in options ) {
4588
+ old[ name ] = elem.style[ name ];
4589
+ elem.style[ name ] = options[ name ];
4590
+ }
4591
+
4592
+ ret = callback.apply( elem, args || [] );
4593
+
4594
+ // Revert the old values
4595
+ for ( name in options ) {
4596
+ elem.style[ name ] = old[ name ];
4597
+ }
4598
+
4599
+ return ret;
4600
+ };
4601
+
4602
+
4603
+
4604
+
4605
+ function adjustCSS( elem, prop, valueParts, tween ) {
4606
+ var adjusted,
4607
+ scale = 1,
4608
+ maxIterations = 20,
4609
+ currentValue = tween ?
4610
+ function() {
4611
+ return tween.cur();
4612
+ } :
4613
+ function() {
4614
+ return jQuery.css( elem, prop, "" );
4615
+ },
4616
+ initial = currentValue(),
4617
+ unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
4618
+
4619
+ // Starting value computation is required for potential unit mismatches
4620
+ initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
4621
+ rcssNum.exec( jQuery.css( elem, prop ) );
4622
+
4623
+ if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
4624
+
4625
+ // Trust units reported by jQuery.css
4626
+ unit = unit || initialInUnit[ 3 ];
4627
+
4628
+ // Make sure we update the tween properties later on
4629
+ valueParts = valueParts || [];
4630
+
4631
+ // Iteratively approximate from a nonzero starting point
4632
+ initialInUnit = +initial || 1;
4633
+
4634
+ do {
4635
+
4636
+ // If previous iteration zeroed out, double until we get *something*.
4637
+ // Use string for doubling so we don't accidentally see scale as unchanged below
4638
+ scale = scale || ".5";
4639
+
4640
+ // Adjust and apply
4641
+ initialInUnit = initialInUnit / scale;
4642
+ jQuery.style( elem, prop, initialInUnit + unit );
4643
+
4644
+ // Update scale, tolerating zero or NaN from tween.cur()
4645
+ // Break the loop if scale is unchanged or perfect, or if we've just had enough.
4646
+ } while (
4647
+ scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations
4648
+ );
4649
+ }
4650
+
4651
+ if ( valueParts ) {
4652
+ initialInUnit = +initialInUnit || +initial || 0;
4653
+
4654
+ // Apply relative offset (+=/-=) if specified
4655
+ adjusted = valueParts[ 1 ] ?
4656
+ initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
4657
+ +valueParts[ 2 ];
4658
+ if ( tween ) {
4659
+ tween.unit = unit;
4660
+ tween.start = initialInUnit;
4661
+ tween.end = adjusted;
4662
+ }
4663
+ }
4664
+ return adjusted;
4665
+ }
4666
+
4667
+
4668
+ var defaultDisplayMap = {};
4669
+
4670
+ function getDefaultDisplay( elem ) {
4671
+ var temp,
4672
+ doc = elem.ownerDocument,
4673
+ nodeName = elem.nodeName,
4674
+ display = defaultDisplayMap[ nodeName ];
4675
+
4676
+ if ( display ) {
4677
+ return display;
4678
+ }
4679
+
4680
+ temp = doc.body.appendChild( doc.createElement( nodeName ) );
4681
+ display = jQuery.css( temp, "display" );
4682
+
4683
+ temp.parentNode.removeChild( temp );
4684
+
4685
+ if ( display === "none" ) {
4686
+ display = "block";
4687
+ }
4688
+ defaultDisplayMap[ nodeName ] = display;
4689
+
4690
+ return display;
4691
+ }
4692
+
4693
+ function showHide( elements, show ) {
4694
+ var display, elem,
4695
+ values = [],
4696
+ index = 0,
4697
+ length = elements.length;
4698
+
4699
+ // Determine new display value for elements that need to change
4700
+ for ( ; index < length; index++ ) {
4701
+ elem = elements[ index ];
4702
+ if ( !elem.style ) {
4703
+ continue;
4704
+ }
4705
+
4706
+ display = elem.style.display;
4707
+ if ( show ) {
4708
+
4709
+ // Since we force visibility upon cascade-hidden elements, an immediate (and slow)
4710
+ // check is required in this first loop unless we have a nonempty display value (either
4711
+ // inline or about-to-be-restored)
4712
+ if ( display === "none" ) {
4713
+ values[ index ] = dataPriv.get( elem, "display" ) || null;
4714
+ if ( !values[ index ] ) {
4715
+ elem.style.display = "";
4716
+ }
4717
+ }
4718
+ if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) {
4719
+ values[ index ] = getDefaultDisplay( elem );
4720
+ }
4721
+ } else {
4722
+ if ( display !== "none" ) {
4723
+ values[ index ] = "none";
4724
+
4725
+ // Remember what we're overwriting
4726
+ dataPriv.set( elem, "display", display );
4727
+ }
4728
+ }
4729
+ }
4730
+
4731
+ // Set the display of the elements in a second loop to avoid constant reflow
4732
+ for ( index = 0; index < length; index++ ) {
4733
+ if ( values[ index ] != null ) {
4734
+ elements[ index ].style.display = values[ index ];
4735
+ }
4736
+ }
4737
+
4738
+ return elements;
4739
+ }
4740
+
4741
+ jQuery.fn.extend( {
4742
+ show: function() {
4743
+ return showHide( this, true );
4744
+ },
4745
+ hide: function() {
4746
+ return showHide( this );
4747
+ },
4748
+ toggle: function( state ) {
4749
+ if ( typeof state === "boolean" ) {
4750
+ return state ? this.show() : this.hide();
4751
+ }
4752
+
4753
+ return this.each( function() {
4754
+ if ( isHiddenWithinTree( this ) ) {
4755
+ jQuery( this ).show();
4756
+ } else {
4757
+ jQuery( this ).hide();
4758
+ }
4759
+ } );
4760
+ }
4761
+ } );
4762
+ var rcheckableType = ( /^(?:checkbox|radio)$/i );
4763
+
4764
+ var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i );
4765
+
4766
+ var rscriptType = ( /^$|\/(?:java|ecma)script/i );
4767
+
4768
+
4769
+
4770
+ // We have to close these tags to support XHTML (#13200)
4771
+ var wrapMap = {
4772
+
4773
+ // Support: IE <=9 only
4774
+ option: [ 1, "<select multiple='multiple'>", "</select>" ],
4775
+
4776
+ // XHTML parsers do not magically insert elements in the
4777
+ // same way that tag soup parsers do. So we cannot shorten
4778
+ // this by omitting <tbody> or other required elements.
4779
+ thead: [ 1, "<table>", "</table>" ],
4780
+ col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
4781
+ tr: [ 2, "<table><tbody>", "</tbody></table>" ],
4782
+ td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
4783
+
4784
+ _default: [ 0, "", "" ]
4785
+ };
4786
+
4787
+ // Support: IE <=9 only
4788
+ wrapMap.optgroup = wrapMap.option;
4789
+
4790
+ wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
4791
+ wrapMap.th = wrapMap.td;
4792
+
4793
+
4794
+ function getAll( context, tag ) {
4795
+
4796
+ // Support: IE <=9 - 11 only
4797
+ // Use typeof to avoid zero-argument method invocation on host objects (#15151)
4798
+ var ret;
4799
+
4800
+ if ( typeof context.getElementsByTagName !== "undefined" ) {
4801
+ ret = context.getElementsByTagName( tag || "*" );
4802
+
4803
+ } else if ( typeof context.querySelectorAll !== "undefined" ) {
4804
+ ret = context.querySelectorAll( tag || "*" );
4805
+
4806
+ } else {
4807
+ ret = [];
4808
+ }
4809
+
4810
+ if ( tag === undefined || tag && nodeName( context, tag ) ) {
4811
+ return jQuery.merge( [ context ], ret );
4812
+ }
4813
+
4814
+ return ret;
4815
+ }
4816
+
4817
+
4818
+ // Mark scripts as having already been evaluated
4819
+ function setGlobalEval( elems, refElements ) {
4820
+ var i = 0,
4821
+ l = elems.length;
4822
+
4823
+ for ( ; i < l; i++ ) {
4824
+ dataPriv.set(
4825
+ elems[ i ],
4826
+ "globalEval",
4827
+ !refElements || dataPriv.get( refElements[ i ], "globalEval" )
4828
+ );
4829
+ }
4830
+ }
4831
+
4832
+
4833
+ var rhtml = /<|&#?\w+;/;
4834
+
4835
+ function buildFragment( elems, context, scripts, selection, ignored ) {
4836
+ var elem, tmp, tag, wrap, contains, j,
4837
+ fragment = context.createDocumentFragment(),
4838
+ nodes = [],
4839
+ i = 0,
4840
+ l = elems.length;
4841
+
4842
+ for ( ; i < l; i++ ) {
4843
+ elem = elems[ i ];
4844
+
4845
+ if ( elem || elem === 0 ) {
4846
+
4847
+ // Add nodes directly
4848
+ if ( jQuery.type( elem ) === "object" ) {
4849
+
4850
+ // Support: Android <=4.0 only, PhantomJS 1 only
4851
+ // push.apply(_, arraylike) throws on ancient WebKit
4852
+ jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
4853
+
4854
+ // Convert non-html into a text node
4855
+ } else if ( !rhtml.test( elem ) ) {
4856
+ nodes.push( context.createTextNode( elem ) );
4857
+
4858
+ // Convert html into DOM nodes
4859
+ } else {
4860
+ tmp = tmp || fragment.appendChild( context.createElement( "div" ) );
4861
+
4862
+ // Deserialize a standard representation
4863
+ tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
4864
+ wrap = wrapMap[ tag ] || wrapMap._default;
4865
+ tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];
4866
+
4867
+ // Descend through wrappers to the right content
4868
+ j = wrap[ 0 ];
4869
+ while ( j-- ) {
4870
+ tmp = tmp.lastChild;
4871
+ }
4872
+
4873
+ // Support: Android <=4.0 only, PhantomJS 1 only
4874
+ // push.apply(_, arraylike) throws on ancient WebKit
4875
+ jQuery.merge( nodes, tmp.childNodes );
4876
+
4877
+ // Remember the top-level container
4878
+ tmp = fragment.firstChild;
4879
+
4880
+ // Ensure the created nodes are orphaned (#12392)
4881
+ tmp.textContent = "";
4882
+ }
4883
+ }
4884
+ }
4885
+
4886
+ // Remove wrapper from fragment
4887
+ fragment.textContent = "";
4888
+
4889
+ i = 0;
4890
+ while ( ( elem = nodes[ i++ ] ) ) {
4891
+
4892
+ // Skip elements already in the context collection (trac-4087)
4893
+ if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
4894
+ if ( ignored ) {
4895
+ ignored.push( elem );
4896
+ }
4897
+ continue;
4898
+ }
4899
+
4900
+ contains = jQuery.contains( elem.ownerDocument, elem );
4901
+
4902
+ // Append to fragment
4903
+ tmp = getAll( fragment.appendChild( elem ), "script" );
4904
+
4905
+ // Preserve script evaluation history
4906
+ if ( contains ) {
4907
+ setGlobalEval( tmp );
4908
+ }
4909
+
4910
+ // Capture executables
4911
+ if ( scripts ) {
4912
+ j = 0;
4913
+ while ( ( elem = tmp[ j++ ] ) ) {
4914
+ if ( rscriptType.test( elem.type || "" ) ) {
4915
+ scripts.push( elem );
4916
+ }
4917
+ }
4918
+ }
4919
+ }
4920
+
4921
+ return fragment;
4922
+ }
4923
+
4924
+
4925
+ ( function() {
4926
+ var fragment = document.createDocumentFragment(),
4927
+ div = fragment.appendChild( document.createElement( "div" ) ),
4928
+ input = document.createElement( "input" );
4929
+
4930
+ // Support: Android 4.0 - 4.3 only
4931
+ // Check state lost if the name is set (#11217)
4932
+ // Support: Windows Web Apps (WWA)
4933
+ // `name` and `type` must use .setAttribute for WWA (#14901)
4934
+ input.setAttribute( "type", "radio" );
4935
+ input.setAttribute( "checked", "checked" );
4936
+ input.setAttribute( "name", "t" );
4937
+
4938
+ div.appendChild( input );
4939
+
4940
+ // Support: Android <=4.1 only
4941
+ // Older WebKit doesn't clone checked state correctly in fragments
4942
+ support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
4943
+
4944
+ // Support: IE <=11 only
4945
+ // Make sure textarea (and checkbox) defaultValue is properly cloned
4946
+ div.innerHTML = "<textarea>x</textarea>";
4947
+ support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
4948
+ } )();
4949
+ var documentElement = document.documentElement;
4950
+
4951
+
4952
+
4953
+ var
4954
+ rkeyEvent = /^key/,
4955
+ rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
4956
+ rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
4957
+
4958
+ function returnTrue() {
4959
+ return true;
4960
+ }
4961
+
4962
+ function returnFalse() {
4963
+ return false;
4964
+ }
4965
+
4966
+ // Support: IE <=9 only
4967
+ // See #13393 for more info
4968
+ function safeActiveElement() {
4969
+ try {
4970
+ return document.activeElement;
4971
+ } catch ( err ) { }
4972
+ }
4973
+
4974
+ function on( elem, types, selector, data, fn, one ) {
4975
+ var origFn, type;
4976
+
4977
+ // Types can be a map of types/handlers
4978
+ if ( typeof types === "object" ) {
4979
+
4980
+ // ( types-Object, selector, data )
4981
+ if ( typeof selector !== "string" ) {
4982
+
4983
+ // ( types-Object, data )
4984
+ data = data || selector;
4985
+ selector = undefined;
4986
+ }
4987
+ for ( type in types ) {
4988
+ on( elem, type, selector, data, types[ type ], one );
4989
+ }
4990
+ return elem;
4991
+ }
4992
+
4993
+ if ( data == null && fn == null ) {
4994
+
4995
+ // ( types, fn )
4996
+ fn = selector;
4997
+ data = selector = undefined;
4998
+ } else if ( fn == null ) {
4999
+ if ( typeof selector === "string" ) {
5000
+
5001
+ // ( types, selector, fn )
5002
+ fn = data;
5003
+ data = undefined;
5004
+ } else {
5005
+
5006
+ // ( types, data, fn )
5007
+ fn = data;
5008
+ data = selector;
5009
+ selector = undefined;
5010
+ }
5011
+ }
5012
+ if ( fn === false ) {
5013
+ fn = returnFalse;
5014
+ } else if ( !fn ) {
5015
+ return elem;
5016
+ }
5017
+
5018
+ if ( one === 1 ) {
5019
+ origFn = fn;
5020
+ fn = function( event ) {
5021
+
5022
+ // Can use an empty set, since event contains the info
5023
+ jQuery().off( event );
5024
+ return origFn.apply( this, arguments );
5025
+ };
5026
+
5027
+ // Use same guid so caller can remove using origFn
5028
+ fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
5029
+ }
5030
+ return elem.each( function() {
5031
+ jQuery.event.add( this, types, fn, data, selector );
5032
+ } );
5033
+ }
5034
+
5035
+ /*
5036
+ * Helper functions for managing events -- not part of the public interface.
5037
+ * Props to Dean Edwards' addEvent library for many of the ideas.
5038
+ */
5039
+ jQuery.event = {
5040
+
5041
+ global: {},
5042
+
5043
+ add: function( elem, types, handler, data, selector ) {
5044
+
5045
+ var handleObjIn, eventHandle, tmp,
5046
+ events, t, handleObj,
5047
+ special, handlers, type, namespaces, origType,
5048
+ elemData = dataPriv.get( elem );
5049
+
5050
+ // Don't attach events to noData or text/comment nodes (but allow plain objects)
5051
+ if ( !elemData ) {
5052
+ return;
5053
+ }
5054
+
5055
+ // Caller can pass in an object of custom data in lieu of the handler
5056
+ if ( handler.handler ) {
5057
+ handleObjIn = handler;
5058
+ handler = handleObjIn.handler;
5059
+ selector = handleObjIn.selector;
5060
+ }
5061
+
5062
+ // Ensure that invalid selectors throw exceptions at attach time
5063
+ // Evaluate against documentElement in case elem is a non-element node (e.g., document)
5064
+ if ( selector ) {
5065
+ jQuery.find.matchesSelector( documentElement, selector );
5066
+ }
5067
+
5068
+ // Make sure that the handler has a unique ID, used to find/remove it later
5069
+ if ( !handler.guid ) {
5070
+ handler.guid = jQuery.guid++;
5071
+ }
5072
+
5073
+ // Init the element's event structure and main handler, if this is the first
5074
+ if ( !( events = elemData.events ) ) {
5075
+ events = elemData.events = {};
5076
+ }
5077
+ if ( !( eventHandle = elemData.handle ) ) {
5078
+ eventHandle = elemData.handle = function( e ) {
5079
+
5080
+ // Discard the second event of a jQuery.event.trigger() and
5081
+ // when an event is called after a page has unloaded
5082
+ return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
5083
+ jQuery.event.dispatch.apply( elem, arguments ) : undefined;
5084
+ };
5085
+ }
5086
+
5087
+ // Handle multiple events separated by a space
5088
+ types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
5089
+ t = types.length;
5090
+ while ( t-- ) {
5091
+ tmp = rtypenamespace.exec( types[ t ] ) || [];
5092
+ type = origType = tmp[ 1 ];
5093
+ namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
5094
+
5095
+ // There *must* be a type, no attaching namespace-only handlers
5096
+ if ( !type ) {
5097
+ continue;
5098
+ }
5099
+
5100
+ // If event changes its type, use the special event handlers for the changed type
5101
+ special = jQuery.event.special[ type ] || {};
5102
+
5103
+ // If selector defined, determine special event api type, otherwise given type
5104
+ type = ( selector ? special.delegateType : special.bindType ) || type;
5105
+
5106
+ // Update special based on newly reset type
5107
+ special = jQuery.event.special[ type ] || {};
5108
+
5109
+ // handleObj is passed to all event handlers
5110
+ handleObj = jQuery.extend( {
5111
+ type: type,
5112
+ origType: origType,
5113
+ data: data,
5114
+ handler: handler,
5115
+ guid: handler.guid,
5116
+ selector: selector,
5117
+ needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
5118
+ namespace: namespaces.join( "." )
5119
+ }, handleObjIn );
5120
+
5121
+ // Init the event handler queue if we're the first
5122
+ if ( !( handlers = events[ type ] ) ) {
5123
+ handlers = events[ type ] = [];
5124
+ handlers.delegateCount = 0;
5125
+
5126
+ // Only use addEventListener if the special events handler returns false
5127
+ if ( !special.setup ||
5128
+ special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
5129
+
5130
+ if ( elem.addEventListener ) {
5131
+ elem.addEventListener( type, eventHandle );
5132
+ }
5133
+ }
5134
+ }
5135
+
5136
+ if ( special.add ) {
5137
+ special.add.call( elem, handleObj );
5138
+
5139
+ if ( !handleObj.handler.guid ) {
5140
+ handleObj.handler.guid = handler.guid;
5141
+ }
5142
+ }
5143
+
5144
+ // Add to the element's handler list, delegates in front
5145
+ if ( selector ) {
5146
+ handlers.splice( handlers.delegateCount++, 0, handleObj );
5147
+ } else {
5148
+ handlers.push( handleObj );
5149
+ }
5150
+
5151
+ // Keep track of which events have ever been used, for event optimization
5152
+ jQuery.event.global[ type ] = true;
5153
+ }
5154
+
5155
+ },
5156
+
5157
+ // Detach an event or set of events from an element
5158
+ remove: function( elem, types, handler, selector, mappedTypes ) {
5159
+
5160
+ var j, origCount, tmp,
5161
+ events, t, handleObj,
5162
+ special, handlers, type, namespaces, origType,
5163
+ elemData = dataPriv.hasData( elem ) && dataPriv.get( elem );
5164
+
5165
+ if ( !elemData || !( events = elemData.events ) ) {
5166
+ return;
5167
+ }
5168
+
5169
+ // Once for each type.namespace in types; type may be omitted
5170
+ types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
5171
+ t = types.length;
5172
+ while ( t-- ) {
5173
+ tmp = rtypenamespace.exec( types[ t ] ) || [];
5174
+ type = origType = tmp[ 1 ];
5175
+ namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
5176
+
5177
+ // Unbind all events (on this namespace, if provided) for the element
5178
+ if ( !type ) {
5179
+ for ( type in events ) {
5180
+ jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
5181
+ }
5182
+ continue;
5183
+ }
5184
+
5185
+ special = jQuery.event.special[ type ] || {};
5186
+ type = ( selector ? special.delegateType : special.bindType ) || type;
5187
+ handlers = events[ type ] || [];
5188
+ tmp = tmp[ 2 ] &&
5189
+ new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );
5190
+
5191
+ // Remove matching events
5192
+ origCount = j = handlers.length;
5193
+ while ( j-- ) {
5194
+ handleObj = handlers[ j ];
5195
+
5196
+ if ( ( mappedTypes || origType === handleObj.origType ) &&
5197
+ ( !handler || handler.guid === handleObj.guid ) &&
5198
+ ( !tmp || tmp.test( handleObj.namespace ) ) &&
5199
+ ( !selector || selector === handleObj.selector ||
5200
+ selector === "**" && handleObj.selector ) ) {
5201
+ handlers.splice( j, 1 );
5202
+
5203
+ if ( handleObj.selector ) {
5204
+ handlers.delegateCount--;
5205
+ }
5206
+ if ( special.remove ) {
5207
+ special.remove.call( elem, handleObj );
5208
+ }
5209
+ }
5210
+ }
5211
+
5212
+ // Remove generic event handler if we removed something and no more handlers exist
5213
+ // (avoids potential for endless recursion during removal of special event handlers)
5214
+ if ( origCount && !handlers.length ) {
5215
+ if ( !special.teardown ||
5216
+ special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
5217
+
5218
+ jQuery.removeEvent( elem, type, elemData.handle );
5219
+ }
5220
+
5221
+ delete events[ type ];
5222
+ }
5223
+ }
5224
+
5225
+ // Remove data and the expando if it's no longer used
5226
+ if ( jQuery.isEmptyObject( events ) ) {
5227
+ dataPriv.remove( elem, "handle events" );
5228
+ }
5229
+ },
5230
+
5231
+ dispatch: function( nativeEvent ) {
5232
+
5233
+ // Make a writable jQuery.Event from the native event object
5234
+ var event = jQuery.event.fix( nativeEvent );
5235
+
5236
+ var i, j, ret, matched, handleObj, handlerQueue,
5237
+ args = new Array( arguments.length ),
5238
+ handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [],
5239
+ special = jQuery.event.special[ event.type ] || {};
5240
+
5241
+ // Use the fix-ed jQuery.Event rather than the (read-only) native event
5242
+ args[ 0 ] = event;
5243
+
5244
+ for ( i = 1; i < arguments.length; i++ ) {
5245
+ args[ i ] = arguments[ i ];
5246
+ }
5247
+
5248
+ event.delegateTarget = this;
5249
+
5250
+ // Call the preDispatch hook for the mapped type, and let it bail if desired
5251
+ if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
5252
+ return;
5253
+ }
5254
+
5255
+ // Determine handlers
5256
+ handlerQueue = jQuery.event.handlers.call( this, event, handlers );
5257
+
5258
+ // Run delegates first; they may want to stop propagation beneath us
5259
+ i = 0;
5260
+ while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
5261
+ event.currentTarget = matched.elem;
5262
+
5263
+ j = 0;
5264
+ while ( ( handleObj = matched.handlers[ j++ ] ) &&
5265
+ !event.isImmediatePropagationStopped() ) {
5266
+
5267
+ // Triggered event must either 1) have no namespace, or 2) have namespace(s)
5268
+ // a subset or equal to those in the bound event (both can have no namespace).
5269
+ if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {
5270
+
5271
+ event.handleObj = handleObj;
5272
+ event.data = handleObj.data;
5273
+
5274
+ ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
5275
+ handleObj.handler ).apply( matched.elem, args );
5276
+
5277
+ if ( ret !== undefined ) {
5278
+ if ( ( event.result = ret ) === false ) {
5279
+ event.preventDefault();
5280
+ event.stopPropagation();
5281
+ }
5282
+ }
5283
+ }
5284
+ }
5285
+ }
5286
+
5287
+ // Call the postDispatch hook for the mapped type
5288
+ if ( special.postDispatch ) {
5289
+ special.postDispatch.call( this, event );
5290
+ }
5291
+
5292
+ return event.result;
5293
+ },
5294
+
5295
+ handlers: function( event, handlers ) {
5296
+ var i, handleObj, sel, matchedHandlers, matchedSelectors,
5297
+ handlerQueue = [],
5298
+ delegateCount = handlers.delegateCount,
5299
+ cur = event.target;
5300
+
5301
+ // Find delegate handlers
5302
+ if ( delegateCount &&
5303
+
5304
+ // Support: IE <=9
5305
+ // Black-hole SVG <use> instance trees (trac-13180)
5306
+ cur.nodeType &&
5307
+
5308
+ // Support: Firefox <=42
5309
+ // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)
5310
+ // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click
5311
+ // Support: IE 11 only
5312
+ // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343)
5313
+ !( event.type === "click" && event.button >= 1 ) ) {
5314
+
5315
+ for ( ; cur !== this; cur = cur.parentNode || this ) {
5316
+
5317
+ // Don't check non-elements (#13208)
5318
+ // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
5319
+ if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) {
5320
+ matchedHandlers = [];
5321
+ matchedSelectors = {};
5322
+ for ( i = 0; i < delegateCount; i++ ) {
5323
+ handleObj = handlers[ i ];
5324
+
5325
+ // Don't conflict with Object.prototype properties (#13203)
5326
+ sel = handleObj.selector + " ";
5327
+
5328
+ if ( matchedSelectors[ sel ] === undefined ) {
5329
+ matchedSelectors[ sel ] = handleObj.needsContext ?
5330
+ jQuery( sel, this ).index( cur ) > -1 :
5331
+ jQuery.find( sel, this, null, [ cur ] ).length;
5332
+ }
5333
+ if ( matchedSelectors[ sel ] ) {
5334
+ matchedHandlers.push( handleObj );
5335
+ }
5336
+ }
5337
+ if ( matchedHandlers.length ) {
5338
+ handlerQueue.push( { elem: cur, handlers: matchedHandlers } );
5339
+ }
5340
+ }
5341
+ }
5342
+ }
5343
+
5344
+ // Add the remaining (directly-bound) handlers
5345
+ cur = this;
5346
+ if ( delegateCount < handlers.length ) {
5347
+ handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );
5348
+ }
5349
+
5350
+ return handlerQueue;
5351
+ },
5352
+
5353
+ addProp: function( name, hook ) {
5354
+ Object.defineProperty( jQuery.Event.prototype, name, {
5355
+ enumerable: true,
5356
+ configurable: true,
5357
+
5358
+ get: jQuery.isFunction( hook ) ?
5359
+ function() {
5360
+ if ( this.originalEvent ) {
5361
+ return hook( this.originalEvent );
5362
+ }
5363
+ } :
5364
+ function() {
5365
+ if ( this.originalEvent ) {
5366
+ return this.originalEvent[ name ];
5367
+ }
5368
+ },
5369
+
5370
+ set: function( value ) {
5371
+ Object.defineProperty( this, name, {
5372
+ enumerable: true,
5373
+ configurable: true,
5374
+ writable: true,
5375
+ value: value
5376
+ } );
5377
+ }
5378
+ } );
5379
+ },
5380
+
5381
+ fix: function( originalEvent ) {
5382
+ return originalEvent[ jQuery.expando ] ?
5383
+ originalEvent :
5384
+ new jQuery.Event( originalEvent );
5385
+ },
5386
+
5387
+ special: {
5388
+ load: {
5389
+
5390
+ // Prevent triggered image.load events from bubbling to window.load
5391
+ noBubble: true
5392
+ },
5393
+ focus: {
5394
+
5395
+ // Fire native event if possible so blur/focus sequence is correct
5396
+ trigger: function() {
5397
+ if ( this !== safeActiveElement() && this.focus ) {
5398
+ this.focus();
5399
+ return false;
5400
+ }
5401
+ },
5402
+ delegateType: "focusin"
5403
+ },
5404
+ blur: {
5405
+ trigger: function() {
5406
+ if ( this === safeActiveElement() && this.blur ) {
5407
+ this.blur();
5408
+ return false;
5409
+ }
5410
+ },
5411
+ delegateType: "focusout"
5412
+ },
5413
+ click: {
5414
+
5415
+ // For checkbox, fire native event so checked state will be right
5416
+ trigger: function() {
5417
+ if ( this.type === "checkbox" && this.click && nodeName( this, "input" ) ) {
5418
+ this.click();
5419
+ return false;
5420
+ }
5421
+ },
5422
+
5423
+ // For cross-browser consistency, don't fire native .click() on links
5424
+ _default: function( event ) {
5425
+ return nodeName( event.target, "a" );
5426
+ }
5427
+ },
5428
+
5429
+ beforeunload: {
5430
+ postDispatch: function( event ) {
5431
+
5432
+ // Support: Firefox 20+
5433
+ // Firefox doesn't alert if the returnValue field is not set.
5434
+ if ( event.result !== undefined && event.originalEvent ) {
5435
+ event.originalEvent.returnValue = event.result;
5436
+ }
5437
+ }
5438
+ }
5439
+ }
5440
+ };
5441
+
5442
+ jQuery.removeEvent = function( elem, type, handle ) {
5443
+
5444
+ // This "if" is needed for plain objects
5445
+ if ( elem.removeEventListener ) {
5446
+ elem.removeEventListener( type, handle );
5447
+ }
5448
+ };
5449
+
5450
+ jQuery.Event = function( src, props ) {
5451
+
5452
+ // Allow instantiation without the 'new' keyword
5453
+ if ( !( this instanceof jQuery.Event ) ) {
5454
+ return new jQuery.Event( src, props );
5455
+ }
5456
+
5457
+ // Event object
5458
+ if ( src && src.type ) {
5459
+ this.originalEvent = src;
5460
+ this.type = src.type;
5461
+
5462
+ // Events bubbling up the document may have been marked as prevented
5463
+ // by a handler lower down the tree; reflect the correct value.
5464
+ this.isDefaultPrevented = src.defaultPrevented ||
5465
+ src.defaultPrevented === undefined &&
5466
+
5467
+ // Support: Android <=2.3 only
5468
+ src.returnValue === false ?
5469
+ returnTrue :
5470
+ returnFalse;
5471
+
5472
+ // Create target properties
5473
+ // Support: Safari <=6 - 7 only
5474
+ // Target should not be a text node (#504, #13143)
5475
+ this.target = ( src.target && src.target.nodeType === 3 ) ?
5476
+ src.target.parentNode :
5477
+ src.target;
5478
+
5479
+ this.currentTarget = src.currentTarget;
5480
+ this.relatedTarget = src.relatedTarget;
5481
+
5482
+ // Event type
5483
+ } else {
5484
+ this.type = src;
5485
+ }
5486
+
5487
+ // Put explicitly provided properties onto the event object
5488
+ if ( props ) {
5489
+ jQuery.extend( this, props );
5490
+ }
5491
+
5492
+ // Create a timestamp if incoming event doesn't have one
5493
+ this.timeStamp = src && src.timeStamp || jQuery.now();
5494
+
5495
+ // Mark it as fixed
5496
+ this[ jQuery.expando ] = true;
5497
+ };
5498
+
5499
+ // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
5500
+ // https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
5501
+ jQuery.Event.prototype = {
5502
+ constructor: jQuery.Event,
5503
+ isDefaultPrevented: returnFalse,
5504
+ isPropagationStopped: returnFalse,
5505
+ isImmediatePropagationStopped: returnFalse,
5506
+ isSimulated: false,
5507
+
5508
+ preventDefault: function() {
5509
+ var e = this.originalEvent;
5510
+
5511
+ this.isDefaultPrevented = returnTrue;
5512
+
5513
+ if ( e && !this.isSimulated ) {
5514
+ e.preventDefault();
5515
+ }
5516
+ },
5517
+ stopPropagation: function() {
5518
+ var e = this.originalEvent;
5519
+
5520
+ this.isPropagationStopped = returnTrue;
5521
+
5522
+ if ( e && !this.isSimulated ) {
5523
+ e.stopPropagation();
5524
+ }
5525
+ },
5526
+ stopImmediatePropagation: function() {
5527
+ var e = this.originalEvent;
5528
+
5529
+ this.isImmediatePropagationStopped = returnTrue;
5530
+
5531
+ if ( e && !this.isSimulated ) {
5532
+ e.stopImmediatePropagation();
5533
+ }
5534
+
5535
+ this.stopPropagation();
5536
+ }
5537
+ };
5538
+
5539
+ // Includes all common event props including KeyEvent and MouseEvent specific props
5540
+ jQuery.each( {
5541
+ altKey: true,
5542
+ bubbles: true,
5543
+ cancelable: true,
5544
+ changedTouches: true,
5545
+ ctrlKey: true,
5546
+ detail: true,
5547
+ eventPhase: true,
5548
+ metaKey: true,
5549
+ pageX: true,
5550
+ pageY: true,
5551
+ shiftKey: true,
5552
+ view: true,
5553
+ "char": true,
5554
+ charCode: true,
5555
+ key: true,
5556
+ keyCode: true,
5557
+ button: true,
5558
+ buttons: true,
5559
+ clientX: true,
5560
+ clientY: true,
5561
+ offsetX: true,
5562
+ offsetY: true,
5563
+ pointerId: true,
5564
+ pointerType: true,
5565
+ screenX: true,
5566
+ screenY: true,
5567
+ targetTouches: true,
5568
+ toElement: true,
5569
+ touches: true,
5570
+
5571
+ which: function( event ) {
5572
+ var button = event.button;
5573
+
5574
+ // Add which for key events
5575
+ if ( event.which == null && rkeyEvent.test( event.type ) ) {
5576
+ return event.charCode != null ? event.charCode : event.keyCode;
5577
+ }
5578
+
5579
+ // Add which for click: 1 === left; 2 === middle; 3 === right
5580
+ if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {
5581
+ if ( button & 1 ) {
5582
+ return 1;
5583
+ }
5584
+
5585
+ if ( button & 2 ) {
5586
+ return 3;
5587
+ }
5588
+
5589
+ if ( button & 4 ) {
5590
+ return 2;
5591
+ }
5592
+
5593
+ return 0;
5594
+ }
5595
+
5596
+ return event.which;
5597
+ }
5598
+ }, jQuery.event.addProp );
5599
+
5600
+ // Create mouseenter/leave events using mouseover/out and event-time checks
5601
+ // so that event delegation works in jQuery.
5602
+ // Do the same for pointerenter/pointerleave and pointerover/pointerout
5603
+ //
5604
+ // Support: Safari 7 only
5605
+ // Safari sends mouseenter too often; see:
5606
+ // https://bugs.chromium.org/p/chromium/issues/detail?id=470258
5607
+ // for the description of the bug (it existed in older Chrome versions as well).
5608
+ jQuery.each( {
5609
+ mouseenter: "mouseover",
5610
+ mouseleave: "mouseout",
5611
+ pointerenter: "pointerover",
5612
+ pointerleave: "pointerout"
5613
+ }, function( orig, fix ) {
5614
+ jQuery.event.special[ orig ] = {
5615
+ delegateType: fix,
5616
+ bindType: fix,
5617
+
5618
+ handle: function( event ) {
5619
+ var ret,
5620
+ target = this,
5621
+ related = event.relatedTarget,
5622
+ handleObj = event.handleObj;
5623
+
5624
+ // For mouseenter/leave call the handler if related is outside the target.
5625
+ // NB: No relatedTarget if the mouse left/entered the browser window
5626
+ if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
5627
+ event.type = handleObj.origType;
5628
+ ret = handleObj.handler.apply( this, arguments );
5629
+ event.type = fix;
5630
+ }
5631
+ return ret;
5632
+ }
5633
+ };
5634
+ } );
5635
+
5636
+ jQuery.fn.extend( {
5637
+
5638
+ on: function( types, selector, data, fn ) {
5639
+ return on( this, types, selector, data, fn );
5640
+ },
5641
+ one: function( types, selector, data, fn ) {
5642
+ return on( this, types, selector, data, fn, 1 );
5643
+ },
5644
+ off: function( types, selector, fn ) {
5645
+ var handleObj, type;
5646
+ if ( types && types.preventDefault && types.handleObj ) {
5647
+
5648
+ // ( event ) dispatched jQuery.Event
5649
+ handleObj = types.handleObj;
5650
+ jQuery( types.delegateTarget ).off(
5651
+ handleObj.namespace ?
5652
+ handleObj.origType + "." + handleObj.namespace :
5653
+ handleObj.origType,
5654
+ handleObj.selector,
5655
+ handleObj.handler
5656
+ );
5657
+ return this;
5658
+ }
5659
+ if ( typeof types === "object" ) {
5660
+
5661
+ // ( types-object [, selector] )
5662
+ for ( type in types ) {
5663
+ this.off( type, selector, types[ type ] );
5664
+ }
5665
+ return this;
5666
+ }
5667
+ if ( selector === false || typeof selector === "function" ) {
5668
+
5669
+ // ( types [, fn] )
5670
+ fn = selector;
5671
+ selector = undefined;
5672
+ }
5673
+ if ( fn === false ) {
5674
+ fn = returnFalse;
5675
+ }
5676
+ return this.each( function() {
5677
+ jQuery.event.remove( this, types, fn, selector );
5678
+ } );
5679
+ }
5680
+ } );
5681
+
5682
+
5683
+ var
5684
+
5685
+ /* eslint-disable max-len */
5686
+
5687
+ // See https://github.com/eslint/eslint/issues/3229
5688
+ rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,
5689
+
5690
+ /* eslint-enable */
5691
+
5692
+ // Support: IE <=10 - 11, Edge 12 - 13
5693
+ // In IE/Edge using regex groups here causes severe slowdowns.
5694
+ // See https://connect.microsoft.com/IE/feedback/details/1736512/
5695
+ rnoInnerhtml = /<script|<style|<link/i,
5696
+
5697
+ // checked="checked" or checked
5698
+ rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
5699
+ rscriptTypeMasked = /^true\/(.*)/,
5700
+ rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;
5701
+
5702
+ // Prefer a tbody over its parent table for containing new rows
5703
+ function manipulationTarget( elem, content ) {
5704
+ if ( nodeName( elem, "table" ) &&
5705
+ nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) {
5706
+
5707
+ return jQuery( ">tbody", elem )[ 0 ] || elem;
5708
+ }
5709
+
5710
+ return elem;
5711
+ }
5712
+
5713
+ // Replace/restore the type attribute of script elements for safe DOM manipulation
5714
+ function disableScript( elem ) {
5715
+ elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type;
5716
+ return elem;
5717
+ }
5718
+ function restoreScript( elem ) {
5719
+ var match = rscriptTypeMasked.exec( elem.type );
5720
+
5721
+ if ( match ) {
5722
+ elem.type = match[ 1 ];
5723
+ } else {
5724
+ elem.removeAttribute( "type" );
5725
+ }
5726
+
5727
+ return elem;
5728
+ }
5729
+
5730
+ function cloneCopyEvent( src, dest ) {
5731
+ var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;
5732
+
5733
+ if ( dest.nodeType !== 1 ) {
5734
+ return;
5735
+ }
5736
+
5737
+ // 1. Copy private data: events, handlers, etc.
5738
+ if ( dataPriv.hasData( src ) ) {
5739
+ pdataOld = dataPriv.access( src );
5740
+ pdataCur = dataPriv.set( dest, pdataOld );
5741
+ events = pdataOld.events;
5742
+
5743
+ if ( events ) {
5744
+ delete pdataCur.handle;
5745
+ pdataCur.events = {};
5746
+
5747
+ for ( type in events ) {
5748
+ for ( i = 0, l = events[ type ].length; i < l; i++ ) {
5749
+ jQuery.event.add( dest, type, events[ type ][ i ] );
5750
+ }
5751
+ }
5752
+ }
5753
+ }
5754
+
5755
+ // 2. Copy user data
5756
+ if ( dataUser.hasData( src ) ) {
5757
+ udataOld = dataUser.access( src );
5758
+ udataCur = jQuery.extend( {}, udataOld );
5759
+
5760
+ dataUser.set( dest, udataCur );
5761
+ }
5762
+ }
5763
+
5764
+ // Fix IE bugs, see support tests
5765
+ function fixInput( src, dest ) {
5766
+ var nodeName = dest.nodeName.toLowerCase();
5767
+
5768
+ // Fails to persist the checked state of a cloned checkbox or radio button.
5769
+ if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
5770
+ dest.checked = src.checked;
5771
+
5772
+ // Fails to return the selected option to the default selected state when cloning options
5773
+ } else if ( nodeName === "input" || nodeName === "textarea" ) {
5774
+ dest.defaultValue = src.defaultValue;
5775
+ }
5776
+ }
5777
+
5778
+ function domManip( collection, args, callback, ignored ) {
5779
+
5780
+ // Flatten any nested arrays
5781
+ args = concat.apply( [], args );
5782
+
5783
+ var fragment, first, scripts, hasScripts, node, doc,
5784
+ i = 0,
5785
+ l = collection.length,
5786
+ iNoClone = l - 1,
5787
+ value = args[ 0 ],
5788
+ isFunction = jQuery.isFunction( value );
5789
+
5790
+ // We can't cloneNode fragments that contain checked, in WebKit
5791
+ if ( isFunction ||
5792
+ ( l > 1 && typeof value === "string" &&
5793
+ !support.checkClone && rchecked.test( value ) ) ) {
5794
+ return collection.each( function( index ) {
5795
+ var self = collection.eq( index );
5796
+ if ( isFunction ) {
5797
+ args[ 0 ] = value.call( this, index, self.html() );
5798
+ }
5799
+ domManip( self, args, callback, ignored );
5800
+ } );
5801
+ }
5802
+
5803
+ if ( l ) {
5804
+ fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );
5805
+ first = fragment.firstChild;
5806
+
5807
+ if ( fragment.childNodes.length === 1 ) {
5808
+ fragment = first;
5809
+ }
5810
+
5811
+ // Require either new content or an interest in ignored elements to invoke the callback
5812
+ if ( first || ignored ) {
5813
+ scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
5814
+ hasScripts = scripts.length;
5815
+
5816
+ // Use the original fragment for the last item
5817
+ // instead of the first because it can end up
5818
+ // being emptied incorrectly in certain situations (#8070).
5819
+ for ( ; i < l; i++ ) {
5820
+ node = fragment;
5821
+
5822
+ if ( i !== iNoClone ) {
5823
+ node = jQuery.clone( node, true, true );
5824
+
5825
+ // Keep references to cloned scripts for later restoration
5826
+ if ( hasScripts ) {
5827
+
5828
+ // Support: Android <=4.0 only, PhantomJS 1 only
5829
+ // push.apply(_, arraylike) throws on ancient WebKit
5830
+ jQuery.merge( scripts, getAll( node, "script" ) );
5831
+ }
5832
+ }
5833
+
5834
+ callback.call( collection[ i ], node, i );
5835
+ }
5836
+
5837
+ if ( hasScripts ) {
5838
+ doc = scripts[ scripts.length - 1 ].ownerDocument;
5839
+
5840
+ // Reenable scripts
5841
+ jQuery.map( scripts, restoreScript );
5842
+
5843
+ // Evaluate executable scripts on first document insertion
5844
+ for ( i = 0; i < hasScripts; i++ ) {
5845
+ node = scripts[ i ];
5846
+ if ( rscriptType.test( node.type || "" ) &&
5847
+ !dataPriv.access( node, "globalEval" ) &&
5848
+ jQuery.contains( doc, node ) ) {
5849
+
5850
+ if ( node.src ) {
5851
+
5852
+ // Optional AJAX dependency, but won't run scripts if not present
5853
+ if ( jQuery._evalUrl ) {
5854
+ jQuery._evalUrl( node.src );
5855
+ }
5856
+ } else {
5857
+ DOMEval( node.textContent.replace( rcleanScript, "" ), doc );
5858
+ }
5859
+ }
5860
+ }
5861
+ }
5862
+ }
5863
+ }
5864
+
5865
+ return collection;
5866
+ }
5867
+
5868
+ function remove( elem, selector, keepData ) {
5869
+ var node,
5870
+ nodes = selector ? jQuery.filter( selector, elem ) : elem,
5871
+ i = 0;
5872
+
5873
+ for ( ; ( node = nodes[ i ] ) != null; i++ ) {
5874
+ if ( !keepData && node.nodeType === 1 ) {
5875
+ jQuery.cleanData( getAll( node ) );
5876
+ }
5877
+
5878
+ if ( node.parentNode ) {
5879
+ if ( keepData && jQuery.contains( node.ownerDocument, node ) ) {
5880
+ setGlobalEval( getAll( node, "script" ) );
5881
+ }
5882
+ node.parentNode.removeChild( node );
5883
+ }
5884
+ }
5885
+
5886
+ return elem;
5887
+ }
5888
+
5889
+ jQuery.extend( {
5890
+ htmlPrefilter: function( html ) {
5891
+ return html.replace( rxhtmlTag, "<$1></$2>" );
5892
+ },
5893
+
5894
+ clone: function( elem, dataAndEvents, deepDataAndEvents ) {
5895
+ var i, l, srcElements, destElements,
5896
+ clone = elem.cloneNode( true ),
5897
+ inPage = jQuery.contains( elem.ownerDocument, elem );
5898
+
5899
+ // Fix IE cloning issues
5900
+ if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
5901
+ !jQuery.isXMLDoc( elem ) ) {
5902
+
5903
+ // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2
5904
+ destElements = getAll( clone );
5905
+ srcElements = getAll( elem );
5906
+
5907
+ for ( i = 0, l = srcElements.length; i < l; i++ ) {
5908
+ fixInput( srcElements[ i ], destElements[ i ] );
5909
+ }
5910
+ }
5911
+
5912
+ // Copy the events from the original to the clone
5913
+ if ( dataAndEvents ) {
5914
+ if ( deepDataAndEvents ) {
5915
+ srcElements = srcElements || getAll( elem );
5916
+ destElements = destElements || getAll( clone );
5917
+
5918
+ for ( i = 0, l = srcElements.length; i < l; i++ ) {
5919
+ cloneCopyEvent( srcElements[ i ], destElements[ i ] );
5920
+ }
5921
+ } else {
5922
+ cloneCopyEvent( elem, clone );
5923
+ }
5924
+ }
5925
+
5926
+ // Preserve script evaluation history
5927
+ destElements = getAll( clone, "script" );
5928
+ if ( destElements.length > 0 ) {
5929
+ setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
5930
+ }
5931
+
5932
+ // Return the cloned set
5933
+ return clone;
5934
+ },
5935
+
5936
+ cleanData: function( elems ) {
5937
+ var data, elem, type,
5938
+ special = jQuery.event.special,
5939
+ i = 0;
5940
+
5941
+ for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {
5942
+ if ( acceptData( elem ) ) {
5943
+ if ( ( data = elem[ dataPriv.expando ] ) ) {
5944
+ if ( data.events ) {
5945
+ for ( type in data.events ) {
5946
+ if ( special[ type ] ) {
5947
+ jQuery.event.remove( elem, type );
5948
+
5949
+ // This is a shortcut to avoid jQuery.event.remove's overhead
5950
+ } else {
5951
+ jQuery.removeEvent( elem, type, data.handle );
5952
+ }
5953
+ }
5954
+ }
5955
+
5956
+ // Support: Chrome <=35 - 45+
5957
+ // Assign undefined instead of using delete, see Data#remove
5958
+ elem[ dataPriv.expando ] = undefined;
5959
+ }
5960
+ if ( elem[ dataUser.expando ] ) {
5961
+
5962
+ // Support: Chrome <=35 - 45+
5963
+ // Assign undefined instead of using delete, see Data#remove
5964
+ elem[ dataUser.expando ] = undefined;
5965
+ }
5966
+ }
5967
+ }
5968
+ }
5969
+ } );
5970
+
5971
+ jQuery.fn.extend( {
5972
+ detach: function( selector ) {
5973
+ return remove( this, selector, true );
5974
+ },
5975
+
5976
+ remove: function( selector ) {
5977
+ return remove( this, selector );
5978
+ },
5979
+
5980
+ text: function( value ) {
5981
+ return access( this, function( value ) {
5982
+ return value === undefined ?
5983
+ jQuery.text( this ) :
5984
+ this.empty().each( function() {
5985
+ if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
5986
+ this.textContent = value;
5987
+ }
5988
+ } );
5989
+ }, null, value, arguments.length );
5990
+ },
5991
+
5992
+ append: function() {
5993
+ return domManip( this, arguments, function( elem ) {
5994
+ if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
5995
+ var target = manipulationTarget( this, elem );
5996
+ target.appendChild( elem );
5997
+ }
5998
+ } );
5999
+ },
6000
+
6001
+ prepend: function() {
6002
+ return domManip( this, arguments, function( elem ) {
6003
+ if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
6004
+ var target = manipulationTarget( this, elem );
6005
+ target.insertBefore( elem, target.firstChild );
6006
+ }
6007
+ } );
6008
+ },
6009
+
6010
+ before: function() {
6011
+ return domManip( this, arguments, function( elem ) {
6012
+ if ( this.parentNode ) {
6013
+ this.parentNode.insertBefore( elem, this );
6014
+ }
6015
+ } );
6016
+ },
6017
+
6018
+ after: function() {
6019
+ return domManip( this, arguments, function( elem ) {
6020
+ if ( this.parentNode ) {
6021
+ this.parentNode.insertBefore( elem, this.nextSibling );
6022
+ }
6023
+ } );
6024
+ },
6025
+
6026
+ empty: function() {
6027
+ var elem,
6028
+ i = 0;
6029
+
6030
+ for ( ; ( elem = this[ i ] ) != null; i++ ) {
6031
+ if ( elem.nodeType === 1 ) {
6032
+
6033
+ // Prevent memory leaks
6034
+ jQuery.cleanData( getAll( elem, false ) );
6035
+
6036
+ // Remove any remaining nodes
6037
+ elem.textContent = "";
6038
+ }
6039
+ }
6040
+
6041
+ return this;
6042
+ },
6043
+
6044
+ clone: function( dataAndEvents, deepDataAndEvents ) {
6045
+ dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
6046
+ deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
6047
+
6048
+ return this.map( function() {
6049
+ return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
6050
+ } );
6051
+ },
6052
+
6053
+ html: function( value ) {
6054
+ return access( this, function( value ) {
6055
+ var elem = this[ 0 ] || {},
6056
+ i = 0,
6057
+ l = this.length;
6058
+
6059
+ if ( value === undefined && elem.nodeType === 1 ) {
6060
+ return elem.innerHTML;
6061
+ }
6062
+
6063
+ // See if we can take a shortcut and just use innerHTML
6064
+ if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
6065
+ !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
6066
+
6067
+ value = jQuery.htmlPrefilter( value );
6068
+
6069
+ try {
6070
+ for ( ; i < l; i++ ) {
6071
+ elem = this[ i ] || {};
6072
+
6073
+ // Remove element nodes and prevent memory leaks
6074
+ if ( elem.nodeType === 1 ) {
6075
+ jQuery.cleanData( getAll( elem, false ) );
6076
+ elem.innerHTML = value;
6077
+ }
6078
+ }
6079
+
6080
+ elem = 0;
6081
+
6082
+ // If using innerHTML throws an exception, use the fallback method
6083
+ } catch ( e ) {}
6084
+ }
6085
+
6086
+ if ( elem ) {
6087
+ this.empty().append( value );
6088
+ }
6089
+ }, null, value, arguments.length );
6090
+ },
6091
+
6092
+ replaceWith: function() {
6093
+ var ignored = [];
6094
+
6095
+ // Make the changes, replacing each non-ignored context element with the new content
6096
+ return domManip( this, arguments, function( elem ) {
6097
+ var parent = this.parentNode;
6098
+
6099
+ if ( jQuery.inArray( this, ignored ) < 0 ) {
6100
+ jQuery.cleanData( getAll( this ) );
6101
+ if ( parent ) {
6102
+ parent.replaceChild( elem, this );
6103
+ }
6104
+ }
6105
+
6106
+ // Force callback invocation
6107
+ }, ignored );
6108
+ }
6109
+ } );
6110
+
6111
+ jQuery.each( {
6112
+ appendTo: "append",
6113
+ prependTo: "prepend",
6114
+ insertBefore: "before",
6115
+ insertAfter: "after",
6116
+ replaceAll: "replaceWith"
6117
+ }, function( name, original ) {
6118
+ jQuery.fn[ name ] = function( selector ) {
6119
+ var elems,
6120
+ ret = [],
6121
+ insert = jQuery( selector ),
6122
+ last = insert.length - 1,
6123
+ i = 0;
6124
+
6125
+ for ( ; i <= last; i++ ) {
6126
+ elems = i === last ? this : this.clone( true );
6127
+ jQuery( insert[ i ] )[ original ]( elems );
6128
+
6129
+ // Support: Android <=4.0 only, PhantomJS 1 only
6130
+ // .get() because push.apply(_, arraylike) throws on ancient WebKit
6131
+ push.apply( ret, elems.get() );
6132
+ }
6133
+
6134
+ return this.pushStack( ret );
6135
+ };
6136
+ } );
6137
+ var rmargin = ( /^margin/ );
6138
+
6139
+ var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
6140
+
6141
+ var getStyles = function( elem ) {
6142
+
6143
+ // Support: IE <=11 only, Firefox <=30 (#15098, #14150)
6144
+ // IE throws on elements created in popups
6145
+ // FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
6146
+ var view = elem.ownerDocument.defaultView;
6147
+
6148
+ if ( !view || !view.opener ) {
6149
+ view = window;
6150
+ }
6151
+
6152
+ return view.getComputedStyle( elem );
6153
+ };
6154
+
6155
+
6156
+
6157
+ ( function() {
6158
+
6159
+ // Executing both pixelPosition & boxSizingReliable tests require only one layout
6160
+ // so they're executed at the same time to save the second computation.
6161
+ function computeStyleTests() {
6162
+
6163
+ // This is a singleton, we need to execute it only once
6164
+ if ( !div ) {
6165
+ return;
6166
+ }
6167
+
6168
+ div.style.cssText =
6169
+ "box-sizing:border-box;" +
6170
+ "position:relative;display:block;" +
6171
+ "margin:auto;border:1px;padding:1px;" +
6172
+ "top:1%;width:50%";
6173
+ div.innerHTML = "";
6174
+ documentElement.appendChild( container );
6175
+
6176
+ var divStyle = window.getComputedStyle( div );
6177
+ pixelPositionVal = divStyle.top !== "1%";
6178
+
6179
+ // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44
6180
+ reliableMarginLeftVal = divStyle.marginLeft === "2px";
6181
+ boxSizingReliableVal = divStyle.width === "4px";
6182
+
6183
+ // Support: Android 4.0 - 4.3 only
6184
+ // Some styles come back with percentage values, even though they shouldn't
6185
+ div.style.marginRight = "50%";
6186
+ pixelMarginRightVal = divStyle.marginRight === "4px";
6187
+
6188
+ documentElement.removeChild( container );
6189
+
6190
+ // Nullify the div so it wouldn't be stored in the memory and
6191
+ // it will also be a sign that checks already performed
6192
+ div = null;
6193
+ }
6194
+
6195
+ var pixelPositionVal, boxSizingReliableVal, pixelMarginRightVal, reliableMarginLeftVal,
6196
+ container = document.createElement( "div" ),
6197
+ div = document.createElement( "div" );
6198
+
6199
+ // Finish early in limited (non-browser) environments
6200
+ if ( !div.style ) {
6201
+ return;
6202
+ }
6203
+
6204
+ // Support: IE <=9 - 11 only
6205
+ // Style of cloned element affects source element cloned (#8908)
6206
+ div.style.backgroundClip = "content-box";
6207
+ div.cloneNode( true ).style.backgroundClip = "";
6208
+ support.clearCloneStyle = div.style.backgroundClip === "content-box";
6209
+
6210
+ container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" +
6211
+ "padding:0;margin-top:1px;position:absolute";
6212
+ container.appendChild( div );
6213
+
6214
+ jQuery.extend( support, {
6215
+ pixelPosition: function() {
6216
+ computeStyleTests();
6217
+ return pixelPositionVal;
6218
+ },
6219
+ boxSizingReliable: function() {
6220
+ computeStyleTests();
6221
+ return boxSizingReliableVal;
6222
+ },
6223
+ pixelMarginRight: function() {
6224
+ computeStyleTests();
6225
+ return pixelMarginRightVal;
6226
+ },
6227
+ reliableMarginLeft: function() {
6228
+ computeStyleTests();
6229
+ return reliableMarginLeftVal;
6230
+ }
6231
+ } );
6232
+ } )();
6233
+
6234
+
6235
+ function curCSS( elem, name, computed ) {
6236
+ var width, minWidth, maxWidth, ret,
6237
+
6238
+ // Support: Firefox 51+
6239
+ // Retrieving style before computed somehow
6240
+ // fixes an issue with getting wrong values
6241
+ // on detached elements
6242
+ style = elem.style;
6243
+
6244
+ computed = computed || getStyles( elem );
6245
+
6246
+ // getPropertyValue is needed for:
6247
+ // .css('filter') (IE 9 only, #12537)
6248
+ // .css('--customProperty) (#3144)
6249
+ if ( computed ) {
6250
+ ret = computed.getPropertyValue( name ) || computed[ name ];
6251
+
6252
+ if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
6253
+ ret = jQuery.style( elem, name );
6254
+ }
6255
+
6256
+ // A tribute to the "awesome hack by Dean Edwards"
6257
+ // Android Browser returns percentage for some values,
6258
+ // but width seems to be reliably pixels.
6259
+ // This is against the CSSOM draft spec:
6260
+ // https://drafts.csswg.org/cssom/#resolved-values
6261
+ if ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) {
6262
+
6263
+ // Remember the original values
6264
+ width = style.width;
6265
+ minWidth = style.minWidth;
6266
+ maxWidth = style.maxWidth;
6267
+
6268
+ // Put in the new values to get a computed value out
6269
+ style.minWidth = style.maxWidth = style.width = ret;
6270
+ ret = computed.width;
6271
+
6272
+ // Revert the changed values
6273
+ style.width = width;
6274
+ style.minWidth = minWidth;
6275
+ style.maxWidth = maxWidth;
6276
+ }
6277
+ }
6278
+
6279
+ return ret !== undefined ?
6280
+
6281
+ // Support: IE <=9 - 11 only
6282
+ // IE returns zIndex value as an integer.
6283
+ ret + "" :
6284
+ ret;
6285
+ }
6286
+
6287
+
6288
+ function addGetHookIf( conditionFn, hookFn ) {
6289
+
6290
+ // Define the hook, we'll check on the first run if it's really needed.
6291
+ return {
6292
+ get: function() {
6293
+ if ( conditionFn() ) {
6294
+
6295
+ // Hook not needed (or it's not possible to use it due
6296
+ // to missing dependency), remove it.
6297
+ delete this.get;
6298
+ return;
6299
+ }
6300
+
6301
+ // Hook needed; redefine it so that the support test is not executed again.
6302
+ return ( this.get = hookFn ).apply( this, arguments );
6303
+ }
6304
+ };
6305
+ }
6306
+
6307
+
6308
+ var
6309
+
6310
+ // Swappable if display is none or starts with table
6311
+ // except "table", "table-cell", or "table-caption"
6312
+ // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
6313
+ rdisplayswap = /^(none|table(?!-c[ea]).+)/,
6314
+ rcustomProp = /^--/,
6315
+ cssShow = { position: "absolute", visibility: "hidden", display: "block" },
6316
+ cssNormalTransform = {
6317
+ letterSpacing: "0",
6318
+ fontWeight: "400"
6319
+ },
6320
+
6321
+ cssPrefixes = [ "Webkit", "Moz", "ms" ],
6322
+ emptyStyle = document.createElement( "div" ).style;
6323
+
6324
+ // Return a css property mapped to a potentially vendor prefixed property
6325
+ function vendorPropName( name ) {
6326
+
6327
+ // Shortcut for names that are not vendor prefixed
6328
+ if ( name in emptyStyle ) {
6329
+ return name;
6330
+ }
6331
+
6332
+ // Check for vendor prefixed names
6333
+ var capName = name[ 0 ].toUpperCase() + name.slice( 1 ),
6334
+ i = cssPrefixes.length;
6335
+
6336
+ while ( i-- ) {
6337
+ name = cssPrefixes[ i ] + capName;
6338
+ if ( name in emptyStyle ) {
6339
+ return name;
6340
+ }
6341
+ }
6342
+ }
6343
+
6344
+ // Return a property mapped along what jQuery.cssProps suggests or to
6345
+ // a vendor prefixed property.
6346
+ function finalPropName( name ) {
6347
+ var ret = jQuery.cssProps[ name ];
6348
+ if ( !ret ) {
6349
+ ret = jQuery.cssProps[ name ] = vendorPropName( name ) || name;
6350
+ }
6351
+ return ret;
6352
+ }
6353
+
6354
+ function setPositiveNumber( elem, value, subtract ) {
6355
+
6356
+ // Any relative (+/-) values have already been
6357
+ // normalized at this point
6358
+ var matches = rcssNum.exec( value );
6359
+ return matches ?
6360
+
6361
+ // Guard against undefined "subtract", e.g., when used as in cssHooks
6362
+ Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) :
6363
+ value;
6364
+ }
6365
+
6366
+ function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
6367
+ var i,
6368
+ val = 0;
6369
+
6370
+ // If we already have the right measurement, avoid augmentation
6371
+ if ( extra === ( isBorderBox ? "border" : "content" ) ) {
6372
+ i = 4;
6373
+
6374
+ // Otherwise initialize for horizontal or vertical properties
6375
+ } else {
6376
+ i = name === "width" ? 1 : 0;
6377
+ }
6378
+
6379
+ for ( ; i < 4; i += 2 ) {
6380
+
6381
+ // Both box models exclude margin, so add it if we want it
6382
+ if ( extra === "margin" ) {
6383
+ val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
6384
+ }
6385
+
6386
+ if ( isBorderBox ) {
6387
+
6388
+ // border-box includes padding, so remove it if we want content
6389
+ if ( extra === "content" ) {
6390
+ val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
6391
+ }
6392
+
6393
+ // At this point, extra isn't border nor margin, so remove border
6394
+ if ( extra !== "margin" ) {
6395
+ val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
6396
+ }
6397
+ } else {
6398
+
6399
+ // At this point, extra isn't content, so add padding
6400
+ val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
6401
+
6402
+ // At this point, extra isn't content nor padding, so add border
6403
+ if ( extra !== "padding" ) {
6404
+ val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
6405
+ }
6406
+ }
6407
+ }
6408
+
6409
+ return val;
6410
+ }
6411
+
6412
+ function getWidthOrHeight( elem, name, extra ) {
6413
+
6414
+ // Start with computed style
6415
+ var valueIsBorderBox,
6416
+ styles = getStyles( elem ),
6417
+ val = curCSS( elem, name, styles ),
6418
+ isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
6419
+
6420
+ // Computed unit is not pixels. Stop here and return.
6421
+ if ( rnumnonpx.test( val ) ) {
6422
+ return val;
6423
+ }
6424
+
6425
+ // Check for style in case a browser which returns unreliable values
6426
+ // for getComputedStyle silently falls back to the reliable elem.style
6427
+ valueIsBorderBox = isBorderBox &&
6428
+ ( support.boxSizingReliable() || val === elem.style[ name ] );
6429
+
6430
+ // Fall back to offsetWidth/Height when value is "auto"
6431
+ // This happens for inline elements with no explicit setting (gh-3571)
6432
+ if ( val === "auto" ) {
6433
+ val = elem[ "offset" + name[ 0 ].toUpperCase() + name.slice( 1 ) ];
6434
+ }
6435
+
6436
+ // Normalize "", auto, and prepare for extra
6437
+ val = parseFloat( val ) || 0;
6438
+
6439
+ // Use the active box-sizing model to add/subtract irrelevant styles
6440
+ return ( val +
6441
+ augmentWidthOrHeight(
6442
+ elem,
6443
+ name,
6444
+ extra || ( isBorderBox ? "border" : "content" ),
6445
+ valueIsBorderBox,
6446
+ styles
6447
+ )
6448
+ ) + "px";
6449
+ }
6450
+
6451
+ jQuery.extend( {
6452
+
6453
+ // Add in style property hooks for overriding the default
6454
+ // behavior of getting and setting a style property
6455
+ cssHooks: {
6456
+ opacity: {
6457
+ get: function( elem, computed ) {
6458
+ if ( computed ) {
6459
+
6460
+ // We should always get a number back from opacity
6461
+ var ret = curCSS( elem, "opacity" );
6462
+ return ret === "" ? "1" : ret;
6463
+ }
6464
+ }
6465
+ }
6466
+ },
6467
+
6468
+ // Don't automatically add "px" to these possibly-unitless properties
6469
+ cssNumber: {
6470
+ "animationIterationCount": true,
6471
+ "columnCount": true,
6472
+ "fillOpacity": true,
6473
+ "flexGrow": true,
6474
+ "flexShrink": true,
6475
+ "fontWeight": true,
6476
+ "lineHeight": true,
6477
+ "opacity": true,
6478
+ "order": true,
6479
+ "orphans": true,
6480
+ "widows": true,
6481
+ "zIndex": true,
6482
+ "zoom": true
6483
+ },
6484
+
6485
+ // Add in properties whose names you wish to fix before
6486
+ // setting or getting the value
6487
+ cssProps: {
6488
+ "float": "cssFloat"
6489
+ },
6490
+
6491
+ // Get and set the style property on a DOM Node
6492
+ style: function( elem, name, value, extra ) {
6493
+
6494
+ // Don't set styles on text and comment nodes
6495
+ if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
6496
+ return;
6497
+ }
6498
+
6499
+ // Make sure that we're working with the right name
6500
+ var ret, type, hooks,
6501
+ origName = jQuery.camelCase( name ),
6502
+ isCustomProp = rcustomProp.test( name ),
6503
+ style = elem.style;
6504
+
6505
+ // Make sure that we're working with the right name. We don't
6506
+ // want to query the value if it is a CSS custom property
6507
+ // since they are user-defined.
6508
+ if ( !isCustomProp ) {
6509
+ name = finalPropName( origName );
6510
+ }
6511
+
6512
+ // Gets hook for the prefixed version, then unprefixed version
6513
+ hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
6514
+
6515
+ // Check if we're setting a value
6516
+ if ( value !== undefined ) {
6517
+ type = typeof value;
6518
+
6519
+ // Convert "+=" or "-=" to relative numbers (#7345)
6520
+ if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
6521
+ value = adjustCSS( elem, name, ret );
6522
+
6523
+ // Fixes bug #9237
6524
+ type = "number";
6525
+ }
6526
+
6527
+ // Make sure that null and NaN values aren't set (#7116)
6528
+ if ( value == null || value !== value ) {
6529
+ return;
6530
+ }
6531
+
6532
+ // If a number was passed in, add the unit (except for certain CSS properties)
6533
+ if ( type === "number" ) {
6534
+ value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
6535
+ }
6536
+
6537
+ // background-* props affect original clone's values
6538
+ if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
6539
+ style[ name ] = "inherit";
6540
+ }
6541
+
6542
+ // If a hook was provided, use that value, otherwise just set the specified value
6543
+ if ( !hooks || !( "set" in hooks ) ||
6544
+ ( value = hooks.set( elem, value, extra ) ) !== undefined ) {
6545
+
6546
+ if ( isCustomProp ) {
6547
+ style.setProperty( name, value );
6548
+ } else {
6549
+ style[ name ] = value;
6550
+ }
6551
+ }
6552
+
6553
+ } else {
6554
+
6555
+ // If a hook was provided get the non-computed value from there
6556
+ if ( hooks && "get" in hooks &&
6557
+ ( ret = hooks.get( elem, false, extra ) ) !== undefined ) {
6558
+
6559
+ return ret;
6560
+ }
6561
+
6562
+ // Otherwise just get the value from the style object
6563
+ return style[ name ];
6564
+ }
6565
+ },
6566
+
6567
+ css: function( elem, name, extra, styles ) {
6568
+ var val, num, hooks,
6569
+ origName = jQuery.camelCase( name ),
6570
+ isCustomProp = rcustomProp.test( name );
6571
+
6572
+ // Make sure that we're working with the right name. We don't
6573
+ // want to modify the value if it is a CSS custom property
6574
+ // since they are user-defined.
6575
+ if ( !isCustomProp ) {
6576
+ name = finalPropName( origName );
6577
+ }
6578
+
6579
+ // Try prefixed name followed by the unprefixed name
6580
+ hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
6581
+
6582
+ // If a hook was provided get the computed value from there
6583
+ if ( hooks && "get" in hooks ) {
6584
+ val = hooks.get( elem, true, extra );
6585
+ }
6586
+
6587
+ // Otherwise, if a way to get the computed value exists, use that
6588
+ if ( val === undefined ) {
6589
+ val = curCSS( elem, name, styles );
6590
+ }
6591
+
6592
+ // Convert "normal" to computed value
6593
+ if ( val === "normal" && name in cssNormalTransform ) {
6594
+ val = cssNormalTransform[ name ];
6595
+ }
6596
+
6597
+ // Make numeric if forced or a qualifier was provided and val looks numeric
6598
+ if ( extra === "" || extra ) {
6599
+ num = parseFloat( val );
6600
+ return extra === true || isFinite( num ) ? num || 0 : val;
6601
+ }
6602
+
6603
+ return val;
6604
+ }
6605
+ } );
6606
+
6607
+ jQuery.each( [ "height", "width" ], function( i, name ) {
6608
+ jQuery.cssHooks[ name ] = {
6609
+ get: function( elem, computed, extra ) {
6610
+ if ( computed ) {
6611
+
6612
+ // Certain elements can have dimension info if we invisibly show them
6613
+ // but it must have a current display style that would benefit
6614
+ return rdisplayswap.test( jQuery.css( elem, "display" ) ) &&
6615
+
6616
+ // Support: Safari 8+
6617
+ // Table columns in Safari have non-zero offsetWidth & zero
6618
+ // getBoundingClientRect().width unless display is changed.
6619
+ // Support: IE <=11 only
6620
+ // Running getBoundingClientRect on a disconnected node
6621
+ // in IE throws an error.
6622
+ ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
6623
+ swap( elem, cssShow, function() {
6624
+ return getWidthOrHeight( elem, name, extra );
6625
+ } ) :
6626
+ getWidthOrHeight( elem, name, extra );
6627
+ }
6628
+ },
6629
+
6630
+ set: function( elem, value, extra ) {
6631
+ var matches,
6632
+ styles = extra && getStyles( elem ),
6633
+ subtract = extra && augmentWidthOrHeight(
6634
+ elem,
6635
+ name,
6636
+ extra,
6637
+ jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
6638
+ styles
6639
+ );
6640
+
6641
+ // Convert to pixels if value adjustment is needed
6642
+ if ( subtract && ( matches = rcssNum.exec( value ) ) &&
6643
+ ( matches[ 3 ] || "px" ) !== "px" ) {
6644
+
6645
+ elem.style[ name ] = value;
6646
+ value = jQuery.css( elem, name );
6647
+ }
6648
+
6649
+ return setPositiveNumber( elem, value, subtract );
6650
+ }
6651
+ };
6652
+ } );
6653
+
6654
+ jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
6655
+ function( elem, computed ) {
6656
+ if ( computed ) {
6657
+ return ( parseFloat( curCSS( elem, "marginLeft" ) ) ||
6658
+ elem.getBoundingClientRect().left -
6659
+ swap( elem, { marginLeft: 0 }, function() {
6660
+ return elem.getBoundingClientRect().left;
6661
+ } )
6662
+ ) + "px";
6663
+ }
6664
+ }
6665
+ );
6666
+
6667
+ // These hooks are used by animate to expand properties
6668
+ jQuery.each( {
6669
+ margin: "",
6670
+ padding: "",
6671
+ border: "Width"
6672
+ }, function( prefix, suffix ) {
6673
+ jQuery.cssHooks[ prefix + suffix ] = {
6674
+ expand: function( value ) {
6675
+ var i = 0,
6676
+ expanded = {},
6677
+
6678
+ // Assumes a single number if not a string
6679
+ parts = typeof value === "string" ? value.split( " " ) : [ value ];
6680
+
6681
+ for ( ; i < 4; i++ ) {
6682
+ expanded[ prefix + cssExpand[ i ] + suffix ] =
6683
+ parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
6684
+ }
6685
+
6686
+ return expanded;
6687
+ }
6688
+ };
6689
+
6690
+ if ( !rmargin.test( prefix ) ) {
6691
+ jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
6692
+ }
6693
+ } );
6694
+
6695
+ jQuery.fn.extend( {
6696
+ css: function( name, value ) {
6697
+ return access( this, function( elem, name, value ) {
6698
+ var styles, len,
6699
+ map = {},
6700
+ i = 0;
6701
+
6702
+ if ( Array.isArray( name ) ) {
6703
+ styles = getStyles( elem );
6704
+ len = name.length;
6705
+
6706
+ for ( ; i < len; i++ ) {
6707
+ map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
6708
+ }
6709
+
6710
+ return map;
6711
+ }
6712
+
6713
+ return value !== undefined ?
6714
+ jQuery.style( elem, name, value ) :
6715
+ jQuery.css( elem, name );
6716
+ }, name, value, arguments.length > 1 );
6717
+ }
6718
+ } );
6719
+
6720
+
6721
+ function Tween( elem, options, prop, end, easing ) {
6722
+ return new Tween.prototype.init( elem, options, prop, end, easing );
6723
+ }
6724
+ jQuery.Tween = Tween;
6725
+
6726
+ Tween.prototype = {
6727
+ constructor: Tween,
6728
+ init: function( elem, options, prop, end, easing, unit ) {
6729
+ this.elem = elem;
6730
+ this.prop = prop;
6731
+ this.easing = easing || jQuery.easing._default;
6732
+ this.options = options;
6733
+ this.start = this.now = this.cur();
6734
+ this.end = end;
6735
+ this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
6736
+ },
6737
+ cur: function() {
6738
+ var hooks = Tween.propHooks[ this.prop ];
6739
+
6740
+ return hooks && hooks.get ?
6741
+ hooks.get( this ) :
6742
+ Tween.propHooks._default.get( this );
6743
+ },
6744
+ run: function( percent ) {
6745
+ var eased,
6746
+ hooks = Tween.propHooks[ this.prop ];
6747
+
6748
+ if ( this.options.duration ) {
6749
+ this.pos = eased = jQuery.easing[ this.easing ](
6750
+ percent, this.options.duration * percent, 0, 1, this.options.duration
6751
+ );
6752
+ } else {
6753
+ this.pos = eased = percent;
6754
+ }
6755
+ this.now = ( this.end - this.start ) * eased + this.start;
6756
+
6757
+ if ( this.options.step ) {
6758
+ this.options.step.call( this.elem, this.now, this );
6759
+ }
6760
+
6761
+ if ( hooks && hooks.set ) {
6762
+ hooks.set( this );
6763
+ } else {
6764
+ Tween.propHooks._default.set( this );
6765
+ }
6766
+ return this;
6767
+ }
6768
+ };
6769
+
6770
+ Tween.prototype.init.prototype = Tween.prototype;
6771
+
6772
+ Tween.propHooks = {
6773
+ _default: {
6774
+ get: function( tween ) {
6775
+ var result;
6776
+
6777
+ // Use a property on the element directly when it is not a DOM element,
6778
+ // or when there is no matching style property that exists.
6779
+ if ( tween.elem.nodeType !== 1 ||
6780
+ tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {
6781
+ return tween.elem[ tween.prop ];
6782
+ }
6783
+
6784
+ // Passing an empty string as a 3rd parameter to .css will automatically
6785
+ // attempt a parseFloat and fallback to a string if the parse fails.
6786
+ // Simple values such as "10px" are parsed to Float;
6787
+ // complex values such as "rotate(1rad)" are returned as-is.
6788
+ result = jQuery.css( tween.elem, tween.prop, "" );
6789
+
6790
+ // Empty strings, null, undefined and "auto" are converted to 0.
6791
+ return !result || result === "auto" ? 0 : result;
6792
+ },
6793
+ set: function( tween ) {
6794
+
6795
+ // Use step hook for back compat.
6796
+ // Use cssHook if its there.
6797
+ // Use .style if available and use plain properties where available.
6798
+ if ( jQuery.fx.step[ tween.prop ] ) {
6799
+ jQuery.fx.step[ tween.prop ]( tween );
6800
+ } else if ( tween.elem.nodeType === 1 &&
6801
+ ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null ||
6802
+ jQuery.cssHooks[ tween.prop ] ) ) {
6803
+ jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
6804
+ } else {
6805
+ tween.elem[ tween.prop ] = tween.now;
6806
+ }
6807
+ }
6808
+ }
6809
+ };
6810
+
6811
+ // Support: IE <=9 only
6812
+ // Panic based approach to setting things on disconnected nodes
6813
+ Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
6814
+ set: function( tween ) {
6815
+ if ( tween.elem.nodeType && tween.elem.parentNode ) {
6816
+ tween.elem[ tween.prop ] = tween.now;
6817
+ }
6818
+ }
6819
+ };
6820
+
6821
+ jQuery.easing = {
6822
+ linear: function( p ) {
6823
+ return p;
6824
+ },
6825
+ swing: function( p ) {
6826
+ return 0.5 - Math.cos( p * Math.PI ) / 2;
6827
+ },
6828
+ _default: "swing"
6829
+ };
6830
+
6831
+ jQuery.fx = Tween.prototype.init;
6832
+
6833
+ // Back compat <1.8 extension point
6834
+ jQuery.fx.step = {};
6835
+
6836
+
6837
+
6838
+
6839
+ var
6840
+ fxNow, inProgress,
6841
+ rfxtypes = /^(?:toggle|show|hide)$/,
6842
+ rrun = /queueHooks$/;
6843
+
6844
+ function schedule() {
6845
+ if ( inProgress ) {
6846
+ if ( document.hidden === false && window.requestAnimationFrame ) {
6847
+ window.requestAnimationFrame( schedule );
6848
+ } else {
6849
+ window.setTimeout( schedule, jQuery.fx.interval );
6850
+ }
6851
+
6852
+ jQuery.fx.tick();
6853
+ }
6854
+ }
6855
+
6856
+ // Animations created synchronously will run synchronously
6857
+ function createFxNow() {
6858
+ window.setTimeout( function() {
6859
+ fxNow = undefined;
6860
+ } );
6861
+ return ( fxNow = jQuery.now() );
6862
+ }
6863
+
6864
+ // Generate parameters to create a standard animation
6865
+ function genFx( type, includeWidth ) {
6866
+ var which,
6867
+ i = 0,
6868
+ attrs = { height: type };
6869
+
6870
+ // If we include width, step value is 1 to do all cssExpand values,
6871
+ // otherwise step value is 2 to skip over Left and Right
6872
+ includeWidth = includeWidth ? 1 : 0;
6873
+ for ( ; i < 4; i += 2 - includeWidth ) {
6874
+ which = cssExpand[ i ];
6875
+ attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
6876
+ }
6877
+
6878
+ if ( includeWidth ) {
6879
+ attrs.opacity = attrs.width = type;
6880
+ }
6881
+
6882
+ return attrs;
6883
+ }
6884
+
6885
+ function createTween( value, prop, animation ) {
6886
+ var tween,
6887
+ collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ),
6888
+ index = 0,
6889
+ length = collection.length;
6890
+ for ( ; index < length; index++ ) {
6891
+ if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {
6892
+
6893
+ // We're done with this property
6894
+ return tween;
6895
+ }
6896
+ }
6897
+ }
6898
+
6899
+ function defaultPrefilter( elem, props, opts ) {
6900
+ var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,
6901
+ isBox = "width" in props || "height" in props,
6902
+ anim = this,
6903
+ orig = {},
6904
+ style = elem.style,
6905
+ hidden = elem.nodeType && isHiddenWithinTree( elem ),
6906
+ dataShow = dataPriv.get( elem, "fxshow" );
6907
+
6908
+ // Queue-skipping animations hijack the fx hooks
6909
+ if ( !opts.queue ) {
6910
+ hooks = jQuery._queueHooks( elem, "fx" );
6911
+ if ( hooks.unqueued == null ) {
6912
+ hooks.unqueued = 0;
6913
+ oldfire = hooks.empty.fire;
6914
+ hooks.empty.fire = function() {
6915
+ if ( !hooks.unqueued ) {
6916
+ oldfire();
6917
+ }
6918
+ };
6919
+ }
6920
+ hooks.unqueued++;
6921
+
6922
+ anim.always( function() {
6923
+
6924
+ // Ensure the complete handler is called before this completes
6925
+ anim.always( function() {
6926
+ hooks.unqueued--;
6927
+ if ( !jQuery.queue( elem, "fx" ).length ) {
6928
+ hooks.empty.fire();
6929
+ }
6930
+ } );
6931
+ } );
6932
+ }
6933
+
6934
+ // Detect show/hide animations
6935
+ for ( prop in props ) {
6936
+ value = props[ prop ];
6937
+ if ( rfxtypes.test( value ) ) {
6938
+ delete props[ prop ];
6939
+ toggle = toggle || value === "toggle";
6940
+ if ( value === ( hidden ? "hide" : "show" ) ) {
6941
+
6942
+ // Pretend to be hidden if this is a "show" and
6943
+ // there is still data from a stopped show/hide
6944
+ if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
6945
+ hidden = true;
6946
+
6947
+ // Ignore all other no-op show/hide data
6948
+ } else {
6949
+ continue;
6950
+ }
6951
+ }
6952
+ orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
6953
+ }
6954
+ }
6955
+
6956
+ // Bail out if this is a no-op like .hide().hide()
6957
+ propTween = !jQuery.isEmptyObject( props );
6958
+ if ( !propTween && jQuery.isEmptyObject( orig ) ) {
6959
+ return;
6960
+ }
6961
+
6962
+ // Restrict "overflow" and "display" styles during box animations
6963
+ if ( isBox && elem.nodeType === 1 ) {
6964
+
6965
+ // Support: IE <=9 - 11, Edge 12 - 13
6966
+ // Record all 3 overflow attributes because IE does not infer the shorthand
6967
+ // from identically-valued overflowX and overflowY
6968
+ opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
6969
+
6970
+ // Identify a display type, preferring old show/hide data over the CSS cascade
6971
+ restoreDisplay = dataShow && dataShow.display;
6972
+ if ( restoreDisplay == null ) {
6973
+ restoreDisplay = dataPriv.get( elem, "display" );
6974
+ }
6975
+ display = jQuery.css( elem, "display" );
6976
+ if ( display === "none" ) {
6977
+ if ( restoreDisplay ) {
6978
+ display = restoreDisplay;
6979
+ } else {
6980
+
6981
+ // Get nonempty value(s) by temporarily forcing visibility
6982
+ showHide( [ elem ], true );
6983
+ restoreDisplay = elem.style.display || restoreDisplay;
6984
+ display = jQuery.css( elem, "display" );
6985
+ showHide( [ elem ] );
6986
+ }
6987
+ }
6988
+
6989
+ // Animate inline elements as inline-block
6990
+ if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) {
6991
+ if ( jQuery.css( elem, "float" ) === "none" ) {
6992
+
6993
+ // Restore the original display value at the end of pure show/hide animations
6994
+ if ( !propTween ) {
6995
+ anim.done( function() {
6996
+ style.display = restoreDisplay;
6997
+ } );
6998
+ if ( restoreDisplay == null ) {
6999
+ display = style.display;
7000
+ restoreDisplay = display === "none" ? "" : display;
7001
+ }
7002
+ }
7003
+ style.display = "inline-block";
7004
+ }
7005
+ }
7006
+ }
7007
+
7008
+ if ( opts.overflow ) {
7009
+ style.overflow = "hidden";
7010
+ anim.always( function() {
7011
+ style.overflow = opts.overflow[ 0 ];
7012
+ style.overflowX = opts.overflow[ 1 ];
7013
+ style.overflowY = opts.overflow[ 2 ];
7014
+ } );
7015
+ }
7016
+
7017
+ // Implement show/hide animations
7018
+ propTween = false;
7019
+ for ( prop in orig ) {
7020
+
7021
+ // General show/hide setup for this element animation
7022
+ if ( !propTween ) {
7023
+ if ( dataShow ) {
7024
+ if ( "hidden" in dataShow ) {
7025
+ hidden = dataShow.hidden;
7026
+ }
7027
+ } else {
7028
+ dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } );
7029
+ }
7030
+
7031
+ // Store hidden/visible for toggle so `.stop().toggle()` "reverses"
7032
+ if ( toggle ) {
7033
+ dataShow.hidden = !hidden;
7034
+ }
7035
+
7036
+ // Show elements before animating them
7037
+ if ( hidden ) {
7038
+ showHide( [ elem ], true );
7039
+ }
7040
+
7041
+ /* eslint-disable no-loop-func */
7042
+
7043
+ anim.done( function() {
7044
+
7045
+ /* eslint-enable no-loop-func */
7046
+
7047
+ // The final step of a "hide" animation is actually hiding the element
7048
+ if ( !hidden ) {
7049
+ showHide( [ elem ] );
7050
+ }
7051
+ dataPriv.remove( elem, "fxshow" );
7052
+ for ( prop in orig ) {
7053
+ jQuery.style( elem, prop, orig[ prop ] );
7054
+ }
7055
+ } );
7056
+ }
7057
+
7058
+ // Per-property setup
7059
+ propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
7060
+ if ( !( prop in dataShow ) ) {
7061
+ dataShow[ prop ] = propTween.start;
7062
+ if ( hidden ) {
7063
+ propTween.end = propTween.start;
7064
+ propTween.start = 0;
7065
+ }
7066
+ }
7067
+ }
7068
+ }
7069
+
7070
+ function propFilter( props, specialEasing ) {
7071
+ var index, name, easing, value, hooks;
7072
+
7073
+ // camelCase, specialEasing and expand cssHook pass
7074
+ for ( index in props ) {
7075
+ name = jQuery.camelCase( index );
7076
+ easing = specialEasing[ name ];
7077
+ value = props[ index ];
7078
+ if ( Array.isArray( value ) ) {
7079
+ easing = value[ 1 ];
7080
+ value = props[ index ] = value[ 0 ];
7081
+ }
7082
+
7083
+ if ( index !== name ) {
7084
+ props[ name ] = value;
7085
+ delete props[ index ];
7086
+ }
7087
+
7088
+ hooks = jQuery.cssHooks[ name ];
7089
+ if ( hooks && "expand" in hooks ) {
7090
+ value = hooks.expand( value );
7091
+ delete props[ name ];
7092
+
7093
+ // Not quite $.extend, this won't overwrite existing keys.
7094
+ // Reusing 'index' because we have the correct "name"
7095
+ for ( index in value ) {
7096
+ if ( !( index in props ) ) {
7097
+ props[ index ] = value[ index ];
7098
+ specialEasing[ index ] = easing;
7099
+ }
7100
+ }
7101
+ } else {
7102
+ specialEasing[ name ] = easing;
7103
+ }
7104
+ }
7105
+ }
7106
+
7107
+ function Animation( elem, properties, options ) {
7108
+ var result,
7109
+ stopped,
7110
+ index = 0,
7111
+ length = Animation.prefilters.length,
7112
+ deferred = jQuery.Deferred().always( function() {
7113
+
7114
+ // Don't match elem in the :animated selector
7115
+ delete tick.elem;
7116
+ } ),
7117
+ tick = function() {
7118
+ if ( stopped ) {
7119
+ return false;
7120
+ }
7121
+ var currentTime = fxNow || createFxNow(),
7122
+ remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
7123
+
7124
+ // Support: Android 2.3 only
7125
+ // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
7126
+ temp = remaining / animation.duration || 0,
7127
+ percent = 1 - temp,
7128
+ index = 0,
7129
+ length = animation.tweens.length;
7130
+
7131
+ for ( ; index < length; index++ ) {
7132
+ animation.tweens[ index ].run( percent );
7133
+ }
7134
+
7135
+ deferred.notifyWith( elem, [ animation, percent, remaining ] );
7136
+
7137
+ // If there's more to do, yield
7138
+ if ( percent < 1 && length ) {
7139
+ return remaining;
7140
+ }
7141
+
7142
+ // If this was an empty animation, synthesize a final progress notification
7143
+ if ( !length ) {
7144
+ deferred.notifyWith( elem, [ animation, 1, 0 ] );
7145
+ }
7146
+
7147
+ // Resolve the animation and report its conclusion
7148
+ deferred.resolveWith( elem, [ animation ] );
7149
+ return false;
7150
+ },
7151
+ animation = deferred.promise( {
7152
+ elem: elem,
7153
+ props: jQuery.extend( {}, properties ),
7154
+ opts: jQuery.extend( true, {
7155
+ specialEasing: {},
7156
+ easing: jQuery.easing._default
7157
+ }, options ),
7158
+ originalProperties: properties,
7159
+ originalOptions: options,
7160
+ startTime: fxNow || createFxNow(),
7161
+ duration: options.duration,
7162
+ tweens: [],
7163
+ createTween: function( prop, end ) {
7164
+ var tween = jQuery.Tween( elem, animation.opts, prop, end,
7165
+ animation.opts.specialEasing[ prop ] || animation.opts.easing );
7166
+ animation.tweens.push( tween );
7167
+ return tween;
7168
+ },
7169
+ stop: function( gotoEnd ) {
7170
+ var index = 0,
7171
+
7172
+ // If we are going to the end, we want to run all the tweens
7173
+ // otherwise we skip this part
7174
+ length = gotoEnd ? animation.tweens.length : 0;
7175
+ if ( stopped ) {
7176
+ return this;
7177
+ }
7178
+ stopped = true;
7179
+ for ( ; index < length; index++ ) {
7180
+ animation.tweens[ index ].run( 1 );
7181
+ }
7182
+
7183
+ // Resolve when we played the last frame; otherwise, reject
7184
+ if ( gotoEnd ) {
7185
+ deferred.notifyWith( elem, [ animation, 1, 0 ] );
7186
+ deferred.resolveWith( elem, [ animation, gotoEnd ] );
7187
+ } else {
7188
+ deferred.rejectWith( elem, [ animation, gotoEnd ] );
7189
+ }
7190
+ return this;
7191
+ }
7192
+ } ),
7193
+ props = animation.props;
7194
+
7195
+ propFilter( props, animation.opts.specialEasing );
7196
+
7197
+ for ( ; index < length; index++ ) {
7198
+ result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );
7199
+ if ( result ) {
7200
+ if ( jQuery.isFunction( result.stop ) ) {
7201
+ jQuery._queueHooks( animation.elem, animation.opts.queue ).stop =
7202
+ jQuery.proxy( result.stop, result );
7203
+ }
7204
+ return result;
7205
+ }
7206
+ }
7207
+
7208
+ jQuery.map( props, createTween, animation );
7209
+
7210
+ if ( jQuery.isFunction( animation.opts.start ) ) {
7211
+ animation.opts.start.call( elem, animation );
7212
+ }
7213
+
7214
+ // Attach callbacks from options
7215
+ animation
7216
+ .progress( animation.opts.progress )
7217
+ .done( animation.opts.done, animation.opts.complete )
7218
+ .fail( animation.opts.fail )
7219
+ .always( animation.opts.always );
7220
+
7221
+ jQuery.fx.timer(
7222
+ jQuery.extend( tick, {
7223
+ elem: elem,
7224
+ anim: animation,
7225
+ queue: animation.opts.queue
7226
+ } )
7227
+ );
7228
+
7229
+ return animation;
7230
+ }
7231
+
7232
+ jQuery.Animation = jQuery.extend( Animation, {
7233
+
7234
+ tweeners: {
7235
+ "*": [ function( prop, value ) {
7236
+ var tween = this.createTween( prop, value );
7237
+ adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );
7238
+ return tween;
7239
+ } ]
7240
+ },
7241
+
7242
+ tweener: function( props, callback ) {
7243
+ if ( jQuery.isFunction( props ) ) {
7244
+ callback = props;
7245
+ props = [ "*" ];
7246
+ } else {
7247
+ props = props.match( rnothtmlwhite );
7248
+ }
7249
+
7250
+ var prop,
7251
+ index = 0,
7252
+ length = props.length;
7253
+
7254
+ for ( ; index < length; index++ ) {
7255
+ prop = props[ index ];
7256
+ Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];
7257
+ Animation.tweeners[ prop ].unshift( callback );
7258
+ }
7259
+ },
7260
+
7261
+ prefilters: [ defaultPrefilter ],
7262
+
7263
+ prefilter: function( callback, prepend ) {
7264
+ if ( prepend ) {
7265
+ Animation.prefilters.unshift( callback );
7266
+ } else {
7267
+ Animation.prefilters.push( callback );
7268
+ }
7269
+ }
7270
+ } );
7271
+
7272
+ jQuery.speed = function( speed, easing, fn ) {
7273
+ var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
7274
+ complete: fn || !fn && easing ||
7275
+ jQuery.isFunction( speed ) && speed,
7276
+ duration: speed,
7277
+ easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
7278
+ };
7279
+
7280
+ // Go to the end state if fx are off
7281
+ if ( jQuery.fx.off ) {
7282
+ opt.duration = 0;
7283
+
7284
+ } else {
7285
+ if ( typeof opt.duration !== "number" ) {
7286
+ if ( opt.duration in jQuery.fx.speeds ) {
7287
+ opt.duration = jQuery.fx.speeds[ opt.duration ];
7288
+
7289
+ } else {
7290
+ opt.duration = jQuery.fx.speeds._default;
7291
+ }
7292
+ }
7293
+ }
7294
+
7295
+ // Normalize opt.queue - true/undefined/null -> "fx"
7296
+ if ( opt.queue == null || opt.queue === true ) {
7297
+ opt.queue = "fx";
7298
+ }
7299
+
7300
+ // Queueing
7301
+ opt.old = opt.complete;
7302
+
7303
+ opt.complete = function() {
7304
+ if ( jQuery.isFunction( opt.old ) ) {
7305
+ opt.old.call( this );
7306
+ }
7307
+
7308
+ if ( opt.queue ) {
7309
+ jQuery.dequeue( this, opt.queue );
7310
+ }
7311
+ };
7312
+
7313
+ return opt;
7314
+ };
7315
+
7316
+ jQuery.fn.extend( {
7317
+ fadeTo: function( speed, to, easing, callback ) {
7318
+
7319
+ // Show any hidden elements after setting opacity to 0
7320
+ return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show()
7321
+
7322
+ // Animate to the value specified
7323
+ .end().animate( { opacity: to }, speed, easing, callback );
7324
+ },
7325
+ animate: function( prop, speed, easing, callback ) {
7326
+ var empty = jQuery.isEmptyObject( prop ),
7327
+ optall = jQuery.speed( speed, easing, callback ),
7328
+ doAnimation = function() {
7329
+
7330
+ // Operate on a copy of prop so per-property easing won't be lost
7331
+ var anim = Animation( this, jQuery.extend( {}, prop ), optall );
7332
+
7333
+ // Empty animations, or finishing resolves immediately
7334
+ if ( empty || dataPriv.get( this, "finish" ) ) {
7335
+ anim.stop( true );
7336
+ }
7337
+ };
7338
+ doAnimation.finish = doAnimation;
7339
+
7340
+ return empty || optall.queue === false ?
7341
+ this.each( doAnimation ) :
7342
+ this.queue( optall.queue, doAnimation );
7343
+ },
7344
+ stop: function( type, clearQueue, gotoEnd ) {
7345
+ var stopQueue = function( hooks ) {
7346
+ var stop = hooks.stop;
7347
+ delete hooks.stop;
7348
+ stop( gotoEnd );
7349
+ };
7350
+
7351
+ if ( typeof type !== "string" ) {
7352
+ gotoEnd = clearQueue;
7353
+ clearQueue = type;
7354
+ type = undefined;
7355
+ }
7356
+ if ( clearQueue && type !== false ) {
7357
+ this.queue( type || "fx", [] );
7358
+ }
7359
+
7360
+ return this.each( function() {
7361
+ var dequeue = true,
7362
+ index = type != null && type + "queueHooks",
7363
+ timers = jQuery.timers,
7364
+ data = dataPriv.get( this );
7365
+
7366
+ if ( index ) {
7367
+ if ( data[ index ] && data[ index ].stop ) {
7368
+ stopQueue( data[ index ] );
7369
+ }
7370
+ } else {
7371
+ for ( index in data ) {
7372
+ if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
7373
+ stopQueue( data[ index ] );
7374
+ }
7375
+ }
7376
+ }
7377
+
7378
+ for ( index = timers.length; index--; ) {
7379
+ if ( timers[ index ].elem === this &&
7380
+ ( type == null || timers[ index ].queue === type ) ) {
7381
+
7382
+ timers[ index ].anim.stop( gotoEnd );
7383
+ dequeue = false;
7384
+ timers.splice( index, 1 );
7385
+ }
7386
+ }
7387
+
7388
+ // Start the next in the queue if the last step wasn't forced.
7389
+ // Timers currently will call their complete callbacks, which
7390
+ // will dequeue but only if they were gotoEnd.
7391
+ if ( dequeue || !gotoEnd ) {
7392
+ jQuery.dequeue( this, type );
7393
+ }
7394
+ } );
7395
+ },
7396
+ finish: function( type ) {
7397
+ if ( type !== false ) {
7398
+ type = type || "fx";
7399
+ }
7400
+ return this.each( function() {
7401
+ var index,
7402
+ data = dataPriv.get( this ),
7403
+ queue = data[ type + "queue" ],
7404
+ hooks = data[ type + "queueHooks" ],
7405
+ timers = jQuery.timers,
7406
+ length = queue ? queue.length : 0;
7407
+
7408
+ // Enable finishing flag on private data
7409
+ data.finish = true;
7410
+
7411
+ // Empty the queue first
7412
+ jQuery.queue( this, type, [] );
7413
+
7414
+ if ( hooks && hooks.stop ) {
7415
+ hooks.stop.call( this, true );
7416
+ }
7417
+
7418
+ // Look for any active animations, and finish them
7419
+ for ( index = timers.length; index--; ) {
7420
+ if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
7421
+ timers[ index ].anim.stop( true );
7422
+ timers.splice( index, 1 );
7423
+ }
7424
+ }
7425
+
7426
+ // Look for any animations in the old queue and finish them
7427
+ for ( index = 0; index < length; index++ ) {
7428
+ if ( queue[ index ] && queue[ index ].finish ) {
7429
+ queue[ index ].finish.call( this );
7430
+ }
7431
+ }
7432
+
7433
+ // Turn off finishing flag
7434
+ delete data.finish;
7435
+ } );
7436
+ }
7437
+ } );
7438
+
7439
+ jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) {
7440
+ var cssFn = jQuery.fn[ name ];
7441
+ jQuery.fn[ name ] = function( speed, easing, callback ) {
7442
+ return speed == null || typeof speed === "boolean" ?
7443
+ cssFn.apply( this, arguments ) :
7444
+ this.animate( genFx( name, true ), speed, easing, callback );
7445
+ };
7446
+ } );
7447
+
7448
+ // Generate shortcuts for custom animations
7449
+ jQuery.each( {
7450
+ slideDown: genFx( "show" ),
7451
+ slideUp: genFx( "hide" ),
7452
+ slideToggle: genFx( "toggle" ),
7453
+ fadeIn: { opacity: "show" },
7454
+ fadeOut: { opacity: "hide" },
7455
+ fadeToggle: { opacity: "toggle" }
7456
+ }, function( name, props ) {
7457
+ jQuery.fn[ name ] = function( speed, easing, callback ) {
7458
+ return this.animate( props, speed, easing, callback );
7459
+ };
7460
+ } );
7461
+
7462
+ jQuery.timers = [];
7463
+ jQuery.fx.tick = function() {
7464
+ var timer,
7465
+ i = 0,
7466
+ timers = jQuery.timers;
7467
+
7468
+ fxNow = jQuery.now();
7469
+
7470
+ for ( ; i < timers.length; i++ ) {
7471
+ timer = timers[ i ];
7472
+
7473
+ // Run the timer and safely remove it when done (allowing for external removal)
7474
+ if ( !timer() && timers[ i ] === timer ) {
7475
+ timers.splice( i--, 1 );
7476
+ }
7477
+ }
7478
+
7479
+ if ( !timers.length ) {
7480
+ jQuery.fx.stop();
7481
+ }
7482
+ fxNow = undefined;
7483
+ };
7484
+
7485
+ jQuery.fx.timer = function( timer ) {
7486
+ jQuery.timers.push( timer );
7487
+ jQuery.fx.start();
7488
+ };
7489
+
7490
+ jQuery.fx.interval = 13;
7491
+ jQuery.fx.start = function() {
7492
+ if ( inProgress ) {
7493
+ return;
7494
+ }
7495
+
7496
+ inProgress = true;
7497
+ schedule();
7498
+ };
7499
+
7500
+ jQuery.fx.stop = function() {
7501
+ inProgress = null;
7502
+ };
7503
+
7504
+ jQuery.fx.speeds = {
7505
+ slow: 600,
7506
+ fast: 200,
7507
+
7508
+ // Default speed
7509
+ _default: 400
7510
+ };
7511
+
7512
+
7513
+ // Based off of the plugin by Clint Helfers, with permission.
7514
+ // https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
7515
+ jQuery.fn.delay = function( time, type ) {
7516
+ time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
7517
+ type = type || "fx";
7518
+
7519
+ return this.queue( type, function( next, hooks ) {
7520
+ var timeout = window.setTimeout( next, time );
7521
+ hooks.stop = function() {
7522
+ window.clearTimeout( timeout );
7523
+ };
7524
+ } );
7525
+ };
7526
+
7527
+
7528
+ ( function() {
7529
+ var input = document.createElement( "input" ),
7530
+ select = document.createElement( "select" ),
7531
+ opt = select.appendChild( document.createElement( "option" ) );
7532
+
7533
+ input.type = "checkbox";
7534
+
7535
+ // Support: Android <=4.3 only
7536
+ // Default value for a checkbox should be "on"
7537
+ support.checkOn = input.value !== "";
7538
+
7539
+ // Support: IE <=11 only
7540
+ // Must access selectedIndex to make default options select
7541
+ support.optSelected = opt.selected;
7542
+
7543
+ // Support: IE <=11 only
7544
+ // An input loses its value after becoming a radio
7545
+ input = document.createElement( "input" );
7546
+ input.value = "t";
7547
+ input.type = "radio";
7548
+ support.radioValue = input.value === "t";
7549
+ } )();
7550
+
7551
+
7552
+ var boolHook,
7553
+ attrHandle = jQuery.expr.attrHandle;
7554
+
7555
+ jQuery.fn.extend( {
7556
+ attr: function( name, value ) {
7557
+ return access( this, jQuery.attr, name, value, arguments.length > 1 );
7558
+ },
7559
+
7560
+ removeAttr: function( name ) {
7561
+ return this.each( function() {
7562
+ jQuery.removeAttr( this, name );
7563
+ } );
7564
+ }
7565
+ } );
7566
+
7567
+ jQuery.extend( {
7568
+ attr: function( elem, name, value ) {
7569
+ var ret, hooks,
7570
+ nType = elem.nodeType;
7571
+
7572
+ // Don't get/set attributes on text, comment and attribute nodes
7573
+ if ( nType === 3 || nType === 8 || nType === 2 ) {
7574
+ return;
7575
+ }
7576
+
7577
+ // Fallback to prop when attributes are not supported
7578
+ if ( typeof elem.getAttribute === "undefined" ) {
7579
+ return jQuery.prop( elem, name, value );
7580
+ }
7581
+
7582
+ // Attribute hooks are determined by the lowercase version
7583
+ // Grab necessary hook if one is defined
7584
+ if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
7585
+ hooks = jQuery.attrHooks[ name.toLowerCase() ] ||
7586
+ ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );
7587
+ }
7588
+
7589
+ if ( value !== undefined ) {
7590
+ if ( value === null ) {
7591
+ jQuery.removeAttr( elem, name );
7592
+ return;
7593
+ }
7594
+
7595
+ if ( hooks && "set" in hooks &&
7596
+ ( ret = hooks.set( elem, value, name ) ) !== undefined ) {
7597
+ return ret;
7598
+ }
7599
+
7600
+ elem.setAttribute( name, value + "" );
7601
+ return value;
7602
+ }
7603
+
7604
+ if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
7605
+ return ret;
7606
+ }
7607
+
7608
+ ret = jQuery.find.attr( elem, name );
7609
+
7610
+ // Non-existent attributes return null, we normalize to undefined
7611
+ return ret == null ? undefined : ret;
7612
+ },
7613
+
7614
+ attrHooks: {
7615
+ type: {
7616
+ set: function( elem, value ) {
7617
+ if ( !support.radioValue && value === "radio" &&
7618
+ nodeName( elem, "input" ) ) {
7619
+ var val = elem.value;
7620
+ elem.setAttribute( "type", value );
7621
+ if ( val ) {
7622
+ elem.value = val;
7623
+ }
7624
+ return value;
7625
+ }
7626
+ }
7627
+ }
7628
+ },
7629
+
7630
+ removeAttr: function( elem, value ) {
7631
+ var name,
7632
+ i = 0,
7633
+
7634
+ // Attribute names can contain non-HTML whitespace characters
7635
+ // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2
7636
+ attrNames = value && value.match( rnothtmlwhite );
7637
+
7638
+ if ( attrNames && elem.nodeType === 1 ) {
7639
+ while ( ( name = attrNames[ i++ ] ) ) {
7640
+ elem.removeAttribute( name );
7641
+ }
7642
+ }
7643
+ }
7644
+ } );
7645
+
7646
+ // Hooks for boolean attributes
7647
+ boolHook = {
7648
+ set: function( elem, value, name ) {
7649
+ if ( value === false ) {
7650
+
7651
+ // Remove boolean attributes when set to false
7652
+ jQuery.removeAttr( elem, name );
7653
+ } else {
7654
+ elem.setAttribute( name, name );
7655
+ }
7656
+ return name;
7657
+ }
7658
+ };
7659
+
7660
+ jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
7661
+ var getter = attrHandle[ name ] || jQuery.find.attr;
7662
+
7663
+ attrHandle[ name ] = function( elem, name, isXML ) {
7664
+ var ret, handle,
7665
+ lowercaseName = name.toLowerCase();
7666
+
7667
+ if ( !isXML ) {
7668
+
7669
+ // Avoid an infinite loop by temporarily removing this function from the getter
7670
+ handle = attrHandle[ lowercaseName ];
7671
+ attrHandle[ lowercaseName ] = ret;
7672
+ ret = getter( elem, name, isXML ) != null ?
7673
+ lowercaseName :
7674
+ null;
7675
+ attrHandle[ lowercaseName ] = handle;
7676
+ }
7677
+ return ret;
7678
+ };
7679
+ } );
7680
+
7681
+
7682
+
7683
+
7684
+ var rfocusable = /^(?:input|select|textarea|button)$/i,
7685
+ rclickable = /^(?:a|area)$/i;
7686
+
7687
+ jQuery.fn.extend( {
7688
+ prop: function( name, value ) {
7689
+ return access( this, jQuery.prop, name, value, arguments.length > 1 );
7690
+ },
7691
+
7692
+ removeProp: function( name ) {
7693
+ return this.each( function() {
7694
+ delete this[ jQuery.propFix[ name ] || name ];
7695
+ } );
7696
+ }
7697
+ } );
7698
+
7699
+ jQuery.extend( {
7700
+ prop: function( elem, name, value ) {
7701
+ var ret, hooks,
7702
+ nType = elem.nodeType;
7703
+
7704
+ // Don't get/set properties on text, comment and attribute nodes
7705
+ if ( nType === 3 || nType === 8 || nType === 2 ) {
7706
+ return;
7707
+ }
7708
+
7709
+ if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
7710
+
7711
+ // Fix name and attach hooks
7712
+ name = jQuery.propFix[ name ] || name;
7713
+ hooks = jQuery.propHooks[ name ];
7714
+ }
7715
+
7716
+ if ( value !== undefined ) {
7717
+ if ( hooks && "set" in hooks &&
7718
+ ( ret = hooks.set( elem, value, name ) ) !== undefined ) {
7719
+ return ret;
7720
+ }
7721
+
7722
+ return ( elem[ name ] = value );
7723
+ }
7724
+
7725
+ if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
7726
+ return ret;
7727
+ }
7728
+
7729
+ return elem[ name ];
7730
+ },
7731
+
7732
+ propHooks: {
7733
+ tabIndex: {
7734
+ get: function( elem ) {
7735
+
7736
+ // Support: IE <=9 - 11 only
7737
+ // elem.tabIndex doesn't always return the
7738
+ // correct value when it hasn't been explicitly set
7739
+ // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
7740
+ // Use proper attribute retrieval(#12072)
7741
+ var tabindex = jQuery.find.attr( elem, "tabindex" );
7742
+
7743
+ if ( tabindex ) {
7744
+ return parseInt( tabindex, 10 );
7745
+ }
7746
+
7747
+ if (
7748
+ rfocusable.test( elem.nodeName ) ||
7749
+ rclickable.test( elem.nodeName ) &&
7750
+ elem.href
7751
+ ) {
7752
+ return 0;
7753
+ }
7754
+
7755
+ return -1;
7756
+ }
7757
+ }
7758
+ },
7759
+
7760
+ propFix: {
7761
+ "for": "htmlFor",
7762
+ "class": "className"
7763
+ }
7764
+ } );
7765
+
7766
+ // Support: IE <=11 only
7767
+ // Accessing the selectedIndex property
7768
+ // forces the browser to respect setting selected
7769
+ // on the option
7770
+ // The getter ensures a default option is selected
7771
+ // when in an optgroup
7772
+ // eslint rule "no-unused-expressions" is disabled for this code
7773
+ // since it considers such accessions noop
7774
+ if ( !support.optSelected ) {
7775
+ jQuery.propHooks.selected = {
7776
+ get: function( elem ) {
7777
+
7778
+ /* eslint no-unused-expressions: "off" */
7779
+
7780
+ var parent = elem.parentNode;
7781
+ if ( parent && parent.parentNode ) {
7782
+ parent.parentNode.selectedIndex;
7783
+ }
7784
+ return null;
7785
+ },
7786
+ set: function( elem ) {
7787
+
7788
+ /* eslint no-unused-expressions: "off" */
7789
+
7790
+ var parent = elem.parentNode;
7791
+ if ( parent ) {
7792
+ parent.selectedIndex;
7793
+
7794
+ if ( parent.parentNode ) {
7795
+ parent.parentNode.selectedIndex;
7796
+ }
7797
+ }
7798
+ }
7799
+ };
7800
+ }
7801
+
7802
+ jQuery.each( [
7803
+ "tabIndex",
7804
+ "readOnly",
7805
+ "maxLength",
7806
+ "cellSpacing",
7807
+ "cellPadding",
7808
+ "rowSpan",
7809
+ "colSpan",
7810
+ "useMap",
7811
+ "frameBorder",
7812
+ "contentEditable"
7813
+ ], function() {
7814
+ jQuery.propFix[ this.toLowerCase() ] = this;
7815
+ } );
7816
+
7817
+
7818
+
7819
+
7820
+ // Strip and collapse whitespace according to HTML spec
7821
+ // https://html.spec.whatwg.org/multipage/infrastructure.html#strip-and-collapse-whitespace
7822
+ function stripAndCollapse( value ) {
7823
+ var tokens = value.match( rnothtmlwhite ) || [];
7824
+ return tokens.join( " " );
7825
+ }
7826
+
7827
+
7828
+ function getClass( elem ) {
7829
+ return elem.getAttribute && elem.getAttribute( "class" ) || "";
7830
+ }
7831
+
7832
+ jQuery.fn.extend( {
7833
+ addClass: function( value ) {
7834
+ var classes, elem, cur, curValue, clazz, j, finalValue,
7835
+ i = 0;
7836
+
7837
+ if ( jQuery.isFunction( value ) ) {
7838
+ return this.each( function( j ) {
7839
+ jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );
7840
+ } );
7841
+ }
7842
+
7843
+ if ( typeof value === "string" && value ) {
7844
+ classes = value.match( rnothtmlwhite ) || [];
7845
+
7846
+ while ( ( elem = this[ i++ ] ) ) {
7847
+ curValue = getClass( elem );
7848
+ cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
7849
+
7850
+ if ( cur ) {
7851
+ j = 0;
7852
+ while ( ( clazz = classes[ j++ ] ) ) {
7853
+ if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
7854
+ cur += clazz + " ";
7855
+ }
7856
+ }
7857
+
7858
+ // Only assign if different to avoid unneeded rendering.
7859
+ finalValue = stripAndCollapse( cur );
7860
+ if ( curValue !== finalValue ) {
7861
+ elem.setAttribute( "class", finalValue );
7862
+ }
7863
+ }
7864
+ }
7865
+ }
7866
+
7867
+ return this;
7868
+ },
7869
+
7870
+ removeClass: function( value ) {
7871
+ var classes, elem, cur, curValue, clazz, j, finalValue,
7872
+ i = 0;
7873
+
7874
+ if ( jQuery.isFunction( value ) ) {
7875
+ return this.each( function( j ) {
7876
+ jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );
7877
+ } );
7878
+ }
7879
+
7880
+ if ( !arguments.length ) {
7881
+ return this.attr( "class", "" );
7882
+ }
7883
+
7884
+ if ( typeof value === "string" && value ) {
7885
+ classes = value.match( rnothtmlwhite ) || [];
7886
+
7887
+ while ( ( elem = this[ i++ ] ) ) {
7888
+ curValue = getClass( elem );
7889
+
7890
+ // This expression is here for better compressibility (see addClass)
7891
+ cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
7892
+
7893
+ if ( cur ) {
7894
+ j = 0;
7895
+ while ( ( clazz = classes[ j++ ] ) ) {
7896
+
7897
+ // Remove *all* instances
7898
+ while ( cur.indexOf( " " + clazz + " " ) > -1 ) {
7899
+ cur = cur.replace( " " + clazz + " ", " " );
7900
+ }
7901
+ }
7902
+
7903
+ // Only assign if different to avoid unneeded rendering.
7904
+ finalValue = stripAndCollapse( cur );
7905
+ if ( curValue !== finalValue ) {
7906
+ elem.setAttribute( "class", finalValue );
7907
+ }
7908
+ }
7909
+ }
7910
+ }
7911
+
7912
+ return this;
7913
+ },
7914
+
7915
+ toggleClass: function( value, stateVal ) {
7916
+ var type = typeof value;
7917
+
7918
+ if ( typeof stateVal === "boolean" && type === "string" ) {
7919
+ return stateVal ? this.addClass( value ) : this.removeClass( value );
7920
+ }
7921
+
7922
+ if ( jQuery.isFunction( value ) ) {
7923
+ return this.each( function( i ) {
7924
+ jQuery( this ).toggleClass(
7925
+ value.call( this, i, getClass( this ), stateVal ),
7926
+ stateVal
7927
+ );
7928
+ } );
7929
+ }
7930
+
7931
+ return this.each( function() {
7932
+ var className, i, self, classNames;
7933
+
7934
+ if ( type === "string" ) {
7935
+
7936
+ // Toggle individual class names
7937
+ i = 0;
7938
+ self = jQuery( this );
7939
+ classNames = value.match( rnothtmlwhite ) || [];
7940
+
7941
+ while ( ( className = classNames[ i++ ] ) ) {
7942
+
7943
+ // Check each className given, space separated list
7944
+ if ( self.hasClass( className ) ) {
7945
+ self.removeClass( className );
7946
+ } else {
7947
+ self.addClass( className );
7948
+ }
7949
+ }
7950
+
7951
+ // Toggle whole class name
7952
+ } else if ( value === undefined || type === "boolean" ) {
7953
+ className = getClass( this );
7954
+ if ( className ) {
7955
+
7956
+ // Store className if set
7957
+ dataPriv.set( this, "__className__", className );
7958
+ }
7959
+
7960
+ // If the element has a class name or if we're passed `false`,
7961
+ // then remove the whole classname (if there was one, the above saved it).
7962
+ // Otherwise bring back whatever was previously saved (if anything),
7963
+ // falling back to the empty string if nothing was stored.
7964
+ if ( this.setAttribute ) {
7965
+ this.setAttribute( "class",
7966
+ className || value === false ?
7967
+ "" :
7968
+ dataPriv.get( this, "__className__" ) || ""
7969
+ );
7970
+ }
7971
+ }
7972
+ } );
7973
+ },
7974
+
7975
+ hasClass: function( selector ) {
7976
+ var className, elem,
7977
+ i = 0;
7978
+
7979
+ className = " " + selector + " ";
7980
+ while ( ( elem = this[ i++ ] ) ) {
7981
+ if ( elem.nodeType === 1 &&
7982
+ ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
7983
+ return true;
7984
+ }
7985
+ }
7986
+
7987
+ return false;
7988
+ }
7989
+ } );
7990
+
7991
+
7992
+
7993
+
7994
+ var rreturn = /\r/g;
7995
+
7996
+ jQuery.fn.extend( {
7997
+ val: function( value ) {
7998
+ var hooks, ret, isFunction,
7999
+ elem = this[ 0 ];
8000
+
8001
+ if ( !arguments.length ) {
8002
+ if ( elem ) {
8003
+ hooks = jQuery.valHooks[ elem.type ] ||
8004
+ jQuery.valHooks[ elem.nodeName.toLowerCase() ];
8005
+
8006
+ if ( hooks &&
8007
+ "get" in hooks &&
8008
+ ( ret = hooks.get( elem, "value" ) ) !== undefined
8009
+ ) {
8010
+ return ret;
8011
+ }
8012
+
8013
+ ret = elem.value;
8014
+
8015
+ // Handle most common string cases
8016
+ if ( typeof ret === "string" ) {
8017
+ return ret.replace( rreturn, "" );
8018
+ }
8019
+
8020
+ // Handle cases where value is null/undef or number
8021
+ return ret == null ? "" : ret;
8022
+ }
8023
+
8024
+ return;
8025
+ }
8026
+
8027
+ isFunction = jQuery.isFunction( value );
8028
+
8029
+ return this.each( function( i ) {
8030
+ var val;
8031
+
8032
+ if ( this.nodeType !== 1 ) {
8033
+ return;
8034
+ }
8035
+
8036
+ if ( isFunction ) {
8037
+ val = value.call( this, i, jQuery( this ).val() );
8038
+ } else {
8039
+ val = value;
8040
+ }
8041
+
8042
+ // Treat null/undefined as ""; convert numbers to string
8043
+ if ( val == null ) {
8044
+ val = "";
8045
+
8046
+ } else if ( typeof val === "number" ) {
8047
+ val += "";
8048
+
8049
+ } else if ( Array.isArray( val ) ) {
8050
+ val = jQuery.map( val, function( value ) {
8051
+ return value == null ? "" : value + "";
8052
+ } );
8053
+ }
8054
+
8055
+ hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
8056
+
8057
+ // If set returns undefined, fall back to normal setting
8058
+ if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) {
8059
+ this.value = val;
8060
+ }
8061
+ } );
8062
+ }
8063
+ } );
8064
+
8065
+ jQuery.extend( {
8066
+ valHooks: {
8067
+ option: {
8068
+ get: function( elem ) {
8069
+
8070
+ var val = jQuery.find.attr( elem, "value" );
8071
+ return val != null ?
8072
+ val :
8073
+
8074
+ // Support: IE <=10 - 11 only
8075
+ // option.text throws exceptions (#14686, #14858)
8076
+ // Strip and collapse whitespace
8077
+ // https://html.spec.whatwg.org/#strip-and-collapse-whitespace
8078
+ stripAndCollapse( jQuery.text( elem ) );
8079
+ }
8080
+ },
8081
+ select: {
8082
+ get: function( elem ) {
8083
+ var value, option, i,
8084
+ options = elem.options,
8085
+ index = elem.selectedIndex,
8086
+ one = elem.type === "select-one",
8087
+ values = one ? null : [],
8088
+ max = one ? index + 1 : options.length;
8089
+
8090
+ if ( index < 0 ) {
8091
+ i = max;
8092
+
8093
+ } else {
8094
+ i = one ? index : 0;
8095
+ }
8096
+
8097
+ // Loop through all the selected options
8098
+ for ( ; i < max; i++ ) {
8099
+ option = options[ i ];
8100
+
8101
+ // Support: IE <=9 only
8102
+ // IE8-9 doesn't update selected after form reset (#2551)
8103
+ if ( ( option.selected || i === index ) &&
8104
+
8105
+ // Don't return options that are disabled or in a disabled optgroup
8106
+ !option.disabled &&
8107
+ ( !option.parentNode.disabled ||
8108
+ !nodeName( option.parentNode, "optgroup" ) ) ) {
8109
+
8110
+ // Get the specific value for the option
8111
+ value = jQuery( option ).val();
8112
+
8113
+ // We don't need an array for one selects
8114
+ if ( one ) {
8115
+ return value;
8116
+ }
8117
+
8118
+ // Multi-Selects return an array
8119
+ values.push( value );
8120
+ }
8121
+ }
8122
+
8123
+ return values;
8124
+ },
8125
+
8126
+ set: function( elem, value ) {
8127
+ var optionSet, option,
8128
+ options = elem.options,
8129
+ values = jQuery.makeArray( value ),
8130
+ i = options.length;
8131
+
8132
+ while ( i-- ) {
8133
+ option = options[ i ];
8134
+
8135
+ /* eslint-disable no-cond-assign */
8136
+
8137
+ if ( option.selected =
8138
+ jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1
8139
+ ) {
8140
+ optionSet = true;
8141
+ }
8142
+
8143
+ /* eslint-enable no-cond-assign */
8144
+ }
8145
+
8146
+ // Force browsers to behave consistently when non-matching value is set
8147
+ if ( !optionSet ) {
8148
+ elem.selectedIndex = -1;
8149
+ }
8150
+ return values;
8151
+ }
8152
+ }
8153
+ }
8154
+ } );
8155
+
8156
+ // Radios and checkboxes getter/setter
8157
+ jQuery.each( [ "radio", "checkbox" ], function() {
8158
+ jQuery.valHooks[ this ] = {
8159
+ set: function( elem, value ) {
8160
+ if ( Array.isArray( value ) ) {
8161
+ return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );
8162
+ }
8163
+ }
8164
+ };
8165
+ if ( !support.checkOn ) {
8166
+ jQuery.valHooks[ this ].get = function( elem ) {
8167
+ return elem.getAttribute( "value" ) === null ? "on" : elem.value;
8168
+ };
8169
+ }
8170
+ } );
8171
+
8172
+
8173
+
8174
+
8175
+ // Return jQuery for attributes-only inclusion
8176
+
8177
+
8178
+ var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/;
8179
+
8180
+ jQuery.extend( jQuery.event, {
8181
+
8182
+ trigger: function( event, data, elem, onlyHandlers ) {
8183
+
8184
+ var i, cur, tmp, bubbleType, ontype, handle, special,
8185
+ eventPath = [ elem || document ],
8186
+ type = hasOwn.call( event, "type" ) ? event.type : event,
8187
+ namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : [];
8188
+
8189
+ cur = tmp = elem = elem || document;
8190
+
8191
+ // Don't do events on text and comment nodes
8192
+ if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
8193
+ return;
8194
+ }
8195
+
8196
+ // focus/blur morphs to focusin/out; ensure we're not firing them right now
8197
+ if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
8198
+ return;
8199
+ }
8200
+
8201
+ if ( type.indexOf( "." ) > -1 ) {
8202
+
8203
+ // Namespaced trigger; create a regexp to match event type in handle()
8204
+ namespaces = type.split( "." );
8205
+ type = namespaces.shift();
8206
+ namespaces.sort();
8207
+ }
8208
+ ontype = type.indexOf( ":" ) < 0 && "on" + type;
8209
+
8210
+ // Caller can pass in a jQuery.Event object, Object, or just an event type string
8211
+ event = event[ jQuery.expando ] ?
8212
+ event :
8213
+ new jQuery.Event( type, typeof event === "object" && event );
8214
+
8215
+ // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
8216
+ event.isTrigger = onlyHandlers ? 2 : 3;
8217
+ event.namespace = namespaces.join( "." );
8218
+ event.rnamespace = event.namespace ?
8219
+ new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) :
8220
+ null;
8221
+
8222
+ // Clean up the event in case it is being reused
8223
+ event.result = undefined;
8224
+ if ( !event.target ) {
8225
+ event.target = elem;
8226
+ }
8227
+
8228
+ // Clone any incoming data and prepend the event, creating the handler arg list
8229
+ data = data == null ?
8230
+ [ event ] :
8231
+ jQuery.makeArray( data, [ event ] );
8232
+
8233
+ // Allow special events to draw outside the lines
8234
+ special = jQuery.event.special[ type ] || {};
8235
+ if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
8236
+ return;
8237
+ }
8238
+
8239
+ // Determine event propagation path in advance, per W3C events spec (#9951)
8240
+ // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
8241
+ if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
8242
+
8243
+ bubbleType = special.delegateType || type;
8244
+ if ( !rfocusMorph.test( bubbleType + type ) ) {
8245
+ cur = cur.parentNode;
8246
+ }
8247
+ for ( ; cur; cur = cur.parentNode ) {
8248
+ eventPath.push( cur );
8249
+ tmp = cur;
8250
+ }
8251
+
8252
+ // Only add window if we got to document (e.g., not plain obj or detached DOM)
8253
+ if ( tmp === ( elem.ownerDocument || document ) ) {
8254
+ eventPath.push( tmp.defaultView || tmp.parentWindow || window );
8255
+ }
8256
+ }
8257
+
8258
+ // Fire handlers on the event path
8259
+ i = 0;
8260
+ while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {
8261
+
8262
+ event.type = i > 1 ?
8263
+ bubbleType :
8264
+ special.bindType || type;
8265
+
8266
+ // jQuery handler
8267
+ handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] &&
8268
+ dataPriv.get( cur, "handle" );
8269
+ if ( handle ) {
8270
+ handle.apply( cur, data );
8271
+ }
8272
+
8273
+ // Native handler
8274
+ handle = ontype && cur[ ontype ];
8275
+ if ( handle && handle.apply && acceptData( cur ) ) {
8276
+ event.result = handle.apply( cur, data );
8277
+ if ( event.result === false ) {
8278
+ event.preventDefault();
8279
+ }
8280
+ }
8281
+ }
8282
+ event.type = type;
8283
+
8284
+ // If nobody prevented the default action, do it now
8285
+ if ( !onlyHandlers && !event.isDefaultPrevented() ) {
8286
+
8287
+ if ( ( !special._default ||
8288
+ special._default.apply( eventPath.pop(), data ) === false ) &&
8289
+ acceptData( elem ) ) {
8290
+
8291
+ // Call a native DOM method on the target with the same name as the event.
8292
+ // Don't do default actions on window, that's where global variables be (#6170)
8293
+ if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {
8294
+
8295
+ // Don't re-trigger an onFOO event when we call its FOO() method
8296
+ tmp = elem[ ontype ];
8297
+
8298
+ if ( tmp ) {
8299
+ elem[ ontype ] = null;
8300
+ }
8301
+
8302
+ // Prevent re-triggering of the same event, since we already bubbled it above
8303
+ jQuery.event.triggered = type;
8304
+ elem[ type ]();
8305
+ jQuery.event.triggered = undefined;
8306
+
8307
+ if ( tmp ) {
8308
+ elem[ ontype ] = tmp;
8309
+ }
8310
+ }
8311
+ }
8312
+ }
8313
+
8314
+ return event.result;
8315
+ },
8316
+
8317
+ // Piggyback on a donor event to simulate a different one
8318
+ // Used only for `focus(in | out)` events
8319
+ simulate: function( type, elem, event ) {
8320
+ var e = jQuery.extend(
8321
+ new jQuery.Event(),
8322
+ event,
8323
+ {
8324
+ type: type,
8325
+ isSimulated: true
8326
+ }
8327
+ );
8328
+
8329
+ jQuery.event.trigger( e, null, elem );
8330
+ }
8331
+
8332
+ } );
8333
+
8334
+ jQuery.fn.extend( {
8335
+
8336
+ trigger: function( type, data ) {
8337
+ return this.each( function() {
8338
+ jQuery.event.trigger( type, data, this );
8339
+ } );
8340
+ },
8341
+ triggerHandler: function( type, data ) {
8342
+ var elem = this[ 0 ];
8343
+ if ( elem ) {
8344
+ return jQuery.event.trigger( type, data, elem, true );
8345
+ }
8346
+ }
8347
+ } );
8348
+
8349
+
8350
+ jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
8351
+ "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
8352
+ "change select submit keydown keypress keyup contextmenu" ).split( " " ),
8353
+ function( i, name ) {
8354
+
8355
+ // Handle event binding
8356
+ jQuery.fn[ name ] = function( data, fn ) {
8357
+ return arguments.length > 0 ?
8358
+ this.on( name, null, data, fn ) :
8359
+ this.trigger( name );
8360
+ };
8361
+ } );
8362
+
8363
+ jQuery.fn.extend( {
8364
+ hover: function( fnOver, fnOut ) {
8365
+ return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
8366
+ }
8367
+ } );
8368
+
8369
+
8370
+
8371
+
8372
+ support.focusin = "onfocusin" in window;
8373
+
8374
+
8375
+ // Support: Firefox <=44
8376
+ // Firefox doesn't have focus(in | out) events
8377
+ // Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
8378
+ //
8379
+ // Support: Chrome <=48 - 49, Safari <=9.0 - 9.1
8380
+ // focus(in | out) events fire after focus & blur events,
8381
+ // which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
8382
+ // Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857
8383
+ if ( !support.focusin ) {
8384
+ jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) {
8385
+
8386
+ // Attach a single capturing handler on the document while someone wants focusin/focusout
8387
+ var handler = function( event ) {
8388
+ jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );
8389
+ };
8390
+
8391
+ jQuery.event.special[ fix ] = {
8392
+ setup: function() {
8393
+ var doc = this.ownerDocument || this,
8394
+ attaches = dataPriv.access( doc, fix );
8395
+
8396
+ if ( !attaches ) {
8397
+ doc.addEventListener( orig, handler, true );
8398
+ }
8399
+ dataPriv.access( doc, fix, ( attaches || 0 ) + 1 );
8400
+ },
8401
+ teardown: function() {
8402
+ var doc = this.ownerDocument || this,
8403
+ attaches = dataPriv.access( doc, fix ) - 1;
8404
+
8405
+ if ( !attaches ) {
8406
+ doc.removeEventListener( orig, handler, true );
8407
+ dataPriv.remove( doc, fix );
8408
+
8409
+ } else {
8410
+ dataPriv.access( doc, fix, attaches );
8411
+ }
8412
+ }
8413
+ };
8414
+ } );
8415
+ }
8416
+ var location = window.location;
8417
+
8418
+ var nonce = jQuery.now();
8419
+
8420
+ var rquery = ( /\?/ );
8421
+
8422
+
8423
+
8424
+ // Cross-browser xml parsing
8425
+ jQuery.parseXML = function( data ) {
8426
+ var xml;
8427
+ if ( !data || typeof data !== "string" ) {
8428
+ return null;
8429
+ }
8430
+
8431
+ // Support: IE 9 - 11 only
8432
+ // IE throws on parseFromString with invalid input.
8433
+ try {
8434
+ xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
8435
+ } catch ( e ) {
8436
+ xml = undefined;
8437
+ }
8438
+
8439
+ if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
8440
+ jQuery.error( "Invalid XML: " + data );
8441
+ }
8442
+ return xml;
8443
+ };
8444
+
8445
+
8446
+ var
8447
+ rbracket = /\[\]$/,
8448
+ rCRLF = /\r?\n/g,
8449
+ rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
8450
+ rsubmittable = /^(?:input|select|textarea|keygen)/i;
8451
+
8452
+ function buildParams( prefix, obj, traditional, add ) {
8453
+ var name;
8454
+
8455
+ if ( Array.isArray( obj ) ) {
8456
+
8457
+ // Serialize array item.
8458
+ jQuery.each( obj, function( i, v ) {
8459
+ if ( traditional || rbracket.test( prefix ) ) {
8460
+
8461
+ // Treat each array item as a scalar.
8462
+ add( prefix, v );
8463
+
8464
+ } else {
8465
+
8466
+ // Item is non-scalar (array or object), encode its numeric index.
8467
+ buildParams(
8468
+ prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]",
8469
+ v,
8470
+ traditional,
8471
+ add
8472
+ );
8473
+ }
8474
+ } );
8475
+
8476
+ } else if ( !traditional && jQuery.type( obj ) === "object" ) {
8477
+
8478
+ // Serialize object item.
8479
+ for ( name in obj ) {
8480
+ buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
8481
+ }
8482
+
8483
+ } else {
8484
+
8485
+ // Serialize scalar item.
8486
+ add( prefix, obj );
8487
+ }
8488
+ }
8489
+
8490
+ // Serialize an array of form elements or a set of
8491
+ // key/values into a query string
8492
+ jQuery.param = function( a, traditional ) {
8493
+ var prefix,
8494
+ s = [],
8495
+ add = function( key, valueOrFunction ) {
8496
+
8497
+ // If value is a function, invoke it and use its return value
8498
+ var value = jQuery.isFunction( valueOrFunction ) ?
8499
+ valueOrFunction() :
8500
+ valueOrFunction;
8501
+
8502
+ s[ s.length ] = encodeURIComponent( key ) + "=" +
8503
+ encodeURIComponent( value == null ? "" : value );
8504
+ };
8505
+
8506
+ // If an array was passed in, assume that it is an array of form elements.
8507
+ if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
8508
+
8509
+ // Serialize the form elements
8510
+ jQuery.each( a, function() {
8511
+ add( this.name, this.value );
8512
+ } );
8513
+
8514
+ } else {
8515
+
8516
+ // If traditional, encode the "old" way (the way 1.3.2 or older
8517
+ // did it), otherwise encode params recursively.
8518
+ for ( prefix in a ) {
8519
+ buildParams( prefix, a[ prefix ], traditional, add );
8520
+ }
8521
+ }
8522
+
8523
+ // Return the resulting serialization
8524
+ return s.join( "&" );
8525
+ };
8526
+
8527
+ jQuery.fn.extend( {
8528
+ serialize: function() {
8529
+ return jQuery.param( this.serializeArray() );
8530
+ },
8531
+ serializeArray: function() {
8532
+ return this.map( function() {
8533
+
8534
+ // Can add propHook for "elements" to filter or add form elements
8535
+ var elements = jQuery.prop( this, "elements" );
8536
+ return elements ? jQuery.makeArray( elements ) : this;
8537
+ } )
8538
+ .filter( function() {
8539
+ var type = this.type;
8540
+
8541
+ // Use .is( ":disabled" ) so that fieldset[disabled] works
8542
+ return this.name && !jQuery( this ).is( ":disabled" ) &&
8543
+ rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
8544
+ ( this.checked || !rcheckableType.test( type ) );
8545
+ } )
8546
+ .map( function( i, elem ) {
8547
+ var val = jQuery( this ).val();
8548
+
8549
+ if ( val == null ) {
8550
+ return null;
8551
+ }
8552
+
8553
+ if ( Array.isArray( val ) ) {
8554
+ return jQuery.map( val, function( val ) {
8555
+ return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
8556
+ } );
8557
+ }
8558
+
8559
+ return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
8560
+ } ).get();
8561
+ }
8562
+ } );
8563
+
8564
+
8565
+ var
8566
+ r20 = /%20/g,
8567
+ rhash = /#.*$/,
8568
+ rantiCache = /([?&])_=[^&]*/,
8569
+ rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
8570
+
8571
+ // #7653, #8125, #8152: local protocol detection
8572
+ rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
8573
+ rnoContent = /^(?:GET|HEAD)$/,
8574
+ rprotocol = /^\/\//,
8575
+
8576
+ /* Prefilters
8577
+ * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
8578
+ * 2) These are called:
8579
+ * - BEFORE asking for a transport
8580
+ * - AFTER param serialization (s.data is a string if s.processData is true)
8581
+ * 3) key is the dataType
8582
+ * 4) the catchall symbol "*" can be used
8583
+ * 5) execution will start with transport dataType and THEN continue down to "*" if needed
8584
+ */
8585
+ prefilters = {},
8586
+
8587
+ /* Transports bindings
8588
+ * 1) key is the dataType
8589
+ * 2) the catchall symbol "*" can be used
8590
+ * 3) selection will start with transport dataType and THEN go to "*" if needed
8591
+ */
8592
+ transports = {},
8593
+
8594
+ // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
8595
+ allTypes = "*/".concat( "*" ),
8596
+
8597
+ // Anchor tag for parsing the document origin
8598
+ originAnchor = document.createElement( "a" );
8599
+ originAnchor.href = location.href;
8600
+
8601
+ // Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
8602
+ function addToPrefiltersOrTransports( structure ) {
8603
+
8604
+ // dataTypeExpression is optional and defaults to "*"
8605
+ return function( dataTypeExpression, func ) {
8606
+
8607
+ if ( typeof dataTypeExpression !== "string" ) {
8608
+ func = dataTypeExpression;
8609
+ dataTypeExpression = "*";
8610
+ }
8611
+
8612
+ var dataType,
8613
+ i = 0,
8614
+ dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];
8615
+
8616
+ if ( jQuery.isFunction( func ) ) {
8617
+
8618
+ // For each dataType in the dataTypeExpression
8619
+ while ( ( dataType = dataTypes[ i++ ] ) ) {
8620
+
8621
+ // Prepend if requested
8622
+ if ( dataType[ 0 ] === "+" ) {
8623
+ dataType = dataType.slice( 1 ) || "*";
8624
+ ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );
8625
+
8626
+ // Otherwise append
8627
+ } else {
8628
+ ( structure[ dataType ] = structure[ dataType ] || [] ).push( func );
8629
+ }
8630
+ }
8631
+ }
8632
+ };
8633
+ }
8634
+
8635
+ // Base inspection function for prefilters and transports
8636
+ function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
8637
+
8638
+ var inspected = {},
8639
+ seekingTransport = ( structure === transports );
8640
+
8641
+ function inspect( dataType ) {
8642
+ var selected;
8643
+ inspected[ dataType ] = true;
8644
+ jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
8645
+ var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
8646
+ if ( typeof dataTypeOrTransport === "string" &&
8647
+ !seekingTransport && !inspected[ dataTypeOrTransport ] ) {
8648
+
8649
+ options.dataTypes.unshift( dataTypeOrTransport );
8650
+ inspect( dataTypeOrTransport );
8651
+ return false;
8652
+ } else if ( seekingTransport ) {
8653
+ return !( selected = dataTypeOrTransport );
8654
+ }
8655
+ } );
8656
+ return selected;
8657
+ }
8658
+
8659
+ return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
8660
+ }
8661
+
8662
+ // A special extend for ajax options
8663
+ // that takes "flat" options (not to be deep extended)
8664
+ // Fixes #9887
8665
+ function ajaxExtend( target, src ) {
8666
+ var key, deep,
8667
+ flatOptions = jQuery.ajaxSettings.flatOptions || {};
8668
+
8669
+ for ( key in src ) {
8670
+ if ( src[ key ] !== undefined ) {
8671
+ ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
8672
+ }
8673
+ }
8674
+ if ( deep ) {
8675
+ jQuery.extend( true, target, deep );
8676
+ }
8677
+
8678
+ return target;
8679
+ }
8680
+
8681
+ /* Handles responses to an ajax request:
8682
+ * - finds the right dataType (mediates between content-type and expected dataType)
8683
+ * - returns the corresponding response
8684
+ */
8685
+ function ajaxHandleResponses( s, jqXHR, responses ) {
8686
+
8687
+ var ct, type, finalDataType, firstDataType,
8688
+ contents = s.contents,
8689
+ dataTypes = s.dataTypes;
8690
+
8691
+ // Remove auto dataType and get content-type in the process
8692
+ while ( dataTypes[ 0 ] === "*" ) {
8693
+ dataTypes.shift();
8694
+ if ( ct === undefined ) {
8695
+ ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" );
8696
+ }
8697
+ }
8698
+
8699
+ // Check if we're dealing with a known content-type
8700
+ if ( ct ) {
8701
+ for ( type in contents ) {
8702
+ if ( contents[ type ] && contents[ type ].test( ct ) ) {
8703
+ dataTypes.unshift( type );
8704
+ break;
8705
+ }
8706
+ }
8707
+ }
8708
+
8709
+ // Check to see if we have a response for the expected dataType
8710
+ if ( dataTypes[ 0 ] in responses ) {
8711
+ finalDataType = dataTypes[ 0 ];
8712
+ } else {
8713
+
8714
+ // Try convertible dataTypes
8715
+ for ( type in responses ) {
8716
+ if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) {
8717
+ finalDataType = type;
8718
+ break;
8719
+ }
8720
+ if ( !firstDataType ) {
8721
+ firstDataType = type;
8722
+ }
8723
+ }
8724
+
8725
+ // Or just use first one
8726
+ finalDataType = finalDataType || firstDataType;
8727
+ }
8728
+
8729
+ // If we found a dataType
8730
+ // We add the dataType to the list if needed
8731
+ // and return the corresponding response
8732
+ if ( finalDataType ) {
8733
+ if ( finalDataType !== dataTypes[ 0 ] ) {
8734
+ dataTypes.unshift( finalDataType );
8735
+ }
8736
+ return responses[ finalDataType ];
8737
+ }
8738
+ }
8739
+
8740
+ /* Chain conversions given the request and the original response
8741
+ * Also sets the responseXXX fields on the jqXHR instance
8742
+ */
8743
+ function ajaxConvert( s, response, jqXHR, isSuccess ) {
8744
+ var conv2, current, conv, tmp, prev,
8745
+ converters = {},
8746
+
8747
+ // Work with a copy of dataTypes in case we need to modify it for conversion
8748
+ dataTypes = s.dataTypes.slice();
8749
+
8750
+ // Create converters map with lowercased keys
8751
+ if ( dataTypes[ 1 ] ) {
8752
+ for ( conv in s.converters ) {
8753
+ converters[ conv.toLowerCase() ] = s.converters[ conv ];
8754
+ }
8755
+ }
8756
+
8757
+ current = dataTypes.shift();
8758
+
8759
+ // Convert to each sequential dataType
8760
+ while ( current ) {
8761
+
8762
+ if ( s.responseFields[ current ] ) {
8763
+ jqXHR[ s.responseFields[ current ] ] = response;
8764
+ }
8765
+
8766
+ // Apply the dataFilter if provided
8767
+ if ( !prev && isSuccess && s.dataFilter ) {
8768
+ response = s.dataFilter( response, s.dataType );
8769
+ }
8770
+
8771
+ prev = current;
8772
+ current = dataTypes.shift();
8773
+
8774
+ if ( current ) {
8775
+
8776
+ // There's only work to do if current dataType is non-auto
8777
+ if ( current === "*" ) {
8778
+
8779
+ current = prev;
8780
+
8781
+ // Convert response if prev dataType is non-auto and differs from current
8782
+ } else if ( prev !== "*" && prev !== current ) {
8783
+
8784
+ // Seek a direct converter
8785
+ conv = converters[ prev + " " + current ] || converters[ "* " + current ];
8786
+
8787
+ // If none found, seek a pair
8788
+ if ( !conv ) {
8789
+ for ( conv2 in converters ) {
8790
+
8791
+ // If conv2 outputs current
8792
+ tmp = conv2.split( " " );
8793
+ if ( tmp[ 1 ] === current ) {
8794
+
8795
+ // If prev can be converted to accepted input
8796
+ conv = converters[ prev + " " + tmp[ 0 ] ] ||
8797
+ converters[ "* " + tmp[ 0 ] ];
8798
+ if ( conv ) {
8799
+
8800
+ // Condense equivalence converters
8801
+ if ( conv === true ) {
8802
+ conv = converters[ conv2 ];
8803
+
8804
+ // Otherwise, insert the intermediate dataType
8805
+ } else if ( converters[ conv2 ] !== true ) {
8806
+ current = tmp[ 0 ];
8807
+ dataTypes.unshift( tmp[ 1 ] );
8808
+ }
8809
+ break;
8810
+ }
8811
+ }
8812
+ }
8813
+ }
8814
+
8815
+ // Apply converter (if not an equivalence)
8816
+ if ( conv !== true ) {
8817
+
8818
+ // Unless errors are allowed to bubble, catch and return them
8819
+ if ( conv && s.throws ) {
8820
+ response = conv( response );
8821
+ } else {
8822
+ try {
8823
+ response = conv( response );
8824
+ } catch ( e ) {
8825
+ return {
8826
+ state: "parsererror",
8827
+ error: conv ? e : "No conversion from " + prev + " to " + current
8828
+ };
8829
+ }
8830
+ }
8831
+ }
8832
+ }
8833
+ }
8834
+ }
8835
+
8836
+ return { state: "success", data: response };
8837
+ }
8838
+
8839
+ jQuery.extend( {
8840
+
8841
+ // Counter for holding the number of active queries
8842
+ active: 0,
8843
+
8844
+ // Last-Modified header cache for next request
8845
+ lastModified: {},
8846
+ etag: {},
8847
+
8848
+ ajaxSettings: {
8849
+ url: location.href,
8850
+ type: "GET",
8851
+ isLocal: rlocalProtocol.test( location.protocol ),
8852
+ global: true,
8853
+ processData: true,
8854
+ async: true,
8855
+ contentType: "application/x-www-form-urlencoded; charset=UTF-8",
8856
+
8857
+ /*
8858
+ timeout: 0,
8859
+ data: null,
8860
+ dataType: null,
8861
+ username: null,
8862
+ password: null,
8863
+ cache: null,
8864
+ throws: false,
8865
+ traditional: false,
8866
+ headers: {},
8867
+ */
8868
+
8869
+ accepts: {
8870
+ "*": allTypes,
8871
+ text: "text/plain",
8872
+ html: "text/html",
8873
+ xml: "application/xml, text/xml",
8874
+ json: "application/json, text/javascript"
8875
+ },
8876
+
8877
+ contents: {
8878
+ xml: /\bxml\b/,
8879
+ html: /\bhtml/,
8880
+ json: /\bjson\b/
8881
+ },
8882
+
8883
+ responseFields: {
8884
+ xml: "responseXML",
8885
+ text: "responseText",
8886
+ json: "responseJSON"
8887
+ },
8888
+
8889
+ // Data converters
8890
+ // Keys separate source (or catchall "*") and destination types with a single space
8891
+ converters: {
8892
+
8893
+ // Convert anything to text
8894
+ "* text": String,
8895
+
8896
+ // Text to html (true = no transformation)
8897
+ "text html": true,
8898
+
8899
+ // Evaluate text as a json expression
8900
+ "text json": JSON.parse,
8901
+
8902
+ // Parse text as xml
8903
+ "text xml": jQuery.parseXML
8904
+ },
8905
+
8906
+ // For options that shouldn't be deep extended:
8907
+ // you can add your own custom options here if
8908
+ // and when you create one that shouldn't be
8909
+ // deep extended (see ajaxExtend)
8910
+ flatOptions: {
8911
+ url: true,
8912
+ context: true
8913
+ }
8914
+ },
8915
+
8916
+ // Creates a full fledged settings object into target
8917
+ // with both ajaxSettings and settings fields.
8918
+ // If target is omitted, writes into ajaxSettings.
8919
+ ajaxSetup: function( target, settings ) {
8920
+ return settings ?
8921
+
8922
+ // Building a settings object
8923
+ ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
8924
+
8925
+ // Extending ajaxSettings
8926
+ ajaxExtend( jQuery.ajaxSettings, target );
8927
+ },
8928
+
8929
+ ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
8930
+ ajaxTransport: addToPrefiltersOrTransports( transports ),
8931
+
8932
+ // Main method
8933
+ ajax: function( url, options ) {
8934
+
8935
+ // If url is an object, simulate pre-1.5 signature
8936
+ if ( typeof url === "object" ) {
8937
+ options = url;
8938
+ url = undefined;
8939
+ }
8940
+
8941
+ // Force options to be an object
8942
+ options = options || {};
8943
+
8944
+ var transport,
8945
+
8946
+ // URL without anti-cache param
8947
+ cacheURL,
8948
+
8949
+ // Response headers
8950
+ responseHeadersString,
8951
+ responseHeaders,
8952
+
8953
+ // timeout handle
8954
+ timeoutTimer,
8955
+
8956
+ // Url cleanup var
8957
+ urlAnchor,
8958
+
8959
+ // Request state (becomes false upon send and true upon completion)
8960
+ completed,
8961
+
8962
+ // To know if global events are to be dispatched
8963
+ fireGlobals,
8964
+
8965
+ // Loop variable
8966
+ i,
8967
+
8968
+ // uncached part of the url
8969
+ uncached,
8970
+
8971
+ // Create the final options object
8972
+ s = jQuery.ajaxSetup( {}, options ),
8973
+
8974
+ // Callbacks context
8975
+ callbackContext = s.context || s,
8976
+
8977
+ // Context for global events is callbackContext if it is a DOM node or jQuery collection
8978
+ globalEventContext = s.context &&
8979
+ ( callbackContext.nodeType || callbackContext.jquery ) ?
8980
+ jQuery( callbackContext ) :
8981
+ jQuery.event,
8982
+
8983
+ // Deferreds
8984
+ deferred = jQuery.Deferred(),
8985
+ completeDeferred = jQuery.Callbacks( "once memory" ),
8986
+
8987
+ // Status-dependent callbacks
8988
+ statusCode = s.statusCode || {},
8989
+
8990
+ // Headers (they are sent all at once)
8991
+ requestHeaders = {},
8992
+ requestHeadersNames = {},
8993
+
8994
+ // Default abort message
8995
+ strAbort = "canceled",
8996
+
8997
+ // Fake xhr
8998
+ jqXHR = {
8999
+ readyState: 0,
9000
+
9001
+ // Builds headers hashtable if needed
9002
+ getResponseHeader: function( key ) {
9003
+ var match;
9004
+ if ( completed ) {
9005
+ if ( !responseHeaders ) {
9006
+ responseHeaders = {};
9007
+ while ( ( match = rheaders.exec( responseHeadersString ) ) ) {
9008
+ responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ];
9009
+ }
9010
+ }
9011
+ match = responseHeaders[ key.toLowerCase() ];
9012
+ }
9013
+ return match == null ? null : match;
9014
+ },
9015
+
9016
+ // Raw string
9017
+ getAllResponseHeaders: function() {
9018
+ return completed ? responseHeadersString : null;
9019
+ },
9020
+
9021
+ // Caches the header
9022
+ setRequestHeader: function( name, value ) {
9023
+ if ( completed == null ) {
9024
+ name = requestHeadersNames[ name.toLowerCase() ] =
9025
+ requestHeadersNames[ name.toLowerCase() ] || name;
9026
+ requestHeaders[ name ] = value;
9027
+ }
9028
+ return this;
9029
+ },
9030
+
9031
+ // Overrides response content-type header
9032
+ overrideMimeType: function( type ) {
9033
+ if ( completed == null ) {
9034
+ s.mimeType = type;
9035
+ }
9036
+ return this;
9037
+ },
9038
+
9039
+ // Status-dependent callbacks
9040
+ statusCode: function( map ) {
9041
+ var code;
9042
+ if ( map ) {
9043
+ if ( completed ) {
9044
+
9045
+ // Execute the appropriate callbacks
9046
+ jqXHR.always( map[ jqXHR.status ] );
9047
+ } else {
9048
+
9049
+ // Lazy-add the new callbacks in a way that preserves old ones
9050
+ for ( code in map ) {
9051
+ statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
9052
+ }
9053
+ }
9054
+ }
9055
+ return this;
9056
+ },
9057
+
9058
+ // Cancel the request
9059
+ abort: function( statusText ) {
9060
+ var finalText = statusText || strAbort;
9061
+ if ( transport ) {
9062
+ transport.abort( finalText );
9063
+ }
9064
+ done( 0, finalText );
9065
+ return this;
9066
+ }
9067
+ };
9068
+
9069
+ // Attach deferreds
9070
+ deferred.promise( jqXHR );
9071
+
9072
+ // Add protocol if not provided (prefilters might expect it)
9073
+ // Handle falsy url in the settings object (#10093: consistency with old signature)
9074
+ // We also use the url parameter if available
9075
+ s.url = ( ( url || s.url || location.href ) + "" )
9076
+ .replace( rprotocol, location.protocol + "//" );
9077
+
9078
+ // Alias method option to type as per ticket #12004
9079
+ s.type = options.method || options.type || s.method || s.type;
9080
+
9081
+ // Extract dataTypes list
9082
+ s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ];
9083
+
9084
+ // A cross-domain request is in order when the origin doesn't match the current origin.
9085
+ if ( s.crossDomain == null ) {
9086
+ urlAnchor = document.createElement( "a" );
9087
+
9088
+ // Support: IE <=8 - 11, Edge 12 - 13
9089
+ // IE throws exception on accessing the href property if url is malformed,
9090
+ // e.g. http://example.com:80x/
9091
+ try {
9092
+ urlAnchor.href = s.url;
9093
+
9094
+ // Support: IE <=8 - 11 only
9095
+ // Anchor's host property isn't correctly set when s.url is relative
9096
+ urlAnchor.href = urlAnchor.href;
9097
+ s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !==
9098
+ urlAnchor.protocol + "//" + urlAnchor.host;
9099
+ } catch ( e ) {
9100
+
9101
+ // If there is an error parsing the URL, assume it is crossDomain,
9102
+ // it can be rejected by the transport if it is invalid
9103
+ s.crossDomain = true;
9104
+ }
9105
+ }
9106
+
9107
+ // Convert data if not already a string
9108
+ if ( s.data && s.processData && typeof s.data !== "string" ) {
9109
+ s.data = jQuery.param( s.data, s.traditional );
9110
+ }
9111
+
9112
+ // Apply prefilters
9113
+ inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
9114
+
9115
+ // If request was aborted inside a prefilter, stop there
9116
+ if ( completed ) {
9117
+ return jqXHR;
9118
+ }
9119
+
9120
+ // We can fire global events as of now if asked to
9121
+ // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
9122
+ fireGlobals = jQuery.event && s.global;
9123
+
9124
+ // Watch for a new set of requests
9125
+ if ( fireGlobals && jQuery.active++ === 0 ) {
9126
+ jQuery.event.trigger( "ajaxStart" );
9127
+ }
9128
+
9129
+ // Uppercase the type
9130
+ s.type = s.type.toUpperCase();
9131
+
9132
+ // Determine if request has content
9133
+ s.hasContent = !rnoContent.test( s.type );
9134
+
9135
+ // Save the URL in case we're toying with the If-Modified-Since
9136
+ // and/or If-None-Match header later on
9137
+ // Remove hash to simplify url manipulation
9138
+ cacheURL = s.url.replace( rhash, "" );
9139
+
9140
+ // More options handling for requests with no content
9141
+ if ( !s.hasContent ) {
9142
+
9143
+ // Remember the hash so we can put it back
9144
+ uncached = s.url.slice( cacheURL.length );
9145
+
9146
+ // If data is available, append data to url
9147
+ if ( s.data ) {
9148
+ cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data;
9149
+
9150
+ // #9682: remove data so that it's not used in an eventual retry
9151
+ delete s.data;
9152
+ }
9153
+
9154
+ // Add or update anti-cache param if needed
9155
+ if ( s.cache === false ) {
9156
+ cacheURL = cacheURL.replace( rantiCache, "$1" );
9157
+ uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached;
9158
+ }
9159
+
9160
+ // Put hash and anti-cache on the URL that will be requested (gh-1732)
9161
+ s.url = cacheURL + uncached;
9162
+
9163
+ // Change '%20' to '+' if this is encoded form body content (gh-2658)
9164
+ } else if ( s.data && s.processData &&
9165
+ ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) {
9166
+ s.data = s.data.replace( r20, "+" );
9167
+ }
9168
+
9169
+ // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
9170
+ if ( s.ifModified ) {
9171
+ if ( jQuery.lastModified[ cacheURL ] ) {
9172
+ jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
9173
+ }
9174
+ if ( jQuery.etag[ cacheURL ] ) {
9175
+ jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
9176
+ }
9177
+ }
9178
+
9179
+ // Set the correct header, if data is being sent
9180
+ if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
9181
+ jqXHR.setRequestHeader( "Content-Type", s.contentType );
9182
+ }
9183
+
9184
+ // Set the Accepts header for the server, depending on the dataType
9185
+ jqXHR.setRequestHeader(
9186
+ "Accept",
9187
+ s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?
9188
+ s.accepts[ s.dataTypes[ 0 ] ] +
9189
+ ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
9190
+ s.accepts[ "*" ]
9191
+ );
9192
+
9193
+ // Check for headers option
9194
+ for ( i in s.headers ) {
9195
+ jqXHR.setRequestHeader( i, s.headers[ i ] );
9196
+ }
9197
+
9198
+ // Allow custom headers/mimetypes and early abort
9199
+ if ( s.beforeSend &&
9200
+ ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {
9201
+
9202
+ // Abort if not done already and return
9203
+ return jqXHR.abort();
9204
+ }
9205
+
9206
+ // Aborting is no longer a cancellation
9207
+ strAbort = "abort";
9208
+
9209
+ // Install callbacks on deferreds
9210
+ completeDeferred.add( s.complete );
9211
+ jqXHR.done( s.success );
9212
+ jqXHR.fail( s.error );
9213
+
9214
+ // Get transport
9215
+ transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
9216
+
9217
+ // If no transport, we auto-abort
9218
+ if ( !transport ) {
9219
+ done( -1, "No Transport" );
9220
+ } else {
9221
+ jqXHR.readyState = 1;
9222
+
9223
+ // Send global event
9224
+ if ( fireGlobals ) {
9225
+ globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
9226
+ }
9227
+
9228
+ // If request was aborted inside ajaxSend, stop there
9229
+ if ( completed ) {
9230
+ return jqXHR;
9231
+ }
9232
+
9233
+ // Timeout
9234
+ if ( s.async && s.timeout > 0 ) {
9235
+ timeoutTimer = window.setTimeout( function() {
9236
+ jqXHR.abort( "timeout" );
9237
+ }, s.timeout );
9238
+ }
9239
+
9240
+ try {
9241
+ completed = false;
9242
+ transport.send( requestHeaders, done );
9243
+ } catch ( e ) {
9244
+
9245
+ // Rethrow post-completion exceptions
9246
+ if ( completed ) {
9247
+ throw e;
9248
+ }
9249
+
9250
+ // Propagate others as results
9251
+ done( -1, e );
9252
+ }
9253
+ }
9254
+
9255
+ // Callback for when everything is done
9256
+ function done( status, nativeStatusText, responses, headers ) {
9257
+ var isSuccess, success, error, response, modified,
9258
+ statusText = nativeStatusText;
9259
+
9260
+ // Ignore repeat invocations
9261
+ if ( completed ) {
9262
+ return;
9263
+ }
9264
+
9265
+ completed = true;
9266
+
9267
+ // Clear timeout if it exists
9268
+ if ( timeoutTimer ) {
9269
+ window.clearTimeout( timeoutTimer );
9270
+ }
9271
+
9272
+ // Dereference transport for early garbage collection
9273
+ // (no matter how long the jqXHR object will be used)
9274
+ transport = undefined;
9275
+
9276
+ // Cache response headers
9277
+ responseHeadersString = headers || "";
9278
+
9279
+ // Set readyState
9280
+ jqXHR.readyState = status > 0 ? 4 : 0;
9281
+
9282
+ // Determine if successful
9283
+ isSuccess = status >= 200 && status < 300 || status === 304;
9284
+
9285
+ // Get response data
9286
+ if ( responses ) {
9287
+ response = ajaxHandleResponses( s, jqXHR, responses );
9288
+ }
9289
+
9290
+ // Convert no matter what (that way responseXXX fields are always set)
9291
+ response = ajaxConvert( s, response, jqXHR, isSuccess );
9292
+
9293
+ // If successful, handle type chaining
9294
+ if ( isSuccess ) {
9295
+
9296
+ // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
9297
+ if ( s.ifModified ) {
9298
+ modified = jqXHR.getResponseHeader( "Last-Modified" );
9299
+ if ( modified ) {
9300
+ jQuery.lastModified[ cacheURL ] = modified;
9301
+ }
9302
+ modified = jqXHR.getResponseHeader( "etag" );
9303
+ if ( modified ) {
9304
+ jQuery.etag[ cacheURL ] = modified;
9305
+ }
9306
+ }
9307
+
9308
+ // if no content
9309
+ if ( status === 204 || s.type === "HEAD" ) {
9310
+ statusText = "nocontent";
9311
+
9312
+ // if not modified
9313
+ } else if ( status === 304 ) {
9314
+ statusText = "notmodified";
9315
+
9316
+ // If we have data, let's convert it
9317
+ } else {
9318
+ statusText = response.state;
9319
+ success = response.data;
9320
+ error = response.error;
9321
+ isSuccess = !error;
9322
+ }
9323
+ } else {
9324
+
9325
+ // Extract error from statusText and normalize for non-aborts
9326
+ error = statusText;
9327
+ if ( status || !statusText ) {
9328
+ statusText = "error";
9329
+ if ( status < 0 ) {
9330
+ status = 0;
9331
+ }
9332
+ }
9333
+ }
9334
+
9335
+ // Set data for the fake xhr object
9336
+ jqXHR.status = status;
9337
+ jqXHR.statusText = ( nativeStatusText || statusText ) + "";
9338
+
9339
+ // Success/Error
9340
+ if ( isSuccess ) {
9341
+ deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
9342
+ } else {
9343
+ deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
9344
+ }
9345
+
9346
+ // Status-dependent callbacks
9347
+ jqXHR.statusCode( statusCode );
9348
+ statusCode = undefined;
9349
+
9350
+ if ( fireGlobals ) {
9351
+ globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
9352
+ [ jqXHR, s, isSuccess ? success : error ] );
9353
+ }
9354
+
9355
+ // Complete
9356
+ completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
9357
+
9358
+ if ( fireGlobals ) {
9359
+ globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
9360
+
9361
+ // Handle the global AJAX counter
9362
+ if ( !( --jQuery.active ) ) {
9363
+ jQuery.event.trigger( "ajaxStop" );
9364
+ }
9365
+ }
9366
+ }
9367
+
9368
+ return jqXHR;
9369
+ },
9370
+
9371
+ getJSON: function( url, data, callback ) {
9372
+ return jQuery.get( url, data, callback, "json" );
9373
+ },
9374
+
9375
+ getScript: function( url, callback ) {
9376
+ return jQuery.get( url, undefined, callback, "script" );
9377
+ }
9378
+ } );
9379
+
9380
+ jQuery.each( [ "get", "post" ], function( i, method ) {
9381
+ jQuery[ method ] = function( url, data, callback, type ) {
9382
+
9383
+ // Shift arguments if data argument was omitted
9384
+ if ( jQuery.isFunction( data ) ) {
9385
+ type = type || callback;
9386
+ callback = data;
9387
+ data = undefined;
9388
+ }
9389
+
9390
+ // The url can be an options object (which then must have .url)
9391
+ return jQuery.ajax( jQuery.extend( {
9392
+ url: url,
9393
+ type: method,
9394
+ dataType: type,
9395
+ data: data,
9396
+ success: callback
9397
+ }, jQuery.isPlainObject( url ) && url ) );
9398
+ };
9399
+ } );
9400
+
9401
+
9402
+ jQuery._evalUrl = function( url ) {
9403
+ return jQuery.ajax( {
9404
+ url: url,
9405
+
9406
+ // Make this explicit, since user can override this through ajaxSetup (#11264)
9407
+ type: "GET",
9408
+ dataType: "script",
9409
+ cache: true,
9410
+ async: false,
9411
+ global: false,
9412
+ "throws": true
9413
+ } );
9414
+ };
9415
+
9416
+
9417
+ jQuery.fn.extend( {
9418
+ wrapAll: function( html ) {
9419
+ var wrap;
9420
+
9421
+ if ( this[ 0 ] ) {
9422
+ if ( jQuery.isFunction( html ) ) {
9423
+ html = html.call( this[ 0 ] );
9424
+ }
9425
+
9426
+ // The elements to wrap the target around
9427
+ wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
9428
+
9429
+ if ( this[ 0 ].parentNode ) {
9430
+ wrap.insertBefore( this[ 0 ] );
9431
+ }
9432
+
9433
+ wrap.map( function() {
9434
+ var elem = this;
9435
+
9436
+ while ( elem.firstElementChild ) {
9437
+ elem = elem.firstElementChild;
9438
+ }
9439
+
9440
+ return elem;
9441
+ } ).append( this );
9442
+ }
9443
+
9444
+ return this;
9445
+ },
9446
+
9447
+ wrapInner: function( html ) {
9448
+ if ( jQuery.isFunction( html ) ) {
9449
+ return this.each( function( i ) {
9450
+ jQuery( this ).wrapInner( html.call( this, i ) );
9451
+ } );
9452
+ }
9453
+
9454
+ return this.each( function() {
9455
+ var self = jQuery( this ),
9456
+ contents = self.contents();
9457
+
9458
+ if ( contents.length ) {
9459
+ contents.wrapAll( html );
9460
+
9461
+ } else {
9462
+ self.append( html );
9463
+ }
9464
+ } );
9465
+ },
9466
+
9467
+ wrap: function( html ) {
9468
+ var isFunction = jQuery.isFunction( html );
9469
+
9470
+ return this.each( function( i ) {
9471
+ jQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html );
9472
+ } );
9473
+ },
9474
+
9475
+ unwrap: function( selector ) {
9476
+ this.parent( selector ).not( "body" ).each( function() {
9477
+ jQuery( this ).replaceWith( this.childNodes );
9478
+ } );
9479
+ return this;
9480
+ }
9481
+ } );
9482
+
9483
+
9484
+ jQuery.expr.pseudos.hidden = function( elem ) {
9485
+ return !jQuery.expr.pseudos.visible( elem );
9486
+ };
9487
+ jQuery.expr.pseudos.visible = function( elem ) {
9488
+ return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );
9489
+ };
9490
+
9491
+
9492
+
9493
+
9494
+ jQuery.ajaxSettings.xhr = function() {
9495
+ try {
9496
+ return new window.XMLHttpRequest();
9497
+ } catch ( e ) {}
9498
+ };
9499
+
9500
+ var xhrSuccessStatus = {
9501
+
9502
+ // File protocol always yields status code 0, assume 200
9503
+ 0: 200,
9504
+
9505
+ // Support: IE <=9 only
9506
+ // #1450: sometimes IE returns 1223 when it should be 204
9507
+ 1223: 204
9508
+ },
9509
+ xhrSupported = jQuery.ajaxSettings.xhr();
9510
+
9511
+ support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
9512
+ support.ajax = xhrSupported = !!xhrSupported;
9513
+
9514
+ jQuery.ajaxTransport( function( options ) {
9515
+ var callback, errorCallback;
9516
+
9517
+ // Cross domain only allowed if supported through XMLHttpRequest
9518
+ if ( support.cors || xhrSupported && !options.crossDomain ) {
9519
+ return {
9520
+ send: function( headers, complete ) {
9521
+ var i,
9522
+ xhr = options.xhr();
9523
+
9524
+ xhr.open(
9525
+ options.type,
9526
+ options.url,
9527
+ options.async,
9528
+ options.username,
9529
+ options.password
9530
+ );
9531
+
9532
+ // Apply custom fields if provided
9533
+ if ( options.xhrFields ) {
9534
+ for ( i in options.xhrFields ) {
9535
+ xhr[ i ] = options.xhrFields[ i ];
9536
+ }
9537
+ }
9538
+
9539
+ // Override mime type if needed
9540
+ if ( options.mimeType && xhr.overrideMimeType ) {
9541
+ xhr.overrideMimeType( options.mimeType );
9542
+ }
9543
+
9544
+ // X-Requested-With header
9545
+ // For cross-domain requests, seeing as conditions for a preflight are
9546
+ // akin to a jigsaw puzzle, we simply never set it to be sure.
9547
+ // (it can always be set on a per-request basis or even using ajaxSetup)
9548
+ // For same-domain requests, won't change header if already provided.
9549
+ if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) {
9550
+ headers[ "X-Requested-With" ] = "XMLHttpRequest";
9551
+ }
9552
+
9553
+ // Set headers
9554
+ for ( i in headers ) {
9555
+ xhr.setRequestHeader( i, headers[ i ] );
9556
+ }
9557
+
9558
+ // Callback
9559
+ callback = function( type ) {
9560
+ return function() {
9561
+ if ( callback ) {
9562
+ callback = errorCallback = xhr.onload =
9563
+ xhr.onerror = xhr.onabort = xhr.onreadystatechange = null;
9564
+
9565
+ if ( type === "abort" ) {
9566
+ xhr.abort();
9567
+ } else if ( type === "error" ) {
9568
+
9569
+ // Support: IE <=9 only
9570
+ // On a manual native abort, IE9 throws
9571
+ // errors on any property access that is not readyState
9572
+ if ( typeof xhr.status !== "number" ) {
9573
+ complete( 0, "error" );
9574
+ } else {
9575
+ complete(
9576
+
9577
+ // File: protocol always yields status 0; see #8605, #14207
9578
+ xhr.status,
9579
+ xhr.statusText
9580
+ );
9581
+ }
9582
+ } else {
9583
+ complete(
9584
+ xhrSuccessStatus[ xhr.status ] || xhr.status,
9585
+ xhr.statusText,
9586
+
9587
+ // Support: IE <=9 only
9588
+ // IE9 has no XHR2 but throws on binary (trac-11426)
9589
+ // For XHR2 non-text, let the caller handle it (gh-2498)
9590
+ ( xhr.responseType || "text" ) !== "text" ||
9591
+ typeof xhr.responseText !== "string" ?
9592
+ { binary: xhr.response } :
9593
+ { text: xhr.responseText },
9594
+ xhr.getAllResponseHeaders()
9595
+ );
9596
+ }
9597
+ }
9598
+ };
9599
+ };
9600
+
9601
+ // Listen to events
9602
+ xhr.onload = callback();
9603
+ errorCallback = xhr.onerror = callback( "error" );
9604
+
9605
+ // Support: IE 9 only
9606
+ // Use onreadystatechange to replace onabort
9607
+ // to handle uncaught aborts
9608
+ if ( xhr.onabort !== undefined ) {
9609
+ xhr.onabort = errorCallback;
9610
+ } else {
9611
+ xhr.onreadystatechange = function() {
9612
+
9613
+ // Check readyState before timeout as it changes
9614
+ if ( xhr.readyState === 4 ) {
9615
+
9616
+ // Allow onerror to be called first,
9617
+ // but that will not handle a native abort
9618
+ // Also, save errorCallback to a variable
9619
+ // as xhr.onerror cannot be accessed
9620
+ window.setTimeout( function() {
9621
+ if ( callback ) {
9622
+ errorCallback();
9623
+ }
9624
+ } );
9625
+ }
9626
+ };
9627
+ }
9628
+
9629
+ // Create the abort callback
9630
+ callback = callback( "abort" );
9631
+
9632
+ try {
9633
+
9634
+ // Do send the request (this may raise an exception)
9635
+ xhr.send( options.hasContent && options.data || null );
9636
+ } catch ( e ) {
9637
+
9638
+ // #14683: Only rethrow if this hasn't been notified as an error yet
9639
+ if ( callback ) {
9640
+ throw e;
9641
+ }
9642
+ }
9643
+ },
9644
+
9645
+ abort: function() {
9646
+ if ( callback ) {
9647
+ callback();
9648
+ }
9649
+ }
9650
+ };
9651
+ }
9652
+ } );
9653
+
9654
+
9655
+
9656
+
9657
+ // Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)
9658
+ jQuery.ajaxPrefilter( function( s ) {
9659
+ if ( s.crossDomain ) {
9660
+ s.contents.script = false;
9661
+ }
9662
+ } );
9663
+
9664
+ // Install script dataType
9665
+ jQuery.ajaxSetup( {
9666
+ accepts: {
9667
+ script: "text/javascript, application/javascript, " +
9668
+ "application/ecmascript, application/x-ecmascript"
9669
+ },
9670
+ contents: {
9671
+ script: /\b(?:java|ecma)script\b/
9672
+ },
9673
+ converters: {
9674
+ "text script": function( text ) {
9675
+ jQuery.globalEval( text );
9676
+ return text;
9677
+ }
9678
+ }
9679
+ } );
9680
+
9681
+ // Handle cache's special case and crossDomain
9682
+ jQuery.ajaxPrefilter( "script", function( s ) {
9683
+ if ( s.cache === undefined ) {
9684
+ s.cache = false;
9685
+ }
9686
+ if ( s.crossDomain ) {
9687
+ s.type = "GET";
9688
+ }
9689
+ } );
9690
+
9691
+ // Bind script tag hack transport
9692
+ jQuery.ajaxTransport( "script", function( s ) {
9693
+
9694
+ // This transport only deals with cross domain requests
9695
+ if ( s.crossDomain ) {
9696
+ var script, callback;
9697
+ return {
9698
+ send: function( _, complete ) {
9699
+ script = jQuery( "<script>" ).prop( {
9700
+ charset: s.scriptCharset,
9701
+ src: s.url
9702
+ } ).on(
9703
+ "load error",
9704
+ callback = function( evt ) {
9705
+ script.remove();
9706
+ callback = null;
9707
+ if ( evt ) {
9708
+ complete( evt.type === "error" ? 404 : 200, evt.type );
9709
+ }
9710
+ }
9711
+ );
9712
+
9713
+ // Use native DOM manipulation to avoid our domManip AJAX trickery
9714
+ document.head.appendChild( script[ 0 ] );
9715
+ },
9716
+ abort: function() {
9717
+ if ( callback ) {
9718
+ callback();
9719
+ }
9720
+ }
9721
+ };
9722
+ }
9723
+ } );
9724
+
9725
+
9726
+
9727
+
9728
+ var oldCallbacks = [],
9729
+ rjsonp = /(=)\?(?=&|$)|\?\?/;
9730
+
9731
+ // Default jsonp settings
9732
+ jQuery.ajaxSetup( {
9733
+ jsonp: "callback",
9734
+ jsonpCallback: function() {
9735
+ var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
9736
+ this[ callback ] = true;
9737
+ return callback;
9738
+ }
9739
+ } );
9740
+
9741
+ // Detect, normalize options and install callbacks for jsonp requests
9742
+ jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
9743
+
9744
+ var callbackName, overwritten, responseContainer,
9745
+ jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
9746
+ "url" :
9747
+ typeof s.data === "string" &&
9748
+ ( s.contentType || "" )
9749
+ .indexOf( "application/x-www-form-urlencoded" ) === 0 &&
9750
+ rjsonp.test( s.data ) && "data"
9751
+ );
9752
+
9753
+ // Handle iff the expected data type is "jsonp" or we have a parameter to set
9754
+ if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
9755
+
9756
+ // Get callback name, remembering preexisting value associated with it
9757
+ callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
9758
+ s.jsonpCallback() :
9759
+ s.jsonpCallback;
9760
+
9761
+ // Insert callback into url or form data
9762
+ if ( jsonProp ) {
9763
+ s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
9764
+ } else if ( s.jsonp !== false ) {
9765
+ s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
9766
+ }
9767
+
9768
+ // Use data converter to retrieve json after script execution
9769
+ s.converters[ "script json" ] = function() {
9770
+ if ( !responseContainer ) {
9771
+ jQuery.error( callbackName + " was not called" );
9772
+ }
9773
+ return responseContainer[ 0 ];
9774
+ };
9775
+
9776
+ // Force json dataType
9777
+ s.dataTypes[ 0 ] = "json";
9778
+
9779
+ // Install callback
9780
+ overwritten = window[ callbackName ];
9781
+ window[ callbackName ] = function() {
9782
+ responseContainer = arguments;
9783
+ };
9784
+
9785
+ // Clean-up function (fires after converters)
9786
+ jqXHR.always( function() {
9787
+
9788
+ // If previous value didn't exist - remove it
9789
+ if ( overwritten === undefined ) {
9790
+ jQuery( window ).removeProp( callbackName );
9791
+
9792
+ // Otherwise restore preexisting value
9793
+ } else {
9794
+ window[ callbackName ] = overwritten;
9795
+ }
9796
+
9797
+ // Save back as free
9798
+ if ( s[ callbackName ] ) {
9799
+
9800
+ // Make sure that re-using the options doesn't screw things around
9801
+ s.jsonpCallback = originalSettings.jsonpCallback;
9802
+
9803
+ // Save the callback name for future use
9804
+ oldCallbacks.push( callbackName );
9805
+ }
9806
+
9807
+ // Call if it was a function and we have a response
9808
+ if ( responseContainer && jQuery.isFunction( overwritten ) ) {
9809
+ overwritten( responseContainer[ 0 ] );
9810
+ }
9811
+
9812
+ responseContainer = overwritten = undefined;
9813
+ } );
9814
+
9815
+ // Delegate to script
9816
+ return "script";
9817
+ }
9818
+ } );
9819
+
9820
+
9821
+
9822
+
9823
+ // Support: Safari 8 only
9824
+ // In Safari 8 documents created via document.implementation.createHTMLDocument
9825
+ // collapse sibling forms: the second one becomes a child of the first one.
9826
+ // Because of that, this security measure has to be disabled in Safari 8.
9827
+ // https://bugs.webkit.org/show_bug.cgi?id=137337
9828
+ support.createHTMLDocument = ( function() {
9829
+ var body = document.implementation.createHTMLDocument( "" ).body;
9830
+ body.innerHTML = "<form></form><form></form>";
9831
+ return body.childNodes.length === 2;
9832
+ } )();
9833
+
9834
+
9835
+ // Argument "data" should be string of html
9836
+ // context (optional): If specified, the fragment will be created in this context,
9837
+ // defaults to document
9838
+ // keepScripts (optional): If true, will include scripts passed in the html string
9839
+ jQuery.parseHTML = function( data, context, keepScripts ) {
9840
+ if ( typeof data !== "string" ) {
9841
+ return [];
9842
+ }
9843
+ if ( typeof context === "boolean" ) {
9844
+ keepScripts = context;
9845
+ context = false;
9846
+ }
9847
+
9848
+ var base, parsed, scripts;
9849
+
9850
+ if ( !context ) {
9851
+
9852
+ // Stop scripts or inline event handlers from being executed immediately
9853
+ // by using document.implementation
9854
+ if ( support.createHTMLDocument ) {
9855
+ context = document.implementation.createHTMLDocument( "" );
9856
+
9857
+ // Set the base href for the created document
9858
+ // so any parsed elements with URLs
9859
+ // are based on the document's URL (gh-2965)
9860
+ base = context.createElement( "base" );
9861
+ base.href = document.location.href;
9862
+ context.head.appendChild( base );
9863
+ } else {
9864
+ context = document;
9865
+ }
9866
+ }
9867
+
9868
+ parsed = rsingleTag.exec( data );
9869
+ scripts = !keepScripts && [];
9870
+
9871
+ // Single tag
9872
+ if ( parsed ) {
9873
+ return [ context.createElement( parsed[ 1 ] ) ];
9874
+ }
9875
+
9876
+ parsed = buildFragment( [ data ], context, scripts );
9877
+
9878
+ if ( scripts && scripts.length ) {
9879
+ jQuery( scripts ).remove();
9880
+ }
9881
+
9882
+ return jQuery.merge( [], parsed.childNodes );
9883
+ };
9884
+
9885
+
9886
+ /**
9887
+ * Load a url into a page
9888
+ */
9889
+ jQuery.fn.load = function( url, params, callback ) {
9890
+ var selector, type, response,
9891
+ self = this,
9892
+ off = url.indexOf( " " );
9893
+
9894
+ if ( off > -1 ) {
9895
+ selector = stripAndCollapse( url.slice( off ) );
9896
+ url = url.slice( 0, off );
9897
+ }
9898
+
9899
+ // If it's a function
9900
+ if ( jQuery.isFunction( params ) ) {
9901
+
9902
+ // We assume that it's the callback
9903
+ callback = params;
9904
+ params = undefined;
9905
+
9906
+ // Otherwise, build a param string
9907
+ } else if ( params && typeof params === "object" ) {
9908
+ type = "POST";
9909
+ }
9910
+
9911
+ // If we have elements to modify, make the request
9912
+ if ( self.length > 0 ) {
9913
+ jQuery.ajax( {
9914
+ url: url,
9915
+
9916
+ // If "type" variable is undefined, then "GET" method will be used.
9917
+ // Make value of this field explicit since
9918
+ // user can override it through ajaxSetup method
9919
+ type: type || "GET",
9920
+ dataType: "html",
9921
+ data: params
9922
+ } ).done( function( responseText ) {
9923
+
9924
+ // Save response for use in complete callback
9925
+ response = arguments;
9926
+
9927
+ self.html( selector ?
9928
+
9929
+ // If a selector was specified, locate the right elements in a dummy div
9930
+ // Exclude scripts to avoid IE 'Permission Denied' errors
9931
+ jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :
9932
+
9933
+ // Otherwise use the full result
9934
+ responseText );
9935
+
9936
+ // If the request succeeds, this function gets "data", "status", "jqXHR"
9937
+ // but they are ignored because response was set above.
9938
+ // If it fails, this function gets "jqXHR", "status", "error"
9939
+ } ).always( callback && function( jqXHR, status ) {
9940
+ self.each( function() {
9941
+ callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );
9942
+ } );
9943
+ } );
9944
+ }
9945
+
9946
+ return this;
9947
+ };
9948
+
9949
+
9950
+
9951
+
9952
+ // Attach a bunch of functions for handling common AJAX events
9953
+ jQuery.each( [
9954
+ "ajaxStart",
9955
+ "ajaxStop",
9956
+ "ajaxComplete",
9957
+ "ajaxError",
9958
+ "ajaxSuccess",
9959
+ "ajaxSend"
9960
+ ], function( i, type ) {
9961
+ jQuery.fn[ type ] = function( fn ) {
9962
+ return this.on( type, fn );
9963
+ };
9964
+ } );
9965
+
9966
+
9967
+
9968
+
9969
+ jQuery.expr.pseudos.animated = function( elem ) {
9970
+ return jQuery.grep( jQuery.timers, function( fn ) {
9971
+ return elem === fn.elem;
9972
+ } ).length;
9973
+ };
9974
+
9975
+
9976
+
9977
+
9978
+ jQuery.offset = {
9979
+ setOffset: function( elem, options, i ) {
9980
+ var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
9981
+ position = jQuery.css( elem, "position" ),
9982
+ curElem = jQuery( elem ),
9983
+ props = {};
9984
+
9985
+ // Set position first, in-case top/left are set even on static elem
9986
+ if ( position === "static" ) {
9987
+ elem.style.position = "relative";
9988
+ }
9989
+
9990
+ curOffset = curElem.offset();
9991
+ curCSSTop = jQuery.css( elem, "top" );
9992
+ curCSSLeft = jQuery.css( elem, "left" );
9993
+ calculatePosition = ( position === "absolute" || position === "fixed" ) &&
9994
+ ( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1;
9995
+
9996
+ // Need to be able to calculate position if either
9997
+ // top or left is auto and position is either absolute or fixed
9998
+ if ( calculatePosition ) {
9999
+ curPosition = curElem.position();
10000
+ curTop = curPosition.top;
10001
+ curLeft = curPosition.left;
10002
+
10003
+ } else {
10004
+ curTop = parseFloat( curCSSTop ) || 0;
10005
+ curLeft = parseFloat( curCSSLeft ) || 0;
10006
+ }
10007
+
10008
+ if ( jQuery.isFunction( options ) ) {
10009
+
10010
+ // Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
10011
+ options = options.call( elem, i, jQuery.extend( {}, curOffset ) );
10012
+ }
10013
+
10014
+ if ( options.top != null ) {
10015
+ props.top = ( options.top - curOffset.top ) + curTop;
10016
+ }
10017
+ if ( options.left != null ) {
10018
+ props.left = ( options.left - curOffset.left ) + curLeft;
10019
+ }
10020
+
10021
+ if ( "using" in options ) {
10022
+ options.using.call( elem, props );
10023
+
10024
+ } else {
10025
+ curElem.css( props );
10026
+ }
10027
+ }
10028
+ };
10029
+
10030
+ jQuery.fn.extend( {
10031
+ offset: function( options ) {
10032
+
10033
+ // Preserve chaining for setter
10034
+ if ( arguments.length ) {
10035
+ return options === undefined ?
10036
+ this :
10037
+ this.each( function( i ) {
10038
+ jQuery.offset.setOffset( this, options, i );
10039
+ } );
10040
+ }
10041
+
10042
+ var doc, docElem, rect, win,
10043
+ elem = this[ 0 ];
10044
+
10045
+ if ( !elem ) {
10046
+ return;
10047
+ }
10048
+
10049
+ // Return zeros for disconnected and hidden (display: none) elements (gh-2310)
10050
+ // Support: IE <=11 only
10051
+ // Running getBoundingClientRect on a
10052
+ // disconnected node in IE throws an error
10053
+ if ( !elem.getClientRects().length ) {
10054
+ return { top: 0, left: 0 };
10055
+ }
10056
+
10057
+ rect = elem.getBoundingClientRect();
10058
+
10059
+ doc = elem.ownerDocument;
10060
+ docElem = doc.documentElement;
10061
+ win = doc.defaultView;
10062
+
10063
+ return {
10064
+ top: rect.top + win.pageYOffset - docElem.clientTop,
10065
+ left: rect.left + win.pageXOffset - docElem.clientLeft
10066
+ };
10067
+ },
10068
+
10069
+ position: function() {
10070
+ if ( !this[ 0 ] ) {
10071
+ return;
10072
+ }
10073
+
10074
+ var offsetParent, offset,
10075
+ elem = this[ 0 ],
10076
+ parentOffset = { top: 0, left: 0 };
10077
+
10078
+ // Fixed elements are offset from window (parentOffset = {top:0, left: 0},
10079
+ // because it is its only offset parent
10080
+ if ( jQuery.css( elem, "position" ) === "fixed" ) {
10081
+
10082
+ // Assume getBoundingClientRect is there when computed position is fixed
10083
+ offset = elem.getBoundingClientRect();
10084
+
10085
+ } else {
10086
+
10087
+ // Get *real* offsetParent
10088
+ offsetParent = this.offsetParent();
10089
+
10090
+ // Get correct offsets
10091
+ offset = this.offset();
10092
+ if ( !nodeName( offsetParent[ 0 ], "html" ) ) {
10093
+ parentOffset = offsetParent.offset();
10094
+ }
10095
+
10096
+ // Add offsetParent borders
10097
+ parentOffset = {
10098
+ top: parentOffset.top + jQuery.css( offsetParent[ 0 ], "borderTopWidth", true ),
10099
+ left: parentOffset.left + jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true )
10100
+ };
10101
+ }
10102
+
10103
+ // Subtract parent offsets and element margins
10104
+ return {
10105
+ top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
10106
+ left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
10107
+ };
10108
+ },
10109
+
10110
+ // This method will return documentElement in the following cases:
10111
+ // 1) For the element inside the iframe without offsetParent, this method will return
10112
+ // documentElement of the parent window
10113
+ // 2) For the hidden or detached element
10114
+ // 3) For body or html element, i.e. in case of the html node - it will return itself
10115
+ //
10116
+ // but those exceptions were never presented as a real life use-cases
10117
+ // and might be considered as more preferable results.
10118
+ //
10119
+ // This logic, however, is not guaranteed and can change at any point in the future
10120
+ offsetParent: function() {
10121
+ return this.map( function() {
10122
+ var offsetParent = this.offsetParent;
10123
+
10124
+ while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) {
10125
+ offsetParent = offsetParent.offsetParent;
10126
+ }
10127
+
10128
+ return offsetParent || documentElement;
10129
+ } );
10130
+ }
10131
+ } );
10132
+
10133
+ // Create scrollLeft and scrollTop methods
10134
+ jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
10135
+ var top = "pageYOffset" === prop;
10136
+
10137
+ jQuery.fn[ method ] = function( val ) {
10138
+ return access( this, function( elem, method, val ) {
10139
+
10140
+ // Coalesce documents and windows
10141
+ var win;
10142
+ if ( jQuery.isWindow( elem ) ) {
10143
+ win = elem;
10144
+ } else if ( elem.nodeType === 9 ) {
10145
+ win = elem.defaultView;
10146
+ }
10147
+
10148
+ if ( val === undefined ) {
10149
+ return win ? win[ prop ] : elem[ method ];
10150
+ }
10151
+
10152
+ if ( win ) {
10153
+ win.scrollTo(
10154
+ !top ? val : win.pageXOffset,
10155
+ top ? val : win.pageYOffset
10156
+ );
10157
+
10158
+ } else {
10159
+ elem[ method ] = val;
10160
+ }
10161
+ }, method, val, arguments.length );
10162
+ };
10163
+ } );
10164
+
10165
+ // Support: Safari <=7 - 9.1, Chrome <=37 - 49
10166
+ // Add the top/left cssHooks using jQuery.fn.position
10167
+ // Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
10168
+ // Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347
10169
+ // getComputedStyle returns percent when specified for top/left/bottom/right;
10170
+ // rather than make the css module depend on the offset module, just check for it here
10171
+ jQuery.each( [ "top", "left" ], function( i, prop ) {
10172
+ jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
10173
+ function( elem, computed ) {
10174
+ if ( computed ) {
10175
+ computed = curCSS( elem, prop );
10176
+
10177
+ // If curCSS returns percentage, fallback to offset
10178
+ return rnumnonpx.test( computed ) ?
10179
+ jQuery( elem ).position()[ prop ] + "px" :
10180
+ computed;
10181
+ }
10182
+ }
10183
+ );
10184
+ } );
10185
+
10186
+
10187
+ // Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
10188
+ jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
10189
+ jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name },
10190
+ function( defaultExtra, funcName ) {
10191
+
10192
+ // Margin is only for outerHeight, outerWidth
10193
+ jQuery.fn[ funcName ] = function( margin, value ) {
10194
+ var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
10195
+ extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
10196
+
10197
+ return access( this, function( elem, type, value ) {
10198
+ var doc;
10199
+
10200
+ if ( jQuery.isWindow( elem ) ) {
10201
+
10202
+ // $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)
10203
+ return funcName.indexOf( "outer" ) === 0 ?
10204
+ elem[ "inner" + name ] :
10205
+ elem.document.documentElement[ "client" + name ];
10206
+ }
10207
+
10208
+ // Get document width or height
10209
+ if ( elem.nodeType === 9 ) {
10210
+ doc = elem.documentElement;
10211
+
10212
+ // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
10213
+ // whichever is greatest
10214
+ return Math.max(
10215
+ elem.body[ "scroll" + name ], doc[ "scroll" + name ],
10216
+ elem.body[ "offset" + name ], doc[ "offset" + name ],
10217
+ doc[ "client" + name ]
10218
+ );
10219
+ }
10220
+
10221
+ return value === undefined ?
10222
+
10223
+ // Get width or height on the element, requesting but not forcing parseFloat
10224
+ jQuery.css( elem, type, extra ) :
10225
+
10226
+ // Set width or height on the element
10227
+ jQuery.style( elem, type, value, extra );
10228
+ }, type, chainable ? margin : undefined, chainable );
10229
+ };
10230
+ } );
10231
+ } );
10232
+
10233
+
10234
+ jQuery.fn.extend( {
10235
+
10236
+ bind: function( types, data, fn ) {
10237
+ return this.on( types, null, data, fn );
10238
+ },
10239
+ unbind: function( types, fn ) {
10240
+ return this.off( types, null, fn );
10241
+ },
10242
+
10243
+ delegate: function( selector, types, data, fn ) {
10244
+ return this.on( types, selector, data, fn );
10245
+ },
10246
+ undelegate: function( selector, types, fn ) {
10247
+
10248
+ // ( namespace ) or ( selector, types [, fn] )
10249
+ return arguments.length === 1 ?
10250
+ this.off( selector, "**" ) :
10251
+ this.off( types, selector || "**", fn );
10252
+ }
10253
+ } );
10254
+
10255
+ jQuery.holdReady = function( hold ) {
10256
+ if ( hold ) {
10257
+ jQuery.readyWait++;
10258
+ } else {
10259
+ jQuery.ready( true );
10260
+ }
10261
+ };
10262
+ jQuery.isArray = Array.isArray;
10263
+ jQuery.parseJSON = JSON.parse;
10264
+ jQuery.nodeName = nodeName;
10265
+
10266
+
10267
+
10268
+
10269
+ // Register as a named AMD module, since jQuery can be concatenated with other
10270
+ // files that may use define, but not via a proper concatenation script that
10271
+ // understands anonymous AMD modules. A named AMD is safest and most robust
10272
+ // way to register. Lowercase jquery is used because AMD module names are
10273
+ // derived from file names, and jQuery is normally delivered in a lowercase
10274
+ // file name. Do this after creating the global so that if an AMD module wants
10275
+ // to call noConflict to hide this version of jQuery, it will work.
10276
+
10277
+ // Note that for maximum portability, libraries that are not jQuery should
10278
+ // declare themselves as anonymous modules, and avoid setting a global if an
10279
+ // AMD loader is present. jQuery is a special case. For more information, see
10280
+ // https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
10281
+
10282
+ if ( true ) {
10283
+ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = function() {
10284
+ return jQuery;
10285
+ }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),
10286
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
10287
+ }
10288
+
10289
+
10290
+
10291
+
10292
+ var
10293
+
10294
+ // Map over jQuery in case of overwrite
10295
+ _jQuery = window.jQuery,
10296
+
10297
+ // Map over the $ in case of overwrite
10298
+ _$ = window.$;
10299
+
10300
+ jQuery.noConflict = function( deep ) {
10301
+ if ( window.$ === jQuery ) {
10302
+ window.$ = _$;
10303
+ }
10304
+
10305
+ if ( deep && window.jQuery === jQuery ) {
10306
+ window.jQuery = _jQuery;
10307
+ }
10308
+
10309
+ return jQuery;
10310
+ };
10311
+
10312
+ // Expose jQuery and $ identifiers, even in AMD
10313
+ // (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
10314
+ // and CommonJS for browser emulators (#13566)
10315
+ if ( !noGlobal ) {
10316
+ window.jQuery = window.$ = jQuery;
10317
+ }
10318
+
10319
+
10320
+
10321
+
10322
+ return jQuery;
10323
+ } );
10324
+
10325
+
10326
+ /***/ }),
10327
+ /* 1 */,
10328
+ /* 2 */,
10329
+ /* 3 */,
10330
+ /* 4 */,
10331
+ /* 5 */
10332
+ /***/ (function(module, exports, __webpack_require__) {
10333
+
10334
+ "use strict";
10335
+
10336
+
10337
+ __webpack_require__(6);
10338
+
10339
+ jQuery(document).ready(function ($) {
10340
+
10341
+ // var myOptions = {
10342
+ // // you can declare a default color here,
10343
+ // // or in the data-default-color attribute on the input
10344
+ // defaultColor: 'ddd',
10345
+ // // a callback to fire whenever the color changes to a valid color
10346
+ // change: function(event, ui){},
10347
+ // // a callback to fire when the input is emptied or an invalid color
10348
+ // clear: function() {},
10349
+ // // hide the color picker controls on load
10350
+ // hide: true,
10351
+ // // show a group of common colors beneath the square
10352
+ // // or, supply an array of colors to customize further
10353
+ // palettes: true
10354
+ // };
10355
+ $('.color-wp').wpColorPicker();
10356
+ // $('.color-wp').wpColorPicker(myOptions);
10357
+
10358
+
10359
+ // let s1_options = {
10360
+ // defaultColor: 'ddd',
10361
+ // hide: true,
10362
+ // palettes: true
10363
+ // }
10364
+ // $('.color-wp-s1').wpColorPicker(s1_options);
10365
+
10366
+ });
10367
+
10368
+ $(document).ready(function () {
10369
+ $('select').material_select();
10370
+ $('.collapsible').collapsible();
10371
+
10372
+ var position = document.querySelectorAll('.position');
10373
+
10374
+ var default_display = function default_display() {
10375
+
10376
+ var val = $('.select').find(":selected").val();
10377
+
10378
+ var position1 = document.querySelector('.position-1');
10379
+ var position2 = document.querySelector('.position-2');
10380
+ var position3 = document.querySelector('.position-3');
10381
+ var position4 = document.querySelector('.position-4');
10382
+
10383
+ if (val == '1') {
10384
+ position1.classList.add('display-block');
10385
+ } else if (val == '2') {
10386
+ position2.classList.add('display-block');
10387
+ } else if (val == '3') {
10388
+ position3.classList.add('display-block');
10389
+ } else if (val == '4') {
10390
+ position4.classList.add('display-block');
10391
+ }
10392
+ };
10393
+
10394
+ default_display();
10395
+
10396
+ // incase displya-block is added remove it ..
10397
+ var remove = function remove() {
10398
+ position.forEach(function (e) {
10399
+ e.classList.remove('display-block');
10400
+ });
10401
+ };
10402
+
10403
+ $(".select").on("change", function (e) {
10404
+ var x = e.target;
10405
+ var val = e.target.value;
10406
+
10407
+ var position1 = document.querySelector('.position-1');
10408
+ var position2 = document.querySelector('.position-2');
10409
+ var position3 = document.querySelector('.position-3');
10410
+ var position4 = document.querySelector('.position-4');
10411
+
10412
+ if (val == '1') {
10413
+ remove();
10414
+ position1.classList.add('display-block');
10415
+ } else if (val == '2') {
10416
+ remove();
10417
+ position2.classList.add('display-block');
10418
+ } else if (val == '3') {
10419
+ remove();
10420
+ position3.classList.add('display-block');
10421
+ } else if (val == '4') {
10422
+ remove();
10423
+ position4.classList.add('display-block');
10424
+ }
10425
+ });
10426
+
10427
+ // can impove this code -
10428
+ // https://stackoverflow.com/a/32631357/2591092
10429
+ // https://stackoverflow.com/questions/11208021/jquery-add-css-class-depending-on-selectbox-option
10430
+ });
10431
+
10432
+ /***/ }),
10433
+ /* 6 */
10434
+ /***/ (function(module, exports, __webpack_require__) {
10435
+
10436
+ var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;var __WEBPACK_AMD_DEFINE_RESULT__;var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!
10437
+ * Materialize v0.100.1 (http://materializecss.com)
10438
+ * Copyright 2014-2017 Materialize
10439
+ * MIT License (https://raw.githubusercontent.com/Dogfalo/materialize/master/LICENSE)
10440
+ */
10441
+ var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
10442
+
10443
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
10444
+
10445
+ // Check for jQuery.
10446
+ if (typeof jQuery === 'undefined') {
10447
+ var jQuery;
10448
+ // Check if require is a defined function.
10449
+ if (true) {
10450
+ jQuery = $ = __webpack_require__(0);
10451
+ // Else use the dollar sign alias.
10452
+ } else {
10453
+ jQuery = $;
10454
+ }
10455
+ }
10456
+ ; /*
10457
+ * jQuery Easing v1.4.0 - http://gsgd.co.uk/sandbox/jquery/easing/
10458
+ * Open source under the BSD License.
10459
+ * Copyright © 2008 George McGinley Smith
10460
+ * All rights reserved.
10461
+ * https://raw.github.com/gdsmith/jquery-easing/master/LICENSE
10462
+ */
10463
+
10464
+ (function (factory) {
10465
+ if (true) {
10466
+ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(0)], __WEBPACK_AMD_DEFINE_RESULT__ = function ($) {
10467
+ return factory($);
10468
+ }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),
10469
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
10470
+ } else if (typeof module === "object" && typeof module.exports === "object") {
10471
+ exports = factory(require('jquery'));
10472
+ } else {
10473
+ factory(jQuery);
10474
+ }
10475
+ })(function ($) {
10476
+
10477
+ // Preserve the original jQuery "swing" easing as "jswing"
10478
+ $.easing['jswing'] = $.easing['swing'];
10479
+
10480
+ var pow = Math.pow,
10481
+ sqrt = Math.sqrt,
10482
+ sin = Math.sin,
10483
+ cos = Math.cos,
10484
+ PI = Math.PI,
10485
+ c1 = 1.70158,
10486
+ c2 = c1 * 1.525,
10487
+ c3 = c1 + 1,
10488
+ c4 = 2 * PI / 3,
10489
+ c5 = 2 * PI / 4.5;
10490
+
10491
+ // x is the fraction of animation progress, in the range 0..1
10492
+ function bounceOut(x) {
10493
+ var n1 = 7.5625,
10494
+ d1 = 2.75;
10495
+ if (x < 1 / d1) {
10496
+ return n1 * x * x;
10497
+ } else if (x < 2 / d1) {
10498
+ return n1 * (x -= 1.5 / d1) * x + .75;
10499
+ } else if (x < 2.5 / d1) {
10500
+ return n1 * (x -= 2.25 / d1) * x + .9375;
10501
+ } else {
10502
+ return n1 * (x -= 2.625 / d1) * x + .984375;
10503
+ }
10504
+ }
10505
+
10506
+ $.extend($.easing, {
10507
+ def: 'easeOutQuad',
10508
+ swing: function (x) {
10509
+ return $.easing[$.easing.def](x);
10510
+ },
10511
+ easeInQuad: function (x) {
10512
+ return x * x;
10513
+ },
10514
+ easeOutQuad: function (x) {
10515
+ return 1 - (1 - x) * (1 - x);
10516
+ },
10517
+ easeInOutQuad: function (x) {
10518
+ return x < 0.5 ? 2 * x * x : 1 - pow(-2 * x + 2, 2) / 2;
10519
+ },
10520
+ easeInCubic: function (x) {
10521
+ return x * x * x;
10522
+ },
10523
+ easeOutCubic: function (x) {
10524
+ return 1 - pow(1 - x, 3);
10525
+ },
10526
+ easeInOutCubic: function (x) {
10527
+ return x < 0.5 ? 4 * x * x * x : 1 - pow(-2 * x + 2, 3) / 2;
10528
+ },
10529
+ easeInQuart: function (x) {
10530
+ return x * x * x * x;
10531
+ },
10532
+ easeOutQuart: function (x) {
10533
+ return 1 - pow(1 - x, 4);
10534
+ },
10535
+ easeInOutQuart: function (x) {
10536
+ return x < 0.5 ? 8 * x * x * x * x : 1 - pow(-2 * x + 2, 4) / 2;
10537
+ },
10538
+ easeInQuint: function (x) {
10539
+ return x * x * x * x * x;
10540
+ },
10541
+ easeOutQuint: function (x) {
10542
+ return 1 - pow(1 - x, 5);
10543
+ },
10544
+ easeInOutQuint: function (x) {
10545
+ return x < 0.5 ? 16 * x * x * x * x * x : 1 - pow(-2 * x + 2, 5) / 2;
10546
+ },
10547
+ easeInSine: function (x) {
10548
+ return 1 - cos(x * PI / 2);
10549
+ },
10550
+ easeOutSine: function (x) {
10551
+ return sin(x * PI / 2);
10552
+ },
10553
+ easeInOutSine: function (x) {
10554
+ return -(cos(PI * x) - 1) / 2;
10555
+ },
10556
+ easeInExpo: function (x) {
10557
+ return x === 0 ? 0 : pow(2, 10 * x - 10);
10558
+ },
10559
+ easeOutExpo: function (x) {
10560
+ return x === 1 ? 1 : 1 - pow(2, -10 * x);
10561
+ },
10562
+ easeInOutExpo: function (x) {
10563
+ return x === 0 ? 0 : x === 1 ? 1 : x < 0.5 ? pow(2, 20 * x - 10) / 2 : (2 - pow(2, -20 * x + 10)) / 2;
10564
+ },
10565
+ easeInCirc: function (x) {
10566
+ return 1 - sqrt(1 - pow(x, 2));
10567
+ },
10568
+ easeOutCirc: function (x) {
10569
+ return sqrt(1 - pow(x - 1, 2));
10570
+ },
10571
+ easeInOutCirc: function (x) {
10572
+ return x < 0.5 ? (1 - sqrt(1 - pow(2 * x, 2))) / 2 : (sqrt(1 - pow(-2 * x + 2, 2)) + 1) / 2;
10573
+ },
10574
+ easeInElastic: function (x) {
10575
+ return x === 0 ? 0 : x === 1 ? 1 : -pow(2, 10 * x - 10) * sin((x * 10 - 10.75) * c4);
10576
+ },
10577
+ easeOutElastic: function (x) {
10578
+ return x === 0 ? 0 : x === 1 ? 1 : pow(2, -10 * x) * sin((x * 10 - 0.75) * c4) + 1;
10579
+ },
10580
+ easeInOutElastic: function (x) {
10581
+ return x === 0 ? 0 : x === 1 ? 1 : x < 0.5 ? -(pow(2, 20 * x - 10) * sin((20 * x - 11.125) * c5)) / 2 : pow(2, -20 * x + 10) * sin((20 * x - 11.125) * c5) / 2 + 1;
10582
+ },
10583
+ easeInBack: function (x) {
10584
+ return c3 * x * x * x - c1 * x * x;
10585
+ },
10586
+ easeOutBack: function (x) {
10587
+ return 1 + c3 * pow(x - 1, 3) + c1 * pow(x - 1, 2);
10588
+ },
10589
+ easeInOutBack: function (x) {
10590
+ return x < 0.5 ? pow(2 * x, 2) * ((c2 + 1) * 2 * x - c2) / 2 : (pow(2 * x - 2, 2) * ((c2 + 1) * (x * 2 - 2) + c2) + 2) / 2;
10591
+ },
10592
+ easeInBounce: function (x) {
10593
+ return 1 - bounceOut(1 - x);
10594
+ },
10595
+ easeOutBounce: bounceOut,
10596
+ easeInOutBounce: function (x) {
10597
+ return x < 0.5 ? (1 - bounceOut(1 - 2 * x)) / 2 : (1 + bounceOut(2 * x - 1)) / 2;
10598
+ }
10599
+ });
10600
+ });; // Custom Easing
10601
+ jQuery.extend(jQuery.easing, {
10602
+ easeInOutMaterial: function (x, t, b, c, d) {
10603
+ if ((t /= d / 2) < 1) return c / 2 * t * t + b;
10604
+ return c / 4 * ((t -= 2) * t * t + 2) + b;
10605
+ }
10606
+ });; /*! VelocityJS.org (1.2.3). (C) 2014 Julian Shapiro. MIT @license: en.wikipedia.org/wiki/MIT_License */
10607
+ /*! VelocityJS.org jQuery Shim (1.0.1). (C) 2014 The jQuery Foundation. MIT @license: en.wikipedia.org/wiki/MIT_License. */
10608
+ /*! Note that this has been modified by Materialize to confirm that Velocity is not already being imported. */
10609
+ jQuery.Velocity ? console.log("Velocity is already loaded. You may be needlessly importing Velocity again; note that Materialize includes Velocity.") : (!function (e) {
10610
+ function t(e) {
10611
+ var t = e.length,
10612
+ a = r.type(e);return "function" === a || r.isWindow(e) ? !1 : 1 === e.nodeType && t ? !0 : "array" === a || 0 === t || "number" == typeof t && t > 0 && t - 1 in e;
10613
+ }if (!e.jQuery) {
10614
+ var r = function (e, t) {
10615
+ return new r.fn.init(e, t);
10616
+ };r.isWindow = function (e) {
10617
+ return null != e && e == e.window;
10618
+ }, r.type = function (e) {
10619
+ return null == e ? e + "" : "object" == typeof e || "function" == typeof e ? n[i.call(e)] || "object" : typeof e;
10620
+ }, r.isArray = Array.isArray || function (e) {
10621
+ return "array" === r.type(e);
10622
+ }, r.isPlainObject = function (e) {
10623
+ var t;if (!e || "object" !== r.type(e) || e.nodeType || r.isWindow(e)) return !1;try {
10624
+ if (e.constructor && !o.call(e, "constructor") && !o.call(e.constructor.prototype, "isPrototypeOf")) return !1;
10625
+ } catch (a) {
10626
+ return !1;
10627
+ }for (t in e) {}return void 0 === t || o.call(e, t);
10628
+ }, r.each = function (e, r, a) {
10629
+ var n,
10630
+ o = 0,
10631
+ i = e.length,
10632
+ s = t(e);if (a) {
10633
+ if (s) for (; i > o && (n = r.apply(e[o], a), n !== !1); o++) {} else for (o in e) {
10634
+ if (n = r.apply(e[o], a), n === !1) break;
10635
+ }
10636
+ } else if (s) for (; i > o && (n = r.call(e[o], o, e[o]), n !== !1); o++) {} else for (o in e) {
10637
+ if (n = r.call(e[o], o, e[o]), n === !1) break;
10638
+ }return e;
10639
+ }, r.data = function (e, t, n) {
10640
+ if (void 0 === n) {
10641
+ var o = e[r.expando],
10642
+ i = o && a[o];if (void 0 === t) return i;if (i && t in i) return i[t];
10643
+ } else if (void 0 !== t) {
10644
+ var o = e[r.expando] || (e[r.expando] = ++r.uuid);return a[o] = a[o] || {}, a[o][t] = n, n;
10645
+ }
10646
+ }, r.removeData = function (e, t) {
10647
+ var n = e[r.expando],
10648
+ o = n && a[n];o && r.each(t, function (e, t) {
10649
+ delete o[t];
10650
+ });
10651
+ }, r.extend = function () {
10652
+ var e,
10653
+ t,
10654
+ a,
10655
+ n,
10656
+ o,
10657
+ i,
10658
+ s = arguments[0] || {},
10659
+ l = 1,
10660
+ u = arguments.length,
10661
+ c = !1;for ("boolean" == typeof s && (c = s, s = arguments[l] || {}, l++), "object" != typeof s && "function" !== r.type(s) && (s = {}), l === u && (s = this, l--); u > l; l++) {
10662
+ if (null != (o = arguments[l])) for (n in o) {
10663
+ e = s[n], a = o[n], s !== a && (c && a && (r.isPlainObject(a) || (t = r.isArray(a))) ? (t ? (t = !1, i = e && r.isArray(e) ? e : []) : i = e && r.isPlainObject(e) ? e : {}, s[n] = r.extend(c, i, a)) : void 0 !== a && (s[n] = a));
10664
+ }
10665
+ }return s;
10666
+ }, r.queue = function (e, a, n) {
10667
+ function o(e, r) {
10668
+ var a = r || [];return null != e && (t(Object(e)) ? !function (e, t) {
10669
+ for (var r = +t.length, a = 0, n = e.length; r > a;) {
10670
+ e[n++] = t[a++];
10671
+ }if (r !== r) for (; void 0 !== t[a];) {
10672
+ e[n++] = t[a++];
10673
+ }return e.length = n, e;
10674
+ }(a, "string" == typeof e ? [e] : e) : [].push.call(a, e)), a;
10675
+ }if (e) {
10676
+ a = (a || "fx") + "queue";var i = r.data(e, a);return n ? (!i || r.isArray(n) ? i = r.data(e, a, o(n)) : i.push(n), i) : i || [];
10677
+ }
10678
+ }, r.dequeue = function (e, t) {
10679
+ r.each(e.nodeType ? [e] : e, function (e, a) {
10680
+ t = t || "fx";var n = r.queue(a, t),
10681
+ o = n.shift();"inprogress" === o && (o = n.shift()), o && ("fx" === t && n.unshift("inprogress"), o.call(a, function () {
10682
+ r.dequeue(a, t);
10683
+ }));
10684
+ });
10685
+ }, r.fn = r.prototype = { init: function (e) {
10686
+ if (e.nodeType) return this[0] = e, this;throw new Error("Not a DOM node.");
10687
+ }, offset: function () {
10688
+ var t = this[0].getBoundingClientRect ? this[0].getBoundingClientRect() : { top: 0, left: 0 };return { top: t.top + (e.pageYOffset || document.scrollTop || 0) - (document.clientTop || 0), left: t.left + (e.pageXOffset || document.scrollLeft || 0) - (document.clientLeft || 0) };
10689
+ }, position: function () {
10690
+ function e() {
10691
+ for (var e = this.offsetParent || document; e && "html" === !e.nodeType.toLowerCase && "static" === e.style.position;) {
10692
+ e = e.offsetParent;
10693
+ }return e || document;
10694
+ }var t = this[0],
10695
+ e = e.apply(t),
10696
+ a = this.offset(),
10697
+ n = /^(?:body|html)$/i.test(e.nodeName) ? { top: 0, left: 0 } : r(e).offset();return a.top -= parseFloat(t.style.marginTop) || 0, a.left -= parseFloat(t.style.marginLeft) || 0, e.style && (n.top += parseFloat(e.style.borderTopWidth) || 0, n.left += parseFloat(e.style.borderLeftWidth) || 0), { top: a.top - n.top, left: a.left - n.left };
10698
+ } };var a = {};r.expando = "velocity" + new Date().getTime(), r.uuid = 0;for (var n = {}, o = n.hasOwnProperty, i = n.toString, s = "Boolean Number String Function Array Date RegExp Object Error".split(" "), l = 0; l < s.length; l++) {
10699
+ n["[object " + s[l] + "]"] = s[l].toLowerCase();
10700
+ }r.fn.init.prototype = r.fn, e.Velocity = { Utilities: r };
10701
+ }
10702
+ }(window), function (e) {
10703
+ "object" == typeof module && "object" == typeof module.exports ? module.exports = e() : true ? !(__WEBPACK_AMD_DEFINE_FACTORY__ = (e),
10704
+ __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
10705
+ (__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) :
10706
+ __WEBPACK_AMD_DEFINE_FACTORY__),
10707
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : e();
10708
+ }(function () {
10709
+ return function (e, t, r, a) {
10710
+ function n(e) {
10711
+ for (var t = -1, r = e ? e.length : 0, a = []; ++t < r;) {
10712
+ var n = e[t];n && a.push(n);
10713
+ }return a;
10714
+ }function o(e) {
10715
+ return m.isWrapped(e) ? e = [].slice.call(e) : m.isNode(e) && (e = [e]), e;
10716
+ }function i(e) {
10717
+ var t = f.data(e, "velocity");return null === t ? a : t;
10718
+ }function s(e) {
10719
+ return function (t) {
10720
+ return Math.round(t * e) * (1 / e);
10721
+ };
10722
+ }function l(e, r, a, n) {
10723
+ function o(e, t) {
10724
+ return 1 - 3 * t + 3 * e;
10725
+ }function i(e, t) {
10726
+ return 3 * t - 6 * e;
10727
+ }function s(e) {
10728
+ return 3 * e;
10729
+ }function l(e, t, r) {
10730
+ return ((o(t, r) * e + i(t, r)) * e + s(t)) * e;
10731
+ }function u(e, t, r) {
10732
+ return 3 * o(t, r) * e * e + 2 * i(t, r) * e + s(t);
10733
+ }function c(t, r) {
10734
+ for (var n = 0; m > n; ++n) {
10735
+ var o = u(r, e, a);if (0 === o) return r;var i = l(r, e, a) - t;r -= i / o;
10736
+ }return r;
10737
+ }function p() {
10738
+ for (var t = 0; b > t; ++t) {
10739
+ w[t] = l(t * x, e, a);
10740
+ }
10741
+ }function f(t, r, n) {
10742
+ var o,
10743
+ i,
10744
+ s = 0;do {
10745
+ i = r + (n - r) / 2, o = l(i, e, a) - t, o > 0 ? n = i : r = i;
10746
+ } while (Math.abs(o) > h && ++s < v);return i;
10747
+ }function d(t) {
10748
+ for (var r = 0, n = 1, o = b - 1; n != o && w[n] <= t; ++n) {
10749
+ r += x;
10750
+ }--n;var i = (t - w[n]) / (w[n + 1] - w[n]),
10751
+ s = r + i * x,
10752
+ l = u(s, e, a);return l >= y ? c(t, s) : 0 == l ? s : f(t, r, r + x);
10753
+ }function g() {
10754
+ V = !0, (e != r || a != n) && p();
10755
+ }var m = 4,
10756
+ y = .001,
10757
+ h = 1e-7,
10758
+ v = 10,
10759
+ b = 11,
10760
+ x = 1 / (b - 1),
10761
+ S = "Float32Array" in t;if (4 !== arguments.length) return !1;for (var P = 0; 4 > P; ++P) {
10762
+ if ("number" != typeof arguments[P] || isNaN(arguments[P]) || !isFinite(arguments[P])) return !1;
10763
+ }e = Math.min(e, 1), a = Math.min(a, 1), e = Math.max(e, 0), a = Math.max(a, 0);var w = S ? new Float32Array(b) : new Array(b),
10764
+ V = !1,
10765
+ C = function (t) {
10766
+ return V || g(), e === r && a === n ? t : 0 === t ? 0 : 1 === t ? 1 : l(d(t), r, n);
10767
+ };C.getControlPoints = function () {
10768
+ return [{ x: e, y: r }, { x: a, y: n }];
10769
+ };var T = "generateBezier(" + [e, r, a, n] + ")";return C.toString = function () {
10770
+ return T;
10771
+ }, C;
10772
+ }function u(e, t) {
10773
+ var r = e;return m.isString(e) ? b.Easings[e] || (r = !1) : r = m.isArray(e) && 1 === e.length ? s.apply(null, e) : m.isArray(e) && 2 === e.length ? x.apply(null, e.concat([t])) : m.isArray(e) && 4 === e.length ? l.apply(null, e) : !1, r === !1 && (r = b.Easings[b.defaults.easing] ? b.defaults.easing : v), r;
10774
+ }function c(e) {
10775
+ if (e) {
10776
+ var t = new Date().getTime(),
10777
+ r = b.State.calls.length;r > 1e4 && (b.State.calls = n(b.State.calls));for (var o = 0; r > o; o++) {
10778
+ if (b.State.calls[o]) {
10779
+ var s = b.State.calls[o],
10780
+ l = s[0],
10781
+ u = s[2],
10782
+ d = s[3],
10783
+ g = !!d,
10784
+ y = null;d || (d = b.State.calls[o][3] = t - 16);for (var h = Math.min((t - d) / u.duration, 1), v = 0, x = l.length; x > v; v++) {
10785
+ var P = l[v],
10786
+ V = P.element;if (i(V)) {
10787
+ var C = !1;if (u.display !== a && null !== u.display && "none" !== u.display) {
10788
+ if ("flex" === u.display) {
10789
+ var T = ["-webkit-box", "-moz-box", "-ms-flexbox", "-webkit-flex"];f.each(T, function (e, t) {
10790
+ S.setPropertyValue(V, "display", t);
10791
+ });
10792
+ }S.setPropertyValue(V, "display", u.display);
10793
+ }u.visibility !== a && "hidden" !== u.visibility && S.setPropertyValue(V, "visibility", u.visibility);for (var k in P) {
10794
+ if ("element" !== k) {
10795
+ var A,
10796
+ F = P[k],
10797
+ j = m.isString(F.easing) ? b.Easings[F.easing] : F.easing;if (1 === h) A = F.endValue;else {
10798
+ var E = F.endValue - F.startValue;if (A = F.startValue + E * j(h, u, E), !g && A === F.currentValue) continue;
10799
+ }if (F.currentValue = A, "tween" === k) y = A;else {
10800
+ if (S.Hooks.registered[k]) {
10801
+ var H = S.Hooks.getRoot(k),
10802
+ N = i(V).rootPropertyValueCache[H];N && (F.rootPropertyValue = N);
10803
+ }var L = S.setPropertyValue(V, k, F.currentValue + (0 === parseFloat(A) ? "" : F.unitType), F.rootPropertyValue, F.scrollData);S.Hooks.registered[k] && (i(V).rootPropertyValueCache[H] = S.Normalizations.registered[H] ? S.Normalizations.registered[H]("extract", null, L[1]) : L[1]), "transform" === L[0] && (C = !0);
10804
+ }
10805
+ }
10806
+ }u.mobileHA && i(V).transformCache.translate3d === a && (i(V).transformCache.translate3d = "(0px, 0px, 0px)", C = !0), C && S.flushTransformCache(V);
10807
+ }
10808
+ }u.display !== a && "none" !== u.display && (b.State.calls[o][2].display = !1), u.visibility !== a && "hidden" !== u.visibility && (b.State.calls[o][2].visibility = !1), u.progress && u.progress.call(s[1], s[1], h, Math.max(0, d + u.duration - t), d, y), 1 === h && p(o);
10809
+ }
10810
+ }
10811
+ }b.State.isTicking && w(c);
10812
+ }function p(e, t) {
10813
+ if (!b.State.calls[e]) return !1;for (var r = b.State.calls[e][0], n = b.State.calls[e][1], o = b.State.calls[e][2], s = b.State.calls[e][4], l = !1, u = 0, c = r.length; c > u; u++) {
10814
+ var p = r[u].element;if (t || o.loop || ("none" === o.display && S.setPropertyValue(p, "display", o.display), "hidden" === o.visibility && S.setPropertyValue(p, "visibility", o.visibility)), o.loop !== !0 && (f.queue(p)[1] === a || !/\.velocityQueueEntryFlag/i.test(f.queue(p)[1])) && i(p)) {
10815
+ i(p).isAnimating = !1, i(p).rootPropertyValueCache = {};var d = !1;f.each(S.Lists.transforms3D, function (e, t) {
10816
+ var r = /^scale/.test(t) ? 1 : 0,
10817
+ n = i(p).transformCache[t];i(p).transformCache[t] !== a && new RegExp("^\\(" + r + "[^.]").test(n) && (d = !0, delete i(p).transformCache[t]);
10818
+ }), o.mobileHA && (d = !0, delete i(p).transformCache.translate3d), d && S.flushTransformCache(p), S.Values.removeClass(p, "velocity-animating");
10819
+ }if (!t && o.complete && !o.loop && u === c - 1) try {
10820
+ o.complete.call(n, n);
10821
+ } catch (g) {
10822
+ setTimeout(function () {
10823
+ throw g;
10824
+ }, 1);
10825
+ }s && o.loop !== !0 && s(n), i(p) && o.loop === !0 && !t && (f.each(i(p).tweensContainer, function (e, t) {
10826
+ /^rotate/.test(e) && 360 === parseFloat(t.endValue) && (t.endValue = 0, t.startValue = 360), /^backgroundPosition/.test(e) && 100 === parseFloat(t.endValue) && "%" === t.unitType && (t.endValue = 0, t.startValue = 100);
10827
+ }), b(p, "reverse", { loop: !0, delay: o.delay })), o.queue !== !1 && f.dequeue(p, o.queue);
10828
+ }b.State.calls[e] = !1;for (var m = 0, y = b.State.calls.length; y > m; m++) {
10829
+ if (b.State.calls[m] !== !1) {
10830
+ l = !0;break;
10831
+ }
10832
+ }l === !1 && (b.State.isTicking = !1, delete b.State.calls, b.State.calls = []);
10833
+ }var f,
10834
+ d = function () {
10835
+ if (r.documentMode) return r.documentMode;for (var e = 7; e > 4; e--) {
10836
+ var t = r.createElement("div");if (t.innerHTML = "<!--[if IE " + e + "]><span></span><![endif]-->", t.getElementsByTagName("span").length) return t = null, e;
10837
+ }return a;
10838
+ }(),
10839
+ g = function () {
10840
+ var e = 0;return t.webkitRequestAnimationFrame || t.mozRequestAnimationFrame || function (t) {
10841
+ var r,
10842
+ a = new Date().getTime();return r = Math.max(0, 16 - (a - e)), e = a + r, setTimeout(function () {
10843
+ t(a + r);
10844
+ }, r);
10845
+ };
10846
+ }(),
10847
+ m = { isString: function (e) {
10848
+ return "string" == typeof e;
10849
+ }, isArray: Array.isArray || function (e) {
10850
+ return "[object Array]" === Object.prototype.toString.call(e);
10851
+ }, isFunction: function (e) {
10852
+ return "[object Function]" === Object.prototype.toString.call(e);
10853
+ }, isNode: function (e) {
10854
+ return e && e.nodeType;
10855
+ }, isNodeList: function (e) {
10856
+ return "object" == typeof e && /^\[object (HTMLCollection|NodeList|Object)\]$/.test(Object.prototype.toString.call(e)) && e.length !== a && (0 === e.length || "object" == typeof e[0] && e[0].nodeType > 0);
10857
+ }, isWrapped: function (e) {
10858
+ return e && (e.jquery || t.Zepto && t.Zepto.zepto.isZ(e));
10859
+ }, isSVG: function (e) {
10860
+ return t.SVGElement && e instanceof t.SVGElement;
10861
+ }, isEmptyObject: function (e) {
10862
+ for (var t in e) {
10863
+ return !1;
10864
+ }return !0;
10865
+ } },
10866
+ y = !1;if (e.fn && e.fn.jquery ? (f = e, y = !0) : f = t.Velocity.Utilities, 8 >= d && !y) throw new Error("Velocity: IE8 and below require jQuery to be loaded before Velocity.");if (7 >= d) return void (jQuery.fn.velocity = jQuery.fn.animate);var h = 400,
10867
+ v = "swing",
10868
+ b = { State: { isMobile: /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent), isAndroid: /Android/i.test(navigator.userAgent), isGingerbread: /Android 2\.3\.[3-7]/i.test(navigator.userAgent), isChrome: t.chrome, isFirefox: /Firefox/i.test(navigator.userAgent), prefixElement: r.createElement("div"), prefixMatches: {}, scrollAnchor: null, scrollPropertyLeft: null, scrollPropertyTop: null, isTicking: !1, calls: [] }, CSS: {}, Utilities: f, Redirects: {}, Easings: {}, Promise: t.Promise, defaults: { queue: "", duration: h, easing: v, begin: a, complete: a, progress: a, display: a, visibility: a, loop: !1, delay: !1, mobileHA: !0, _cacheValues: !0 }, init: function (e) {
10869
+ f.data(e, "velocity", { isSVG: m.isSVG(e), isAnimating: !1, computedStyle: null, tweensContainer: null, rootPropertyValueCache: {}, transformCache: {} });
10870
+ }, hook: null, mock: !1, version: { major: 1, minor: 2, patch: 2 }, debug: !1 };t.pageYOffset !== a ? (b.State.scrollAnchor = t, b.State.scrollPropertyLeft = "pageXOffset", b.State.scrollPropertyTop = "pageYOffset") : (b.State.scrollAnchor = r.documentElement || r.body.parentNode || r.body, b.State.scrollPropertyLeft = "scrollLeft", b.State.scrollPropertyTop = "scrollTop");var x = function () {
10871
+ function e(e) {
10872
+ return -e.tension * e.x - e.friction * e.v;
10873
+ }function t(t, r, a) {
10874
+ var n = { x: t.x + a.dx * r, v: t.v + a.dv * r, tension: t.tension, friction: t.friction };return { dx: n.v, dv: e(n) };
10875
+ }function r(r, a) {
10876
+ var n = { dx: r.v, dv: e(r) },
10877
+ o = t(r, .5 * a, n),
10878
+ i = t(r, .5 * a, o),
10879
+ s = t(r, a, i),
10880
+ l = 1 / 6 * (n.dx + 2 * (o.dx + i.dx) + s.dx),
10881
+ u = 1 / 6 * (n.dv + 2 * (o.dv + i.dv) + s.dv);return r.x = r.x + l * a, r.v = r.v + u * a, r;
10882
+ }return function a(e, t, n) {
10883
+ var o,
10884
+ i,
10885
+ s,
10886
+ l = { x: -1, v: 0, tension: null, friction: null },
10887
+ u = [0],
10888
+ c = 0,
10889
+ p = 1e-4,
10890
+ f = .016;for (e = parseFloat(e) || 500, t = parseFloat(t) || 20, n = n || null, l.tension = e, l.friction = t, o = null !== n, o ? (c = a(e, t), i = c / n * f) : i = f; s = r(s || l, i), u.push(1 + s.x), c += 16, Math.abs(s.x) > p && Math.abs(s.v) > p;) {}return o ? function (e) {
10891
+ return u[e * (u.length - 1) | 0];
10892
+ } : c;
10893
+ };
10894
+ }();b.Easings = { linear: function (e) {
10895
+ return e;
10896
+ }, swing: function (e) {
10897
+ return .5 - Math.cos(e * Math.PI) / 2;
10898
+ }, spring: function (e) {
10899
+ return 1 - Math.cos(4.5 * e * Math.PI) * Math.exp(6 * -e);
10900
+ } }, f.each([["ease", [.25, .1, .25, 1]], ["ease-in", [.42, 0, 1, 1]], ["ease-out", [0, 0, .58, 1]], ["ease-in-out", [.42, 0, .58, 1]], ["easeInSine", [.47, 0, .745, .715]], ["easeOutSine", [.39, .575, .565, 1]], ["easeInOutSine", [.445, .05, .55, .95]], ["easeInQuad", [.55, .085, .68, .53]], ["easeOutQuad", [.25, .46, .45, .94]], ["easeInOutQuad", [.455, .03, .515, .955]], ["easeInCubic", [.55, .055, .675, .19]], ["easeOutCubic", [.215, .61, .355, 1]], ["easeInOutCubic", [.645, .045, .355, 1]], ["easeInQuart", [.895, .03, .685, .22]], ["easeOutQuart", [.165, .84, .44, 1]], ["easeInOutQuart", [.77, 0, .175, 1]], ["easeInQuint", [.755, .05, .855, .06]], ["easeOutQuint", [.23, 1, .32, 1]], ["easeInOutQuint", [.86, 0, .07, 1]], ["easeInExpo", [.95, .05, .795, .035]], ["easeOutExpo", [.19, 1, .22, 1]], ["easeInOutExpo", [1, 0, 0, 1]], ["easeInCirc", [.6, .04, .98, .335]], ["easeOutCirc", [.075, .82, .165, 1]], ["easeInOutCirc", [.785, .135, .15, .86]]], function (e, t) {
10901
+ b.Easings[t[0]] = l.apply(null, t[1]);
10902
+ });var S = b.CSS = { RegEx: { isHex: /^#([A-f\d]{3}){1,2}$/i, valueUnwrap: /^[A-z]+\((.*)\)$/i, wrappedValueAlreadyExtracted: /[0-9.]+ [0-9.]+ [0-9.]+( [0-9.]+)?/, valueSplit: /([A-z]+\(.+\))|(([A-z0-9#-.]+?)(?=\s|$))/gi }, Lists: { colors: ["fill", "stroke", "stopColor", "color", "backgroundColor", "borderColor", "borderTopColor", "borderRightColor", "borderBottomColor", "borderLeftColor", "outlineColor"], transformsBase: ["translateX", "translateY", "scale", "scaleX", "scaleY", "skewX", "skewY", "rotateZ"], transforms3D: ["transformPerspective", "translateZ", "scaleZ", "rotateX", "rotateY"] }, Hooks: { templates: { textShadow: ["Color X Y Blur", "black 0px 0px 0px"], boxShadow: ["Color X Y Blur Spread", "black 0px 0px 0px 0px"], clip: ["Top Right Bottom Left", "0px 0px 0px 0px"], backgroundPosition: ["X Y", "0% 0%"], transformOrigin: ["X Y Z", "50% 50% 0px"], perspectiveOrigin: ["X Y", "50% 50%"] }, registered: {}, register: function () {
10903
+ for (var e = 0; e < S.Lists.colors.length; e++) {
10904
+ var t = "color" === S.Lists.colors[e] ? "0 0 0 1" : "255 255 255 1";S.Hooks.templates[S.Lists.colors[e]] = ["Red Green Blue Alpha", t];
10905
+ }var r, a, n;if (d) for (r in S.Hooks.templates) {
10906
+ a = S.Hooks.templates[r], n = a[0].split(" ");var o = a[1].match(S.RegEx.valueSplit);"Color" === n[0] && (n.push(n.shift()), o.push(o.shift()), S.Hooks.templates[r] = [n.join(" "), o.join(" ")]);
10907
+ }for (r in S.Hooks.templates) {
10908
+ a = S.Hooks.templates[r], n = a[0].split(" ");for (var e in n) {
10909
+ var i = r + n[e],
10910
+ s = e;S.Hooks.registered[i] = [r, s];
10911
+ }
10912
+ }
10913
+ }, getRoot: function (e) {
10914
+ var t = S.Hooks.registered[e];return t ? t[0] : e;
10915
+ }, cleanRootPropertyValue: function (e, t) {
10916
+ return S.RegEx.valueUnwrap.test(t) && (t = t.match(S.RegEx.valueUnwrap)[1]), S.Values.isCSSNullValue(t) && (t = S.Hooks.templates[e][1]), t;
10917
+ }, extractValue: function (e, t) {
10918
+ var r = S.Hooks.registered[e];if (r) {
10919
+ var a = r[0],
10920
+ n = r[1];return t = S.Hooks.cleanRootPropertyValue(a, t), t.toString().match(S.RegEx.valueSplit)[n];
10921
+ }return t;
10922
+ }, injectValue: function (e, t, r) {
10923
+ var a = S.Hooks.registered[e];if (a) {
10924
+ var n,
10925
+ o,
10926
+ i = a[0],
10927
+ s = a[1];return r = S.Hooks.cleanRootPropertyValue(i, r), n = r.toString().match(S.RegEx.valueSplit), n[s] = t, o = n.join(" ");
10928
+ }return r;
10929
+ } }, Normalizations: { registered: { clip: function (e, t, r) {
10930
+ switch (e) {case "name":
10931
+ return "clip";case "extract":
10932
+ var a;return S.RegEx.wrappedValueAlreadyExtracted.test(r) ? a = r : (a = r.toString().match(S.RegEx.valueUnwrap), a = a ? a[1].replace(/,(\s+)?/g, " ") : r), a;case "inject":
10933
+ return "rect(" + r + ")";}
10934
+ }, blur: function (e, t, r) {
10935
+ switch (e) {case "name":
10936
+ return b.State.isFirefox ? "filter" : "-webkit-filter";case "extract":
10937
+ var a = parseFloat(r);if (!a && 0 !== a) {
10938
+ var n = r.toString().match(/blur\(([0-9]+[A-z]+)\)/i);a = n ? n[1] : 0;
10939
+ }return a;case "inject":
10940
+ return parseFloat(r) ? "blur(" + r + ")" : "none";}
10941
+ }, opacity: function (e, t, r) {
10942
+ if (8 >= d) switch (e) {case "name":
10943
+ return "filter";case "extract":
10944
+ var a = r.toString().match(/alpha\(opacity=(.*)\)/i);return r = a ? a[1] / 100 : 1;case "inject":
10945
+ return t.style.zoom = 1, parseFloat(r) >= 1 ? "" : "alpha(opacity=" + parseInt(100 * parseFloat(r), 10) + ")";} else switch (e) {case "name":
10946
+ return "opacity";case "extract":
10947
+ return r;case "inject":
10948
+ return r;}
10949
+ } }, register: function () {
10950
+ 9 >= d || b.State.isGingerbread || (S.Lists.transformsBase = S.Lists.transformsBase.concat(S.Lists.transforms3D));for (var e = 0; e < S.Lists.transformsBase.length; e++) {
10951
+ !function () {
10952
+ var t = S.Lists.transformsBase[e];S.Normalizations.registered[t] = function (e, r, n) {
10953
+ switch (e) {case "name":
10954
+ return "transform";case "extract":
10955
+ return i(r) === a || i(r).transformCache[t] === a ? /^scale/i.test(t) ? 1 : 0 : i(r).transformCache[t].replace(/[()]/g, "");case "inject":
10956
+ var o = !1;switch (t.substr(0, t.length - 1)) {case "translate":
10957
+ o = !/(%|px|em|rem|vw|vh|\d)$/i.test(n);break;case "scal":case "scale":
10958
+ b.State.isAndroid && i(r).transformCache[t] === a && 1 > n && (n = 1), o = !/(\d)$/i.test(n);break;case "skew":
10959
+ o = !/(deg|\d)$/i.test(n);break;case "rotate":
10960
+ o = !/(deg|\d)$/i.test(n);}return o || (i(r).transformCache[t] = "(" + n + ")"), i(r).transformCache[t];}
10961
+ };
10962
+ }();
10963
+ }for (var e = 0; e < S.Lists.colors.length; e++) {
10964
+ !function () {
10965
+ var t = S.Lists.colors[e];S.Normalizations.registered[t] = function (e, r, n) {
10966
+ switch (e) {case "name":
10967
+ return t;case "extract":
10968
+ var o;if (S.RegEx.wrappedValueAlreadyExtracted.test(n)) o = n;else {
10969
+ var i,
10970
+ s = { black: "rgb(0, 0, 0)", blue: "rgb(0, 0, 255)", gray: "rgb(128, 128, 128)", green: "rgb(0, 128, 0)", red: "rgb(255, 0, 0)", white: "rgb(255, 255, 255)" };/^[A-z]+$/i.test(n) ? i = s[n] !== a ? s[n] : s.black : S.RegEx.isHex.test(n) ? i = "rgb(" + S.Values.hexToRgb(n).join(" ") + ")" : /^rgba?\(/i.test(n) || (i = s.black), o = (i || n).toString().match(S.RegEx.valueUnwrap)[1].replace(/,(\s+)?/g, " ");
10971
+ }return 8 >= d || 3 !== o.split(" ").length || (o += " 1"), o;case "inject":
10972
+ return 8 >= d ? 4 === n.split(" ").length && (n = n.split(/\s+/).slice(0, 3).join(" ")) : 3 === n.split(" ").length && (n += " 1"), (8 >= d ? "rgb" : "rgba") + "(" + n.replace(/\s+/g, ",").replace(/\.(\d)+(?=,)/g, "") + ")";}
10973
+ };
10974
+ }();
10975
+ }
10976
+ } }, Names: { camelCase: function (e) {
10977
+ return e.replace(/-(\w)/g, function (e, t) {
10978
+ return t.toUpperCase();
10979
+ });
10980
+ }, SVGAttribute: function (e) {
10981
+ var t = "width|height|x|y|cx|cy|r|rx|ry|x1|x2|y1|y2";return (d || b.State.isAndroid && !b.State.isChrome) && (t += "|transform"), new RegExp("^(" + t + ")$", "i").test(e);
10982
+ }, prefixCheck: function (e) {
10983
+ if (b.State.prefixMatches[e]) return [b.State.prefixMatches[e], !0];for (var t = ["", "Webkit", "Moz", "ms", "O"], r = 0, a = t.length; a > r; r++) {
10984
+ var n;if (n = 0 === r ? e : t[r] + e.replace(/^\w/, function (e) {
10985
+ return e.toUpperCase();
10986
+ }), m.isString(b.State.prefixElement.style[n])) return b.State.prefixMatches[e] = n, [n, !0];
10987
+ }return [e, !1];
10988
+ } }, Values: { hexToRgb: function (e) {
10989
+ var t,
10990
+ r = /^#?([a-f\d])([a-f\d])([a-f\d])$/i,
10991
+ a = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i;return e = e.replace(r, function (e, t, r, a) {
10992
+ return t + t + r + r + a + a;
10993
+ }), t = a.exec(e), t ? [parseInt(t[1], 16), parseInt(t[2], 16), parseInt(t[3], 16)] : [0, 0, 0];
10994
+ }, isCSSNullValue: function (e) {
10995
+ return 0 == e || /^(none|auto|transparent|(rgba\(0, ?0, ?0, ?0\)))$/i.test(e);
10996
+ }, getUnitType: function (e) {
10997
+ return (/^(rotate|skew)/i.test(e) ? "deg" : /(^(scale|scaleX|scaleY|scaleZ|alpha|flexGrow|flexHeight|zIndex|fontWeight)$)|((opacity|red|green|blue|alpha)$)/i.test(e) ? "" : "px"
10998
+ );
10999
+ }, getDisplayType: function (e) {
11000
+ var t = e && e.tagName.toString().toLowerCase();return (/^(b|big|i|small|tt|abbr|acronym|cite|code|dfn|em|kbd|strong|samp|var|a|bdo|br|img|map|object|q|script|span|sub|sup|button|input|label|select|textarea)$/i.test(t) ? "inline" : /^(li)$/i.test(t) ? "list-item" : /^(tr)$/i.test(t) ? "table-row" : /^(table)$/i.test(t) ? "table" : /^(tbody)$/i.test(t) ? "table-row-group" : "block"
11001
+ );
11002
+ }, addClass: function (e, t) {
11003
+ e.classList ? e.classList.add(t) : e.className += (e.className.length ? " " : "") + t;
11004
+ }, removeClass: function (e, t) {
11005
+ e.classList ? e.classList.remove(t) : e.className = e.className.toString().replace(new RegExp("(^|\\s)" + t.split(" ").join("|") + "(\\s|$)", "gi"), " ");
11006
+ } }, getPropertyValue: function (e, r, n, o) {
11007
+ function s(e, r) {
11008
+ function n() {
11009
+ u && S.setPropertyValue(e, "display", "none");
11010
+ }var l = 0;if (8 >= d) l = f.css(e, r);else {
11011
+ var u = !1;if (/^(width|height)$/.test(r) && 0 === S.getPropertyValue(e, "display") && (u = !0, S.setPropertyValue(e, "display", S.Values.getDisplayType(e))), !o) {
11012
+ if ("height" === r && "border-box" !== S.getPropertyValue(e, "boxSizing").toString().toLowerCase()) {
11013
+ var c = e.offsetHeight - (parseFloat(S.getPropertyValue(e, "borderTopWidth")) || 0) - (parseFloat(S.getPropertyValue(e, "borderBottomWidth")) || 0) - (parseFloat(S.getPropertyValue(e, "paddingTop")) || 0) - (parseFloat(S.getPropertyValue(e, "paddingBottom")) || 0);return n(), c;
11014
+ }if ("width" === r && "border-box" !== S.getPropertyValue(e, "boxSizing").toString().toLowerCase()) {
11015
+ var p = e.offsetWidth - (parseFloat(S.getPropertyValue(e, "borderLeftWidth")) || 0) - (parseFloat(S.getPropertyValue(e, "borderRightWidth")) || 0) - (parseFloat(S.getPropertyValue(e, "paddingLeft")) || 0) - (parseFloat(S.getPropertyValue(e, "paddingRight")) || 0);return n(), p;
11016
+ }
11017
+ }var g;g = i(e) === a ? t.getComputedStyle(e, null) : i(e).computedStyle ? i(e).computedStyle : i(e).computedStyle = t.getComputedStyle(e, null), "borderColor" === r && (r = "borderTopColor"), l = 9 === d && "filter" === r ? g.getPropertyValue(r) : g[r], ("" === l || null === l) && (l = e.style[r]), n();
11018
+ }if ("auto" === l && /^(top|right|bottom|left)$/i.test(r)) {
11019
+ var m = s(e, "position");("fixed" === m || "absolute" === m && /top|left/i.test(r)) && (l = f(e).position()[r] + "px");
11020
+ }return l;
11021
+ }var l;if (S.Hooks.registered[r]) {
11022
+ var u = r,
11023
+ c = S.Hooks.getRoot(u);n === a && (n = S.getPropertyValue(e, S.Names.prefixCheck(c)[0])), S.Normalizations.registered[c] && (n = S.Normalizations.registered[c]("extract", e, n)), l = S.Hooks.extractValue(u, n);
11024
+ } else if (S.Normalizations.registered[r]) {
11025
+ var p, g;p = S.Normalizations.registered[r]("name", e), "transform" !== p && (g = s(e, S.Names.prefixCheck(p)[0]), S.Values.isCSSNullValue(g) && S.Hooks.templates[r] && (g = S.Hooks.templates[r][1])), l = S.Normalizations.registered[r]("extract", e, g);
11026
+ }if (!/^[\d-]/.test(l)) if (i(e) && i(e).isSVG && S.Names.SVGAttribute(r)) {
11027
+ if (/^(height|width)$/i.test(r)) try {
11028
+ l = e.getBBox()[r];
11029
+ } catch (m) {
11030
+ l = 0;
11031
+ } else l = e.getAttribute(r);
11032
+ } else l = s(e, S.Names.prefixCheck(r)[0]);return S.Values.isCSSNullValue(l) && (l = 0), b.debug >= 2 && console.log("Get " + r + ": " + l), l;
11033
+ }, setPropertyValue: function (e, r, a, n, o) {
11034
+ var s = r;if ("scroll" === r) o.container ? o.container["scroll" + o.direction] = a : "Left" === o.direction ? t.scrollTo(a, o.alternateValue) : t.scrollTo(o.alternateValue, a);else if (S.Normalizations.registered[r] && "transform" === S.Normalizations.registered[r]("name", e)) S.Normalizations.registered[r]("inject", e, a), s = "transform", a = i(e).transformCache[r];else {
11035
+ if (S.Hooks.registered[r]) {
11036
+ var l = r,
11037
+ u = S.Hooks.getRoot(r);n = n || S.getPropertyValue(e, u), a = S.Hooks.injectValue(l, a, n), r = u;
11038
+ }if (S.Normalizations.registered[r] && (a = S.Normalizations.registered[r]("inject", e, a), r = S.Normalizations.registered[r]("name", e)), s = S.Names.prefixCheck(r)[0], 8 >= d) try {
11039
+ e.style[s] = a;
11040
+ } catch (c) {
11041
+ b.debug && console.log("Browser does not support [" + a + "] for [" + s + "]");
11042
+ } else i(e) && i(e).isSVG && S.Names.SVGAttribute(r) ? e.setAttribute(r, a) : e.style[s] = a;b.debug >= 2 && console.log("Set " + r + " (" + s + "): " + a);
11043
+ }return [s, a];
11044
+ }, flushTransformCache: function (e) {
11045
+ function t(t) {
11046
+ return parseFloat(S.getPropertyValue(e, t));
11047
+ }var r = "";if ((d || b.State.isAndroid && !b.State.isChrome) && i(e).isSVG) {
11048
+ var a = { translate: [t("translateX"), t("translateY")], skewX: [t("skewX")], skewY: [t("skewY")], scale: 1 !== t("scale") ? [t("scale"), t("scale")] : [t("scaleX"), t("scaleY")], rotate: [t("rotateZ"), 0, 0] };f.each(i(e).transformCache, function (e) {
11049
+ /^translate/i.test(e) ? e = "translate" : /^scale/i.test(e) ? e = "scale" : /^rotate/i.test(e) && (e = "rotate"), a[e] && (r += e + "(" + a[e].join(" ") + ") ", delete a[e]);
11050
+ });
11051
+ } else {
11052
+ var n, o;f.each(i(e).transformCache, function (t) {
11053
+ return n = i(e).transformCache[t], "transformPerspective" === t ? (o = n, !0) : (9 === d && "rotateZ" === t && (t = "rotate"), void (r += t + n + " "));
11054
+ }), o && (r = "perspective" + o + " " + r);
11055
+ }S.setPropertyValue(e, "transform", r);
11056
+ } };S.Hooks.register(), S.Normalizations.register(), b.hook = function (e, t, r) {
11057
+ var n = a;return e = o(e), f.each(e, function (e, o) {
11058
+ if (i(o) === a && b.init(o), r === a) n === a && (n = b.CSS.getPropertyValue(o, t));else {
11059
+ var s = b.CSS.setPropertyValue(o, t, r);"transform" === s[0] && b.CSS.flushTransformCache(o), n = s;
11060
+ }
11061
+ }), n;
11062
+ };var P = function () {
11063
+ function e() {
11064
+ return s ? k.promise || null : l;
11065
+ }function n() {
11066
+ function e(e) {
11067
+ function p(e, t) {
11068
+ var r = a,
11069
+ n = a,
11070
+ i = a;return m.isArray(e) ? (r = e[0], !m.isArray(e[1]) && /^[\d-]/.test(e[1]) || m.isFunction(e[1]) || S.RegEx.isHex.test(e[1]) ? i = e[1] : (m.isString(e[1]) && !S.RegEx.isHex.test(e[1]) || m.isArray(e[1])) && (n = t ? e[1] : u(e[1], s.duration), e[2] !== a && (i = e[2]))) : r = e, t || (n = n || s.easing), m.isFunction(r) && (r = r.call(o, V, w)), m.isFunction(i) && (i = i.call(o, V, w)), [r || 0, n, i];
11071
+ }function d(e, t) {
11072
+ var r, a;return a = (t || "0").toString().toLowerCase().replace(/[%A-z]+$/, function (e) {
11073
+ return r = e, "";
11074
+ }), r || (r = S.Values.getUnitType(e)), [a, r];
11075
+ }function h() {
11076
+ var e = { myParent: o.parentNode || r.body, position: S.getPropertyValue(o, "position"), fontSize: S.getPropertyValue(o, "fontSize") },
11077
+ a = e.position === L.lastPosition && e.myParent === L.lastParent,
11078
+ n = e.fontSize === L.lastFontSize;L.lastParent = e.myParent, L.lastPosition = e.position, L.lastFontSize = e.fontSize;var s = 100,
11079
+ l = {};if (n && a) l.emToPx = L.lastEmToPx, l.percentToPxWidth = L.lastPercentToPxWidth, l.percentToPxHeight = L.lastPercentToPxHeight;else {
11080
+ var u = i(o).isSVG ? r.createElementNS("http://www.w3.org/2000/svg", "rect") : r.createElement("div");b.init(u), e.myParent.appendChild(u), f.each(["overflow", "overflowX", "overflowY"], function (e, t) {
11081
+ b.CSS.setPropertyValue(u, t, "hidden");
11082
+ }), b.CSS.setPropertyValue(u, "position", e.position), b.CSS.setPropertyValue(u, "fontSize", e.fontSize), b.CSS.setPropertyValue(u, "boxSizing", "content-box"), f.each(["minWidth", "maxWidth", "width", "minHeight", "maxHeight", "height"], function (e, t) {
11083
+ b.CSS.setPropertyValue(u, t, s + "%");
11084
+ }), b.CSS.setPropertyValue(u, "paddingLeft", s + "em"), l.percentToPxWidth = L.lastPercentToPxWidth = (parseFloat(S.getPropertyValue(u, "width", null, !0)) || 1) / s, l.percentToPxHeight = L.lastPercentToPxHeight = (parseFloat(S.getPropertyValue(u, "height", null, !0)) || 1) / s, l.emToPx = L.lastEmToPx = (parseFloat(S.getPropertyValue(u, "paddingLeft")) || 1) / s, e.myParent.removeChild(u);
11085
+ }return null === L.remToPx && (L.remToPx = parseFloat(S.getPropertyValue(r.body, "fontSize")) || 16), null === L.vwToPx && (L.vwToPx = parseFloat(t.innerWidth) / 100, L.vhToPx = parseFloat(t.innerHeight) / 100), l.remToPx = L.remToPx, l.vwToPx = L.vwToPx, l.vhToPx = L.vhToPx, b.debug >= 1 && console.log("Unit ratios: " + JSON.stringify(l), o), l;
11086
+ }if (s.begin && 0 === V) try {
11087
+ s.begin.call(g, g);
11088
+ } catch (x) {
11089
+ setTimeout(function () {
11090
+ throw x;
11091
+ }, 1);
11092
+ }if ("scroll" === A) {
11093
+ var P,
11094
+ C,
11095
+ T,
11096
+ F = /^x$/i.test(s.axis) ? "Left" : "Top",
11097
+ j = parseFloat(s.offset) || 0;s.container ? m.isWrapped(s.container) || m.isNode(s.container) ? (s.container = s.container[0] || s.container, P = s.container["scroll" + F], T = P + f(o).position()[F.toLowerCase()] + j) : s.container = null : (P = b.State.scrollAnchor[b.State["scrollProperty" + F]], C = b.State.scrollAnchor[b.State["scrollProperty" + ("Left" === F ? "Top" : "Left")]], T = f(o).offset()[F.toLowerCase()] + j), l = { scroll: { rootPropertyValue: !1, startValue: P, currentValue: P, endValue: T, unitType: "", easing: s.easing, scrollData: { container: s.container, direction: F, alternateValue: C } }, element: o }, b.debug && console.log("tweensContainer (scroll): ", l.scroll, o);
11098
+ } else if ("reverse" === A) {
11099
+ if (!i(o).tweensContainer) return void f.dequeue(o, s.queue);"none" === i(o).opts.display && (i(o).opts.display = "auto"), "hidden" === i(o).opts.visibility && (i(o).opts.visibility = "visible"), i(o).opts.loop = !1, i(o).opts.begin = null, i(o).opts.complete = null, v.easing || delete s.easing, v.duration || delete s.duration, s = f.extend({}, i(o).opts, s);var E = f.extend(!0, {}, i(o).tweensContainer);for (var H in E) {
11100
+ if ("element" !== H) {
11101
+ var N = E[H].startValue;E[H].startValue = E[H].currentValue = E[H].endValue, E[H].endValue = N, m.isEmptyObject(v) || (E[H].easing = s.easing), b.debug && console.log("reverse tweensContainer (" + H + "): " + JSON.stringify(E[H]), o);
11102
+ }
11103
+ }l = E;
11104
+ } else if ("start" === A) {
11105
+ var E;i(o).tweensContainer && i(o).isAnimating === !0 && (E = i(o).tweensContainer), f.each(y, function (e, t) {
11106
+ if (RegExp("^" + S.Lists.colors.join("$|^") + "$").test(e)) {
11107
+ var r = p(t, !0),
11108
+ n = r[0],
11109
+ o = r[1],
11110
+ i = r[2];if (S.RegEx.isHex.test(n)) {
11111
+ for (var s = ["Red", "Green", "Blue"], l = S.Values.hexToRgb(n), u = i ? S.Values.hexToRgb(i) : a, c = 0; c < s.length; c++) {
11112
+ var f = [l[c]];o && f.push(o), u !== a && f.push(u[c]), y[e + s[c]] = f;
11113
+ }delete y[e];
11114
+ }
11115
+ }
11116
+ });for (var z in y) {
11117
+ var O = p(y[z]),
11118
+ q = O[0],
11119
+ $ = O[1],
11120
+ M = O[2];z = S.Names.camelCase(z);var I = S.Hooks.getRoot(z),
11121
+ B = !1;if (i(o).isSVG || "tween" === I || S.Names.prefixCheck(I)[1] !== !1 || S.Normalizations.registered[I] !== a) {
11122
+ (s.display !== a && null !== s.display && "none" !== s.display || s.visibility !== a && "hidden" !== s.visibility) && /opacity|filter/.test(z) && !M && 0 !== q && (M = 0), s._cacheValues && E && E[z] ? (M === a && (M = E[z].endValue + E[z].unitType), B = i(o).rootPropertyValueCache[I]) : S.Hooks.registered[z] ? M === a ? (B = S.getPropertyValue(o, I), M = S.getPropertyValue(o, z, B)) : B = S.Hooks.templates[I][1] : M === a && (M = S.getPropertyValue(o, z));var W,
11123
+ G,
11124
+ Y,
11125
+ D = !1;if (W = d(z, M), M = W[0], Y = W[1], W = d(z, q), q = W[0].replace(/^([+-\/*])=/, function (e, t) {
11126
+ return D = t, "";
11127
+ }), G = W[1], M = parseFloat(M) || 0, q = parseFloat(q) || 0, "%" === G && (/^(fontSize|lineHeight)$/.test(z) ? (q /= 100, G = "em") : /^scale/.test(z) ? (q /= 100, G = "") : /(Red|Green|Blue)$/i.test(z) && (q = q / 100 * 255, G = "")), /[\/*]/.test(D)) G = Y;else if (Y !== G && 0 !== M) if (0 === q) G = Y;else {
11128
+ n = n || h();var Q = /margin|padding|left|right|width|text|word|letter/i.test(z) || /X$/.test(z) || "x" === z ? "x" : "y";switch (Y) {case "%":
11129
+ M *= "x" === Q ? n.percentToPxWidth : n.percentToPxHeight;break;case "px":
11130
+ break;default:
11131
+ M *= n[Y + "ToPx"];}switch (G) {case "%":
11132
+ M *= 1 / ("x" === Q ? n.percentToPxWidth : n.percentToPxHeight);break;case "px":
11133
+ break;default:
11134
+ M *= 1 / n[G + "ToPx"];}
11135
+ }switch (D) {case "+":
11136
+ q = M + q;break;case "-":
11137
+ q = M - q;break;case "*":
11138
+ q = M * q;break;case "/":
11139
+ q = M / q;}l[z] = { rootPropertyValue: B, startValue: M, currentValue: M, endValue: q, unitType: G, easing: $ }, b.debug && console.log("tweensContainer (" + z + "): " + JSON.stringify(l[z]), o);
11140
+ } else b.debug && console.log("Skipping [" + I + "] due to a lack of browser support.");
11141
+ }l.element = o;
11142
+ }l.element && (S.Values.addClass(o, "velocity-animating"), R.push(l), "" === s.queue && (i(o).tweensContainer = l, i(o).opts = s), i(o).isAnimating = !0, V === w - 1 ? (b.State.calls.push([R, g, s, null, k.resolver]), b.State.isTicking === !1 && (b.State.isTicking = !0, c())) : V++);
11143
+ }var n,
11144
+ o = this,
11145
+ s = f.extend({}, b.defaults, v),
11146
+ l = {};switch (i(o) === a && b.init(o), parseFloat(s.delay) && s.queue !== !1 && f.queue(o, s.queue, function (e) {
11147
+ b.velocityQueueEntryFlag = !0, i(o).delayTimer = { setTimeout: setTimeout(e, parseFloat(s.delay)), next: e };
11148
+ }), s.duration.toString().toLowerCase()) {case "fast":
11149
+ s.duration = 200;break;case "normal":
11150
+ s.duration = h;break;case "slow":
11151
+ s.duration = 600;break;default:
11152
+ s.duration = parseFloat(s.duration) || 1;}b.mock !== !1 && (b.mock === !0 ? s.duration = s.delay = 1 : (s.duration *= parseFloat(b.mock) || 1, s.delay *= parseFloat(b.mock) || 1)), s.easing = u(s.easing, s.duration), s.begin && !m.isFunction(s.begin) && (s.begin = null), s.progress && !m.isFunction(s.progress) && (s.progress = null), s.complete && !m.isFunction(s.complete) && (s.complete = null), s.display !== a && null !== s.display && (s.display = s.display.toString().toLowerCase(), "auto" === s.display && (s.display = b.CSS.Values.getDisplayType(o))), s.visibility !== a && null !== s.visibility && (s.visibility = s.visibility.toString().toLowerCase()), s.mobileHA = s.mobileHA && b.State.isMobile && !b.State.isGingerbread, s.queue === !1 ? s.delay ? setTimeout(e, s.delay) : e() : f.queue(o, s.queue, function (t, r) {
11153
+ return r === !0 ? (k.promise && k.resolver(g), !0) : (b.velocityQueueEntryFlag = !0, void e(t));
11154
+ }), "" !== s.queue && "fx" !== s.queue || "inprogress" === f.queue(o)[0] || f.dequeue(o);
11155
+ }var s,
11156
+ l,
11157
+ d,
11158
+ g,
11159
+ y,
11160
+ v,
11161
+ x = arguments[0] && (arguments[0].p || f.isPlainObject(arguments[0].properties) && !arguments[0].properties.names || m.isString(arguments[0].properties));if (m.isWrapped(this) ? (s = !1, d = 0, g = this, l = this) : (s = !0, d = 1, g = x ? arguments[0].elements || arguments[0].e : arguments[0]), g = o(g)) {
11162
+ x ? (y = arguments[0].properties || arguments[0].p, v = arguments[0].options || arguments[0].o) : (y = arguments[d], v = arguments[d + 1]);var w = g.length,
11163
+ V = 0;if (!/^(stop|finish)$/i.test(y) && !f.isPlainObject(v)) {
11164
+ var C = d + 1;v = {};for (var T = C; T < arguments.length; T++) {
11165
+ m.isArray(arguments[T]) || !/^(fast|normal|slow)$/i.test(arguments[T]) && !/^\d/.test(arguments[T]) ? m.isString(arguments[T]) || m.isArray(arguments[T]) ? v.easing = arguments[T] : m.isFunction(arguments[T]) && (v.complete = arguments[T]) : v.duration = arguments[T];
11166
+ }
11167
+ }var k = { promise: null, resolver: null, rejecter: null };s && b.Promise && (k.promise = new b.Promise(function (e, t) {
11168
+ k.resolver = e, k.rejecter = t;
11169
+ }));var A;switch (y) {case "scroll":
11170
+ A = "scroll";break;case "reverse":
11171
+ A = "reverse";break;case "finish":case "stop":
11172
+ f.each(g, function (e, t) {
11173
+ i(t) && i(t).delayTimer && (clearTimeout(i(t).delayTimer.setTimeout), i(t).delayTimer.next && i(t).delayTimer.next(), delete i(t).delayTimer);
11174
+ });var F = [];return f.each(b.State.calls, function (e, t) {
11175
+ t && f.each(t[1], function (r, n) {
11176
+ var o = v === a ? "" : v;return o === !0 || t[2].queue === o || v === a && t[2].queue === !1 ? void f.each(g, function (r, a) {
11177
+ a === n && ((v === !0 || m.isString(v)) && (f.each(f.queue(a, m.isString(v) ? v : ""), function (e, t) {
11178
+ m.isFunction(t) && t(null, !0);
11179
+ }), f.queue(a, m.isString(v) ? v : "", [])), "stop" === y ? (i(a) && i(a).tweensContainer && o !== !1 && f.each(i(a).tweensContainer, function (e, t) {
11180
+ t.endValue = t.currentValue;
11181
+ }), F.push(e)) : "finish" === y && (t[2].duration = 1));
11182
+ }) : !0;
11183
+ });
11184
+ }), "stop" === y && (f.each(F, function (e, t) {
11185
+ p(t, !0);
11186
+ }), k.promise && k.resolver(g)), e();default:
11187
+ if (!f.isPlainObject(y) || m.isEmptyObject(y)) {
11188
+ if (m.isString(y) && b.Redirects[y]) {
11189
+ var j = f.extend({}, v),
11190
+ E = j.duration,
11191
+ H = j.delay || 0;return j.backwards === !0 && (g = f.extend(!0, [], g).reverse()), f.each(g, function (e, t) {
11192
+ parseFloat(j.stagger) ? j.delay = H + parseFloat(j.stagger) * e : m.isFunction(j.stagger) && (j.delay = H + j.stagger.call(t, e, w)), j.drag && (j.duration = parseFloat(E) || (/^(callout|transition)/.test(y) ? 1e3 : h), j.duration = Math.max(j.duration * (j.backwards ? 1 - e / w : (e + 1) / w), .75 * j.duration, 200)), b.Redirects[y].call(t, t, j || {}, e, w, g, k.promise ? k : a);
11193
+ }), e();
11194
+ }var N = "Velocity: First argument (" + y + ") was not a property map, a known action, or a registered redirect. Aborting.";return k.promise ? k.rejecter(new Error(N)) : console.log(N), e();
11195
+ }A = "start";}var L = { lastParent: null, lastPosition: null, lastFontSize: null, lastPercentToPxWidth: null, lastPercentToPxHeight: null, lastEmToPx: null, remToPx: null, vwToPx: null, vhToPx: null },
11196
+ R = [];f.each(g, function (e, t) {
11197
+ m.isNode(t) && n.call(t);
11198
+ });var z,
11199
+ j = f.extend({}, b.defaults, v);if (j.loop = parseInt(j.loop), z = 2 * j.loop - 1, j.loop) for (var O = 0; z > O; O++) {
11200
+ var q = { delay: j.delay, progress: j.progress };O === z - 1 && (q.display = j.display, q.visibility = j.visibility, q.complete = j.complete), P(g, "reverse", q);
11201
+ }return e();
11202
+ }
11203
+ };b = f.extend(P, b), b.animate = P;var w = t.requestAnimationFrame || g;return b.State.isMobile || r.hidden === a || r.addEventListener("visibilitychange", function () {
11204
+ r.hidden ? (w = function (e) {
11205
+ return setTimeout(function () {
11206
+ e(!0);
11207
+ }, 16);
11208
+ }, c()) : w = t.requestAnimationFrame || g;
11209
+ }), e.Velocity = b, e !== t && (e.fn.velocity = P, e.fn.velocity.defaults = b.defaults), f.each(["Down", "Up"], function (e, t) {
11210
+ b.Redirects["slide" + t] = function (e, r, n, o, i, s) {
11211
+ var l = f.extend({}, r),
11212
+ u = l.begin,
11213
+ c = l.complete,
11214
+ p = { height: "", marginTop: "", marginBottom: "", paddingTop: "", paddingBottom: "" },
11215
+ d = {};l.display === a && (l.display = "Down" === t ? "inline" === b.CSS.Values.getDisplayType(e) ? "inline-block" : "block" : "none"), l.begin = function () {
11216
+ u && u.call(i, i);for (var r in p) {
11217
+ d[r] = e.style[r];var a = b.CSS.getPropertyValue(e, r);p[r] = "Down" === t ? [a, 0] : [0, a];
11218
+ }d.overflow = e.style.overflow, e.style.overflow = "hidden";
11219
+ }, l.complete = function () {
11220
+ for (var t in d) {
11221
+ e.style[t] = d[t];
11222
+ }c && c.call(i, i), s && s.resolver(i);
11223
+ }, b(e, p, l);
11224
+ };
11225
+ }), f.each(["In", "Out"], function (e, t) {
11226
+ b.Redirects["fade" + t] = function (e, r, n, o, i, s) {
11227
+ var l = f.extend({}, r),
11228
+ u = { opacity: "In" === t ? 1 : 0 },
11229
+ c = l.complete;l.complete = n !== o - 1 ? l.begin = null : function () {
11230
+ c && c.call(i, i), s && s.resolver(i);
11231
+ }, l.display === a && (l.display = "In" === t ? "auto" : "none"), b(this, u, l);
11232
+ };
11233
+ }), b;
11234
+ }(window.jQuery || window.Zepto || window, window, document);
11235
+ }));
11236
+ ;!function (a, b, c, d) {
11237
+ "use strict";
11238
+ function k(a, b, c) {
11239
+ return setTimeout(q(a, c), b);
11240
+ }function l(a, b, c) {
11241
+ return Array.isArray(a) ? (m(a, c[b], c), !0) : !1;
11242
+ }function m(a, b, c) {
11243
+ var e;if (a) if (a.forEach) a.forEach(b, c);else if (a.length !== d) for (e = 0; e < a.length;) {
11244
+ b.call(c, a[e], e, a), e++;
11245
+ } else for (e in a) {
11246
+ a.hasOwnProperty(e) && b.call(c, a[e], e, a);
11247
+ }
11248
+ }function n(a, b, c) {
11249
+ for (var e = Object.keys(b), f = 0; f < e.length;) {
11250
+ (!c || c && a[e[f]] === d) && (a[e[f]] = b[e[f]]), f++;
11251
+ }return a;
11252
+ }function o(a, b) {
11253
+ return n(a, b, !0);
11254
+ }function p(a, b, c) {
11255
+ var e,
11256
+ d = b.prototype;e = a.prototype = Object.create(d), e.constructor = a, e._super = d, c && n(e, c);
11257
+ }function q(a, b) {
11258
+ return function () {
11259
+ return a.apply(b, arguments);
11260
+ };
11261
+ }function r(a, b) {
11262
+ return typeof a == g ? a.apply(b ? b[0] || d : d, b) : a;
11263
+ }function s(a, b) {
11264
+ return a === d ? b : a;
11265
+ }function t(a, b, c) {
11266
+ m(x(b), function (b) {
11267
+ a.addEventListener(b, c, !1);
11268
+ });
11269
+ }function u(a, b, c) {
11270
+ m(x(b), function (b) {
11271
+ a.removeEventListener(b, c, !1);
11272
+ });
11273
+ }function v(a, b) {
11274
+ for (; a;) {
11275
+ if (a == b) return !0;a = a.parentNode;
11276
+ }return !1;
11277
+ }function w(a, b) {
11278
+ return a.indexOf(b) > -1;
11279
+ }function x(a) {
11280
+ return a.trim().split(/\s+/g);
11281
+ }function y(a, b, c) {
11282
+ if (a.indexOf && !c) return a.indexOf(b);for (var d = 0; d < a.length;) {
11283
+ if (c && a[d][c] == b || !c && a[d] === b) return d;d++;
11284
+ }return -1;
11285
+ }function z(a) {
11286
+ return Array.prototype.slice.call(a, 0);
11287
+ }function A(a, b, c) {
11288
+ for (var d = [], e = [], f = 0; f < a.length;) {
11289
+ var g = b ? a[f][b] : a[f];y(e, g) < 0 && d.push(a[f]), e[f] = g, f++;
11290
+ }return c && (d = b ? d.sort(function (a, c) {
11291
+ return a[b] > c[b];
11292
+ }) : d.sort()), d;
11293
+ }function B(a, b) {
11294
+ for (var c, f, g = b[0].toUpperCase() + b.slice(1), h = 0; h < e.length;) {
11295
+ if (c = e[h], f = c ? c + g : b, f in a) return f;h++;
11296
+ }return d;
11297
+ }function D() {
11298
+ return C++;
11299
+ }function E(a) {
11300
+ var b = a.ownerDocument;return b.defaultView || b.parentWindow;
11301
+ }function ab(a, b) {
11302
+ var c = this;this.manager = a, this.callback = b, this.element = a.element, this.target = a.options.inputTarget, this.domHandler = function (b) {
11303
+ r(a.options.enable, [a]) && c.handler(b);
11304
+ }, this.init();
11305
+ }function bb(a) {
11306
+ var b,
11307
+ c = a.options.inputClass;return b = c ? c : H ? wb : I ? Eb : G ? Gb : rb, new b(a, cb);
11308
+ }function cb(a, b, c) {
11309
+ var d = c.pointers.length,
11310
+ e = c.changedPointers.length,
11311
+ f = b & O && 0 === d - e,
11312
+ g = b & (Q | R) && 0 === d - e;c.isFirst = !!f, c.isFinal = !!g, f && (a.session = {}), c.eventType = b, db(a, c), a.emit("hammer.input", c), a.recognize(c), a.session.prevInput = c;
11313
+ }function db(a, b) {
11314
+ var c = a.session,
11315
+ d = b.pointers,
11316
+ e = d.length;c.firstInput || (c.firstInput = gb(b)), e > 1 && !c.firstMultiple ? c.firstMultiple = gb(b) : 1 === e && (c.firstMultiple = !1);var f = c.firstInput,
11317
+ g = c.firstMultiple,
11318
+ h = g ? g.center : f.center,
11319
+ i = b.center = hb(d);b.timeStamp = j(), b.deltaTime = b.timeStamp - f.timeStamp, b.angle = lb(h, i), b.distance = kb(h, i), eb(c, b), b.offsetDirection = jb(b.deltaX, b.deltaY), b.scale = g ? nb(g.pointers, d) : 1, b.rotation = g ? mb(g.pointers, d) : 0, fb(c, b);var k = a.element;v(b.srcEvent.target, k) && (k = b.srcEvent.target), b.target = k;
11320
+ }function eb(a, b) {
11321
+ var c = b.center,
11322
+ d = a.offsetDelta || {},
11323
+ e = a.prevDelta || {},
11324
+ f = a.prevInput || {};(b.eventType === O || f.eventType === Q) && (e = a.prevDelta = { x: f.deltaX || 0, y: f.deltaY || 0 }, d = a.offsetDelta = { x: c.x, y: c.y }), b.deltaX = e.x + (c.x - d.x), b.deltaY = e.y + (c.y - d.y);
11325
+ }function fb(a, b) {
11326
+ var f,
11327
+ g,
11328
+ h,
11329
+ j,
11330
+ c = a.lastInterval || b,
11331
+ e = b.timeStamp - c.timeStamp;if (b.eventType != R && (e > N || c.velocity === d)) {
11332
+ var k = c.deltaX - b.deltaX,
11333
+ l = c.deltaY - b.deltaY,
11334
+ m = ib(e, k, l);g = m.x, h = m.y, f = i(m.x) > i(m.y) ? m.x : m.y, j = jb(k, l), a.lastInterval = b;
11335
+ } else f = c.velocity, g = c.velocityX, h = c.velocityY, j = c.direction;b.velocity = f, b.velocityX = g, b.velocityY = h, b.direction = j;
11336
+ }function gb(a) {
11337
+ for (var b = [], c = 0; c < a.pointers.length;) {
11338
+ b[c] = { clientX: h(a.pointers[c].clientX), clientY: h(a.pointers[c].clientY) }, c++;
11339
+ }return { timeStamp: j(), pointers: b, center: hb(b), deltaX: a.deltaX, deltaY: a.deltaY };
11340
+ }function hb(a) {
11341
+ var b = a.length;if (1 === b) return { x: h(a[0].clientX), y: h(a[0].clientY) };for (var c = 0, d = 0, e = 0; b > e;) {
11342
+ c += a[e].clientX, d += a[e].clientY, e++;
11343
+ }return { x: h(c / b), y: h(d / b) };
11344
+ }function ib(a, b, c) {
11345
+ return { x: b / a || 0, y: c / a || 0 };
11346
+ }function jb(a, b) {
11347
+ return a === b ? S : i(a) >= i(b) ? a > 0 ? T : U : b > 0 ? V : W;
11348
+ }function kb(a, b, c) {
11349
+ c || (c = $);var d = b[c[0]] - a[c[0]],
11350
+ e = b[c[1]] - a[c[1]];return Math.sqrt(d * d + e * e);
11351
+ }function lb(a, b, c) {
11352
+ c || (c = $);var d = b[c[0]] - a[c[0]],
11353
+ e = b[c[1]] - a[c[1]];return 180 * Math.atan2(e, d) / Math.PI;
11354
+ }function mb(a, b) {
11355
+ return lb(b[1], b[0], _) - lb(a[1], a[0], _);
11356
+ }function nb(a, b) {
11357
+ return kb(b[0], b[1], _) / kb(a[0], a[1], _);
11358
+ }function rb() {
11359
+ this.evEl = pb, this.evWin = qb, this.allow = !0, this.pressed = !1, ab.apply(this, arguments);
11360
+ }function wb() {
11361
+ this.evEl = ub, this.evWin = vb, ab.apply(this, arguments), this.store = this.manager.session.pointerEvents = [];
11362
+ }function Ab() {
11363
+ this.evTarget = yb, this.evWin = zb, this.started = !1, ab.apply(this, arguments);
11364
+ }function Bb(a, b) {
11365
+ var c = z(a.touches),
11366
+ d = z(a.changedTouches);return b & (Q | R) && (c = A(c.concat(d), "identifier", !0)), [c, d];
11367
+ }function Eb() {
11368
+ this.evTarget = Db, this.targetIds = {}, ab.apply(this, arguments);
11369
+ }function Fb(a, b) {
11370
+ var c = z(a.touches),
11371
+ d = this.targetIds;if (b & (O | P) && 1 === c.length) return d[c[0].identifier] = !0, [c, c];var e,
11372
+ f,
11373
+ g = z(a.changedTouches),
11374
+ h = [],
11375
+ i = this.target;if (f = c.filter(function (a) {
11376
+ return v(a.target, i);
11377
+ }), b === O) for (e = 0; e < f.length;) {
11378
+ d[f[e].identifier] = !0, e++;
11379
+ }for (e = 0; e < g.length;) {
11380
+ d[g[e].identifier] && h.push(g[e]), b & (Q | R) && delete d[g[e].identifier], e++;
11381
+ }return h.length ? [A(f.concat(h), "identifier", !0), h] : void 0;
11382
+ }function Gb() {
11383
+ ab.apply(this, arguments);var a = q(this.handler, this);this.touch = new Eb(this.manager, a), this.mouse = new rb(this.manager, a);
11384
+ }function Pb(a, b) {
11385
+ this.manager = a, this.set(b);
11386
+ }function Qb(a) {
11387
+ if (w(a, Mb)) return Mb;var b = w(a, Nb),
11388
+ c = w(a, Ob);return b && c ? Nb + " " + Ob : b || c ? b ? Nb : Ob : w(a, Lb) ? Lb : Kb;
11389
+ }function Yb(a) {
11390
+ this.id = D(), this.manager = null, this.options = o(a || {}, this.defaults), this.options.enable = s(this.options.enable, !0), this.state = Rb, this.simultaneous = {}, this.requireFail = [];
11391
+ }function Zb(a) {
11392
+ return a & Wb ? "cancel" : a & Ub ? "end" : a & Tb ? "move" : a & Sb ? "start" : "";
11393
+ }function $b(a) {
11394
+ return a == W ? "down" : a == V ? "up" : a == T ? "left" : a == U ? "right" : "";
11395
+ }function _b(a, b) {
11396
+ var c = b.manager;return c ? c.get(a) : a;
11397
+ }function ac() {
11398
+ Yb.apply(this, arguments);
11399
+ }function bc() {
11400
+ ac.apply(this, arguments), this.pX = null, this.pY = null;
11401
+ }function cc() {
11402
+ ac.apply(this, arguments);
11403
+ }function dc() {
11404
+ Yb.apply(this, arguments), this._timer = null, this._input = null;
11405
+ }function ec() {
11406
+ ac.apply(this, arguments);
11407
+ }function fc() {
11408
+ ac.apply(this, arguments);
11409
+ }function gc() {
11410
+ Yb.apply(this, arguments), this.pTime = !1, this.pCenter = !1, this._timer = null, this._input = null, this.count = 0;
11411
+ }function hc(a, b) {
11412
+ return b = b || {}, b.recognizers = s(b.recognizers, hc.defaults.preset), new kc(a, b);
11413
+ }function kc(a, b) {
11414
+ b = b || {}, this.options = o(b, hc.defaults), this.options.inputTarget = this.options.inputTarget || a, this.handlers = {}, this.session = {}, this.recognizers = [], this.element = a, this.input = bb(this), this.touchAction = new Pb(this, this.options.touchAction), lc(this, !0), m(b.recognizers, function (a) {
11415
+ var b = this.add(new a[0](a[1]));a[2] && b.recognizeWith(a[2]), a[3] && b.requireFailure(a[3]);
11416
+ }, this);
11417
+ }function lc(a, b) {
11418
+ var c = a.element;m(a.options.cssProps, function (a, d) {
11419
+ c.style[B(c.style, d)] = b ? a : "";
11420
+ });
11421
+ }function mc(a, c) {
11422
+ var d = b.createEvent("Event");d.initEvent(a, !0, !0), d.gesture = c, c.target.dispatchEvent(d);
11423
+ }var e = ["", "webkit", "moz", "MS", "ms", "o"],
11424
+ f = b.createElement("div"),
11425
+ g = "function",
11426
+ h = Math.round,
11427
+ i = Math.abs,
11428
+ j = Date.now,
11429
+ C = 1,
11430
+ F = /mobile|tablet|ip(ad|hone|od)|android/i,
11431
+ G = "ontouchstart" in a,
11432
+ H = B(a, "PointerEvent") !== d,
11433
+ I = G && F.test(navigator.userAgent),
11434
+ J = "touch",
11435
+ K = "pen",
11436
+ L = "mouse",
11437
+ M = "kinect",
11438
+ N = 25,
11439
+ O = 1,
11440
+ P = 2,
11441
+ Q = 4,
11442
+ R = 8,
11443
+ S = 1,
11444
+ T = 2,
11445
+ U = 4,
11446
+ V = 8,
11447
+ W = 16,
11448
+ X = T | U,
11449
+ Y = V | W,
11450
+ Z = X | Y,
11451
+ $ = ["x", "y"],
11452
+ _ = ["clientX", "clientY"];ab.prototype = { handler: function () {}, init: function () {
11453
+ this.evEl && t(this.element, this.evEl, this.domHandler), this.evTarget && t(this.target, this.evTarget, this.domHandler), this.evWin && t(E(this.element), this.evWin, this.domHandler);
11454
+ }, destroy: function () {
11455
+ this.evEl && u(this.element, this.evEl, this.domHandler), this.evTarget && u(this.target, this.evTarget, this.domHandler), this.evWin && u(E(this.element), this.evWin, this.domHandler);
11456
+ } };var ob = { mousedown: O, mousemove: P, mouseup: Q },
11457
+ pb = "mousedown",
11458
+ qb = "mousemove mouseup";p(rb, ab, { handler: function (a) {
11459
+ var b = ob[a.type];b & O && 0 === a.button && (this.pressed = !0), b & P && 1 !== a.which && (b = Q), this.pressed && this.allow && (b & Q && (this.pressed = !1), this.callback(this.manager, b, { pointers: [a], changedPointers: [a], pointerType: L, srcEvent: a }));
11460
+ } });var sb = { pointerdown: O, pointermove: P, pointerup: Q, pointercancel: R, pointerout: R },
11461
+ tb = { 2: J, 3: K, 4: L, 5: M },
11462
+ ub = "pointerdown",
11463
+ vb = "pointermove pointerup pointercancel";a.MSPointerEvent && (ub = "MSPointerDown", vb = "MSPointerMove MSPointerUp MSPointerCancel"), p(wb, ab, { handler: function (a) {
11464
+ var b = this.store,
11465
+ c = !1,
11466
+ d = a.type.toLowerCase().replace("ms", ""),
11467
+ e = sb[d],
11468
+ f = tb[a.pointerType] || a.pointerType,
11469
+ g = f == J,
11470
+ h = y(b, a.pointerId, "pointerId");e & O && (0 === a.button || g) ? 0 > h && (b.push(a), h = b.length - 1) : e & (Q | R) && (c = !0), 0 > h || (b[h] = a, this.callback(this.manager, e, { pointers: b, changedPointers: [a], pointerType: f, srcEvent: a }), c && b.splice(h, 1));
11471
+ } });var xb = { touchstart: O, touchmove: P, touchend: Q, touchcancel: R },
11472
+ yb = "touchstart",
11473
+ zb = "touchstart touchmove touchend touchcancel";p(Ab, ab, { handler: function (a) {
11474
+ var b = xb[a.type];if (b === O && (this.started = !0), this.started) {
11475
+ var c = Bb.call(this, a, b);b & (Q | R) && 0 === c[0].length - c[1].length && (this.started = !1), this.callback(this.manager, b, { pointers: c[0], changedPointers: c[1], pointerType: J, srcEvent: a });
11476
+ }
11477
+ } });var Cb = { touchstart: O, touchmove: P, touchend: Q, touchcancel: R },
11478
+ Db = "touchstart touchmove touchend touchcancel";p(Eb, ab, { handler: function (a) {
11479
+ var b = Cb[a.type],
11480
+ c = Fb.call(this, a, b);c && this.callback(this.manager, b, { pointers: c[0], changedPointers: c[1], pointerType: J, srcEvent: a });
11481
+ } }), p(Gb, ab, { handler: function (a, b, c) {
11482
+ var d = c.pointerType == J,
11483
+ e = c.pointerType == L;if (d) this.mouse.allow = !1;else if (e && !this.mouse.allow) return;b & (Q | R) && (this.mouse.allow = !0), this.callback(a, b, c);
11484
+ }, destroy: function () {
11485
+ this.touch.destroy(), this.mouse.destroy();
11486
+ } });var Hb = B(f.style, "touchAction"),
11487
+ Ib = Hb !== d,
11488
+ Jb = "compute",
11489
+ Kb = "auto",
11490
+ Lb = "manipulation",
11491
+ Mb = "none",
11492
+ Nb = "pan-x",
11493
+ Ob = "pan-y";Pb.prototype = { set: function (a) {
11494
+ a == Jb && (a = this.compute()), Ib && (this.manager.element.style[Hb] = a), this.actions = a.toLowerCase().trim();
11495
+ }, update: function () {
11496
+ this.set(this.manager.options.touchAction);
11497
+ }, compute: function () {
11498
+ var a = [];return m(this.manager.recognizers, function (b) {
11499
+ r(b.options.enable, [b]) && (a = a.concat(b.getTouchAction()));
11500
+ }), Qb(a.join(" "));
11501
+ }, preventDefaults: function (a) {
11502
+ if (!Ib) {
11503
+ var b = a.srcEvent,
11504
+ c = a.offsetDirection;if (this.manager.session.prevented) return b.preventDefault(), void 0;var d = this.actions,
11505
+ e = w(d, Mb),
11506
+ f = w(d, Ob),
11507
+ g = w(d, Nb);return e || f && c & X || g && c & Y ? this.preventSrc(b) : void 0;
11508
+ }
11509
+ }, preventSrc: function (a) {
11510
+ this.manager.session.prevented = !0, a.preventDefault();
11511
+ } };var Rb = 1,
11512
+ Sb = 2,
11513
+ Tb = 4,
11514
+ Ub = 8,
11515
+ Vb = Ub,
11516
+ Wb = 16,
11517
+ Xb = 32;Yb.prototype = { defaults: {}, set: function (a) {
11518
+ return n(this.options, a), this.manager && this.manager.touchAction.update(), this;
11519
+ }, recognizeWith: function (a) {
11520
+ if (l(a, "recognizeWith", this)) return this;var b = this.simultaneous;return a = _b(a, this), b[a.id] || (b[a.id] = a, a.recognizeWith(this)), this;
11521
+ }, dropRecognizeWith: function (a) {
11522
+ return l(a, "dropRecognizeWith", this) ? this : (a = _b(a, this), delete this.simultaneous[a.id], this);
11523
+ }, requireFailure: function (a) {
11524
+ if (l(a, "requireFailure", this)) return this;var b = this.requireFail;return a = _b(a, this), -1 === y(b, a) && (b.push(a), a.requireFailure(this)), this;
11525
+ }, dropRequireFailure: function (a) {
11526
+ if (l(a, "dropRequireFailure", this)) return this;a = _b(a, this);var b = y(this.requireFail, a);return b > -1 && this.requireFail.splice(b, 1), this;
11527
+ }, hasRequireFailures: function () {
11528
+ return this.requireFail.length > 0;
11529
+ }, canRecognizeWith: function (a) {
11530
+ return !!this.simultaneous[a.id];
11531
+ }, emit: function (a) {
11532
+ function d(d) {
11533
+ b.manager.emit(b.options.event + (d ? Zb(c) : ""), a);
11534
+ }var b = this,
11535
+ c = this.state;Ub > c && d(!0), d(), c >= Ub && d(!0);
11536
+ }, tryEmit: function (a) {
11537
+ return this.canEmit() ? this.emit(a) : (this.state = Xb, void 0);
11538
+ }, canEmit: function () {
11539
+ for (var a = 0; a < this.requireFail.length;) {
11540
+ if (!(this.requireFail[a].state & (Xb | Rb))) return !1;a++;
11541
+ }return !0;
11542
+ }, recognize: function (a) {
11543
+ var b = n({}, a);return r(this.options.enable, [this, b]) ? (this.state & (Vb | Wb | Xb) && (this.state = Rb), this.state = this.process(b), this.state & (Sb | Tb | Ub | Wb) && this.tryEmit(b), void 0) : (this.reset(), this.state = Xb, void 0);
11544
+ }, process: function () {}, getTouchAction: function () {}, reset: function () {} }, p(ac, Yb, { defaults: { pointers: 1 }, attrTest: function (a) {
11545
+ var b = this.options.pointers;return 0 === b || a.pointers.length === b;
11546
+ }, process: function (a) {
11547
+ var b = this.state,
11548
+ c = a.eventType,
11549
+ d = b & (Sb | Tb),
11550
+ e = this.attrTest(a);return d && (c & R || !e) ? b | Wb : d || e ? c & Q ? b | Ub : b & Sb ? b | Tb : Sb : Xb;
11551
+ } }), p(bc, ac, { defaults: { event: "pan", threshold: 10, pointers: 1, direction: Z }, getTouchAction: function () {
11552
+ var a = this.options.direction,
11553
+ b = [];return a & X && b.push(Ob), a & Y && b.push(Nb), b;
11554
+ }, directionTest: function (a) {
11555
+ var b = this.options,
11556
+ c = !0,
11557
+ d = a.distance,
11558
+ e = a.direction,
11559
+ f = a.deltaX,
11560
+ g = a.deltaY;return e & b.direction || (b.direction & X ? (e = 0 === f ? S : 0 > f ? T : U, c = f != this.pX, d = Math.abs(a.deltaX)) : (e = 0 === g ? S : 0 > g ? V : W, c = g != this.pY, d = Math.abs(a.deltaY))), a.direction = e, c && d > b.threshold && e & b.direction;
11561
+ }, attrTest: function (a) {
11562
+ return ac.prototype.attrTest.call(this, a) && (this.state & Sb || !(this.state & Sb) && this.directionTest(a));
11563
+ }, emit: function (a) {
11564
+ this.pX = a.deltaX, this.pY = a.deltaY;var b = $b(a.direction);b && this.manager.emit(this.options.event + b, a), this._super.emit.call(this, a);
11565
+ } }), p(cc, ac, { defaults: { event: "pinch", threshold: 0, pointers: 2 }, getTouchAction: function () {
11566
+ return [Mb];
11567
+ }, attrTest: function (a) {
11568
+ return this._super.attrTest.call(this, a) && (Math.abs(a.scale - 1) > this.options.threshold || this.state & Sb);
11569
+ }, emit: function (a) {
11570
+ if (this._super.emit.call(this, a), 1 !== a.scale) {
11571
+ var b = a.scale < 1 ? "in" : "out";this.manager.emit(this.options.event + b, a);
11572
+ }
11573
+ } }), p(dc, Yb, { defaults: { event: "press", pointers: 1, time: 500, threshold: 5 }, getTouchAction: function () {
11574
+ return [Kb];
11575
+ }, process: function (a) {
11576
+ var b = this.options,
11577
+ c = a.pointers.length === b.pointers,
11578
+ d = a.distance < b.threshold,
11579
+ e = a.deltaTime > b.time;if (this._input = a, !d || !c || a.eventType & (Q | R) && !e) this.reset();else if (a.eventType & O) this.reset(), this._timer = k(function () {
11580
+ this.state = Vb, this.tryEmit();
11581
+ }, b.time, this);else if (a.eventType & Q) return Vb;return Xb;
11582
+ }, reset: function () {
11583
+ clearTimeout(this._timer);
11584
+ }, emit: function (a) {
11585
+ this.state === Vb && (a && a.eventType & Q ? this.manager.emit(this.options.event + "up", a) : (this._input.timeStamp = j(), this.manager.emit(this.options.event, this._input)));
11586
+ } }), p(ec, ac, { defaults: { event: "rotate", threshold: 0, pointers: 2 }, getTouchAction: function () {
11587
+ return [Mb];
11588
+ }, attrTest: function (a) {
11589
+ return this._super.attrTest.call(this, a) && (Math.abs(a.rotation) > this.options.threshold || this.state & Sb);
11590
+ } }), p(fc, ac, { defaults: { event: "swipe", threshold: 10, velocity: .65, direction: X | Y, pointers: 1 }, getTouchAction: function () {
11591
+ return bc.prototype.getTouchAction.call(this);
11592
+ }, attrTest: function (a) {
11593
+ var c,
11594
+ b = this.options.direction;return b & (X | Y) ? c = a.velocity : b & X ? c = a.velocityX : b & Y && (c = a.velocityY), this._super.attrTest.call(this, a) && b & a.direction && a.distance > this.options.threshold && i(c) > this.options.velocity && a.eventType & Q;
11595
+ }, emit: function (a) {
11596
+ var b = $b(a.direction);b && this.manager.emit(this.options.event + b, a), this.manager.emit(this.options.event, a);
11597
+ } }), p(gc, Yb, { defaults: { event: "tap", pointers: 1, taps: 1, interval: 300, time: 250, threshold: 2, posThreshold: 10 }, getTouchAction: function () {
11598
+ return [Lb];
11599
+ }, process: function (a) {
11600
+ var b = this.options,
11601
+ c = a.pointers.length === b.pointers,
11602
+ d = a.distance < b.threshold,
11603
+ e = a.deltaTime < b.time;if (this.reset(), a.eventType & O && 0 === this.count) return this.failTimeout();if (d && e && c) {
11604
+ if (a.eventType != Q) return this.failTimeout();var f = this.pTime ? a.timeStamp - this.pTime < b.interval : !0,
11605
+ g = !this.pCenter || kb(this.pCenter, a.center) < b.posThreshold;this.pTime = a.timeStamp, this.pCenter = a.center, g && f ? this.count += 1 : this.count = 1, this._input = a;var h = this.count % b.taps;if (0 === h) return this.hasRequireFailures() ? (this._timer = k(function () {
11606
+ this.state = Vb, this.tryEmit();
11607
+ }, b.interval, this), Sb) : Vb;
11608
+ }return Xb;
11609
+ }, failTimeout: function () {
11610
+ return this._timer = k(function () {
11611
+ this.state = Xb;
11612
+ }, this.options.interval, this), Xb;
11613
+ }, reset: function () {
11614
+ clearTimeout(this._timer);
11615
+ }, emit: function () {
11616
+ this.state == Vb && (this._input.tapCount = this.count, this.manager.emit(this.options.event, this._input));
11617
+ } }), hc.VERSION = "2.0.4", hc.defaults = { domEvents: !1, touchAction: Jb, enable: !0, inputTarget: null, inputClass: null, preset: [[ec, { enable: !1 }], [cc, { enable: !1 }, ["rotate"]], [fc, { direction: X }], [bc, { direction: X }, ["swipe"]], [gc], [gc, { event: "doubletap", taps: 2 }, ["tap"]], [dc]], cssProps: { userSelect: "default", touchSelect: "none", touchCallout: "none", contentZooming: "none", userDrag: "none", tapHighlightColor: "rgba(0,0,0,0)" } };var ic = 1,
11618
+ jc = 2;kc.prototype = { set: function (a) {
11619
+ return n(this.options, a), a.touchAction && this.touchAction.update(), a.inputTarget && (this.input.destroy(), this.input.target = a.inputTarget, this.input.init()), this;
11620
+ }, stop: function (a) {
11621
+ this.session.stopped = a ? jc : ic;
11622
+ }, recognize: function (a) {
11623
+ var b = this.session;if (!b.stopped) {
11624
+ this.touchAction.preventDefaults(a);var c,
11625
+ d = this.recognizers,
11626
+ e = b.curRecognizer;(!e || e && e.state & Vb) && (e = b.curRecognizer = null);for (var f = 0; f < d.length;) {
11627
+ c = d[f], b.stopped === jc || e && c != e && !c.canRecognizeWith(e) ? c.reset() : c.recognize(a), !e && c.state & (Sb | Tb | Ub) && (e = b.curRecognizer = c), f++;
11628
+ }
11629
+ }
11630
+ }, get: function (a) {
11631
+ if (a instanceof Yb) return a;for (var b = this.recognizers, c = 0; c < b.length; c++) {
11632
+ if (b[c].options.event == a) return b[c];
11633
+ }return null;
11634
+ }, add: function (a) {
11635
+ if (l(a, "add", this)) return this;var b = this.get(a.options.event);return b && this.remove(b), this.recognizers.push(a), a.manager = this, this.touchAction.update(), a;
11636
+ }, remove: function (a) {
11637
+ if (l(a, "remove", this)) return this;var b = this.recognizers;return a = this.get(a), b.splice(y(b, a), 1), this.touchAction.update(), this;
11638
+ }, on: function (a, b) {
11639
+ var c = this.handlers;return m(x(a), function (a) {
11640
+ c[a] = c[a] || [], c[a].push(b);
11641
+ }), this;
11642
+ }, off: function (a, b) {
11643
+ var c = this.handlers;return m(x(a), function (a) {
11644
+ b ? c[a].splice(y(c[a], b), 1) : delete c[a];
11645
+ }), this;
11646
+ }, emit: function (a, b) {
11647
+ this.options.domEvents && mc(a, b);var c = this.handlers[a] && this.handlers[a].slice();if (c && c.length) {
11648
+ b.type = a, b.preventDefault = function () {
11649
+ b.srcEvent.preventDefault();
11650
+ };for (var d = 0; d < c.length;) {
11651
+ c[d](b), d++;
11652
+ }
11653
+ }
11654
+ }, destroy: function () {
11655
+ this.element && lc(this, !1), this.handlers = {}, this.session = {}, this.input.destroy(), this.element = null;
11656
+ } }, n(hc, { INPUT_START: O, INPUT_MOVE: P, INPUT_END: Q, INPUT_CANCEL: R, STATE_POSSIBLE: Rb, STATE_BEGAN: Sb, STATE_CHANGED: Tb, STATE_ENDED: Ub, STATE_RECOGNIZED: Vb, STATE_CANCELLED: Wb, STATE_FAILED: Xb, DIRECTION_NONE: S, DIRECTION_LEFT: T, DIRECTION_RIGHT: U, DIRECTION_UP: V, DIRECTION_DOWN: W, DIRECTION_HORIZONTAL: X, DIRECTION_VERTICAL: Y, DIRECTION_ALL: Z, Manager: kc, Input: ab, TouchAction: Pb, TouchInput: Eb, MouseInput: rb, PointerEventInput: wb, TouchMouseInput: Gb, SingleTouchInput: Ab, Recognizer: Yb, AttrRecognizer: ac, Tap: gc, Pan: bc, Swipe: fc, Pinch: cc, Rotate: ec, Press: dc, on: t, off: u, each: m, merge: o, extend: n, inherit: p, bindFn: q, prefixed: B }), "function" == g && __webpack_require__(7) ? !(__WEBPACK_AMD_DEFINE_RESULT__ = function () {
11657
+ return hc;
11658
+ }.call(exports, __webpack_require__, exports, module),
11659
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : "undefined" != typeof module && module.exports ? module.exports = hc : a[c] = hc;
11660
+ }(window, document, "Hammer");;(function (factory) {
11661
+ if (true) {
11662
+ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(0), __webpack_require__(8)], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
11663
+ __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
11664
+ (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
11665
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
11666
+ } else if (typeof exports === 'object') {
11667
+ factory(require('jquery'), require('hammerjs'));
11668
+ } else {
11669
+ factory(jQuery, Hammer);
11670
+ }
11671
+ })(function ($, Hammer) {
11672
+ function hammerify(el, options) {
11673
+ var $el = $(el);
11674
+ if (!$el.data("hammer")) {
11675
+ $el.data("hammer", new Hammer($el[0], options));
11676
+ }
11677
+ }
11678
+
11679
+ $.fn.hammer = function (options) {
11680
+ return this.each(function () {
11681
+ hammerify(this, options);
11682
+ });
11683
+ };
11684
+
11685
+ // extend the emit method to also trigger jQuery events
11686
+ Hammer.Manager.prototype.emit = function (originalEmit) {
11687
+ return function (type, data) {
11688
+ originalEmit.call(this, type, data);
11689
+ $(this.element).trigger({
11690
+ type: type,
11691
+ gesture: data
11692
+ });
11693
+ };
11694
+ }(Hammer.Manager.prototype.emit);
11695
+ });
11696
+ ; // Required for Meteor package, the use of window prevents export by Meteor
11697
+ (function (window) {
11698
+ if (window.Package) {
11699
+ Materialize = {};
11700
+ } else {
11701
+ window.Materialize = {};
11702
+ }
11703
+ })(window);
11704
+
11705
+ /*
11706
+ * raf.js
11707
+ * https://github.com/ngryman/raf.js
11708
+ *
11709
+ * original requestAnimationFrame polyfill by Erik Möller
11710
+ * inspired from paul_irish gist and post
11711
+ *
11712
+ * Copyright (c) 2013 ngryman
11713
+ * Licensed under the MIT license.
11714
+ */
11715
+ (function (window) {
11716
+ var lastTime = 0,
11717
+ vendors = ['webkit', 'moz'],
11718
+ requestAnimationFrame = window.requestAnimationFrame,
11719
+ cancelAnimationFrame = window.cancelAnimationFrame,
11720
+ i = vendors.length;
11721
+
11722
+ // try to un-prefix existing raf
11723
+ while (--i >= 0 && !requestAnimationFrame) {
11724
+ requestAnimationFrame = window[vendors[i] + 'RequestAnimationFrame'];
11725
+ cancelAnimationFrame = window[vendors[i] + 'CancelRequestAnimationFrame'];
11726
+ }
11727
+
11728
+ // polyfill with setTimeout fallback
11729
+ // heavily inspired from @darius gist mod: https://gist.github.com/paulirish/1579671#comment-837945
11730
+ if (!requestAnimationFrame || !cancelAnimationFrame) {
11731
+ requestAnimationFrame = function (callback) {
11732
+ var now = +Date.now(),
11733
+ nextTime = Math.max(lastTime + 16, now);
11734
+ return setTimeout(function () {
11735
+ callback(lastTime = nextTime);
11736
+ }, nextTime - now);
11737
+ };
11738
+
11739
+ cancelAnimationFrame = clearTimeout;
11740
+ }
11741
+
11742
+ // export to window
11743
+ window.requestAnimationFrame = requestAnimationFrame;
11744
+ window.cancelAnimationFrame = cancelAnimationFrame;
11745
+ })(window);
11746
+
11747
+ /**
11748
+ * Generate approximated selector string for a jQuery object
11749
+ * @param {jQuery} obj jQuery object to be parsed
11750
+ * @returns {string}
11751
+ */
11752
+ Materialize.objectSelectorString = function (obj) {
11753
+ var tagStr = obj.prop('tagName') || '';
11754
+ var idStr = obj.attr('id') || '';
11755
+ var classStr = obj.attr('class') || '';
11756
+ return (tagStr + idStr + classStr).replace(/\s/g, '');
11757
+ };
11758
+
11759
+ // Unique Random ID
11760
+ Materialize.guid = function () {
11761
+ function s4() {
11762
+ return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);
11763
+ }
11764
+ return function () {
11765
+ return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4();
11766
+ };
11767
+ }();
11768
+
11769
+ /**
11770
+ * Escapes hash from special characters
11771
+ * @param {string} hash String returned from this.hash
11772
+ * @returns {string}
11773
+ */
11774
+ Materialize.escapeHash = function (hash) {
11775
+ return hash.replace(/(:|\.|\[|\]|,|=)/g, "\\$1");
11776
+ };
11777
+
11778
+ Materialize.elementOrParentIsFixed = function (element) {
11779
+ var $element = $(element);
11780
+ var $checkElements = $element.add($element.parents());
11781
+ var isFixed = false;
11782
+ $checkElements.each(function () {
11783
+ if ($(this).css("position") === "fixed") {
11784
+ isFixed = true;
11785
+ return false;
11786
+ }
11787
+ });
11788
+ return isFixed;
11789
+ };
11790
+
11791
+ /**
11792
+ * Get time in ms
11793
+ * @license https://raw.github.com/jashkenas/underscore/master/LICENSE
11794
+ * @type {function}
11795
+ * @return {number}
11796
+ */
11797
+ var getTime = Date.now || function () {
11798
+ return new Date().getTime();
11799
+ };
11800
+
11801
+ /**
11802
+ * Returns a function, that, when invoked, will only be triggered at most once
11803
+ * during a given window of time. Normally, the throttled function will run
11804
+ * as much as it can, without ever going more than once per `wait` duration;
11805
+ * but if you'd like to disable the execution on the leading edge, pass
11806
+ * `{leading: false}`. To disable execution on the trailing edge, ditto.
11807
+ * @license https://raw.github.com/jashkenas/underscore/master/LICENSE
11808
+ * @param {function} func
11809
+ * @param {number} wait
11810
+ * @param {Object=} options
11811
+ * @returns {Function}
11812
+ */
11813
+ Materialize.throttle = function (func, wait, options) {
11814
+ var context, args, result;
11815
+ var timeout = null;
11816
+ var previous = 0;
11817
+ options || (options = {});
11818
+ var later = function () {
11819
+ previous = options.leading === false ? 0 : getTime();
11820
+ timeout = null;
11821
+ result = func.apply(context, args);
11822
+ context = args = null;
11823
+ };
11824
+ return function () {
11825
+ var now = getTime();
11826
+ if (!previous && options.leading === false) previous = now;
11827
+ var remaining = wait - (now - previous);
11828
+ context = this;
11829
+ args = arguments;
11830
+ if (remaining <= 0) {
11831
+ clearTimeout(timeout);
11832
+ timeout = null;
11833
+ previous = now;
11834
+ result = func.apply(context, args);
11835
+ context = args = null;
11836
+ } else if (!timeout && options.trailing !== false) {
11837
+ timeout = setTimeout(later, remaining);
11838
+ }
11839
+ return result;
11840
+ };
11841
+ };
11842
+
11843
+ // Velocity has conflicts when loaded with jQuery, this will check for it
11844
+ // First, check if in noConflict mode
11845
+ var Vel;
11846
+ if (jQuery) {
11847
+ Vel = jQuery.Velocity;
11848
+ } else if ($) {
11849
+ Vel = $.Velocity;
11850
+ } else {
11851
+ Vel = Velocity;
11852
+ }
11853
+ ;(function ($) {
11854
+ $.fn.collapsible = function (options, methodParam) {
11855
+ var defaults = {
11856
+ accordion: undefined,
11857
+ onOpen: undefined,
11858
+ onClose: undefined
11859
+ };
11860
+
11861
+ var methodName = options;
11862
+ options = $.extend(defaults, options);
11863
+
11864
+ return this.each(function () {
11865
+
11866
+ var $this = $(this);
11867
+
11868
+ var $panel_headers = $(this).find('> li > .collapsible-header');
11869
+
11870
+ var collapsible_type = $this.data("collapsible");
11871
+
11872
+ /****************
11873
+ Helper Functions
11874
+ ****************/
11875
+
11876
+ // Accordion Open
11877
+ function accordionOpen(object) {
11878
+ $panel_headers = $this.find('> li > .collapsible-header');
11879
+ if (object.hasClass('active')) {
11880
+ object.parent().addClass('active');
11881
+ } else {
11882
+ object.parent().removeClass('active');
11883
+ }
11884
+ if (object.parent().hasClass('active')) {
11885
+ object.siblings('.collapsible-body').stop(true, false).slideDown({ duration: 350, easing: "easeOutQuart", queue: false, complete: function () {
11886
+ $(this).css('height', '');
11887
+ } });
11888
+ } else {
11889
+ object.siblings('.collapsible-body').stop(true, false).slideUp({ duration: 350, easing: "easeOutQuart", queue: false, complete: function () {
11890
+ $(this).css('height', '');
11891
+ } });
11892
+ }
11893
+
11894
+ $panel_headers.not(object).removeClass('active').parent().removeClass('active');
11895
+
11896
+ // Close previously open accordion elements.
11897
+ $panel_headers.not(object).parent().children('.collapsible-body').stop(true, false).each(function () {
11898
+ if ($(this).is(':visible')) {
11899
+ $(this).slideUp({
11900
+ duration: 350,
11901
+ easing: "easeOutQuart",
11902
+ queue: false,
11903
+ complete: function () {
11904
+ $(this).css('height', '');
11905
+ execCallbacks($(this).siblings('.collapsible-header'));
11906
+ }
11907
+ });
11908
+ }
11909
+ });
11910
+ }
11911
+
11912
+ // Expandable Open
11913
+ function expandableOpen(object) {
11914
+ if (object.hasClass('active')) {
11915
+ object.parent().addClass('active');
11916
+ } else {
11917
+ object.parent().removeClass('active');
11918
+ }
11919
+ if (object.parent().hasClass('active')) {
11920
+ object.siblings('.collapsible-body').stop(true, false).slideDown({ duration: 350, easing: "easeOutQuart", queue: false, complete: function () {
11921
+ $(this).css('height', '');
11922
+ } });
11923
+ } else {
11924
+ object.siblings('.collapsible-body').stop(true, false).slideUp({ duration: 350, easing: "easeOutQuart", queue: false, complete: function () {
11925
+ $(this).css('height', '');
11926
+ } });
11927
+ }
11928
+ }
11929
+
11930
+ // Open collapsible. object: .collapsible-header
11931
+ function collapsibleOpen(object, noToggle) {
11932
+ if (!noToggle) {
11933
+ object.toggleClass('active');
11934
+ }
11935
+
11936
+ if (options.accordion || collapsible_type === "accordion" || collapsible_type === undefined) {
11937
+ // Handle Accordion
11938
+ accordionOpen(object);
11939
+ } else {
11940
+ // Handle Expandables
11941
+ expandableOpen(object);
11942
+ }
11943
+
11944
+ execCallbacks(object);
11945
+ }
11946
+
11947
+ // Handle callbacks
11948
+ function execCallbacks(object) {
11949
+ if (object.hasClass('active')) {
11950
+ if (typeof options.onOpen === "function") {
11951
+ options.onOpen.call(this, object.parent());
11952
+ }
11953
+ } else {
11954
+ if (typeof options.onClose === "function") {
11955
+ options.onClose.call(this, object.parent());
11956
+ }
11957
+ }
11958
+ }
11959
+
11960
+ /**
11961
+ * Check if object is children of panel header
11962
+ * @param {Object} object Jquery object
11963
+ * @return {Boolean} true if it is children
11964
+ */
11965
+ function isChildrenOfPanelHeader(object) {
11966
+
11967
+ var panelHeader = getPanelHeader(object);
11968
+
11969
+ return panelHeader.length > 0;
11970
+ }
11971
+
11972
+ /**
11973
+ * Get panel header from a children element
11974
+ * @param {Object} object Jquery object
11975
+ * @return {Object} panel header object
11976
+ */
11977
+ function getPanelHeader(object) {
11978
+
11979
+ return object.closest('li > .collapsible-header');
11980
+ }
11981
+
11982
+ // Turn off any existing event handlers
11983
+ function removeEventHandlers() {
11984
+ $this.off('click.collapse', '> li > .collapsible-header');
11985
+ }
11986
+
11987
+ /***** End Helper Functions *****/
11988
+
11989
+ // Methods
11990
+ if (methodName === 'destroy') {
11991
+ removeEventHandlers();
11992
+ return;
11993
+ } else if (methodParam >= 0 && methodParam < $panel_headers.length) {
11994
+ var $curr_header = $panel_headers.eq(methodParam);
11995
+ if ($curr_header.length && (methodName === 'open' || methodName === 'close' && $curr_header.hasClass('active'))) {
11996
+ collapsibleOpen($curr_header);
11997
+ }
11998
+ return;
11999
+ }
12000
+
12001
+ removeEventHandlers();
12002
+
12003
+ // Add click handler to only direct collapsible header children
12004
+ $this.on('click.collapse', '> li > .collapsible-header', function (e) {
12005
+ var element = $(e.target);
12006
+
12007
+ if (isChildrenOfPanelHeader(element)) {
12008
+ element = getPanelHeader(element);
12009
+ }
12010
+
12011
+ collapsibleOpen(element);
12012
+ });
12013
+
12014
+ // Open first active
12015
+ if (options.accordion || collapsible_type === "accordion" || collapsible_type === undefined) {
12016
+ // Handle Accordion
12017
+ collapsibleOpen($panel_headers.filter('.active').first(), true);
12018
+ } else {
12019
+ // Handle Expandables
12020
+ $panel_headers.filter('.active').each(function () {
12021
+ collapsibleOpen($(this), true);
12022
+ });
12023
+ }
12024
+ });
12025
+ };
12026
+
12027
+ $(document).ready(function () {
12028
+ $('.collapsible').collapsible();
12029
+ });
12030
+ })(jQuery);;(function ($) {
12031
+
12032
+ // Add posibility to scroll to selected option
12033
+ // usefull for select for example
12034
+ $.fn.scrollTo = function (elem) {
12035
+ $(this).scrollTop($(this).scrollTop() - $(this).offset().top + $(elem).offset().top);
12036
+ return this;
12037
+ };
12038
+
12039
+ $.fn.dropdown = function (options) {
12040
+ var defaults = {
12041
+ inDuration: 300,
12042
+ outDuration: 225,
12043
+ constrainWidth: true, // Constrains width of dropdown to the activator
12044
+ hover: false,
12045
+ gutter: 0, // Spacing from edge
12046
+ belowOrigin: false,
12047
+ alignment: 'left',
12048
+ stopPropagation: false
12049
+ };
12050
+
12051
+ // Open dropdown.
12052
+ if (options === "open") {
12053
+ this.each(function () {
12054
+ $(this).trigger('open');
12055
+ });
12056
+ return false;
12057
+ }
12058
+
12059
+ // Close dropdown.
12060
+ if (options === "close") {
12061
+ this.each(function () {
12062
+ $(this).trigger('close');
12063
+ });
12064
+ return false;
12065
+ }
12066
+
12067
+ this.each(function () {
12068
+ var origin = $(this);
12069
+ var curr_options = $.extend({}, defaults, options);
12070
+ var isFocused = false;
12071
+
12072
+ // Dropdown menu
12073
+ var activates = $("#" + origin.attr('data-activates'));
12074
+
12075
+ function updateOptions() {
12076
+ if (origin.data('induration') !== undefined) curr_options.inDuration = origin.data('induration');
12077
+ if (origin.data('outduration') !== undefined) curr_options.outDuration = origin.data('outduration');
12078
+ if (origin.data('constrainwidth') !== undefined) curr_options.constrainWidth = origin.data('constrainwidth');
12079
+ if (origin.data('hover') !== undefined) curr_options.hover = origin.data('hover');
12080
+ if (origin.data('gutter') !== undefined) curr_options.gutter = origin.data('gutter');
12081
+ if (origin.data('beloworigin') !== undefined) curr_options.belowOrigin = origin.data('beloworigin');
12082
+ if (origin.data('alignment') !== undefined) curr_options.alignment = origin.data('alignment');
12083
+ if (origin.data('stoppropagation') !== undefined) curr_options.stopPropagation = origin.data('stoppropagation');
12084
+ }
12085
+
12086
+ updateOptions();
12087
+
12088
+ // Attach dropdown to its activator
12089
+ origin.after(activates);
12090
+
12091
+ /*
12092
+ Helper function to position and resize dropdown.
12093
+ Used in hover and click handler.
12094
+ */
12095
+ function placeDropdown(eventType) {
12096
+ // Check for simultaneous focus and click events.
12097
+ if (eventType === 'focus') {
12098
+ isFocused = true;
12099
+ }
12100
+
12101
+ // Check html data attributes
12102
+ updateOptions();
12103
+
12104
+ // Set Dropdown state
12105
+ activates.addClass('active');
12106
+ origin.addClass('active');
12107
+
12108
+ var originWidth = origin[0].getBoundingClientRect().width;
12109
+
12110
+ // Constrain width
12111
+ if (curr_options.constrainWidth === true) {
12112
+ activates.css('width', originWidth);
12113
+ } else {
12114
+ activates.css('white-space', 'nowrap');
12115
+ }
12116
+
12117
+ // Offscreen detection
12118
+ var windowHeight = window.innerHeight;
12119
+ var originHeight = origin.innerHeight();
12120
+ var offsetLeft = origin.offset().left;
12121
+ var offsetTop = origin.offset().top - $(window).scrollTop();
12122
+ var currAlignment = curr_options.alignment;
12123
+ var gutterSpacing = 0;
12124
+ var leftPosition = 0;
12125
+
12126
+ // Below Origin
12127
+ var verticalOffset = 0;
12128
+ if (curr_options.belowOrigin === true) {
12129
+ verticalOffset = originHeight;
12130
+ }
12131
+
12132
+ // Check for scrolling positioned container.
12133
+ var scrollYOffset = 0;
12134
+ var scrollXOffset = 0;
12135
+ var wrapper = origin.parent();
12136
+ if (!wrapper.is('body')) {
12137
+ if (wrapper[0].scrollHeight > wrapper[0].clientHeight) {
12138
+ scrollYOffset = wrapper[0].scrollTop;
12139
+ }
12140
+ if (wrapper[0].scrollWidth > wrapper[0].clientWidth) {
12141
+ scrollXOffset = wrapper[0].scrollLeft;
12142
+ }
12143
+ }
12144
+
12145
+ if (offsetLeft + activates.innerWidth() > $(window).width()) {
12146
+ // Dropdown goes past screen on right, force right alignment
12147
+ currAlignment = 'right';
12148
+ } else if (offsetLeft - activates.innerWidth() + origin.innerWidth() < 0) {
12149
+ // Dropdown goes past screen on left, force left alignment
12150
+ currAlignment = 'left';
12151
+ }
12152
+ // Vertical bottom offscreen detection
12153
+ if (offsetTop + activates.innerHeight() > windowHeight) {
12154
+ // If going upwards still goes offscreen, just crop height of dropdown.
12155
+ if (offsetTop + originHeight - activates.innerHeight() < 0) {
12156
+ var adjustedHeight = windowHeight - offsetTop - verticalOffset;
12157
+ activates.css('max-height', adjustedHeight);
12158
+ } else {
12159
+ // Flow upwards.
12160
+ if (!verticalOffset) {
12161
+ verticalOffset += originHeight;
12162
+ }
12163
+ verticalOffset -= activates.innerHeight();
12164
+ }
12165
+ }
12166
+
12167
+ // Handle edge alignment
12168
+ if (currAlignment === 'left') {
12169
+ gutterSpacing = curr_options.gutter;
12170
+ leftPosition = origin.position().left + gutterSpacing;
12171
+ } else if (currAlignment === 'right') {
12172
+ // Material icons fix
12173
+ activates.stop(true, true).css({
12174
+ opacity: 0,
12175
+ left: 0
12176
+ });
12177
+
12178
+ var offsetRight = origin.position().left + originWidth - activates.width();
12179
+ gutterSpacing = -curr_options.gutter;
12180
+ leftPosition = offsetRight + gutterSpacing;
12181
+ }
12182
+
12183
+ // Position dropdown
12184
+ activates.css({
12185
+ position: 'absolute',
12186
+ top: origin.position().top + verticalOffset + scrollYOffset,
12187
+ left: leftPosition + scrollXOffset
12188
+ });
12189
+
12190
+ // Show dropdown
12191
+ activates.slideDown({
12192
+ queue: false,
12193
+ duration: curr_options.inDuration,
12194
+ easing: 'easeOutCubic',
12195
+ complete: function () {
12196
+ $(this).css('height', '');
12197
+ }
12198
+ }).animate({ opacity: 1 }, { queue: false, duration: curr_options.inDuration, easing: 'easeOutSine' });
12199
+
12200
+ // Add click close handler to document
12201
+ setTimeout(function () {
12202
+ $(document).on('click.' + activates.attr('id'), function (e) {
12203
+ hideDropdown();
12204
+ $(document).off('click.' + activates.attr('id'));
12205
+ });
12206
+ }, 0);
12207
+ }
12208
+
12209
+ function hideDropdown() {
12210
+ // Check for simultaneous focus and click events.
12211
+ isFocused = false;
12212
+ activates.fadeOut(curr_options.outDuration);
12213
+ activates.removeClass('active');
12214
+ origin.removeClass('active');
12215
+ $(document).off('click.' + activates.attr('id'));
12216
+ setTimeout(function () {
12217
+ activates.css('max-height', '');
12218
+ }, curr_options.outDuration);
12219
+ }
12220
+
12221
+ // Hover
12222
+ if (curr_options.hover) {
12223
+ var open = false;
12224
+ origin.off('click.' + origin.attr('id'));
12225
+ // Hover handler to show dropdown
12226
+ origin.on('mouseenter', function (e) {
12227
+ // Mouse over
12228
+ if (open === false) {
12229
+ placeDropdown();
12230
+ open = true;
12231
+ }
12232
+ });
12233
+ origin.on('mouseleave', function (e) {
12234
+ // If hover on origin then to something other than dropdown content, then close
12235
+ var toEl = e.toElement || e.relatedTarget; // added browser compatibility for target element
12236
+ if (!$(toEl).closest('.dropdown-content').is(activates)) {
12237
+ activates.stop(true, true);
12238
+ hideDropdown();
12239
+ open = false;
12240
+ }
12241
+ });
12242
+
12243
+ activates.on('mouseleave', function (e) {
12244
+ // Mouse out
12245
+ var toEl = e.toElement || e.relatedTarget;
12246
+ if (!$(toEl).closest('.dropdown-button').is(origin)) {
12247
+ activates.stop(true, true);
12248
+ hideDropdown();
12249
+ open = false;
12250
+ }
12251
+ });
12252
+
12253
+ // Click
12254
+ } else {
12255
+ // Click handler to show dropdown
12256
+ origin.off('click.' + origin.attr('id'));
12257
+ origin.on('click.' + origin.attr('id'), function (e) {
12258
+ if (!isFocused) {
12259
+ if (origin[0] == e.currentTarget && !origin.hasClass('active') && $(e.target).closest('.dropdown-content').length === 0) {
12260
+ e.preventDefault(); // Prevents button click from moving window
12261
+ if (curr_options.stopPropagation) {
12262
+ e.stopPropagation();
12263
+ }
12264
+ placeDropdown('click');
12265
+ }
12266
+ // If origin is clicked and menu is open, close menu
12267
+ else if (origin.hasClass('active')) {
12268
+ hideDropdown();
12269
+ $(document).off('click.' + activates.attr('id'));
12270
+ }
12271
+ }
12272
+ });
12273
+ } // End else
12274
+
12275
+ // Listen to open and close event - useful for select component
12276
+ origin.on('open', function (e, eventType) {
12277
+ placeDropdown(eventType);
12278
+ });
12279
+ origin.on('close', hideDropdown);
12280
+ });
12281
+ }; // End dropdown plugin
12282
+
12283
+ $(document).ready(function () {
12284
+ $('.dropdown-button').dropdown();
12285
+ });
12286
+ })(jQuery);
12287
+ ;(function ($) {
12288
+ 'use strict';
12289
+
12290
+ var _defaults = {
12291
+ opacity: 0.5,
12292
+ inDuration: 250,
12293
+ outDuration: 250,
12294
+ ready: undefined,
12295
+ complete: undefined,
12296
+ dismissible: true,
12297
+ startingTop: '4%',
12298
+ endingTop: '10%'
12299
+ };
12300
+
12301
+ /**
12302
+ * @class
12303
+ *
12304
+ */
12305
+
12306
+ var Modal = function () {
12307
+ /**
12308
+ * Construct Modal instance and set up overlay
12309
+ * @constructor
12310
+ * @param {jQuery} $el
12311
+ * @param {Object} options
12312
+ */
12313
+ function Modal($el, options) {
12314
+ _classCallCheck(this, Modal);
12315
+
12316
+ // If exists, destroy and reinitialize
12317
+ if (!!$el[0].M_Modal) {
12318
+ $el[0].M_Modal.destroy();
12319
+ }
12320
+
12321
+ /**
12322
+ * The jQuery element
12323
+ * @type {jQuery}
12324
+ */
12325
+ this.$el = $el;
12326
+
12327
+ /**
12328
+ * Options for the modal
12329
+ * @member Modal#options
12330
+ * @prop {Number} [opacity=0.5] - Opacity of the modal overlay
12331
+ * @prop {Number} [inDuration=250] - Length in ms of enter transition
12332
+ * @prop {Number} [outDuration=250] - Length in ms of exit transition
12333
+ * @prop {Function} ready - Callback function called when modal is finished entering
12334
+ * @prop {Function} complete - Callback function called when modal is finished exiting
12335
+ * @prop {Boolean} [dismissible=true] - Allow modal to be dismissed by keyboard or overlay click
12336
+ * @prop {String} [startingTop='4%'] - startingTop
12337
+ * @prop {String} [endingTop='10%'] - endingTop
12338
+ */
12339
+ this.options = $.extend({}, Modal.defaults, options);
12340
+
12341
+ /**
12342
+ * Describes open/close state of modal
12343
+ * @type {Boolean}
12344
+ */
12345
+ this.isOpen = false;
12346
+
12347
+ this.$el[0].M_Modal = this;
12348
+ this.id = $el.attr('id');
12349
+ this.openingTrigger = undefined;
12350
+ this.$overlay = $('<div class="modal-overlay"></div>');
12351
+
12352
+ Modal._increment++;
12353
+ Modal._count++;
12354
+ this.$overlay[0].style.zIndex = 1000 + Modal._increment * 2;
12355
+ this.$el[0].style.zIndex = 1000 + Modal._increment * 2 + 1;
12356
+ this.setupEventHandlers();
12357
+ }
12358
+
12359
+ _createClass(Modal, [{
12360
+ key: 'getInstance',
12361
+
12362
+
12363
+ /**
12364
+ * Get Instance
12365
+ */
12366
+ value: function getInstance() {
12367
+ return this;
12368
+ }
12369
+
12370
+ /**
12371
+ * Teardown component
12372
+ */
12373
+
12374
+ }, {
12375
+ key: 'destroy',
12376
+ value: function destroy() {
12377
+ this.removeEventHandlers();
12378
+ this.$el[0].removeAttribute('style');
12379
+ if (!!this.$overlay[0].parentNode) {
12380
+ this.$overlay[0].parentNode.removeChild(this.$overlay[0]);
12381
+ }
12382
+ this.$el[0].M_Modal = undefined;
12383
+ Modal._count--;
12384
+ }
12385
+
12386
+ /**
12387
+ * Setup Event Handlers
12388
+ */
12389
+
12390
+ }, {
12391
+ key: 'setupEventHandlers',
12392
+ value: function setupEventHandlers() {
12393
+ this.handleOverlayClickBound = this.handleOverlayClick.bind(this);
12394
+ this.handleModalCloseClickBound = this.handleModalCloseClick.bind(this);
12395
+
12396
+ if (Modal._count === 1) {
12397
+ document.addEventListener('click', this.handleTriggerClick);
12398
+ }
12399
+ this.$overlay[0].addEventListener('click', this.handleOverlayClickBound);
12400
+ this.$el[0].addEventListener('click', this.handleModalCloseClickBound);
12401
+ }
12402
+
12403
+ /**
12404
+ * Remove Event Handlers
12405
+ */
12406
+
12407
+ }, {
12408
+ key: 'removeEventHandlers',
12409
+ value: function removeEventHandlers() {
12410
+ if (Modal._count === 0) {
12411
+ document.removeEventListener('click', this.handleTriggerClick);
12412
+ }
12413
+ this.$overlay[0].removeEventListener('click', this.handleOverlayClickBound);
12414
+ this.$el[0].removeEventListener('click', this.handleModalCloseClickBound);
12415
+ }
12416
+
12417
+ /**
12418
+ * Handle Trigger Click
12419
+ * @param {Event} e
12420
+ */
12421
+
12422
+ }, {
12423
+ key: 'handleTriggerClick',
12424
+ value: function handleTriggerClick(e) {
12425
+ var $trigger = $(e.target).closest('.modal-trigger');
12426
+ if (e.target && $trigger.length) {
12427
+ var modalId = $trigger[0].getAttribute('href');
12428
+ if (modalId) {
12429
+ modalId = modalId.slice(1);
12430
+ } else {
12431
+ modalId = $trigger[0].getAttribute('data-target');
12432
+ }
12433
+ var modalInstance = document.getElementById(modalId).M_Modal;
12434
+ if (modalInstance) {
12435
+ modalInstance.open($trigger);
12436
+ }
12437
+ e.preventDefault();
12438
+ }
12439
+ }
12440
+
12441
+ /**
12442
+ * Handle Overlay Click
12443
+ */
12444
+
12445
+ }, {
12446
+ key: 'handleOverlayClick',
12447
+ value: function handleOverlayClick() {
12448
+ if (this.options.dismissible) {
12449
+ this.close();
12450
+ }
12451
+ }
12452
+
12453
+ /**
12454
+ * Handle Modal Close Click
12455
+ * @param {Event} e
12456
+ */
12457
+
12458
+ }, {
12459
+ key: 'handleModalCloseClick',
12460
+ value: function handleModalCloseClick(e) {
12461
+ var $closeTrigger = $(e.target).closest('.modal-close');
12462
+ if (e.target && $closeTrigger.length) {
12463
+ this.close();
12464
+ }
12465
+ }
12466
+
12467
+ /**
12468
+ * Handle Keydown
12469
+ * @param {Event} e
12470
+ */
12471
+
12472
+ }, {
12473
+ key: 'handleKeydown',
12474
+ value: function handleKeydown(e) {
12475
+ // ESC key
12476
+ if (e.keyCode === 27 && this.options.dismissible) {
12477
+ this.close();
12478
+ }
12479
+ }
12480
+
12481
+ /**
12482
+ * Animate in modal
12483
+ */
12484
+
12485
+ }, {
12486
+ key: 'animateIn',
12487
+ value: function animateIn() {
12488
+ var _this = this;
12489
+
12490
+ // Set initial styles
12491
+ $.extend(this.$el[0].style, {
12492
+ display: 'block',
12493
+ opacity: 0
12494
+ });
12495
+ $.extend(this.$overlay[0].style, {
12496
+ display: 'block',
12497
+ opacity: 0
12498
+ });
12499
+
12500
+ // Animate overlay
12501
+ Vel(this.$overlay[0], { opacity: this.options.opacity }, { duration: this.options.inDuration, queue: false, ease: 'easeOutCubic' });
12502
+
12503
+ // Define modal animation options
12504
+ var enterVelocityOptions = {
12505
+ duration: this.options.inDuration,
12506
+ queue: false,
12507
+ ease: 'easeOutCubic',
12508
+ // Handle modal ready callback
12509
+ complete: function () {
12510
+ if (typeof _this.options.ready === 'function') {
12511
+ _this.options.ready.call(_this, _this.$el, _this.openingTrigger);
12512
+ }
12513
+ }
12514
+ };
12515
+
12516
+ // Bottom sheet animation
12517
+ if (this.$el[0].classList.contains('bottom-sheet')) {
12518
+ Vel(this.$el[0], { bottom: 0, opacity: 1 }, enterVelocityOptions);
12519
+
12520
+ // Normal modal animation
12521
+ } else {
12522
+ Vel.hook(this.$el[0], 'scaleX', 0.7);
12523
+ this.$el[0].style.top = this.options.startingTop;
12524
+ Vel(this.$el[0], { top: this.options.endingTop, opacity: 1, scaleX: 1 }, enterVelocityOptions);
12525
+ }
12526
+ }
12527
+
12528
+ /**
12529
+ * Animate out modal
12530
+ */
12531
+
12532
+ }, {
12533
+ key: 'animateOut',
12534
+ value: function animateOut() {
12535
+ var _this2 = this;
12536
+
12537
+ // Animate overlay
12538
+ Vel(this.$overlay[0], { opacity: 0 }, { duration: this.options.outDuration, queue: false, ease: 'easeOutQuart' });
12539
+
12540
+ // Define modal animation options
12541
+ var exitVelocityOptions = {
12542
+ duration: this.options.outDuration,
12543
+ queue: false,
12544
+ ease: 'easeOutCubic',
12545
+ // Handle modal ready callback
12546
+ complete: function () {
12547
+ _this2.$el[0].style.display = 'none';
12548
+ // Call complete callback
12549
+ if (typeof _this2.options.complete === 'function') {
12550
+ _this2.options.complete.call(_this2, _this2.$el);
12551
+ }
12552
+ _this2.$overlay[0].remove();
12553
+ }
12554
+ };
12555
+
12556
+ // Bottom sheet animation
12557
+ if (this.$el[0].classList.contains('bottom-sheet')) {
12558
+ Vel(this.$el[0], { bottom: '-100%', opacity: 0 }, exitVelocityOptions);
12559
+
12560
+ // Normal modal animation
12561
+ } else {
12562
+ Vel(this.$el[0], { top: this.options.startingTop, opacity: 0, scaleX: 0.7 }, exitVelocityOptions);
12563
+ }
12564
+ }
12565
+
12566
+ /**
12567
+ * Open Modal
12568
+ * @param {jQuery} [$trigger]
12569
+ */
12570
+
12571
+ }, {
12572
+ key: 'open',
12573
+ value: function open($trigger) {
12574
+ if (this.isOpen) {
12575
+ return;
12576
+ }
12577
+
12578
+ this.isOpen = true;
12579
+ var body = document.body;
12580
+ body.style.overflow = 'hidden';
12581
+ this.$el[0].classList.add('open');
12582
+ body.appendChild(this.$overlay[0]);
12583
+
12584
+ // Set opening trigger, undefined indicates modal was opened by javascript
12585
+ this.openingTrigger = !!$trigger ? $trigger : undefined;
12586
+
12587
+ if (this.options.dismissible) {
12588
+ this.handleKeydownBound = this.handleKeydown.bind(this);
12589
+ document.addEventListener('keydown', this.handleKeydownBound);
12590
+ }
12591
+
12592
+ this.animateIn();
12593
+
12594
+ return this;
12595
+ }
12596
+
12597
+ /**
12598
+ * Close Modal
12599
+ */
12600
+
12601
+ }, {
12602
+ key: 'close',
12603
+ value: function close() {
12604
+ if (!this.isOpen) {
12605
+ return;
12606
+ }
12607
+
12608
+ this.isOpen = false;
12609
+ this.$el[0].classList.remove('open');
12610
+ document.body.style.overflow = null;
12611
+
12612
+ if (this.options.dismissible) {
12613
+ document.removeEventListener('keydown', this.handleKeydownBound);
12614
+ }
12615
+
12616
+ this.animateOut();
12617
+
12618
+ return this;
12619
+ }
12620
+ }], [{
12621
+ key: 'init',
12622
+ value: function init($els, options) {
12623
+ var arr = [];
12624
+ $els.each(function () {
12625
+ arr.push(new Modal($(this), options));
12626
+ });
12627
+ return arr;
12628
+ }
12629
+ }, {
12630
+ key: 'defaults',
12631
+ get: function () {
12632
+ return _defaults;
12633
+ }
12634
+ }]);
12635
+
12636
+ return Modal;
12637
+ }();
12638
+
12639
+ /**
12640
+ * @static
12641
+ * @memberof Modal
12642
+ */
12643
+
12644
+
12645
+ Modal._increment = 0;
12646
+
12647
+ /**
12648
+ * @static
12649
+ * @memberof Modal
12650
+ */
12651
+ Modal._count = 0;
12652
+
12653
+ window.Materialize.Modal = Modal;
12654
+
12655
+ $.fn.modal = function (methodOrOptions) {
12656
+ // Call plugin method if valid method name is passed in
12657
+ if (Modal.prototype[methodOrOptions]) {
12658
+ // Getter methods
12659
+ if (methodOrOptions.slice(0, 3) === 'get') {
12660
+ return this.first()[0].M_Modal[methodOrOptions]();
12661
+
12662
+ // Void methods
12663
+ } else {
12664
+ return this.each(function () {
12665
+ this.M_Modal[methodOrOptions]();
12666
+ });
12667
+ }
12668
+
12669
+ // Initialize plugin if options or no argument is passed in
12670
+ } else if (typeof methodOrOptions === 'object' || !methodOrOptions) {
12671
+ Modal.init(this, arguments[0]);
12672
+ return this;
12673
+
12674
+ // Return error if an unrecognized method name is passed in
12675
+ } else {
12676
+ $.error('Method ' + methodOrOptions + ' does not exist on jQuery.modal');
12677
+ }
12678
+ };
12679
+ })(jQuery);
12680
+ ;(function ($) {
12681
+
12682
+ $.fn.materialbox = function () {
12683
+
12684
+ return this.each(function () {
12685
+
12686
+ if ($(this).hasClass('initialized')) {
12687
+ return;
12688
+ }
12689
+
12690
+ $(this).addClass('initialized');
12691
+
12692
+ var overlayActive = false;
12693
+ var doneAnimating = true;
12694
+ var inDuration = 275;
12695
+ var outDuration = 200;
12696
+ var origin = $(this);
12697
+ var placeholder = $('<div></div>').addClass('material-placeholder');
12698
+ var originalWidth = 0;
12699
+ var originalHeight = 0;
12700
+ var ancestorsChanged;
12701
+ var ancestor;
12702
+ var originInlineStyles = origin.attr('style');
12703
+ origin.wrap(placeholder);
12704
+
12705
+ // Start click handler
12706
+ origin.on('click', function () {
12707
+ var placeholder = origin.parent('.material-placeholder');
12708
+ var windowWidth = window.innerWidth;
12709
+ var windowHeight = window.innerHeight;
12710
+ var originalWidth = origin.width();
12711
+ var originalHeight = origin.height();
12712
+
12713
+ // If already modal, return to original
12714
+ if (doneAnimating === false) {
12715
+ returnToOriginal();
12716
+ return false;
12717
+ } else if (overlayActive && doneAnimating === true) {
12718
+ returnToOriginal();
12719
+ return false;
12720
+ }
12721
+
12722
+ // Set states
12723
+ doneAnimating = false;
12724
+ origin.addClass('active');
12725
+ overlayActive = true;
12726
+
12727
+ // Set positioning for placeholder
12728
+ placeholder.css({
12729
+ width: placeholder[0].getBoundingClientRect().width,
12730
+ height: placeholder[0].getBoundingClientRect().height,
12731
+ position: 'relative',
12732
+ top: 0,
12733
+ left: 0
12734
+ });
12735
+
12736
+ // Find ancestor with overflow: hidden; and remove it
12737
+ ancestorsChanged = undefined;
12738
+ ancestor = placeholder[0].parentNode;
12739
+ var count = 0;
12740
+ while (ancestor !== null && !$(ancestor).is(document)) {
12741
+ var curr = $(ancestor);
12742
+ if (curr.css('overflow') !== 'visible') {
12743
+ curr.css('overflow', 'visible');
12744
+ if (ancestorsChanged === undefined) {
12745
+ ancestorsChanged = curr;
12746
+ } else {
12747
+ ancestorsChanged = ancestorsChanged.add(curr);
12748
+ }
12749
+ }
12750
+ ancestor = ancestor.parentNode;
12751
+ }
12752
+
12753
+ // Set css on origin
12754
+ origin.css({
12755
+ position: 'absolute',
12756
+ 'z-index': 1000,
12757
+ 'will-change': 'left, top, width, height'
12758
+ }).data('width', originalWidth).data('height', originalHeight);
12759
+
12760
+ // Add overlay
12761
+ var overlay = $('<div id="materialbox-overlay"></div>').css({
12762
+ opacity: 0
12763
+ }).click(function () {
12764
+ if (doneAnimating === true) returnToOriginal();
12765
+ });
12766
+
12767
+ // Put before in origin image to preserve z-index layering.
12768
+ origin.before(overlay);
12769
+
12770
+ // Set dimensions if needed
12771
+ var overlayOffset = overlay[0].getBoundingClientRect();
12772
+ overlay.css({
12773
+ width: windowWidth,
12774
+ height: windowHeight,
12775
+ left: -1 * overlayOffset.left,
12776
+ top: -1 * overlayOffset.top
12777
+ });
12778
+
12779
+ // Animate Overlay
12780
+ overlay.velocity({ opacity: 1 }, { duration: inDuration, queue: false, easing: 'easeOutQuad' });
12781
+
12782
+ // Add and animate caption if it exists
12783
+ if (origin.data('caption') !== "") {
12784
+ var $photo_caption = $('<div class="materialbox-caption"></div>');
12785
+ $photo_caption.text(origin.data('caption'));
12786
+ $('body').append($photo_caption);
12787
+ $photo_caption.css({ "display": "inline" });
12788
+ $photo_caption.velocity({ opacity: 1 }, { duration: inDuration, queue: false, easing: 'easeOutQuad' });
12789
+ }
12790
+
12791
+ // Resize Image
12792
+ var ratio = 0;
12793
+ var widthPercent = originalWidth / windowWidth;
12794
+ var heightPercent = originalHeight / windowHeight;
12795
+ var newWidth = 0;
12796
+ var newHeight = 0;
12797
+
12798
+ if (widthPercent > heightPercent) {
12799
+ ratio = originalHeight / originalWidth;
12800
+ newWidth = windowWidth * 0.9;
12801
+ newHeight = windowWidth * 0.9 * ratio;
12802
+ } else {
12803
+ ratio = originalWidth / originalHeight;
12804
+ newWidth = windowHeight * 0.9 * ratio;
12805
+ newHeight = windowHeight * 0.9;
12806
+ }
12807
+
12808
+ // Animate image + set z-index
12809
+ if (origin.hasClass('responsive-img')) {
12810
+ origin.velocity({ 'max-width': newWidth, 'width': originalWidth }, { duration: 0, queue: false,
12811
+ complete: function () {
12812
+ origin.css({ left: 0, top: 0 }).velocity({
12813
+ height: newHeight,
12814
+ width: newWidth,
12815
+ left: $(document).scrollLeft() + windowWidth / 2 - origin.parent('.material-placeholder').offset().left - newWidth / 2,
12816
+ top: $(document).scrollTop() + windowHeight / 2 - origin.parent('.material-placeholder').offset().top - newHeight / 2
12817
+ }, {
12818
+ duration: inDuration,
12819
+ queue: false,
12820
+ easing: 'easeOutQuad',
12821
+ complete: function () {
12822
+ doneAnimating = true;
12823
+ }
12824
+ });
12825
+ } // End Complete
12826
+ }); // End Velocity
12827
+ } else {
12828
+ origin.css('left', 0).css('top', 0).velocity({
12829
+ height: newHeight,
12830
+ width: newWidth,
12831
+ left: $(document).scrollLeft() + windowWidth / 2 - origin.parent('.material-placeholder').offset().left - newWidth / 2,
12832
+ top: $(document).scrollTop() + windowHeight / 2 - origin.parent('.material-placeholder').offset().top - newHeight / 2
12833
+ }, {
12834
+ duration: inDuration,
12835
+ queue: false,
12836
+ easing: 'easeOutQuad',
12837
+ complete: function () {
12838
+ doneAnimating = true;
12839
+ }
12840
+ }); // End Velocity
12841
+ }
12842
+
12843
+ // Handle Exit triggers
12844
+ $(window).on('scroll.materialbox', function () {
12845
+ if (overlayActive) {
12846
+ returnToOriginal();
12847
+ }
12848
+ });
12849
+
12850
+ $(window).on('resize.materialbox', function () {
12851
+ if (overlayActive) {
12852
+ returnToOriginal();
12853
+ }
12854
+ });
12855
+
12856
+ $(document).on('keyup.materialbox', function (e) {
12857
+ // ESC key
12858
+ if (e.keyCode === 27 && doneAnimating === true && overlayActive) {
12859
+ returnToOriginal();
12860
+ }
12861
+ });
12862
+ }); // End click handler
12863
+
12864
+
12865
+ // This function returns the modaled image to the original spot
12866
+ function returnToOriginal() {
12867
+
12868
+ doneAnimating = false;
12869
+
12870
+ var placeholder = origin.parent('.material-placeholder');
12871
+ var windowWidth = window.innerWidth;
12872
+ var windowHeight = window.innerHeight;
12873
+ var originalWidth = origin.data('width');
12874
+ var originalHeight = origin.data('height');
12875
+
12876
+ origin.velocity("stop", true);
12877
+ $('#materialbox-overlay').velocity("stop", true);
12878
+ $('.materialbox-caption').velocity("stop", true);
12879
+
12880
+ // disable exit handlers
12881
+ $(window).off('scroll.materialbox');
12882
+ $(document).off('keyup.materialbox');
12883
+ $(window).off('resize.materialbox');
12884
+
12885
+ $('#materialbox-overlay').velocity({ opacity: 0 }, {
12886
+ duration: outDuration, // Delay prevents animation overlapping
12887
+ queue: false, easing: 'easeOutQuad',
12888
+ complete: function () {
12889
+ // Remove Overlay
12890
+ overlayActive = false;
12891
+ $(this).remove();
12892
+ }
12893
+ });
12894
+
12895
+ // Resize Image
12896
+ origin.velocity({
12897
+ width: originalWidth,
12898
+ height: originalHeight,
12899
+ left: 0,
12900
+ top: 0
12901
+ }, {
12902
+ duration: outDuration,
12903
+ queue: false, easing: 'easeOutQuad',
12904
+ complete: function () {
12905
+ placeholder.css({
12906
+ height: '',
12907
+ width: '',
12908
+ position: '',
12909
+ top: '',
12910
+ left: ''
12911
+ });
12912
+
12913
+ origin.removeAttr('style');
12914
+ origin.attr('style', originInlineStyles);
12915
+
12916
+ // Remove class
12917
+ origin.removeClass('active');
12918
+ doneAnimating = true;
12919
+
12920
+ // Remove overflow overrides on ancestors
12921
+ if (ancestorsChanged) {
12922
+ ancestorsChanged.css('overflow', '');
12923
+ }
12924
+ }
12925
+ });
12926
+
12927
+ // Remove Caption + reset css settings on image
12928
+ $('.materialbox-caption').velocity({ opacity: 0 }, {
12929
+ duration: outDuration, // Delay prevents animation overlapping
12930
+ queue: false, easing: 'easeOutQuad',
12931
+ complete: function () {
12932
+ $(this).remove();
12933
+ }
12934
+ });
12935
+ }
12936
+ });
12937
+ };
12938
+
12939
+ $(document).ready(function () {
12940
+ $('.materialboxed').materialbox();
12941
+ });
12942
+ })(jQuery);
12943
+ ;(function ($) {
12944
+
12945
+ $.fn.parallax = function () {
12946
+ var window_width = $(window).width();
12947
+ // Parallax Scripts
12948
+ return this.each(function (i) {
12949
+ var $this = $(this);
12950
+ $this.addClass('parallax');
12951
+
12952
+ function updateParallax(initial) {
12953
+ var container_height;
12954
+ if (window_width < 601) {
12955
+ container_height = $this.height() > 0 ? $this.height() : $this.children("img").height();
12956
+ } else {
12957
+ container_height = $this.height() > 0 ? $this.height() : 500;
12958
+ }
12959
+ var $img = $this.children("img").first();
12960
+ var img_height = $img.height();
12961
+ var parallax_dist = img_height - container_height;
12962
+ var bottom = $this.offset().top + container_height;
12963
+ var top = $this.offset().top;
12964
+ var scrollTop = $(window).scrollTop();
12965
+ var windowHeight = window.innerHeight;
12966
+ var windowBottom = scrollTop + windowHeight;
12967
+ var percentScrolled = (windowBottom - top) / (container_height + windowHeight);
12968
+ var parallax = Math.round(parallax_dist * percentScrolled);
12969
+
12970
+ if (initial) {
12971
+ $img.css('display', 'block');
12972
+ }
12973
+ if (bottom > scrollTop && top < scrollTop + windowHeight) {
12974
+ $img.css('transform', "translate3D(-50%," + parallax + "px, 0)");
12975
+ }
12976
+ }
12977
+
12978
+ // Wait for image load
12979
+ $this.children("img").one("load", function () {
12980
+ updateParallax(true);
12981
+ }).each(function () {
12982
+ if (this.complete) $(this).trigger("load");
12983
+ });
12984
+
12985
+ $(window).scroll(function () {
12986
+ window_width = $(window).width();
12987
+ updateParallax(false);
12988
+ });
12989
+
12990
+ $(window).resize(function () {
12991
+ window_width = $(window).width();
12992
+ updateParallax(false);
12993
+ });
12994
+ });
12995
+ };
12996
+ })(jQuery);
12997
+ ;(function ($) {
12998
+
12999
+ var methods = {
13000
+ init: function (options) {
13001
+ var defaults = {
13002
+ onShow: null,
13003
+ swipeable: false,
13004
+ responsiveThreshold: Infinity // breakpoint for swipeable
13005
+ };
13006
+ options = $.extend(defaults, options);
13007
+ var namespace = Materialize.objectSelectorString($(this));
13008
+
13009
+ return this.each(function (i) {
13010
+
13011
+ var uniqueNamespace = namespace + i;
13012
+
13013
+ // For each set of tabs, we want to keep track of
13014
+ // which tab is active and its associated content
13015
+ var $this = $(this),
13016
+ window_width = $(window).width();
13017
+
13018
+ var $active,
13019
+ $content,
13020
+ $links = $this.find('li.tab a'),
13021
+ $tabs_width = $this.width(),
13022
+ $tabs_content = $(),
13023
+ $tabs_wrapper,
13024
+ $tab_width = Math.max($tabs_width, $this[0].scrollWidth) / $links.length,
13025
+ $indicator,
13026
+ index = prev_index = 0,
13027
+ clicked = false,
13028
+ clickedTimeout,
13029
+ transition = 300;
13030
+
13031
+ // Finds right attribute for indicator based on active tab.
13032
+ // el: jQuery Object
13033
+ var calcRightPos = function (el) {
13034
+ return Math.ceil($tabs_width - el.position().left - el[0].getBoundingClientRect().width - $this.scrollLeft());
13035
+ };
13036
+
13037
+ // Finds left attribute for indicator based on active tab.
13038
+ // el: jQuery Object
13039
+ var calcLeftPos = function (el) {
13040
+ return Math.floor(el.position().left + $this.scrollLeft());
13041
+ };
13042
+
13043
+ // Animates Indicator to active tab.
13044
+ // prev_index: Number
13045
+ var animateIndicator = function (prev_index) {
13046
+ if (index - prev_index >= 0) {
13047
+ $indicator.velocity({ "right": calcRightPos($active) }, { duration: transition, queue: false, easing: 'easeOutQuad' });
13048
+ $indicator.velocity({ "left": calcLeftPos($active) }, { duration: transition, queue: false, easing: 'easeOutQuad', delay: 90 });
13049
+ } else {
13050
+ $indicator.velocity({ "left": calcLeftPos($active) }, { duration: transition, queue: false, easing: 'easeOutQuad' });
13051
+ $indicator.velocity({ "right": calcRightPos($active) }, { duration: transition, queue: false, easing: 'easeOutQuad', delay: 90 });
13052
+ }
13053
+ };
13054
+
13055
+ // Change swipeable according to responsive threshold
13056
+ if (options.swipeable) {
13057
+ if (window_width > options.responsiveThreshold) {
13058
+ options.swipeable = false;
13059
+ }
13060
+ }
13061
+
13062
+ // If the location.hash matches one of the links, use that as the active tab.
13063
+ $active = $($links.filter('[href="' + location.hash + '"]'));
13064
+
13065
+ // If no match is found, use the first link or any with class 'active' as the initial active tab.
13066
+ if ($active.length === 0) {
13067
+ $active = $(this).find('li.tab a.active').first();
13068
+ }
13069
+ if ($active.length === 0) {
13070
+ $active = $(this).find('li.tab a').first();
13071
+ }
13072
+
13073
+ $active.addClass('active');
13074
+ index = $links.index($active);
13075
+ if (index < 0) {
13076
+ index = 0;
13077
+ }
13078
+
13079
+ if ($active[0] !== undefined) {
13080
+ $content = $($active[0].hash);
13081
+ $content.addClass('active');
13082
+ }
13083
+
13084
+ // append indicator then set indicator width to tab width
13085
+ if (!$this.find('.indicator').length) {
13086
+ $this.append('<li class="indicator"></li>');
13087
+ }
13088
+ $indicator = $this.find('.indicator');
13089
+
13090
+ // we make sure that the indicator is at the end of the tabs
13091
+ $this.append($indicator);
13092
+
13093
+ if ($this.is(":visible")) {
13094
+ // $indicator.css({"right": $tabs_width - ((index + 1) * $tab_width)});
13095
+ // $indicator.css({"left": index * $tab_width});
13096
+ setTimeout(function () {
13097
+ $indicator.css({ "right": calcRightPos($active) });
13098
+ $indicator.css({ "left": calcLeftPos($active) });
13099
+ }, 0);
13100
+ }
13101
+ $(window).off('resize.tabs-' + uniqueNamespace).on('resize.tabs-' + uniqueNamespace, function () {
13102
+ $tabs_width = $this.width();
13103
+ $tab_width = Math.max($tabs_width, $this[0].scrollWidth) / $links.length;
13104
+ if (index < 0) {
13105
+ index = 0;
13106
+ }
13107
+ if ($tab_width !== 0 && $tabs_width !== 0) {
13108
+ $indicator.css({ "right": calcRightPos($active) });
13109
+ $indicator.css({ "left": calcLeftPos($active) });
13110
+ }
13111
+ });
13112
+
13113
+ // Initialize Tabs Content.
13114
+ if (options.swipeable) {
13115
+ // TODO: Duplicate calls with swipeable? handle multiple div wrapping.
13116
+ $links.each(function () {
13117
+ var $curr_content = $(Materialize.escapeHash(this.hash));
13118
+ $curr_content.addClass('carousel-item');
13119
+ $tabs_content = $tabs_content.add($curr_content);
13120
+ });
13121
+ $tabs_wrapper = $tabs_content.wrapAll('<div class="tabs-content carousel"></div>');
13122
+ $tabs_content.css('display', '');
13123
+ $('.tabs-content.carousel').carousel({
13124
+ fullWidth: true,
13125
+ noWrap: true,
13126
+ onCycleTo: function (item) {
13127
+ if (!clicked) {
13128
+ var prev_index = index;
13129
+ index = $tabs_wrapper.index(item);
13130
+ $active.removeClass('active');
13131
+ $active = $links.eq(index);
13132
+ $active.addClass('active');
13133
+ animateIndicator(prev_index);
13134
+ if (typeof options.onShow === "function") {
13135
+ options.onShow.call($this[0], $content);
13136
+ }
13137
+ }
13138
+ }
13139
+ });
13140
+ } else {
13141
+ // Hide the remaining content
13142
+ $links.not($active).each(function () {
13143
+ $(Materialize.escapeHash(this.hash)).hide();
13144
+ });
13145
+ }
13146
+
13147
+ // Bind the click event handler
13148
+ $this.off('click.tabs').on('click.tabs', 'a', function (e) {
13149
+ if ($(this).parent().hasClass('disabled')) {
13150
+ e.preventDefault();
13151
+ return;
13152
+ }
13153
+
13154
+ // Act as regular link if target attribute is specified.
13155
+ if (!!$(this).attr("target")) {
13156
+ return;
13157
+ }
13158
+
13159
+ clicked = true;
13160
+ $tabs_width = $this.width();
13161
+ $tab_width = Math.max($tabs_width, $this[0].scrollWidth) / $links.length;
13162
+
13163
+ // Make the old tab inactive.
13164
+ $active.removeClass('active');
13165
+ var $oldContent = $content;
13166
+
13167
+ // Update the variables with the new link and content
13168
+ $active = $(this);
13169
+ $content = $(Materialize.escapeHash(this.hash));
13170
+ $links = $this.find('li.tab a');
13171
+ var activeRect = $active.position();
13172
+
13173
+ // Make the tab active.
13174
+ $active.addClass('active');
13175
+ prev_index = index;
13176
+ index = $links.index($(this));
13177
+ if (index < 0) {
13178
+ index = 0;
13179
+ }
13180
+ // Change url to current tab
13181
+ // window.location.hash = $active.attr('href');
13182
+
13183
+ // Swap content
13184
+ if (options.swipeable) {
13185
+ if ($tabs_content.length) {
13186
+ $tabs_content.carousel('set', index, function () {
13187
+ if (typeof options.onShow === "function") {
13188
+ options.onShow.call($this[0], $content);
13189
+ }
13190
+ });
13191
+ }
13192
+ } else {
13193
+ if ($content !== undefined) {
13194
+ $content.show();
13195
+ $content.addClass('active');
13196
+ if (typeof options.onShow === "function") {
13197
+ options.onShow.call(this, $content);
13198
+ }
13199
+ }
13200
+
13201
+ if ($oldContent !== undefined && !$oldContent.is($content)) {
13202
+ $oldContent.hide();
13203
+ $oldContent.removeClass('active');
13204
+ }
13205
+ }
13206
+
13207
+ // Reset clicked state
13208
+ clickedTimeout = setTimeout(function () {
13209
+ clicked = false;
13210
+ }, transition);
13211
+
13212
+ // Update indicator
13213
+ animateIndicator(prev_index);
13214
+
13215
+ // Prevent the anchor's default click action
13216
+ e.preventDefault();
13217
+ });
13218
+ });
13219
+ },
13220
+ select_tab: function (id) {
13221
+ this.find('a[href="#' + id + '"]').trigger('click');
13222
+ }
13223
+ };
13224
+
13225
+ $.fn.tabs = function (methodOrOptions) {
13226
+ if (methods[methodOrOptions]) {
13227
+ return methods[methodOrOptions].apply(this, Array.prototype.slice.call(arguments, 1));
13228
+ } else if (typeof methodOrOptions === 'object' || !methodOrOptions) {
13229
+ // Default to "init"
13230
+ return methods.init.apply(this, arguments);
13231
+ } else {
13232
+ $.error('Method ' + methodOrOptions + ' does not exist on jQuery.tabs');
13233
+ }
13234
+ };
13235
+
13236
+ $(document).ready(function () {
13237
+ $('ul.tabs').tabs();
13238
+ });
13239
+ })(jQuery);
13240
+ ;(function ($) {
13241
+ $.fn.tooltip = function (options) {
13242
+ var timeout = null,
13243
+ margin = 5;
13244
+
13245
+ // Defaults
13246
+ var defaults = {
13247
+ delay: 350,
13248
+ tooltip: '',
13249
+ position: 'bottom',
13250
+ html: false
13251
+ };
13252
+
13253
+ // Remove tooltip from the activator
13254
+ if (options === "remove") {
13255
+ this.each(function () {
13256
+ $('#' + $(this).attr('data-tooltip-id')).remove();
13257
+ $(this).removeAttr('data-tooltip-id');
13258
+ $(this).off('mouseenter.tooltip mouseleave.tooltip');
13259
+ });
13260
+ return false;
13261
+ }
13262
+
13263
+ options = $.extend(defaults, options);
13264
+
13265
+ return this.each(function () {
13266
+ var tooltipId = Materialize.guid();
13267
+ var origin = $(this);
13268
+
13269
+ // Destroy old tooltip
13270
+ if (origin.attr('data-tooltip-id')) {
13271
+ $('#' + origin.attr('data-tooltip-id')).remove();
13272
+ }
13273
+
13274
+ origin.attr('data-tooltip-id', tooltipId);
13275
+
13276
+ // Get attributes.
13277
+ var allowHtml, tooltipDelay, tooltipPosition, tooltipText, tooltipEl, backdrop;
13278
+ var setAttributes = function () {
13279
+ allowHtml = origin.attr('data-html') ? origin.attr('data-html') === 'true' : options.html;
13280
+ tooltipDelay = origin.attr('data-delay');
13281
+ tooltipDelay = tooltipDelay === undefined || tooltipDelay === '' ? options.delay : tooltipDelay;
13282
+ tooltipPosition = origin.attr('data-position');
13283
+ tooltipPosition = tooltipPosition === undefined || tooltipPosition === '' ? options.position : tooltipPosition;
13284
+ tooltipText = origin.attr('data-tooltip');
13285
+ tooltipText = tooltipText === undefined || tooltipText === '' ? options.tooltip : tooltipText;
13286
+ };
13287
+ setAttributes();
13288
+
13289
+ var renderTooltipEl = function () {
13290
+ var tooltip = $('<div class="material-tooltip"></div>');
13291
+
13292
+ // Create Text span
13293
+ if (allowHtml) {
13294
+ tooltipText = $('<span></span>').html(tooltipText);
13295
+ } else {
13296
+ tooltipText = $('<span></span>').text(tooltipText);
13297
+ }
13298
+
13299
+ // Create tooltip
13300
+ tooltip.append(tooltipText).appendTo($('body')).attr('id', tooltipId);
13301
+
13302
+ // Create backdrop
13303
+ backdrop = $('<div class="backdrop"></div>');
13304
+ backdrop.appendTo(tooltip);
13305
+ return tooltip;
13306
+ };
13307
+ tooltipEl = renderTooltipEl();
13308
+
13309
+ // Destroy previously binded events
13310
+ origin.off('mouseenter.tooltip mouseleave.tooltip');
13311
+ // Mouse In
13312
+ var started = false,
13313
+ timeoutRef;
13314
+ origin.on({ 'mouseenter.tooltip': function (e) {
13315
+ var showTooltip = function () {
13316
+ setAttributes();
13317
+ started = true;
13318
+ tooltipEl.velocity('stop');
13319
+ backdrop.velocity('stop');
13320
+ tooltipEl.css({ visibility: 'visible', left: '0px', top: '0px' });
13321
+
13322
+ // Tooltip positioning
13323
+ var originWidth = origin.outerWidth();
13324
+ var originHeight = origin.outerHeight();
13325
+ var tooltipHeight = tooltipEl.outerHeight();
13326
+ var tooltipWidth = tooltipEl.outerWidth();
13327
+ var tooltipVerticalMovement = '0px';
13328
+ var tooltipHorizontalMovement = '0px';
13329
+ var backdropOffsetWidth = backdrop[0].offsetWidth;
13330
+ var backdropOffsetHeight = backdrop[0].offsetHeight;
13331
+ var scaleXFactor = 8;
13332
+ var scaleYFactor = 8;
13333
+ var scaleFactor = 0;
13334
+ var targetTop, targetLeft, newCoordinates;
13335
+
13336
+ if (tooltipPosition === "top") {
13337
+ // Top Position
13338
+ targetTop = origin.offset().top - tooltipHeight - margin;
13339
+ targetLeft = origin.offset().left + originWidth / 2 - tooltipWidth / 2;
13340
+ newCoordinates = repositionWithinScreen(targetLeft, targetTop, tooltipWidth, tooltipHeight);
13341
+ tooltipVerticalMovement = '-10px';
13342
+ backdrop.css({
13343
+ bottom: 0,
13344
+ left: 0,
13345
+ borderRadius: '14px 14px 0 0',
13346
+ transformOrigin: '50% 100%',
13347
+ marginTop: tooltipHeight,
13348
+ marginLeft: tooltipWidth / 2 - backdropOffsetWidth / 2
13349
+ });
13350
+ }
13351
+ // Left Position
13352
+ else if (tooltipPosition === "left") {
13353
+ targetTop = origin.offset().top + originHeight / 2 - tooltipHeight / 2;
13354
+ targetLeft = origin.offset().left - tooltipWidth - margin;
13355
+ newCoordinates = repositionWithinScreen(targetLeft, targetTop, tooltipWidth, tooltipHeight);
13356
+
13357
+ tooltipHorizontalMovement = '-10px';
13358
+ backdrop.css({
13359
+ top: '-7px',
13360
+ right: 0,
13361
+ width: '14px',
13362
+ height: '14px',
13363
+ borderRadius: '14px 0 0 14px',
13364
+ transformOrigin: '95% 50%',
13365
+ marginTop: tooltipHeight / 2,
13366
+ marginLeft: tooltipWidth
13367
+ });
13368
+ }
13369
+ // Right Position
13370
+ else if (tooltipPosition === "right") {
13371
+ targetTop = origin.offset().top + originHeight / 2 - tooltipHeight / 2;
13372
+ targetLeft = origin.offset().left + originWidth + margin;
13373
+ newCoordinates = repositionWithinScreen(targetLeft, targetTop, tooltipWidth, tooltipHeight);
13374
+
13375
+ tooltipHorizontalMovement = '+10px';
13376
+ backdrop.css({
13377
+ top: '-7px',
13378
+ left: 0,
13379
+ width: '14px',
13380
+ height: '14px',
13381
+ borderRadius: '0 14px 14px 0',
13382
+ transformOrigin: '5% 50%',
13383
+ marginTop: tooltipHeight / 2,
13384
+ marginLeft: '0px'
13385
+ });
13386
+ } else {
13387
+ // Bottom Position
13388
+ targetTop = origin.offset().top + origin.outerHeight() + margin;
13389
+ targetLeft = origin.offset().left + originWidth / 2 - tooltipWidth / 2;
13390
+ newCoordinates = repositionWithinScreen(targetLeft, targetTop, tooltipWidth, tooltipHeight);
13391
+ tooltipVerticalMovement = '+10px';
13392
+ backdrop.css({
13393
+ top: 0,
13394
+ left: 0,
13395
+ marginLeft: tooltipWidth / 2 - backdropOffsetWidth / 2
13396
+ });
13397
+ }
13398
+
13399
+ // Set tooptip css placement
13400
+ tooltipEl.css({
13401
+ top: newCoordinates.y,
13402
+ left: newCoordinates.x
13403
+ });
13404
+
13405
+ // Calculate Scale to fill
13406
+ scaleXFactor = Math.SQRT2 * tooltipWidth / parseInt(backdropOffsetWidth);
13407
+ scaleYFactor = Math.SQRT2 * tooltipHeight / parseInt(backdropOffsetHeight);
13408
+ scaleFactor = Math.max(scaleXFactor, scaleYFactor);
13409
+
13410
+ tooltipEl.velocity({ translateY: tooltipVerticalMovement, translateX: tooltipHorizontalMovement }, { duration: 350, queue: false }).velocity({ opacity: 1 }, { duration: 300, delay: 50, queue: false });
13411
+ backdrop.css({ visibility: 'visible' }).velocity({ opacity: 1 }, { duration: 55, delay: 0, queue: false }).velocity({ scaleX: scaleFactor, scaleY: scaleFactor }, { duration: 300, delay: 0, queue: false, easing: 'easeInOutQuad' });
13412
+ };
13413
+
13414
+ timeoutRef = setTimeout(showTooltip, tooltipDelay); // End Interval
13415
+
13416
+ // Mouse Out
13417
+ },
13418
+ 'mouseleave.tooltip': function () {
13419
+ // Reset State
13420
+ started = false;
13421
+ clearTimeout(timeoutRef);
13422
+
13423
+ // Animate back
13424
+ setTimeout(function () {
13425
+ if (started !== true) {
13426
+ tooltipEl.velocity({
13427
+ opacity: 0, translateY: 0, translateX: 0 }, { duration: 225, queue: false });
13428
+ backdrop.velocity({ opacity: 0, scaleX: 1, scaleY: 1 }, {
13429
+ duration: 225,
13430
+ queue: false,
13431
+ complete: function () {
13432
+ backdrop.css({ visibility: 'hidden' });
13433
+ tooltipEl.css({ visibility: 'hidden' });
13434
+ started = false;
13435
+ }
13436
+ });
13437
+ }
13438
+ }, 225);
13439
+ }
13440
+ });
13441
+ });
13442
+ };
13443
+
13444
+ var repositionWithinScreen = function (x, y, width, height) {
13445
+ var newX = x;
13446
+ var newY = y;
13447
+
13448
+ if (newX < 0) {
13449
+ newX = 4;
13450
+ } else if (newX + width > window.innerWidth) {
13451
+ newX -= newX + width - window.innerWidth;
13452
+ }
13453
+
13454
+ if (newY < 0) {
13455
+ newY = 4;
13456
+ } else if (newY + height > window.innerHeight + $(window).scrollTop) {
13457
+ newY -= newY + height - window.innerHeight;
13458
+ }
13459
+
13460
+ return { x: newX, y: newY };
13461
+ };
13462
+
13463
+ $(document).ready(function () {
13464
+ $('.tooltipped').tooltip();
13465
+ });
13466
+ })(jQuery);
13467
+ ; /*!
13468
+ * Waves v0.6.4
13469
+ * http://fian.my.id/Waves
13470
+ *
13471
+ * Copyright 2014 Alfiana E. Sibuea and other contributors
13472
+ * Released under the MIT license
13473
+ * https://github.com/fians/Waves/blob/master/LICENSE
13474
+ */
13475
+
13476
+ ;(function (window) {
13477
+ 'use strict';
13478
+
13479
+ var Waves = Waves || {};
13480
+ var $$ = document.querySelectorAll.bind(document);
13481
+
13482
+ // Find exact position of element
13483
+ function isWindow(obj) {
13484
+ return obj !== null && obj === obj.window;
13485
+ }
13486
+
13487
+ function getWindow(elem) {
13488
+ return isWindow(elem) ? elem : elem.nodeType === 9 && elem.defaultView;
13489
+ }
13490
+
13491
+ function offset(elem) {
13492
+ var docElem,
13493
+ win,
13494
+ box = { top: 0, left: 0 },
13495
+ doc = elem && elem.ownerDocument;
13496
+
13497
+ docElem = doc.documentElement;
13498
+
13499
+ if (typeof elem.getBoundingClientRect !== typeof undefined) {
13500
+ box = elem.getBoundingClientRect();
13501
+ }
13502
+ win = getWindow(doc);
13503
+ return {
13504
+ top: box.top + win.pageYOffset - docElem.clientTop,
13505
+ left: box.left + win.pageXOffset - docElem.clientLeft
13506
+ };
13507
+ }
13508
+
13509
+ function convertStyle(obj) {
13510
+ var style = '';
13511
+
13512
+ for (var a in obj) {
13513
+ if (obj.hasOwnProperty(a)) {
13514
+ style += a + ':' + obj[a] + ';';
13515
+ }
13516
+ }
13517
+
13518
+ return style;
13519
+ }
13520
+
13521
+ var Effect = {
13522
+
13523
+ // Effect delay
13524
+ duration: 750,
13525
+
13526
+ show: function (e, element) {
13527
+
13528
+ // Disable right click
13529
+ if (e.button === 2) {
13530
+ return false;
13531
+ }
13532
+
13533
+ var el = element || this;
13534
+
13535
+ // Create ripple
13536
+ var ripple = document.createElement('div');
13537
+ ripple.className = 'waves-ripple';
13538
+ el.appendChild(ripple);
13539
+
13540
+ // Get click coordinate and element witdh
13541
+ var pos = offset(el);
13542
+ var relativeY = e.pageY - pos.top;
13543
+ var relativeX = e.pageX - pos.left;
13544
+ var scale = 'scale(' + el.clientWidth / 100 * 10 + ')';
13545
+
13546
+ // Support for touch devices
13547
+ if ('touches' in e) {
13548
+ relativeY = e.touches[0].pageY - pos.top;
13549
+ relativeX = e.touches[0].pageX - pos.left;
13550
+ }
13551
+
13552
+ // Attach data to element
13553
+ ripple.setAttribute('data-hold', Date.now());
13554
+ ripple.setAttribute('data-scale', scale);
13555
+ ripple.setAttribute('data-x', relativeX);
13556
+ ripple.setAttribute('data-y', relativeY);
13557
+
13558
+ // Set ripple position
13559
+ var rippleStyle = {
13560
+ 'top': relativeY + 'px',
13561
+ 'left': relativeX + 'px'
13562
+ };
13563
+
13564
+ ripple.className = ripple.className + ' waves-notransition';
13565
+ ripple.setAttribute('style', convertStyle(rippleStyle));
13566
+ ripple.className = ripple.className.replace('waves-notransition', '');
13567
+
13568
+ // Scale the ripple
13569
+ rippleStyle['-webkit-transform'] = scale;
13570
+ rippleStyle['-moz-transform'] = scale;
13571
+ rippleStyle['-ms-transform'] = scale;
13572
+ rippleStyle['-o-transform'] = scale;
13573
+ rippleStyle.transform = scale;
13574
+ rippleStyle.opacity = '1';
13575
+
13576
+ rippleStyle['-webkit-transition-duration'] = Effect.duration + 'ms';
13577
+ rippleStyle['-moz-transition-duration'] = Effect.duration + 'ms';
13578
+ rippleStyle['-o-transition-duration'] = Effect.duration + 'ms';
13579
+ rippleStyle['transition-duration'] = Effect.duration + 'ms';
13580
+
13581
+ rippleStyle['-webkit-transition-timing-function'] = 'cubic-bezier(0.250, 0.460, 0.450, 0.940)';
13582
+ rippleStyle['-moz-transition-timing-function'] = 'cubic-bezier(0.250, 0.460, 0.450, 0.940)';
13583
+ rippleStyle['-o-transition-timing-function'] = 'cubic-bezier(0.250, 0.460, 0.450, 0.940)';
13584
+ rippleStyle['transition-timing-function'] = 'cubic-bezier(0.250, 0.460, 0.450, 0.940)';
13585
+
13586
+ ripple.setAttribute('style', convertStyle(rippleStyle));
13587
+ },
13588
+
13589
+ hide: function (e) {
13590
+ TouchHandler.touchup(e);
13591
+
13592
+ var el = this;
13593
+ var width = el.clientWidth * 1.4;
13594
+
13595
+ // Get first ripple
13596
+ var ripple = null;
13597
+ var ripples = el.getElementsByClassName('waves-ripple');
13598
+ if (ripples.length > 0) {
13599
+ ripple = ripples[ripples.length - 1];
13600
+ } else {
13601
+ return false;
13602
+ }
13603
+
13604
+ var relativeX = ripple.getAttribute('data-x');
13605
+ var relativeY = ripple.getAttribute('data-y');
13606
+ var scale = ripple.getAttribute('data-scale');
13607
+
13608
+ // Get delay beetween mousedown and mouse leave
13609
+ var diff = Date.now() - Number(ripple.getAttribute('data-hold'));
13610
+ var delay = 350 - diff;
13611
+
13612
+ if (delay < 0) {
13613
+ delay = 0;
13614
+ }
13615
+
13616
+ // Fade out ripple after delay
13617
+ setTimeout(function () {
13618
+ var style = {
13619
+ 'top': relativeY + 'px',
13620
+ 'left': relativeX + 'px',
13621
+ 'opacity': '0',
13622
+
13623
+ // Duration
13624
+ '-webkit-transition-duration': Effect.duration + 'ms',
13625
+ '-moz-transition-duration': Effect.duration + 'ms',
13626
+ '-o-transition-duration': Effect.duration + 'ms',
13627
+ 'transition-duration': Effect.duration + 'ms',
13628
+ '-webkit-transform': scale,
13629
+ '-moz-transform': scale,
13630
+ '-ms-transform': scale,
13631
+ '-o-transform': scale,
13632
+ 'transform': scale
13633
+ };
13634
+
13635
+ ripple.setAttribute('style', convertStyle(style));
13636
+
13637
+ setTimeout(function () {
13638
+ try {
13639
+ el.removeChild(ripple);
13640
+ } catch (e) {
13641
+ return false;
13642
+ }
13643
+ }, Effect.duration);
13644
+ }, delay);
13645
+ },
13646
+
13647
+ // Little hack to make <input> can perform waves effect
13648
+ wrapInput: function (elements) {
13649
+ for (var a = 0; a < elements.length; a++) {
13650
+ var el = elements[a];
13651
+
13652
+ if (el.tagName.toLowerCase() === 'input') {
13653
+ var parent = el.parentNode;
13654
+
13655
+ // If input already have parent just pass through
13656
+ if (parent.tagName.toLowerCase() === 'i' && parent.className.indexOf('waves-effect') !== -1) {
13657
+ continue;
13658
+ }
13659
+
13660
+ // Put element class and style to the specified parent
13661
+ var wrapper = document.createElement('i');
13662
+ wrapper.className = el.className + ' waves-input-wrapper';
13663
+
13664
+ var elementStyle = el.getAttribute('style');
13665
+
13666
+ if (!elementStyle) {
13667
+ elementStyle = '';
13668
+ }
13669
+
13670
+ wrapper.setAttribute('style', elementStyle);
13671
+
13672
+ el.className = 'waves-button-input';
13673
+ el.removeAttribute('style');
13674
+
13675
+ // Put element as child
13676
+ parent.replaceChild(wrapper, el);
13677
+ wrapper.appendChild(el);
13678
+ }
13679
+ }
13680
+ }
13681
+ };
13682
+
13683
+ /**
13684
+ * Disable mousedown event for 500ms during and after touch
13685
+ */
13686
+ var TouchHandler = {
13687
+ /* uses an integer rather than bool so there's no issues with
13688
+ * needing to clear timeouts if another touch event occurred
13689
+ * within the 500ms. Cannot mouseup between touchstart and
13690
+ * touchend, nor in the 500ms after touchend. */
13691
+ touches: 0,
13692
+ allowEvent: function (e) {
13693
+ var allow = true;
13694
+
13695
+ if (e.type === 'touchstart') {
13696
+ TouchHandler.touches += 1; //push
13697
+ } else if (e.type === 'touchend' || e.type === 'touchcancel') {
13698
+ setTimeout(function () {
13699
+ if (TouchHandler.touches > 0) {
13700
+ TouchHandler.touches -= 1; //pop after 500ms
13701
+ }
13702
+ }, 500);
13703
+ } else if (e.type === 'mousedown' && TouchHandler.touches > 0) {
13704
+ allow = false;
13705
+ }
13706
+
13707
+ return allow;
13708
+ },
13709
+ touchup: function (e) {
13710
+ TouchHandler.allowEvent(e);
13711
+ }
13712
+ };
13713
+
13714
+ /**
13715
+ * Delegated click handler for .waves-effect element.
13716
+ * returns null when .waves-effect element not in "click tree"
13717
+ */
13718
+ function getWavesEffectElement(e) {
13719
+ if (TouchHandler.allowEvent(e) === false) {
13720
+ return null;
13721
+ }
13722
+
13723
+ var element = null;
13724
+ var target = e.target || e.srcElement;
13725
+
13726
+ while (target.parentNode !== null) {
13727
+ if (!(target instanceof SVGElement) && target.className.indexOf('waves-effect') !== -1) {
13728
+ element = target;
13729
+ break;
13730
+ }
13731
+ target = target.parentNode;
13732
+ }
13733
+ return element;
13734
+ }
13735
+
13736
+ /**
13737
+ * Bubble the click and show effect if .waves-effect elem was found
13738
+ */
13739
+ function showEffect(e) {
13740
+ var element = getWavesEffectElement(e);
13741
+
13742
+ if (element !== null) {
13743
+ Effect.show(e, element);
13744
+
13745
+ if ('ontouchstart' in window) {
13746
+ element.addEventListener('touchend', Effect.hide, false);
13747
+ element.addEventListener('touchcancel', Effect.hide, false);
13748
+ }
13749
+
13750
+ element.addEventListener('mouseup', Effect.hide, false);
13751
+ element.addEventListener('mouseleave', Effect.hide, false);
13752
+ element.addEventListener('dragend', Effect.hide, false);
13753
+ }
13754
+ }
13755
+
13756
+ Waves.displayEffect = function (options) {
13757
+ options = options || {};
13758
+
13759
+ if ('duration' in options) {
13760
+ Effect.duration = options.duration;
13761
+ }
13762
+
13763
+ //Wrap input inside <i> tag
13764
+ Effect.wrapInput($$('.waves-effect'));
13765
+
13766
+ if ('ontouchstart' in window) {
13767
+ document.body.addEventListener('touchstart', showEffect, false);
13768
+ }
13769
+
13770
+ document.body.addEventListener('mousedown', showEffect, false);
13771
+ };
13772
+
13773
+ /**
13774
+ * Attach Waves to an input element (or any element which doesn't
13775
+ * bubble mouseup/mousedown events).
13776
+ * Intended to be used with dynamically loaded forms/inputs, or
13777
+ * where the user doesn't want a delegated click handler.
13778
+ */
13779
+ Waves.attach = function (element) {
13780
+ //FUTURE: automatically add waves classes and allow users
13781
+ // to specify them with an options param? Eg. light/classic/button
13782
+ if (element.tagName.toLowerCase() === 'input') {
13783
+ Effect.wrapInput([element]);
13784
+ element = element.parentNode;
13785
+ }
13786
+
13787
+ if ('ontouchstart' in window) {
13788
+ element.addEventListener('touchstart', showEffect, false);
13789
+ }
13790
+
13791
+ element.addEventListener('mousedown', showEffect, false);
13792
+ };
13793
+
13794
+ window.Waves = Waves;
13795
+
13796
+ document.addEventListener('DOMContentLoaded', function () {
13797
+ Waves.displayEffect();
13798
+ }, false);
13799
+ })(window);
13800
+ ;(function ($) {
13801
+ 'use strict';
13802
+
13803
+ var _defaults = {
13804
+ displayLength: Infinity,
13805
+ inDuration: 300,
13806
+ outDuration: 375,
13807
+ className: undefined,
13808
+ completeCallback: undefined,
13809
+ activationPercent: 0.8
13810
+ };
13811
+
13812
+ var Toast = function () {
13813
+ function Toast(message, displayLength, className, completeCallback) {
13814
+ _classCallCheck(this, Toast);
13815
+
13816
+ if (!message) {
13817
+ return;
13818
+ }
13819
+
13820
+ /**
13821
+ * Options for the toast
13822
+ * @member Toast#options
13823
+ */
13824
+ this.options = {
13825
+ displayLength: displayLength,
13826
+ className: className,
13827
+ completeCallback: completeCallback
13828
+ };
13829
+
13830
+ this.options = $.extend({}, Toast.defaults, this.options);
13831
+ this.message = message;
13832
+
13833
+ /**
13834
+ * Describes current pan state toast
13835
+ * @type {Boolean}
13836
+ */
13837
+ this.panning = false;
13838
+
13839
+ /**
13840
+ * Time remaining until toast is removed
13841
+ */
13842
+ this.timeRemaining = this.options.displayLength;
13843
+
13844
+ if (Toast._toasts.length === 0) {
13845
+ Toast._createContainer();
13846
+ }
13847
+
13848
+ // Create new toast
13849
+ Toast._toasts.push(this);
13850
+ var toastElement = this.createToast();
13851
+ toastElement.M_Toast = this;
13852
+ this.el = toastElement;
13853
+ this._animateIn();
13854
+ this.setTimer();
13855
+ }
13856
+
13857
+ _createClass(Toast, [{
13858
+ key: 'createToast',
13859
+
13860
+
13861
+ /**
13862
+ * Create toast and append it to toast container
13863
+ */
13864
+ value: function createToast() {
13865
+ var toast = document.createElement('div');
13866
+ toast.classList.add('toast');
13867
+
13868
+ // Add custom classes onto toast
13869
+ if (this.options.className) {
13870
+ var classes = this.options.className.split(' ');
13871
+ var i = void 0,
13872
+ count = void 0;
13873
+ for (i = 0, count = classes.length; i < count; i++) {
13874
+ toast.classList.add(classes[i]);
13875
+ }
13876
+ }
13877
+
13878
+ // Set content
13879
+ if (typeof HTMLElement === 'object' ? this.message instanceof HTMLElement : this.message && typeof this.message === 'object' && this.message !== null && this.message.nodeType === 1 && typeof this.message.nodeName === 'string') {
13880
+ toast.appendChild(this.message);
13881
+
13882
+ // Check if it is jQuery object
13883
+ } else if (this.message instanceof jQuery) {
13884
+ $(toast).append(this.message);
13885
+
13886
+ // Insert as text;
13887
+ } else {
13888
+ toast.innerHTML = this.message;
13889
+ }
13890
+
13891
+ // Append toasft
13892
+ Toast._container.appendChild(toast);
13893
+ return toast;
13894
+ }
13895
+
13896
+ /**
13897
+ * Animate in toast
13898
+ */
13899
+
13900
+ }, {
13901
+ key: '_animateIn',
13902
+ value: function _animateIn() {
13903
+ // Animate toast in
13904
+ Vel(this.el, { top: 0, opacity: 1 }, {
13905
+ duration: 300,
13906
+ easing: 'easeOutCubic',
13907
+ queue: false
13908
+ });
13909
+ }
13910
+
13911
+ /**
13912
+ * Create setInterval which automatically removes toast when timeRemaining >= 0
13913
+ * has been reached
13914
+ */
13915
+
13916
+ }, {
13917
+ key: 'setTimer',
13918
+ value: function setTimer() {
13919
+ var _this3 = this;
13920
+
13921
+ if (this.timeRemaining !== Infinity) {
13922
+ this.counterInterval = setInterval(function () {
13923
+ // If toast is not being dragged, decrease its time remaining
13924
+ if (!_this3.panning) {
13925
+ _this3.timeRemaining -= 20;
13926
+ }
13927
+
13928
+ // Animate toast out
13929
+ if (_this3.timeRemaining <= 0) {
13930
+ _this3.remove();
13931
+ }
13932
+ }, 20);
13933
+ }
13934
+ }
13935
+
13936
+ /**
13937
+ * Dismiss toast with animation
13938
+ */
13939
+
13940
+ }, {
13941
+ key: 'remove',
13942
+ value: function remove() {
13943
+ var _this4 = this;
13944
+
13945
+ window.clearInterval(this.counterInterval);
13946
+ var activationDistance = this.el.offsetWidth * this.options.activationPercent;
13947
+
13948
+ if (this.wasSwiped) {
13949
+ this.el.style.transition = 'transform .05s, opacity .05s';
13950
+ this.el.style.transform = 'translateX(' + activationDistance + 'px)';
13951
+ this.el.style.opacity = 0;
13952
+ }
13953
+
13954
+ Vel(this.el, { opacity: 0, marginTop: '-40px' }, {
13955
+ duration: this.options.outDuration,
13956
+ easing: 'easeOutExpo',
13957
+ queue: false,
13958
+ complete: function () {
13959
+ // Call the optional callback
13960
+ if (typeof _this4.options.completeCallback === 'function') {
13961
+ _this4.options.completeCallback();
13962
+ }
13963
+ // Remove toast from DOM
13964
+ _this4.el.parentNode.removeChild(_this4.el);
13965
+ Toast._toasts.splice(Toast._toasts.indexOf(_this4), 1);
13966
+ if (Toast._toasts.length === 0) {
13967
+ Toast._removeContainer();
13968
+ }
13969
+ }
13970
+ });
13971
+ }
13972
+ }], [{
13973
+ key: '_createContainer',
13974
+
13975
+
13976
+ /**
13977
+ * Append toast container and add event handlers
13978
+ */
13979
+ value: function _createContainer() {
13980
+ var container = document.createElement('div');
13981
+ container.setAttribute('id', 'toast-container');
13982
+
13983
+ // Add event handler
13984
+ container.addEventListener('touchstart', Toast._onDragStart);
13985
+ container.addEventListener('touchmove', Toast._onDragMove);
13986
+ container.addEventListener('touchend', Toast._onDragEnd);
13987
+
13988
+ container.addEventListener('mousedown', Toast._onDragStart);
13989
+ document.addEventListener('mousemove', Toast._onDragMove);
13990
+ document.addEventListener('mouseup', Toast._onDragEnd);
13991
+
13992
+ document.body.appendChild(container);
13993
+ Toast._container = container;
13994
+ }
13995
+
13996
+ /**
13997
+ * Remove toast container and event handlers
13998
+ */
13999
+
14000
+ }, {
14001
+ key: '_removeContainer',
14002
+ value: function _removeContainer() {
14003
+ // Add event handler
14004
+ document.removeEventListener('mousemove', Toast._onDragMove);
14005
+ document.removeEventListener('mouseup', Toast._onDragEnd);
14006
+
14007
+ Toast._container.parentNode.removeChild(Toast._container);
14008
+ Toast._container = null;
14009
+ }
14010
+
14011
+ /**
14012
+ * Begin drag handler
14013
+ * @param {Event} e
14014
+ */
14015
+
14016
+ }, {
14017
+ key: '_onDragStart',
14018
+ value: function _onDragStart(e) {
14019
+ if (e.target && $(e.target).closest('.toast').length) {
14020
+ var $toast = $(e.target).closest('.toast');
14021
+ var toast = $toast[0].M_Toast;
14022
+ toast.panning = true;
14023
+ Toast._draggedToast = toast;
14024
+ toast.el.classList.add('panning');
14025
+ toast.el.style.transition = null;
14026
+ toast.startingXPos = Toast._xPos(e);
14027
+ toast.time = Date.now();
14028
+ toast.xPos = Toast._xPos(e);
14029
+ }
14030
+ }
14031
+
14032
+ /**
14033
+ * Drag move handler
14034
+ * @param {Event} e
14035
+ */
14036
+
14037
+ }, {
14038
+ key: '_onDragMove',
14039
+ value: function _onDragMove(e) {
14040
+ if (!!Toast._draggedToast) {
14041
+ e.preventDefault();
14042
+ var toast = Toast._draggedToast;
14043
+ toast.deltaX = Math.abs(toast.xPos - Toast._xPos(e));
14044
+ toast.xPos = Toast._xPos(e);
14045
+ toast.velocityX = toast.deltaX / (Date.now() - toast.time);
14046
+ toast.time = Date.now();
14047
+
14048
+ var totalDeltaX = toast.xPos - toast.startingXPos;
14049
+ var activationDistance = toast.el.offsetWidth * toast.options.activationPercent;
14050
+ toast.el.style.transform = 'translateX(' + totalDeltaX + 'px)';
14051
+ toast.el.style.opacity = 1 - Math.abs(totalDeltaX / activationDistance);
14052
+ }
14053
+ }
14054
+
14055
+ /**
14056
+ * End drag handler
14057
+ * @param {Event} e
14058
+ */
14059
+
14060
+ }, {
14061
+ key: '_onDragEnd',
14062
+ value: function _onDragEnd(e) {
14063
+ if (!!Toast._draggedToast) {
14064
+ var toast = Toast._draggedToast;
14065
+ toast.panning = false;
14066
+ toast.el.classList.remove('panning');
14067
+
14068
+ var totalDeltaX = toast.xPos - toast.startingXPos;
14069
+ var activationDistance = toast.el.offsetWidth * toast.options.activationPercent;
14070
+ var shouldBeDismissed = Math.abs(totalDeltaX) > activationDistance || toast.velocityX > 1;
14071
+
14072
+ // Remove toast
14073
+ if (shouldBeDismissed) {
14074
+ toast.wasSwiped = true;
14075
+ toast.remove();
14076
+
14077
+ // Animate toast back to original position
14078
+ } else {
14079
+ toast.el.style.transition = 'transform .2s, opacity .2s';
14080
+ toast.el.style.transform = null;
14081
+ toast.el.style.opacity = null;
14082
+ }
14083
+ Toast._draggedToast = null;
14084
+ }
14085
+ }
14086
+
14087
+ /**
14088
+ * Get x position of mouse or touch event
14089
+ * @param {Event} e
14090
+ */
14091
+
14092
+ }, {
14093
+ key: '_xPos',
14094
+ value: function _xPos(e) {
14095
+ if (e.targetTouches && e.targetTouches.length >= 1) {
14096
+ return e.targetTouches[0].clientX;
14097
+ }
14098
+ // mouse event
14099
+ return e.clientX;
14100
+ }
14101
+
14102
+ /**
14103
+ * Remove all toasts
14104
+ */
14105
+
14106
+ }, {
14107
+ key: 'removeAll',
14108
+ value: function removeAll() {
14109
+ for (var toastIndex in Toast._toasts) {
14110
+ Toast._toasts[toastIndex].remove();
14111
+ }
14112
+ }
14113
+ }, {
14114
+ key: 'defaults',
14115
+ get: function () {
14116
+ return _defaults;
14117
+ }
14118
+ }]);
14119
+
14120
+ return Toast;
14121
+ }();
14122
+
14123
+ /**
14124
+ * @static
14125
+ * @memberof Toast
14126
+ * @type {Array.<Toast>}
14127
+ */
14128
+
14129
+
14130
+ Toast._toasts = [];
14131
+
14132
+ /**
14133
+ * @static
14134
+ * @memberof Toast
14135
+ */
14136
+ Toast._container = null;
14137
+
14138
+ /**
14139
+ * @static
14140
+ * @memberof Toast
14141
+ * @type {Toast}
14142
+ */
14143
+ Toast._draggedToast = null;
14144
+
14145
+ window.Materialize.Toast = Toast;
14146
+ window.Materialize.toast = function (message, displayLength, className, completeCallback) {
14147
+ return new Toast(message, displayLength, className, completeCallback);
14148
+ };
14149
+ })(jQuery);
14150
+ ;(function ($) {
14151
+
14152
+ var methods = {
14153
+ init: function (options) {
14154
+ var defaults = {
14155
+ menuWidth: 300,
14156
+ edge: 'left',
14157
+ closeOnClick: false,
14158
+ draggable: true,
14159
+ onOpen: null,
14160
+ onClose: null
14161
+ };
14162
+ options = $.extend(defaults, options);
14163
+
14164
+ $(this).each(function () {
14165
+ var $this = $(this);
14166
+ var menuId = $this.attr('data-activates');
14167
+ var menu = $("#" + menuId);
14168
+
14169
+ // Set to width
14170
+ if (options.menuWidth != 300) {
14171
+ menu.css('width', options.menuWidth);
14172
+ }
14173
+
14174
+ // Add Touch Area
14175
+ var $dragTarget = $('.drag-target[data-sidenav="' + menuId + '"]');
14176
+ if (options.draggable) {
14177
+ // Regenerate dragTarget
14178
+ if ($dragTarget.length) {
14179
+ $dragTarget.remove();
14180
+ }
14181
+
14182
+ $dragTarget = $('<div class="drag-target"></div>').attr('data-sidenav', menuId);
14183
+ $('body').append($dragTarget);
14184
+ } else {
14185
+ $dragTarget = $();
14186
+ }
14187
+
14188
+ if (options.edge == 'left') {
14189
+ menu.css('transform', 'translateX(-100%)');
14190
+ $dragTarget.css({ 'left': 0 }); // Add Touch Area
14191
+ } else {
14192
+ menu.addClass('right-aligned') // Change text-alignment to right
14193
+ .css('transform', 'translateX(100%)');
14194
+ $dragTarget.css({ 'right': 0 }); // Add Touch Area
14195
+ }
14196
+
14197
+ // If fixed sidenav, bring menu out
14198
+ if (menu.hasClass('fixed')) {
14199
+ if (window.innerWidth > 992) {
14200
+ menu.css('transform', 'translateX(0)');
14201
+ }
14202
+ }
14203
+
14204
+ // Window resize to reset on large screens fixed
14205
+ if (menu.hasClass('fixed')) {
14206
+ $(window).resize(function () {
14207
+ if (window.innerWidth > 992) {
14208
+ // Close menu if window is resized bigger than 992 and user has fixed sidenav
14209
+ if ($('#sidenav-overlay').length !== 0 && menuOut) {
14210
+ removeMenu(true);
14211
+ } else {
14212
+ // menu.removeAttr('style');
14213
+ menu.css('transform', 'translateX(0%)');
14214
+ // menu.css('width', options.menuWidth);
14215
+ }
14216
+ } else if (menuOut === false) {
14217
+ if (options.edge === 'left') {
14218
+ menu.css('transform', 'translateX(-100%)');
14219
+ } else {
14220
+ menu.css('transform', 'translateX(100%)');
14221
+ }
14222
+ }
14223
+ });
14224
+ }
14225
+
14226
+ // if closeOnClick, then add close event for all a tags in side sideNav
14227
+ if (options.closeOnClick === true) {
14228
+ menu.on("click.itemclick", "a:not(.collapsible-header)", function () {
14229
+ if (!(window.innerWidth > 992 && menu.hasClass('fixed'))) {
14230
+ removeMenu();
14231
+ }
14232
+ });
14233
+ }
14234
+
14235
+ var removeMenu = function (restoreNav) {
14236
+ panning = false;
14237
+ menuOut = false;
14238
+ // Reenable scrolling
14239
+ $('body').css({
14240
+ overflow: '',
14241
+ width: ''
14242
+ });
14243
+
14244
+ $('#sidenav-overlay').velocity({ opacity: 0 }, { duration: 200,
14245
+ queue: false, easing: 'easeOutQuad',
14246
+ complete: function () {
14247
+ $(this).remove();
14248
+ } });
14249
+ if (options.edge === 'left') {
14250
+ // Reset phantom div
14251
+ $dragTarget.css({ width: '', right: '', left: '0' });
14252
+ menu.velocity({ 'translateX': '-100%' }, { duration: 200,
14253
+ queue: false,
14254
+ easing: 'easeOutCubic',
14255
+ complete: function () {
14256
+ if (restoreNav === true) {
14257
+ // Restore Fixed sidenav
14258
+ menu.removeAttr('style');
14259
+ menu.css('width', options.menuWidth);
14260
+ }
14261
+ }
14262
+
14263
+ });
14264
+ } else {
14265
+ // Reset phantom div
14266
+ $dragTarget.css({ width: '', right: '0', left: '' });
14267
+ menu.velocity({ 'translateX': '100%' }, { duration: 200,
14268
+ queue: false,
14269
+ easing: 'easeOutCubic',
14270
+ complete: function () {
14271
+ if (restoreNav === true) {
14272
+ // Restore Fixed sidenav
14273
+ menu.removeAttr('style');
14274
+ menu.css('width', options.menuWidth);
14275
+ }
14276
+ }
14277
+ });
14278
+ }
14279
+
14280
+ // Callback
14281
+ if (typeof options.onClose === 'function') {
14282
+ options.onClose.call(this, menu);
14283
+ }
14284
+ };
14285
+
14286
+ // Touch Event
14287
+ var panning = false;
14288
+ var menuOut = false;
14289
+
14290
+ if (options.draggable) {
14291
+ $dragTarget.on('click', function () {
14292
+ if (menuOut) {
14293
+ removeMenu();
14294
+ }
14295
+ });
14296
+
14297
+ $dragTarget.hammer({
14298
+ prevent_default: false
14299
+ }).on('pan', function (e) {
14300
+
14301
+ if (e.gesture.pointerType == "touch") {
14302
+
14303
+ var direction = e.gesture.direction;
14304
+ var x = e.gesture.center.x;
14305
+ var y = e.gesture.center.y;
14306
+ var velocityX = e.gesture.velocityX;
14307
+
14308
+ // Vertical scroll bugfix
14309
+ if (x === 0 && y === 0) {
14310
+ return;
14311
+ }
14312
+
14313
+ // Disable Scrolling
14314
+ var $body = $('body');
14315
+ var $overlay = $('#sidenav-overlay');
14316
+ var oldWidth = $body.innerWidth();
14317
+ $body.css('overflow', 'hidden');
14318
+ $body.width(oldWidth);
14319
+
14320
+ // If overlay does not exist, create one and if it is clicked, close menu
14321
+ if ($overlay.length === 0) {
14322
+ $overlay = $('<div id="sidenav-overlay"></div>');
14323
+ $overlay.css('opacity', 0).click(function () {
14324
+ removeMenu();
14325
+ });
14326
+
14327
+ // Run 'onOpen' when sidenav is opened via touch/swipe if applicable
14328
+ if (typeof options.onOpen === 'function') {
14329
+ options.onOpen.call(this, menu);
14330
+ }
14331
+
14332
+ $('body').append($overlay);
14333
+ }
14334
+
14335
+ // Keep within boundaries
14336
+ if (options.edge === 'left') {
14337
+ if (x > options.menuWidth) {
14338
+ x = options.menuWidth;
14339
+ } else if (x < 0) {
14340
+ x = 0;
14341
+ }
14342
+ }
14343
+
14344
+ if (options.edge === 'left') {
14345
+ // Left Direction
14346
+ if (x < options.menuWidth / 2) {
14347
+ menuOut = false;
14348
+ }
14349
+ // Right Direction
14350
+ else if (x >= options.menuWidth / 2) {
14351
+ menuOut = true;
14352
+ }
14353
+ menu.css('transform', 'translateX(' + (x - options.menuWidth) + 'px)');
14354
+ } else {
14355
+ // Left Direction
14356
+ if (x < window.innerWidth - options.menuWidth / 2) {
14357
+ menuOut = true;
14358
+ }
14359
+ // Right Direction
14360
+ else if (x >= window.innerWidth - options.menuWidth / 2) {
14361
+ menuOut = false;
14362
+ }
14363
+ var rightPos = x - options.menuWidth / 2;
14364
+ if (rightPos < 0) {
14365
+ rightPos = 0;
14366
+ }
14367
+
14368
+ menu.css('transform', 'translateX(' + rightPos + 'px)');
14369
+ }
14370
+
14371
+ // Percentage overlay
14372
+ var overlayPerc;
14373
+ if (options.edge === 'left') {
14374
+ overlayPerc = x / options.menuWidth;
14375
+ $overlay.velocity({ opacity: overlayPerc }, { duration: 10, queue: false, easing: 'easeOutQuad' });
14376
+ } else {
14377
+ overlayPerc = Math.abs((x - window.innerWidth) / options.menuWidth);
14378
+ $overlay.velocity({ opacity: overlayPerc }, { duration: 10, queue: false, easing: 'easeOutQuad' });
14379
+ }
14380
+ }
14381
+ }).on('panend', function (e) {
14382
+
14383
+ if (e.gesture.pointerType == "touch") {
14384
+ var $overlay = $('#sidenav-overlay');
14385
+ var velocityX = e.gesture.velocityX;
14386
+ var x = e.gesture.center.x;
14387
+ var leftPos = x - options.menuWidth;
14388
+ var rightPos = x - options.menuWidth / 2;
14389
+ if (leftPos > 0) {
14390
+ leftPos = 0;
14391
+ }
14392
+ if (rightPos < 0) {
14393
+ rightPos = 0;
14394
+ }
14395
+ panning = false;
14396
+
14397
+ if (options.edge === 'left') {
14398
+ // If velocityX <= 0.3 then the user is flinging the menu closed so ignore menuOut
14399
+ if (menuOut && velocityX <= 0.3 || velocityX < -0.5) {
14400
+ // Return menu to open
14401
+ if (leftPos !== 0) {
14402
+ menu.velocity({ 'translateX': [0, leftPos] }, { duration: 300, queue: false, easing: 'easeOutQuad' });
14403
+ }
14404
+
14405
+ $overlay.velocity({ opacity: 1 }, { duration: 50, queue: false, easing: 'easeOutQuad' });
14406
+ $dragTarget.css({ width: '50%', right: 0, left: '' });
14407
+ menuOut = true;
14408
+ } else if (!menuOut || velocityX > 0.3) {
14409
+ // Enable Scrolling
14410
+ $('body').css({
14411
+ overflow: '',
14412
+ width: ''
14413
+ });
14414
+ // Slide menu closed
14415
+ menu.velocity({ 'translateX': [-1 * options.menuWidth - 10, leftPos] }, { duration: 200, queue: false, easing: 'easeOutQuad' });
14416
+ $overlay.velocity({ opacity: 0 }, { duration: 200, queue: false, easing: 'easeOutQuad',
14417
+ complete: function () {
14418
+ // Run 'onClose' when sidenav is closed via touch/swipe if applicable
14419
+ if (typeof options.onClose === 'function') {
14420
+ options.onClose.call(this, menu);
14421
+ }
14422
+
14423
+ $(this).remove();
14424
+ } });
14425
+ $dragTarget.css({ width: '10px', right: '', left: 0 });
14426
+ }
14427
+ } else {
14428
+ if (menuOut && velocityX >= -0.3 || velocityX > 0.5) {
14429
+ // Return menu to open
14430
+ if (rightPos !== 0) {
14431
+ menu.velocity({ 'translateX': [0, rightPos] }, { duration: 300, queue: false, easing: 'easeOutQuad' });
14432
+ }
14433
+
14434
+ $overlay.velocity({ opacity: 1 }, { duration: 50, queue: false, easing: 'easeOutQuad' });
14435
+ $dragTarget.css({ width: '50%', right: '', left: 0 });
14436
+ menuOut = true;
14437
+ } else if (!menuOut || velocityX < -0.3) {
14438
+ // Enable Scrolling
14439
+ $('body').css({
14440
+ overflow: '',
14441
+ width: ''
14442
+ });
14443
+
14444
+ // Slide menu closed
14445
+ menu.velocity({ 'translateX': [options.menuWidth + 10, rightPos] }, { duration: 200, queue: false, easing: 'easeOutQuad' });
14446
+ $overlay.velocity({ opacity: 0 }, { duration: 200, queue: false, easing: 'easeOutQuad',
14447
+ complete: function () {
14448
+ // Run 'onClose' when sidenav is closed via touch/swipe if applicable
14449
+ if (typeof options.onClose === 'function') {
14450
+ options.onClose.call(this, menu);
14451
+ }
14452
+
14453
+ $(this).remove();
14454
+ } });
14455
+ $dragTarget.css({ width: '10px', right: 0, left: '' });
14456
+ }
14457
+ }
14458
+ }
14459
+ });
14460
+ }
14461
+
14462
+ $this.off('click.sidenav').on('click.sidenav', function () {
14463
+ if (menuOut === true) {
14464
+ menuOut = false;
14465
+ panning = false;
14466
+ removeMenu();
14467
+ } else {
14468
+
14469
+ // Disable Scrolling
14470
+ var $body = $('body');
14471
+ var $overlay = $('<div id="sidenav-overlay"></div>');
14472
+ var oldWidth = $body.innerWidth();
14473
+ $body.css('overflow', 'hidden');
14474
+ $body.width(oldWidth);
14475
+
14476
+ // Push current drag target on top of DOM tree
14477
+ $('body').append($dragTarget);
14478
+
14479
+ if (options.edge === 'left') {
14480
+ $dragTarget.css({ width: '50%', right: 0, left: '' });
14481
+ menu.velocity({ 'translateX': [0, -1 * options.menuWidth] }, { duration: 300, queue: false, easing: 'easeOutQuad' });
14482
+ } else {
14483
+ $dragTarget.css({ width: '50%', right: '', left: 0 });
14484
+ menu.velocity({ 'translateX': [0, options.menuWidth] }, { duration: 300, queue: false, easing: 'easeOutQuad' });
14485
+ }
14486
+
14487
+ // Overlay close on click
14488
+ $overlay.css('opacity', 0).click(function () {
14489
+ menuOut = false;
14490
+ panning = false;
14491
+ removeMenu();
14492
+ $overlay.velocity({ opacity: 0 }, { duration: 300, queue: false, easing: 'easeOutQuad',
14493
+ complete: function () {
14494
+ $(this).remove();
14495
+ }
14496
+ });
14497
+ });
14498
+
14499
+ // Append body
14500
+ $('body').append($overlay);
14501
+ $overlay.velocity({ opacity: 1 }, { duration: 300, queue: false, easing: 'easeOutQuad',
14502
+ complete: function () {
14503
+ menuOut = true;
14504
+ panning = false;
14505
+ }
14506
+ });
14507
+
14508
+ // Callback
14509
+ if (typeof options.onOpen === 'function') {
14510
+ options.onOpen.call(this, menu);
14511
+ }
14512
+ }
14513
+
14514
+ return false;
14515
+ });
14516
+ });
14517
+ },
14518
+ destroy: function () {
14519
+ var $overlay = $('#sidenav-overlay');
14520
+ var $dragTarget = $('.drag-target[data-sidenav="' + $(this).attr('data-activates') + '"]');
14521
+ $overlay.trigger('click');
14522
+ $dragTarget.remove();
14523
+ $(this).off('click');
14524
+ $overlay.remove();
14525
+ },
14526
+ show: function () {
14527
+ this.trigger('click');
14528
+ },
14529
+ hide: function () {
14530
+ $('#sidenav-overlay').trigger('click');
14531
+ }
14532
+ };
14533
+
14534
+ $.fn.sideNav = function (methodOrOptions) {
14535
+ if (methods[methodOrOptions]) {
14536
+ return methods[methodOrOptions].apply(this, Array.prototype.slice.call(arguments, 1));
14537
+ } else if (typeof methodOrOptions === 'object' || !methodOrOptions) {
14538
+ // Default to "init"
14539
+ return methods.init.apply(this, arguments);
14540
+ } else {
14541
+ $.error('Method ' + methodOrOptions + ' does not exist on jQuery.sideNav');
14542
+ }
14543
+ }; // Plugin end
14544
+ })(jQuery);
14545
+ ; /**
14546
+ * Extend jquery with a scrollspy plugin.
14547
+ * This watches the window scroll and fires events when elements are scrolled into viewport.
14548
+ *
14549
+ * throttle() and getTime() taken from Underscore.js
14550
+ * https://github.com/jashkenas/underscore
14551
+ *
14552
+ * @author Copyright 2013 John Smart
14553
+ * @license https://raw.github.com/thesmart/jquery-scrollspy/master/LICENSE
14554
+ * @see https://github.com/thesmart
14555
+ * @version 0.1.2
14556
+ */
14557
+ (function ($) {
14558
+
14559
+ var jWindow = $(window);
14560
+ var elements = [];
14561
+ var elementsInView = [];
14562
+ var isSpying = false;
14563
+ var ticks = 0;
14564
+ var unique_id = 1;
14565
+ var offset = {
14566
+ top: 0,
14567
+ right: 0,
14568
+ bottom: 0,
14569
+ left: 0
14570
+
14571
+ /**
14572
+ * Find elements that are within the boundary
14573
+ * @param {number} top
14574
+ * @param {number} right
14575
+ * @param {number} bottom
14576
+ * @param {number} left
14577
+ * @return {jQuery} A collection of elements
14578
+ */
14579
+ };function findElements(top, right, bottom, left) {
14580
+ var hits = $();
14581
+ $.each(elements, function (i, element) {
14582
+ if (element.height() > 0) {
14583
+ var elTop = element.offset().top,
14584
+ elLeft = element.offset().left,
14585
+ elRight = elLeft + element.width(),
14586
+ elBottom = elTop + element.height();
14587
+
14588
+ var isIntersect = !(elLeft > right || elRight < left || elTop > bottom || elBottom < top);
14589
+
14590
+ if (isIntersect) {
14591
+ hits.push(element);
14592
+ }
14593
+ }
14594
+ });
14595
+
14596
+ return hits;
14597
+ }
14598
+
14599
+ /**
14600
+ * Called when the user scrolls the window
14601
+ */
14602
+ function onScroll(scrollOffset) {
14603
+ // unique tick id
14604
+ ++ticks;
14605
+
14606
+ // viewport rectangle
14607
+ var top = jWindow.scrollTop(),
14608
+ left = jWindow.scrollLeft(),
14609
+ right = left + jWindow.width(),
14610
+ bottom = top + jWindow.height();
14611
+
14612
+ // determine which elements are in view
14613
+ var intersections = findElements(top + offset.top + scrollOffset || 200, right + offset.right, bottom + offset.bottom, left + offset.left);
14614
+ $.each(intersections, function (i, element) {
14615
+
14616
+ var lastTick = element.data('scrollSpy:ticks');
14617
+ if (typeof lastTick != 'number') {
14618
+ // entered into view
14619
+ element.triggerHandler('scrollSpy:enter');
14620
+ }
14621
+
14622
+ // update tick id
14623
+ element.data('scrollSpy:ticks', ticks);
14624
+ });
14625
+
14626
+ // determine which elements are no longer in view
14627
+ $.each(elementsInView, function (i, element) {
14628
+ var lastTick = element.data('scrollSpy:ticks');
14629
+ if (typeof lastTick == 'number' && lastTick !== ticks) {
14630
+ // exited from view
14631
+ element.triggerHandler('scrollSpy:exit');
14632
+ element.data('scrollSpy:ticks', null);
14633
+ }
14634
+ });
14635
+
14636
+ // remember elements in view for next tick
14637
+ elementsInView = intersections;
14638
+ }
14639
+
14640
+ /**
14641
+ * Called when window is resized
14642
+ */
14643
+ function onWinSize() {
14644
+ jWindow.trigger('scrollSpy:winSize');
14645
+ }
14646
+
14647
+ /**
14648
+ * Enables ScrollSpy using a selector
14649
+ * @param {jQuery|string} selector The elements collection, or a selector
14650
+ * @param {Object=} options Optional.
14651
+ throttle : number -> scrollspy throttling. Default: 100 ms
14652
+ offsetTop : number -> offset from top. Default: 0
14653
+ offsetRight : number -> offset from right. Default: 0
14654
+ offsetBottom : number -> offset from bottom. Default: 0
14655
+ offsetLeft : number -> offset from left. Default: 0
14656
+ activeClass : string -> Class name to be added to the active link. Default: active
14657
+ * @returns {jQuery}
14658
+ */
14659
+ $.scrollSpy = function (selector, options) {
14660
+ var defaults = {
14661
+ throttle: 100,
14662
+ scrollOffset: 200, // offset - 200 allows elements near bottom of page to scroll
14663
+ activeClass: 'active',
14664
+ getActiveElement: function (id) {
14665
+ return 'a[href="#' + id + '"]';
14666
+ }
14667
+ };
14668
+ options = $.extend(defaults, options);
14669
+
14670
+ var visible = [];
14671
+ selector = $(selector);
14672
+ selector.each(function (i, element) {
14673
+ elements.push($(element));
14674
+ $(element).data("scrollSpy:id", i);
14675
+ // Smooth scroll to section
14676
+ $('a[href="#' + $(element).attr('id') + '"]').click(function (e) {
14677
+ e.preventDefault();
14678
+ var offset = $(Materialize.escapeHash(this.hash)).offset().top + 1;
14679
+ $('html, body').animate({ scrollTop: offset - options.scrollOffset }, { duration: 400, queue: false, easing: 'easeOutCubic' });
14680
+ });
14681
+ });
14682
+
14683
+ offset.top = options.offsetTop || 0;
14684
+ offset.right = options.offsetRight || 0;
14685
+ offset.bottom = options.offsetBottom || 0;
14686
+ offset.left = options.offsetLeft || 0;
14687
+
14688
+ var throttledScroll = Materialize.throttle(function () {
14689
+ onScroll(options.scrollOffset);
14690
+ }, options.throttle || 100);
14691
+ var readyScroll = function () {
14692
+ $(document).ready(throttledScroll);
14693
+ };
14694
+
14695
+ if (!isSpying) {
14696
+ jWindow.on('scroll', readyScroll);
14697
+ jWindow.on('resize', readyScroll);
14698
+ isSpying = true;
14699
+ }
14700
+
14701
+ // perform a scan once, after current execution context, and after dom is ready
14702
+ setTimeout(readyScroll, 0);
14703
+
14704
+ selector.on('scrollSpy:enter', function () {
14705
+ visible = $.grep(visible, function (value) {
14706
+ return value.height() != 0;
14707
+ });
14708
+
14709
+ var $this = $(this);
14710
+
14711
+ if (visible[0]) {
14712
+ $(options.getActiveElement(visible[0].attr('id'))).removeClass(options.activeClass);
14713
+ if ($this.data('scrollSpy:id') < visible[0].data('scrollSpy:id')) {
14714
+ visible.unshift($(this));
14715
+ } else {
14716
+ visible.push($(this));
14717
+ }
14718
+ } else {
14719
+ visible.push($(this));
14720
+ }
14721
+
14722
+ $(options.getActiveElement(visible[0].attr('id'))).addClass(options.activeClass);
14723
+ });
14724
+ selector.on('scrollSpy:exit', function () {
14725
+ visible = $.grep(visible, function (value) {
14726
+ return value.height() != 0;
14727
+ });
14728
+
14729
+ if (visible[0]) {
14730
+ $(options.getActiveElement(visible[0].attr('id'))).removeClass(options.activeClass);
14731
+ var $this = $(this);
14732
+ visible = $.grep(visible, function (value) {
14733
+ return value.attr('id') != $this.attr('id');
14734
+ });
14735
+ if (visible[0]) {
14736
+ // Check if empty
14737
+ $(options.getActiveElement(visible[0].attr('id'))).addClass(options.activeClass);
14738
+ }
14739
+ }
14740
+ });
14741
+
14742
+ return selector;
14743
+ };
14744
+
14745
+ /**
14746
+ * Listen for window resize events
14747
+ * @param {Object=} options Optional. Set { throttle: number } to change throttling. Default: 100 ms
14748
+ * @returns {jQuery} $(window)
14749
+ */
14750
+ $.winSizeSpy = function (options) {
14751
+ $.winSizeSpy = function () {
14752
+ return jWindow;
14753
+ }; // lock from multiple calls
14754
+ options = options || {
14755
+ throttle: 100
14756
+ };
14757
+ return jWindow.on('resize', Materialize.throttle(onWinSize, options.throttle || 100));
14758
+ };
14759
+
14760
+ /**
14761
+ * Enables ScrollSpy on a collection of elements
14762
+ * e.g. $('.scrollSpy').scrollSpy()
14763
+ * @param {Object=} options Optional.
14764
+ throttle : number -> scrollspy throttling. Default: 100 ms
14765
+ offsetTop : number -> offset from top. Default: 0
14766
+ offsetRight : number -> offset from right. Default: 0
14767
+ offsetBottom : number -> offset from bottom. Default: 0
14768
+ offsetLeft : number -> offset from left. Default: 0
14769
+ * @returns {jQuery}
14770
+ */
14771
+ $.fn.scrollSpy = function (options) {
14772
+ return $.scrollSpy($(this), options);
14773
+ };
14774
+ })(jQuery);
14775
+ ;(function ($) {
14776
+ $(document).ready(function () {
14777
+
14778
+ // Function to update labels of text fields
14779
+ Materialize.updateTextFields = function () {
14780
+ var input_selector = 'input[type=text], input[type=password], input[type=email], input[type=url], input[type=tel], input[type=number], input[type=search], textarea';
14781
+ $(input_selector).each(function (index, element) {
14782
+ var $this = $(this);
14783
+ if ($(element).val().length > 0 || $(element).is(':focus') || element.autofocus || $this.attr('placeholder') !== undefined) {
14784
+ $this.siblings('label').addClass('active');
14785
+ } else if ($(element)[0].validity) {
14786
+ $this.siblings('label').toggleClass('active', $(element)[0].validity.badInput === true);
14787
+ } else {
14788
+ $this.siblings('label').removeClass('active');
14789
+ }
14790
+ });
14791
+ };
14792
+
14793
+ // Text based inputs
14794
+ var input_selector = 'input[type=text], input[type=password], input[type=email], input[type=url], input[type=tel], input[type=number], input[type=search], textarea';
14795
+
14796
+ // Add active if form auto complete
14797
+ $(document).on('change', input_selector, function () {
14798
+ if ($(this).val().length !== 0 || $(this).attr('placeholder') !== undefined) {
14799
+ $(this).siblings('label').addClass('active');
14800
+ }
14801
+ validate_field($(this));
14802
+ });
14803
+
14804
+ // Add active if input element has been pre-populated on document ready
14805
+ $(document).ready(function () {
14806
+ Materialize.updateTextFields();
14807
+ });
14808
+
14809
+ // HTML DOM FORM RESET handling
14810
+ $(document).on('reset', function (e) {
14811
+ var formReset = $(e.target);
14812
+ if (formReset.is('form')) {
14813
+ formReset.find(input_selector).removeClass('valid').removeClass('invalid');
14814
+ formReset.find(input_selector).each(function () {
14815
+ if ($(this).attr('value') === '') {
14816
+ $(this).siblings('label').removeClass('active');
14817
+ }
14818
+ });
14819
+
14820
+ // Reset select
14821
+ formReset.find('select.initialized').each(function () {
14822
+ var reset_text = formReset.find('option[selected]').text();
14823
+ formReset.siblings('input.select-dropdown').val(reset_text);
14824
+ });
14825
+ }
14826
+ });
14827
+
14828
+ // Add active when element has focus
14829
+ $(document).on('focus', input_selector, function () {
14830
+ $(this).siblings('label, .prefix').addClass('active');
14831
+ });
14832
+
14833
+ $(document).on('blur', input_selector, function () {
14834
+ var $inputElement = $(this);
14835
+ var selector = ".prefix";
14836
+
14837
+ if ($inputElement.val().length === 0 && $inputElement[0].validity.badInput !== true && $inputElement.attr('placeholder') === undefined) {
14838
+ selector += ", label";
14839
+ }
14840
+
14841
+ $inputElement.siblings(selector).removeClass('active');
14842
+
14843
+ validate_field($inputElement);
14844
+ });
14845
+
14846
+ window.validate_field = function (object) {
14847
+ var hasLength = object.attr('data-length') !== undefined;
14848
+ var lenAttr = parseInt(object.attr('data-length'));
14849
+ var len = object.val().length;
14850
+
14851
+ if (object.val().length === 0 && object[0].validity.badInput === false && !object.is(':required')) {
14852
+ if (object.hasClass('validate')) {
14853
+ object.removeClass('valid');
14854
+ object.removeClass('invalid');
14855
+ }
14856
+ } else {
14857
+ if (object.hasClass('validate')) {
14858
+ // Check for character counter attributes
14859
+ if (object.is(':valid') && hasLength && len <= lenAttr || object.is(':valid') && !hasLength) {
14860
+ object.removeClass('invalid');
14861
+ object.addClass('valid');
14862
+ } else {
14863
+ object.removeClass('valid');
14864
+ object.addClass('invalid');
14865
+ }
14866
+ }
14867
+ }
14868
+ };
14869
+
14870
+ // Radio and Checkbox focus class
14871
+ var radio_checkbox = 'input[type=radio], input[type=checkbox]';
14872
+ $(document).on('keyup.radio', radio_checkbox, function (e) {
14873
+ // TAB, check if tabbing to radio or checkbox.
14874
+ if (e.which === 9) {
14875
+ $(this).addClass('tabbed');
14876
+ var $this = $(this);
14877
+ $this.one('blur', function (e) {
14878
+
14879
+ $(this).removeClass('tabbed');
14880
+ });
14881
+ return;
14882
+ }
14883
+ });
14884
+
14885
+ // Textarea Auto Resize
14886
+ var hiddenDiv = $('.hiddendiv').first();
14887
+ if (!hiddenDiv.length) {
14888
+ hiddenDiv = $('<div class="hiddendiv common"></div>');
14889
+ $('body').append(hiddenDiv);
14890
+ }
14891
+ var text_area_selector = '.materialize-textarea';
14892
+
14893
+ function textareaAutoResize($textarea) {
14894
+ // Set font properties of hiddenDiv
14895
+
14896
+ var fontFamily = $textarea.css('font-family');
14897
+ var fontSize = $textarea.css('font-size');
14898
+ var lineHeight = $textarea.css('line-height');
14899
+ var padding = $textarea.css('padding');
14900
+
14901
+ if (fontSize) {
14902
+ hiddenDiv.css('font-size', fontSize);
14903
+ }
14904
+ if (fontFamily) {
14905
+ hiddenDiv.css('font-family', fontFamily);
14906
+ }
14907
+ if (lineHeight) {
14908
+ hiddenDiv.css('line-height', lineHeight);
14909
+ }
14910
+ if (padding) {
14911
+ hiddenDiv.css('padding', padding);
14912
+ }
14913
+
14914
+ // Set original-height, if none
14915
+ if (!$textarea.data('original-height')) {
14916
+ $textarea.data('original-height', $textarea.height());
14917
+ }
14918
+
14919
+ if ($textarea.attr('wrap') === 'off') {
14920
+ hiddenDiv.css('overflow-wrap', 'normal').css('white-space', 'pre');
14921
+ }
14922
+
14923
+ hiddenDiv.text($textarea.val() + '\n');
14924
+ var content = hiddenDiv.html().replace(/\n/g, '<br>');
14925
+ hiddenDiv.html(content);
14926
+
14927
+ // When textarea is hidden, width goes crazy.
14928
+ // Approximate with half of window size
14929
+
14930
+ if ($textarea.is(':visible')) {
14931
+ hiddenDiv.css('width', $textarea.width());
14932
+ } else {
14933
+ hiddenDiv.css('width', $(window).width() / 2);
14934
+ }
14935
+
14936
+ /**
14937
+ * Resize if the new height is greater than the
14938
+ * original height of the textarea
14939
+ */
14940
+ if ($textarea.data('original-height') <= hiddenDiv.height()) {
14941
+ $textarea.css('height', hiddenDiv.height());
14942
+ } else if ($textarea.val().length < $textarea.data('previous-length')) {
14943
+ /**
14944
+ * In case the new height is less than original height, it
14945
+ * means the textarea has less text than before
14946
+ * So we set the height to the original one
14947
+ */
14948
+ $textarea.css('height', $textarea.data('original-height'));
14949
+ }
14950
+ $textarea.data('previous-length', $textarea.val().length);
14951
+ }
14952
+
14953
+ $(text_area_selector).each(function () {
14954
+ var $textarea = $(this);
14955
+ /**
14956
+ * Instead of resizing textarea on document load,
14957
+ * store the original height and the original length
14958
+ */
14959
+ $textarea.data('original-height', $textarea.height());
14960
+ $textarea.data('previous-length', $textarea.val().length);
14961
+ });
14962
+
14963
+ $('body').on('keyup keydown autoresize', text_area_selector, function () {
14964
+ textareaAutoResize($(this));
14965
+ });
14966
+
14967
+ // File Input Path
14968
+ $(document).on('change', '.file-field input[type="file"]', function () {
14969
+ var file_field = $(this).closest('.file-field');
14970
+ var path_input = file_field.find('input.file-path');
14971
+ var files = $(this)[0].files;
14972
+ var file_names = [];
14973
+ for (var i = 0; i < files.length; i++) {
14974
+ file_names.push(files[i].name);
14975
+ }
14976
+ path_input.val(file_names.join(", "));
14977
+ path_input.trigger('change');
14978
+ });
14979
+
14980
+ /****************
14981
+ * Range Input *
14982
+ ****************/
14983
+
14984
+ var range_type = 'input[type=range]';
14985
+ var range_mousedown = false;
14986
+ var left;
14987
+
14988
+ $(range_type).each(function () {
14989
+ var thumb = $('<span class="thumb"><span class="value"></span></span>');
14990
+ $(this).after(thumb);
14991
+ });
14992
+
14993
+ var showRangeBubble = function (thumb) {
14994
+ var paddingLeft = parseInt(thumb.parent().css('padding-left'));
14995
+ var marginLeft = -7 + paddingLeft + 'px';
14996
+ thumb.velocity({ height: "30px", width: "30px", top: "-30px", marginLeft: marginLeft }, { duration: 300, easing: 'easeOutExpo' });
14997
+ };
14998
+
14999
+ var calcRangeOffset = function (range) {
15000
+ var width = range.width() - 15;
15001
+ var max = parseFloat(range.attr('max'));
15002
+ var min = parseFloat(range.attr('min'));
15003
+ var percent = (parseFloat(range.val()) - min) / (max - min);
15004
+ return percent * width;
15005
+ };
15006
+
15007
+ var range_wrapper = '.range-field';
15008
+ $(document).on('change', range_type, function (e) {
15009
+ var thumb = $(this).siblings('.thumb');
15010
+ thumb.find('.value').html($(this).val());
15011
+
15012
+ if (!thumb.hasClass('active')) {
15013
+ showRangeBubble(thumb);
15014
+ }
15015
+
15016
+ var offsetLeft = calcRangeOffset($(this));
15017
+ thumb.addClass('active').css('left', offsetLeft);
15018
+ });
15019
+
15020
+ $(document).on('mousedown touchstart', range_type, function (e) {
15021
+ var thumb = $(this).siblings('.thumb');
15022
+
15023
+ // If thumb indicator does not exist yet, create it
15024
+ if (thumb.length <= 0) {
15025
+ thumb = $('<span class="thumb"><span class="value"></span></span>');
15026
+ $(this).after(thumb);
15027
+ }
15028
+
15029
+ // Set indicator value
15030
+ thumb.find('.value').html($(this).val());
15031
+
15032
+ range_mousedown = true;
15033
+ $(this).addClass('active');
15034
+
15035
+ if (!thumb.hasClass('active')) {
15036
+ showRangeBubble(thumb);
15037
+ }
15038
+
15039
+ if (e.type !== 'input') {
15040
+ var offsetLeft = calcRangeOffset($(this));
15041
+ thumb.addClass('active').css('left', offsetLeft);
15042
+ }
15043
+ });
15044
+
15045
+ $(document).on('mouseup touchend', range_wrapper, function () {
15046
+ range_mousedown = false;
15047
+ $(this).removeClass('active');
15048
+ });
15049
+
15050
+ $(document).on('input mousemove touchmove', range_wrapper, function (e) {
15051
+ var thumb = $(this).children('.thumb');
15052
+ var left;
15053
+ var input = $(this).find(range_type);
15054
+
15055
+ if (range_mousedown) {
15056
+ if (!thumb.hasClass('active')) {
15057
+ showRangeBubble(thumb);
15058
+ }
15059
+
15060
+ var offsetLeft = calcRangeOffset(input);
15061
+ thumb.addClass('active').css('left', offsetLeft);
15062
+ thumb.find('.value').html(thumb.siblings(range_type).val());
15063
+ }
15064
+ });
15065
+
15066
+ $(document).on('mouseout touchleave', range_wrapper, function () {
15067
+ if (!range_mousedown) {
15068
+
15069
+ var thumb = $(this).children('.thumb');
15070
+ var paddingLeft = parseInt($(this).css('padding-left'));
15071
+ var marginLeft = 7 + paddingLeft + 'px';
15072
+
15073
+ if (thumb.hasClass('active')) {
15074
+ thumb.velocity({ height: '0', width: '0', top: '10px', marginLeft: marginLeft }, { duration: 100 });
15075
+ }
15076
+ thumb.removeClass('active');
15077
+ }
15078
+ });
15079
+
15080
+ /**************************
15081
+ * Auto complete plugin *
15082
+ *************************/
15083
+ $.fn.autocomplete = function (options) {
15084
+ // Defaults
15085
+ var defaults = {
15086
+ data: {},
15087
+ limit: Infinity,
15088
+ onAutocomplete: null,
15089
+ minLength: 1
15090
+ };
15091
+
15092
+ options = $.extend(defaults, options);
15093
+
15094
+ return this.each(function () {
15095
+ var $input = $(this);
15096
+ var data = options.data,
15097
+ count = 0,
15098
+ activeIndex = -1,
15099
+ oldVal,
15100
+ $inputDiv = $input.closest('.input-field'); // Div to append on
15101
+
15102
+ // Check if data isn't empty
15103
+ if (!$.isEmptyObject(data)) {
15104
+ var $autocomplete = $('<ul class="autocomplete-content dropdown-content"></ul>');
15105
+ var $oldAutocomplete;
15106
+
15107
+ // Append autocomplete element.
15108
+ // Prevent double structure init.
15109
+ if ($inputDiv.length) {
15110
+ $oldAutocomplete = $inputDiv.children('.autocomplete-content.dropdown-content').first();
15111
+ if (!$oldAutocomplete.length) {
15112
+ $inputDiv.append($autocomplete); // Set ul in body
15113
+ }
15114
+ } else {
15115
+ $oldAutocomplete = $input.next('.autocomplete-content.dropdown-content');
15116
+ if (!$oldAutocomplete.length) {
15117
+ $input.after($autocomplete);
15118
+ }
15119
+ }
15120
+ if ($oldAutocomplete.length) {
15121
+ $autocomplete = $oldAutocomplete;
15122
+ }
15123
+
15124
+ // Highlight partial match.
15125
+ var highlight = function (string, $el) {
15126
+ var img = $el.find('img');
15127
+ var matchStart = $el.text().toLowerCase().indexOf("" + string.toLowerCase() + ""),
15128
+ matchEnd = matchStart + string.length - 1,
15129
+ beforeMatch = $el.text().slice(0, matchStart),
15130
+ matchText = $el.text().slice(matchStart, matchEnd + 1),
15131
+ afterMatch = $el.text().slice(matchEnd + 1);
15132
+ $el.html("<span>" + beforeMatch + "<span class='highlight'>" + matchText + "</span>" + afterMatch + "</span>");
15133
+ if (img.length) {
15134
+ $el.prepend(img);
15135
+ }
15136
+ };
15137
+
15138
+ // Reset current element position
15139
+ var resetCurrentElement = function () {
15140
+ activeIndex = -1;
15141
+ $autocomplete.find('.active').removeClass('active');
15142
+ };
15143
+
15144
+ // Remove autocomplete elements
15145
+ var removeAutocomplete = function () {
15146
+ $autocomplete.empty();
15147
+ resetCurrentElement();
15148
+ oldVal = undefined;
15149
+ };
15150
+
15151
+ $input.off('blur.autocomplete').on('blur.autocomplete', function () {
15152
+ removeAutocomplete();
15153
+ });
15154
+
15155
+ // Perform search
15156
+ $input.off('keyup.autocomplete focus.autocomplete').on('keyup.autocomplete focus.autocomplete', function (e) {
15157
+ // Reset count.
15158
+ count = 0;
15159
+ var val = $input.val().toLowerCase();
15160
+
15161
+ // Don't capture enter or arrow key usage.
15162
+ if (e.which === 13 || e.which === 38 || e.which === 40) {
15163
+ return;
15164
+ }
15165
+
15166
+ // Check if the input isn't empty
15167
+ if (oldVal !== val) {
15168
+ removeAutocomplete();
15169
+
15170
+ if (val.length >= options.minLength) {
15171
+ for (var key in data) {
15172
+ if (data.hasOwnProperty(key) && key.toLowerCase().indexOf(val) !== -1) {
15173
+ // Break if past limit
15174
+ if (count >= options.limit) {
15175
+ break;
15176
+ }
15177
+
15178
+ var autocompleteOption = $('<li></li>');
15179
+ if (!!data[key]) {
15180
+ autocompleteOption.append('<img src="' + data[key] + '" class="right circle"><span>' + key + '</span>');
15181
+ } else {
15182
+ autocompleteOption.append('<span>' + key + '</span>');
15183
+ }
15184
+
15185
+ $autocomplete.append(autocompleteOption);
15186
+ highlight(val, autocompleteOption);
15187
+ count++;
15188
+ }
15189
+ }
15190
+ }
15191
+ }
15192
+
15193
+ // Update oldVal
15194
+ oldVal = val;
15195
+ });
15196
+
15197
+ $input.off('keydown.autocomplete').on('keydown.autocomplete', function (e) {
15198
+ // Arrow keys and enter key usage
15199
+ var keyCode = e.which,
15200
+ liElement,
15201
+ numItems = $autocomplete.children('li').length,
15202
+ $active = $autocomplete.children('.active').first();
15203
+
15204
+ // select element on Enter
15205
+ if (keyCode === 13 && activeIndex >= 0) {
15206
+ liElement = $autocomplete.children('li').eq(activeIndex);
15207
+ if (liElement.length) {
15208
+ liElement.trigger('mousedown.autocomplete');
15209
+ e.preventDefault();
15210
+ }
15211
+ return;
15212
+ }
15213
+
15214
+ // Capture up and down key
15215
+ if (keyCode === 38 || keyCode === 40) {
15216
+ e.preventDefault();
15217
+
15218
+ if (keyCode === 38 && activeIndex > 0) {
15219
+ activeIndex--;
15220
+ }
15221
+
15222
+ if (keyCode === 40 && activeIndex < numItems - 1) {
15223
+ activeIndex++;
15224
+ }
15225
+
15226
+ $active.removeClass('active');
15227
+ if (activeIndex >= 0) {
15228
+ $autocomplete.children('li').eq(activeIndex).addClass('active');
15229
+ }
15230
+ }
15231
+ });
15232
+
15233
+ // Set input value
15234
+ $autocomplete.off('mousedown.autocomplete touchstart.autocomplete').on('mousedown.autocomplete touchstart.autocomplete', 'li', function () {
15235
+ var text = $(this).text().trim();
15236
+ $input.val(text);
15237
+ $input.trigger('change');
15238
+ removeAutocomplete();
15239
+
15240
+ // Handle onAutocomplete callback.
15241
+ if (typeof options.onAutocomplete === "function") {
15242
+ options.onAutocomplete.call(this, text);
15243
+ }
15244
+ });
15245
+
15246
+ // Empty data
15247
+ } else {
15248
+ $input.off('keyup.autocomplete focus.autocomplete');
15249
+ }
15250
+ });
15251
+ };
15252
+ }); // End of $(document).ready
15253
+
15254
+ /*******************
15255
+ * Select Plugin *
15256
+ ******************/
15257
+ $.fn.material_select = function (callback) {
15258
+ $(this).each(function () {
15259
+ var $select = $(this);
15260
+
15261
+ if ($select.hasClass('browser-default')) {
15262
+ return; // Continue to next (return false breaks out of entire loop)
15263
+ }
15264
+
15265
+ var multiple = $select.attr('multiple') ? true : false,
15266
+ lastID = $select.attr('data-select-id'); // Tear down structure if Select needs to be rebuilt
15267
+
15268
+ if (lastID) {
15269
+ $select.parent().find('span.caret').remove();
15270
+ $select.parent().find('input').remove();
15271
+
15272
+ $select.unwrap();
15273
+ $('ul#select-options-' + lastID).remove();
15274
+ }
15275
+
15276
+ // If destroying the select, remove the selelct-id and reset it to it's uninitialized state.
15277
+ if (callback === 'destroy') {
15278
+ $select.removeAttr('data-select-id').removeClass('initialized');
15279
+ $(window).off('click.select');
15280
+ return;
15281
+ }
15282
+
15283
+ var uniqueID = Materialize.guid();
15284
+ $select.attr('data-select-id', uniqueID);
15285
+ var wrapper = $('<div class="select-wrapper"></div>');
15286
+ wrapper.addClass($select.attr('class'));
15287
+ if ($select.is(':disabled')) wrapper.addClass('disabled');
15288
+ var options = $('<ul id="select-options-' + uniqueID + '" class="dropdown-content select-dropdown ' + (multiple ? 'multiple-select-dropdown' : '') + '"></ul>'),
15289
+ selectChildren = $select.children('option, optgroup'),
15290
+ valuesSelected = [],
15291
+ optionsHover = false;
15292
+
15293
+ var label = $select.find('option:selected').html() || $select.find('option:first').html() || "";
15294
+
15295
+ // Function that renders and appends the option taking into
15296
+ // account type and possible image icon.
15297
+ var appendOptionWithIcon = function (select, option, type) {
15298
+ // Add disabled attr if disabled
15299
+ var disabledClass = option.is(':disabled') ? 'disabled ' : '';
15300
+ var optgroupClass = type === 'optgroup-option' ? 'optgroup-option ' : '';
15301
+ var multipleCheckbox = multiple ? '<input type="checkbox"' + disabledClass + '/><label></label>' : '';
15302
+
15303
+ // add icons
15304
+ var icon_url = option.data('icon');
15305
+ var classes = option.attr('class');
15306
+ if (!!icon_url) {
15307
+ var classString = '';
15308
+ if (!!classes) classString = ' class="' + classes + '"';
15309
+
15310
+ // Check for multiple type.
15311
+ options.append($('<li class="' + disabledClass + optgroupClass + '"><img alt="" src="' + icon_url + '"' + classString + '><span>' + multipleCheckbox + option.html() + '</span></li>'));
15312
+ return true;
15313
+ }
15314
+
15315
+ // Check for multiple type.
15316
+ options.append($('<li class="' + disabledClass + optgroupClass + '"><span>' + multipleCheckbox + option.html() + '</span></li>'));
15317
+ };
15318
+
15319
+ /* Create dropdown structure. */
15320
+ if (selectChildren.length) {
15321
+ selectChildren.each(function () {
15322
+ if ($(this).is('option')) {
15323
+ // Direct descendant option.
15324
+ if (multiple) {
15325
+ appendOptionWithIcon($select, $(this), 'multiple');
15326
+ } else {
15327
+ appendOptionWithIcon($select, $(this));
15328
+ }
15329
+ } else if ($(this).is('optgroup')) {
15330
+ // Optgroup.
15331
+ var selectOptions = $(this).children('option');
15332
+ options.append($('<li class="optgroup"><span>' + $(this).attr('label') + '</span></li>'));
15333
+
15334
+ selectOptions.each(function () {
15335
+ appendOptionWithIcon($select, $(this), 'optgroup-option');
15336
+ });
15337
+ }
15338
+ });
15339
+ }
15340
+
15341
+ options.find('li:not(.optgroup)').each(function (i) {
15342
+ $(this).click(function (e) {
15343
+ // Check if option element is disabled
15344
+ if (!$(this).hasClass('disabled') && !$(this).hasClass('optgroup')) {
15345
+ var selected = true;
15346
+
15347
+ if (multiple) {
15348
+ $('input[type="checkbox"]', this).prop('checked', function (i, v) {
15349
+ return !v;
15350
+ });
15351
+ selected = toggleEntryFromArray(valuesSelected, i, $select);
15352
+ $newSelect.trigger('focus');
15353
+ } else {
15354
+ options.find('li').removeClass('active');
15355
+ $(this).toggleClass('active');
15356
+ $newSelect.val($(this).text());
15357
+ }
15358
+
15359
+ activateOption(options, $(this));
15360
+ $select.find('option').eq(i).prop('selected', selected);
15361
+ // Trigger onchange() event
15362
+ $select.trigger('change');
15363
+ if (typeof callback !== 'undefined') callback();
15364
+ }
15365
+
15366
+ e.stopPropagation();
15367
+ });
15368
+ });
15369
+
15370
+ // Wrap Elements
15371
+ $select.wrap(wrapper);
15372
+ // Add Select Display Element
15373
+ var dropdownIcon = $('<span class="caret">&#9660;</span>');
15374
+
15375
+ // escape double quotes
15376
+ var sanitizedLabelHtml = label.replace(/"/g, '&quot;');
15377
+
15378
+ var $newSelect = $('<input type="text" class="select-dropdown" readonly="true" ' + ($select.is(':disabled') ? 'disabled' : '') + ' data-activates="select-options-' + uniqueID + '" value="' + sanitizedLabelHtml + '"/>');
15379
+ $select.before($newSelect);
15380
+ $newSelect.before(dropdownIcon);
15381
+
15382
+ $newSelect.after(options);
15383
+ // Check if section element is disabled
15384
+ if (!$select.is(':disabled')) {
15385
+ $newSelect.dropdown({ 'hover': false });
15386
+ }
15387
+
15388
+ // Copy tabindex
15389
+ if ($select.attr('tabindex')) {
15390
+ $($newSelect[0]).attr('tabindex', $select.attr('tabindex'));
15391
+ }
15392
+
15393
+ $select.addClass('initialized');
15394
+
15395
+ $newSelect.on({
15396
+ 'focus': function () {
15397
+ if ($('ul.select-dropdown').not(options[0]).is(':visible')) {
15398
+ $('input.select-dropdown').trigger('close');
15399
+ $(window).off('click.select');
15400
+ }
15401
+ if (!options.is(':visible')) {
15402
+ $(this).trigger('open', ['focus']);
15403
+ var label = $(this).val();
15404
+ if (multiple && label.indexOf(',') >= 0) {
15405
+ label = label.split(',')[0];
15406
+ }
15407
+
15408
+ var selectedOption = options.find('li').filter(function () {
15409
+ return $(this).text().toLowerCase() === label.toLowerCase();
15410
+ })[0];
15411
+ activateOption(options, selectedOption, true);
15412
+
15413
+ $(window).off('click.select').on('click.select', function () {
15414
+ multiple && (optionsHover || $newSelect.trigger('close'));
15415
+ $(window).off('click.select');
15416
+ });
15417
+ }
15418
+ },
15419
+ 'click': function (e) {
15420
+ e.stopPropagation();
15421
+ }
15422
+ });
15423
+
15424
+ $newSelect.on('blur', function () {
15425
+ if (!multiple) {
15426
+ $(this).trigger('close');
15427
+ $(window).off('click.select');
15428
+ }
15429
+ options.find('li.selected').removeClass('selected');
15430
+ });
15431
+
15432
+ options.hover(function () {
15433
+ optionsHover = true;
15434
+ }, function () {
15435
+ optionsHover = false;
15436
+ });
15437
+
15438
+ // Add initial multiple selections.
15439
+ if (multiple) {
15440
+ $select.find("option:selected:not(:disabled)").each(function () {
15441
+ var index = $(this).index();
15442
+
15443
+ toggleEntryFromArray(valuesSelected, index, $select);
15444
+ options.find("li").eq(index).find(":checkbox").prop("checked", true);
15445
+ });
15446
+ }
15447
+
15448
+ /**
15449
+ * Make option as selected and scroll to selected position
15450
+ * @param {jQuery} collection Select options jQuery element
15451
+ * @param {Element} newOption element of the new option
15452
+ * @param {Boolean} firstActivation If on first activation of select
15453
+ */
15454
+ var activateOption = function (collection, newOption, firstActivation) {
15455
+ if (newOption) {
15456
+ collection.find('li.selected').removeClass('selected');
15457
+ var option = $(newOption);
15458
+ option.addClass('selected');
15459
+ if (!multiple || !!firstActivation) {
15460
+ options.scrollTo(option);
15461
+ }
15462
+ }
15463
+ };
15464
+
15465
+ // Allow user to search by typing
15466
+ // this array is cleared after 1 second
15467
+ var filterQuery = [],
15468
+ onKeyDown = function (e) {
15469
+ // TAB - switch to another input
15470
+ if (e.which == 9) {
15471
+ $newSelect.trigger('close');
15472
+ return;
15473
+ }
15474
+
15475
+ // ARROW DOWN WHEN SELECT IS CLOSED - open select options
15476
+ if (e.which == 40 && !options.is(':visible')) {
15477
+ $newSelect.trigger('open');
15478
+ return;
15479
+ }
15480
+
15481
+ // ENTER WHEN SELECT IS CLOSED - submit form
15482
+ if (e.which == 13 && !options.is(':visible')) {
15483
+ return;
15484
+ }
15485
+
15486
+ e.preventDefault();
15487
+
15488
+ // CASE WHEN USER TYPE LETTERS
15489
+ var letter = String.fromCharCode(e.which).toLowerCase(),
15490
+ nonLetters = [9, 13, 27, 38, 40];
15491
+ if (letter && nonLetters.indexOf(e.which) === -1) {
15492
+ filterQuery.push(letter);
15493
+
15494
+ var string = filterQuery.join(''),
15495
+ newOption = options.find('li').filter(function () {
15496
+ return $(this).text().toLowerCase().indexOf(string) === 0;
15497
+ })[0];
15498
+
15499
+ if (newOption) {
15500
+ activateOption(options, newOption);
15501
+ }
15502
+ }
15503
+
15504
+ // ENTER - select option and close when select options are opened
15505
+ if (e.which == 13) {
15506
+ var activeOption = options.find('li.selected:not(.disabled)')[0];
15507
+ if (activeOption) {
15508
+ $(activeOption).trigger('click');
15509
+ if (!multiple) {
15510
+ $newSelect.trigger('close');
15511
+ }
15512
+ }
15513
+ }
15514
+
15515
+ // ARROW DOWN - move to next not disabled option
15516
+ if (e.which == 40) {
15517
+ if (options.find('li.selected').length) {
15518
+ newOption = options.find('li.selected').next('li:not(.disabled)')[0];
15519
+ } else {
15520
+ newOption = options.find('li:not(.disabled)')[0];
15521
+ }
15522
+ activateOption(options, newOption);
15523
+ }
15524
+
15525
+ // ESC - close options
15526
+ if (e.which == 27) {
15527
+ $newSelect.trigger('close');
15528
+ }
15529
+
15530
+ // ARROW UP - move to previous not disabled option
15531
+ if (e.which == 38) {
15532
+ newOption = options.find('li.selected').prev('li:not(.disabled)')[0];
15533
+ if (newOption) activateOption(options, newOption);
15534
+ }
15535
+
15536
+ // Automaticaly clean filter query so user can search again by starting letters
15537
+ setTimeout(function () {
15538
+ filterQuery = [];
15539
+ }, 1000);
15540
+ };
15541
+
15542
+ $newSelect.on('keydown', onKeyDown);
15543
+ });
15544
+
15545
+ function toggleEntryFromArray(entriesArray, entryIndex, select) {
15546
+ var index = entriesArray.indexOf(entryIndex),
15547
+ notAdded = index === -1;
15548
+
15549
+ if (notAdded) {
15550
+ entriesArray.push(entryIndex);
15551
+ } else {
15552
+ entriesArray.splice(index, 1);
15553
+ }
15554
+
15555
+ select.siblings('ul.dropdown-content').find('li:not(.optgroup)').eq(entryIndex).toggleClass('active');
15556
+
15557
+ // use notAdded instead of true (to detect if the option is selected or not)
15558
+ select.find('option').eq(entryIndex).prop('selected', notAdded);
15559
+ setValueToInput(entriesArray, select);
15560
+
15561
+ return notAdded;
15562
+ }
15563
+
15564
+ function setValueToInput(entriesArray, select) {
15565
+ var value = '';
15566
+
15567
+ for (var i = 0, count = entriesArray.length; i < count; i++) {
15568
+ var text = select.find('option').eq(entriesArray[i]).text();
15569
+
15570
+ i === 0 ? value += text : value += ', ' + text;
15571
+ }
15572
+
15573
+ if (value === '') {
15574
+ value = select.find('option:disabled').eq(0).text();
15575
+ }
15576
+
15577
+ select.siblings('input.select-dropdown').val(value);
15578
+ }
15579
+ };
15580
+ })(jQuery);
15581
+ ;(function ($) {
15582
+
15583
+ var methods = {
15584
+
15585
+ init: function (options) {
15586
+ var defaults = {
15587
+ indicators: true,
15588
+ height: 400,
15589
+ transition: 500,
15590
+ interval: 6000
15591
+ };
15592
+ options = $.extend(defaults, options);
15593
+
15594
+ return this.each(function () {
15595
+
15596
+ // For each slider, we want to keep track of
15597
+ // which slide is active and its associated content
15598
+ var $this = $(this);
15599
+ var $slider = $this.find('ul.slides').first();
15600
+ var $slides = $slider.find('> li');
15601
+ var $active_index = $slider.find('.active').index();
15602
+ var $active, $indicators, $interval;
15603
+ if ($active_index != -1) {
15604
+ $active = $slides.eq($active_index);
15605
+ }
15606
+
15607
+ // Transitions the caption depending on alignment
15608
+ function captionTransition(caption, duration) {
15609
+ if (caption.hasClass("center-align")) {
15610
+ caption.velocity({ opacity: 0, translateY: -100 }, { duration: duration, queue: false });
15611
+ } else if (caption.hasClass("right-align")) {
15612
+ caption.velocity({ opacity: 0, translateX: 100 }, { duration: duration, queue: false });
15613
+ } else if (caption.hasClass("left-align")) {
15614
+ caption.velocity({ opacity: 0, translateX: -100 }, { duration: duration, queue: false });
15615
+ }
15616
+ }
15617
+
15618
+ // This function will transition the slide to any index of the next slide
15619
+ function moveToSlide(index) {
15620
+ // Wrap around indices.
15621
+ if (index >= $slides.length) index = 0;else if (index < 0) index = $slides.length - 1;
15622
+
15623
+ $active_index = $slider.find('.active').index();
15624
+
15625
+ // Only do if index changes
15626
+ if ($active_index != index) {
15627
+ $active = $slides.eq($active_index);
15628
+ $caption = $active.find('.caption');
15629
+
15630
+ $active.removeClass('active');
15631
+ $active.velocity({ opacity: 0 }, { duration: options.transition, queue: false, easing: 'easeOutQuad',
15632
+ complete: function () {
15633
+ $slides.not('.active').velocity({ opacity: 0, translateX: 0, translateY: 0 }, { duration: 0, queue: false });
15634
+ } });
15635
+ captionTransition($caption, options.transition);
15636
+
15637
+ // Update indicators
15638
+ if (options.indicators) {
15639
+ $indicators.eq($active_index).removeClass('active');
15640
+ }
15641
+
15642
+ $slides.eq(index).velocity({ opacity: 1 }, { duration: options.transition, queue: false, easing: 'easeOutQuad' });
15643
+ $slides.eq(index).find('.caption').velocity({ opacity: 1, translateX: 0, translateY: 0 }, { duration: options.transition, delay: options.transition, queue: false, easing: 'easeOutQuad' });
15644
+ $slides.eq(index).addClass('active');
15645
+
15646
+ // Update indicators
15647
+ if (options.indicators) {
15648
+ $indicators.eq(index).addClass('active');
15649
+ }
15650
+ }
15651
+ }
15652
+
15653
+ // Set height of slider
15654
+ // If fullscreen, do nothing
15655
+ if (!$this.hasClass('fullscreen')) {
15656
+ if (options.indicators) {
15657
+ // Add height if indicators are present
15658
+ $this.height(options.height + 40);
15659
+ } else {
15660
+ $this.height(options.height);
15661
+ }
15662
+ $slider.height(options.height);
15663
+ }
15664
+
15665
+ // Set initial positions of captions
15666
+ $slides.find('.caption').each(function () {
15667
+ captionTransition($(this), 0);
15668
+ });
15669
+
15670
+ // Move img src into background-image
15671
+ $slides.find('img').each(function () {
15672
+ var placeholderBase64 = 'data:image/gif;base64,R0lGODlhAQABAIABAP///wAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==';
15673
+ if ($(this).attr('src') !== placeholderBase64) {
15674
+ $(this).css('background-image', 'url("' + $(this).attr('src') + '")');
15675
+ $(this).attr('src', placeholderBase64);
15676
+ }
15677
+ });
15678
+
15679
+ // dynamically add indicators
15680
+ if (options.indicators) {
15681
+ $indicators = $('<ul class="indicators"></ul>');
15682
+ $slides.each(function (index) {
15683
+ var $indicator = $('<li class="indicator-item"></li>');
15684
+
15685
+ // Handle clicks on indicators
15686
+ $indicator.click(function () {
15687
+ var $parent = $slider.parent();
15688
+ var curr_index = $parent.find($(this)).index();
15689
+ moveToSlide(curr_index);
15690
+
15691
+ // reset interval
15692
+ clearInterval($interval);
15693
+ $interval = setInterval(function () {
15694
+ $active_index = $slider.find('.active').index();
15695
+ if ($slides.length == $active_index + 1) $active_index = 0; // loop to start
15696
+ else $active_index += 1;
15697
+
15698
+ moveToSlide($active_index);
15699
+ }, options.transition + options.interval);
15700
+ });
15701
+ $indicators.append($indicator);
15702
+ });
15703
+ $this.append($indicators);
15704
+ $indicators = $this.find('ul.indicators').find('li.indicator-item');
15705
+ }
15706
+
15707
+ if ($active) {
15708
+ $active.show();
15709
+ } else {
15710
+ $slides.first().addClass('active').velocity({ opacity: 1 }, { duration: options.transition, queue: false, easing: 'easeOutQuad' });
15711
+
15712
+ $active_index = 0;
15713
+ $active = $slides.eq($active_index);
15714
+
15715
+ // Update indicators
15716
+ if (options.indicators) {
15717
+ $indicators.eq($active_index).addClass('active');
15718
+ }
15719
+ }
15720
+
15721
+ // Adjust height to current slide
15722
+ $active.find('img').each(function () {
15723
+ $active.find('.caption').velocity({ opacity: 1, translateX: 0, translateY: 0 }, { duration: options.transition, queue: false, easing: 'easeOutQuad' });
15724
+ });
15725
+
15726
+ // auto scroll
15727
+ $interval = setInterval(function () {
15728
+ $active_index = $slider.find('.active').index();
15729
+ moveToSlide($active_index + 1);
15730
+ }, options.transition + options.interval);
15731
+
15732
+ // HammerJS, Swipe navigation
15733
+
15734
+ // Touch Event
15735
+ var panning = false;
15736
+ var swipeLeft = false;
15737
+ var swipeRight = false;
15738
+
15739
+ $this.hammer({
15740
+ prevent_default: false
15741
+ }).on('pan', function (e) {
15742
+ if (e.gesture.pointerType === "touch") {
15743
+
15744
+ // reset interval
15745
+ clearInterval($interval);
15746
+
15747
+ var direction = e.gesture.direction;
15748
+ var x = e.gesture.deltaX;
15749
+ var velocityX = e.gesture.velocityX;
15750
+ var velocityY = e.gesture.velocityY;
15751
+
15752
+ $curr_slide = $slider.find('.active');
15753
+ if (Math.abs(velocityX) > Math.abs(velocityY)) {
15754
+ $curr_slide.velocity({ translateX: x
15755
+ }, { duration: 50, queue: false, easing: 'easeOutQuad' });
15756
+ }
15757
+
15758
+ // Swipe Left
15759
+ if (direction === 4 && (x > $this.innerWidth() / 2 || velocityX < -0.65)) {
15760
+ swipeRight = true;
15761
+ }
15762
+ // Swipe Right
15763
+ else if (direction === 2 && (x < -1 * $this.innerWidth() / 2 || velocityX > 0.65)) {
15764
+ swipeLeft = true;
15765
+ }
15766
+
15767
+ // Make Slide Behind active slide visible
15768
+ var next_slide;
15769
+ if (swipeLeft) {
15770
+ next_slide = $curr_slide.next();
15771
+ if (next_slide.length === 0) {
15772
+ next_slide = $slides.first();
15773
+ }
15774
+ next_slide.velocity({ opacity: 1
15775
+ }, { duration: 300, queue: false, easing: 'easeOutQuad' });
15776
+ }
15777
+ if (swipeRight) {
15778
+ next_slide = $curr_slide.prev();
15779
+ if (next_slide.length === 0) {
15780
+ next_slide = $slides.last();
15781
+ }
15782
+ next_slide.velocity({ opacity: 1
15783
+ }, { duration: 300, queue: false, easing: 'easeOutQuad' });
15784
+ }
15785
+ }
15786
+ }).on('panend', function (e) {
15787
+ if (e.gesture.pointerType === "touch") {
15788
+
15789
+ $curr_slide = $slider.find('.active');
15790
+ panning = false;
15791
+ curr_index = $slider.find('.active').index();
15792
+
15793
+ if (!swipeRight && !swipeLeft || $slides.length <= 1) {
15794
+ // Return to original spot
15795
+ $curr_slide.velocity({ translateX: 0
15796
+ }, { duration: 300, queue: false, easing: 'easeOutQuad' });
15797
+ } else if (swipeLeft) {
15798
+ moveToSlide(curr_index + 1);
15799
+ $curr_slide.velocity({ translateX: -1 * $this.innerWidth() }, { duration: 300, queue: false, easing: 'easeOutQuad',
15800
+ complete: function () {
15801
+ $curr_slide.velocity({ opacity: 0, translateX: 0 }, { duration: 0, queue: false });
15802
+ } });
15803
+ } else if (swipeRight) {
15804
+ moveToSlide(curr_index - 1);
15805
+ $curr_slide.velocity({ translateX: $this.innerWidth() }, { duration: 300, queue: false, easing: 'easeOutQuad',
15806
+ complete: function () {
15807
+ $curr_slide.velocity({ opacity: 0, translateX: 0 }, { duration: 0, queue: false });
15808
+ } });
15809
+ }
15810
+ swipeLeft = false;
15811
+ swipeRight = false;
15812
+
15813
+ // Restart interval
15814
+ clearInterval($interval);
15815
+ $interval = setInterval(function () {
15816
+ $active_index = $slider.find('.active').index();
15817
+ if ($slides.length == $active_index + 1) $active_index = 0; // loop to start
15818
+ else $active_index += 1;
15819
+
15820
+ moveToSlide($active_index);
15821
+ }, options.transition + options.interval);
15822
+ }
15823
+ });
15824
+
15825
+ $this.on('sliderPause', function () {
15826
+ clearInterval($interval);
15827
+ });
15828
+
15829
+ $this.on('sliderStart', function () {
15830
+ clearInterval($interval);
15831
+ $interval = setInterval(function () {
15832
+ $active_index = $slider.find('.active').index();
15833
+ if ($slides.length == $active_index + 1) $active_index = 0; // loop to start
15834
+ else $active_index += 1;
15835
+
15836
+ moveToSlide($active_index);
15837
+ }, options.transition + options.interval);
15838
+ });
15839
+
15840
+ $this.on('sliderNext', function () {
15841
+ $active_index = $slider.find('.active').index();
15842
+ moveToSlide($active_index + 1);
15843
+ });
15844
+
15845
+ $this.on('sliderPrev', function () {
15846
+ $active_index = $slider.find('.active').index();
15847
+ moveToSlide($active_index - 1);
15848
+ });
15849
+ });
15850
+ },
15851
+ pause: function () {
15852
+ $(this).trigger('sliderPause');
15853
+ },
15854
+ start: function () {
15855
+ $(this).trigger('sliderStart');
15856
+ },
15857
+ next: function () {
15858
+ $(this).trigger('sliderNext');
15859
+ },
15860
+ prev: function () {
15861
+ $(this).trigger('sliderPrev');
15862
+ }
15863
+ };
15864
+
15865
+ $.fn.slider = function (methodOrOptions) {
15866
+ if (methods[methodOrOptions]) {
15867
+ return methods[methodOrOptions].apply(this, Array.prototype.slice.call(arguments, 1));
15868
+ } else if (typeof methodOrOptions === 'object' || !methodOrOptions) {
15869
+ // Default to "init"
15870
+ return methods.init.apply(this, arguments);
15871
+ } else {
15872
+ $.error('Method ' + methodOrOptions + ' does not exist on jQuery.tooltip');
15873
+ }
15874
+ }; // Plugin end
15875
+ })(jQuery);
15876
+ ;(function ($) {
15877
+ $(document).ready(function () {
15878
+
15879
+ $(document).on('click.card', '.card', function (e) {
15880
+ if ($(this).find('> .card-reveal').length) {
15881
+ var $card = $(e.target).closest('.card');
15882
+ if ($card.data('initialOverflow') === undefined) {
15883
+ $card.data('initialOverflow', $card.css('overflow') === undefined ? '' : $card.css('overflow'));
15884
+ }
15885
+ if ($(e.target).is($('.card-reveal .card-title')) || $(e.target).is($('.card-reveal .card-title i'))) {
15886
+ // Make Reveal animate down and display none
15887
+ $(this).find('.card-reveal').velocity({ translateY: 0 }, {
15888
+ duration: 225,
15889
+ queue: false,
15890
+ easing: 'easeInOutQuad',
15891
+ complete: function () {
15892
+ $(this).css({ display: 'none' });
15893
+ $card.css('overflow', $card.data('initialOverflow'));
15894
+ }
15895
+ });
15896
+ } else if ($(e.target).is($('.card .activator')) || $(e.target).is($('.card .activator i'))) {
15897
+ $card.css('overflow', 'hidden');
15898
+ $(this).find('.card-reveal').css({ display: 'block' }).velocity("stop", false).velocity({ translateY: '-100%' }, { duration: 300, queue: false, easing: 'easeInOutQuad' });
15899
+ }
15900
+ }
15901
+ });
15902
+ });
15903
+ })(jQuery);
15904
+ ;(function ($) {
15905
+ var materialChipsDefaults = {
15906
+ data: [],
15907
+ placeholder: '',
15908
+ secondaryPlaceholder: '',
15909
+ autocompleteOptions: {}
15910
+ };
15911
+
15912
+ $(document).ready(function () {
15913
+ // Handle removal of static chips.
15914
+ $(document).on('click', '.chip .close', function (e) {
15915
+ var $chips = $(this).closest('.chips');
15916
+ if ($chips.attr('data-initialized')) {
15917
+ return;
15918
+ }
15919
+ $(this).closest('.chip').remove();
15920
+ });
15921
+ });
15922
+
15923
+ $.fn.material_chip = function (options) {
15924
+ var self = this;
15925
+ this.$el = $(this);
15926
+ this.$document = $(document);
15927
+ this.SELS = {
15928
+ CHIPS: '.chips',
15929
+ CHIP: '.chip',
15930
+ INPUT: 'input',
15931
+ DELETE: '.material-icons',
15932
+ SELECTED_CHIP: '.selected'
15933
+ };
15934
+
15935
+ if ('data' === options) {
15936
+ return this.$el.data('chips');
15937
+ }
15938
+
15939
+ var curr_options = $.extend({}, materialChipsDefaults, options);
15940
+ self.hasAutocomplete = !$.isEmptyObject(curr_options.autocompleteOptions.data);
15941
+
15942
+ // Initialize
15943
+ this.init = function () {
15944
+ var i = 0;
15945
+ var chips;
15946
+ self.$el.each(function () {
15947
+ var $chips = $(this);
15948
+ var chipId = Materialize.guid();
15949
+ self.chipId = chipId;
15950
+
15951
+ if (!curr_options.data || !(curr_options.data instanceof Array)) {
15952
+ curr_options.data = [];
15953
+ }
15954
+ $chips.data('chips', curr_options.data);
15955
+ $chips.attr('data-index', i);
15956
+ $chips.attr('data-initialized', true);
15957
+
15958
+ if (!$chips.hasClass(self.SELS.CHIPS)) {
15959
+ $chips.addClass('chips');
15960
+ }
15961
+
15962
+ self.chips($chips, chipId);
15963
+ i++;
15964
+ });
15965
+ };
15966
+
15967
+ this.handleEvents = function () {
15968
+ var SELS = self.SELS;
15969
+
15970
+ self.$document.off('click.chips-focus', SELS.CHIPS).on('click.chips-focus', SELS.CHIPS, function (e) {
15971
+ $(e.target).find(SELS.INPUT).focus();
15972
+ });
15973
+
15974
+ self.$document.off('click.chips-select', SELS.CHIP).on('click.chips-select', SELS.CHIP, function (e) {
15975
+ var $chip = $(e.target);
15976
+ if ($chip.length) {
15977
+ var wasSelected = $chip.hasClass('selected');
15978
+ var $chips = $chip.closest(SELS.CHIPS);
15979
+ $(SELS.CHIP).removeClass('selected');
15980
+
15981
+ if (!wasSelected) {
15982
+ self.selectChip($chip.index(), $chips);
15983
+ }
15984
+ }
15985
+ });
15986
+
15987
+ self.$document.off('keydown.chips').on('keydown.chips', function (e) {
15988
+ if ($(e.target).is('input, textarea')) {
15989
+ return;
15990
+ }
15991
+
15992
+ // delete
15993
+ var $chip = self.$document.find(SELS.CHIP + SELS.SELECTED_CHIP);
15994
+ var $chips = $chip.closest(SELS.CHIPS);
15995
+ var length = $chip.siblings(SELS.CHIP).length;
15996
+ var index;
15997
+
15998
+ if (!$chip.length) {
15999
+ return;
16000
+ }
16001
+
16002
+ if (e.which === 8 || e.which === 46) {
16003
+ e.preventDefault();
16004
+
16005
+ index = $chip.index();
16006
+ self.deleteChip(index, $chips);
16007
+
16008
+ var selectIndex = null;
16009
+ if (index + 1 < length) {
16010
+ selectIndex = index;
16011
+ } else if (index === length || index + 1 === length) {
16012
+ selectIndex = length - 1;
16013
+ }
16014
+
16015
+ if (selectIndex < 0) selectIndex = null;
16016
+
16017
+ if (null !== selectIndex) {
16018
+ self.selectChip(selectIndex, $chips);
16019
+ }
16020
+ if (!length) $chips.find('input').focus();
16021
+
16022
+ // left
16023
+ } else if (e.which === 37) {
16024
+ index = $chip.index() - 1;
16025
+ if (index < 0) {
16026
+ return;
16027
+ }
16028
+ $(SELS.CHIP).removeClass('selected');
16029
+ self.selectChip(index, $chips);
16030
+
16031
+ // right
16032
+ } else if (e.which === 39) {
16033
+ index = $chip.index() + 1;
16034
+ $(SELS.CHIP).removeClass('selected');
16035
+ if (index > length) {
16036
+ $chips.find('input').focus();
16037
+ return;
16038
+ }
16039
+ self.selectChip(index, $chips);
16040
+ }
16041
+ });
16042
+
16043
+ self.$document.off('focusin.chips', SELS.CHIPS + ' ' + SELS.INPUT).on('focusin.chips', SELS.CHIPS + ' ' + SELS.INPUT, function (e) {
16044
+ var $currChips = $(e.target).closest(SELS.CHIPS);
16045
+ $currChips.addClass('focus');
16046
+ $currChips.siblings('label, .prefix').addClass('active');
16047
+ $(SELS.CHIP).removeClass('selected');
16048
+ });
16049
+
16050
+ self.$document.off('focusout.chips', SELS.CHIPS + ' ' + SELS.INPUT).on('focusout.chips', SELS.CHIPS + ' ' + SELS.INPUT, function (e) {
16051
+ var $currChips = $(e.target).closest(SELS.CHIPS);
16052
+ $currChips.removeClass('focus');
16053
+
16054
+ // Remove active if empty
16055
+ if ($currChips.data('chips') === undefined || !$currChips.data('chips').length) {
16056
+ $currChips.siblings('label').removeClass('active');
16057
+ }
16058
+ $currChips.siblings('.prefix').removeClass('active');
16059
+ });
16060
+
16061
+ self.$document.off('keydown.chips-add', SELS.CHIPS + ' ' + SELS.INPUT).on('keydown.chips-add', SELS.CHIPS + ' ' + SELS.INPUT, function (e) {
16062
+ var $target = $(e.target);
16063
+ var $chips = $target.closest(SELS.CHIPS);
16064
+ var chipsLength = $chips.children(SELS.CHIP).length;
16065
+
16066
+ // enter
16067
+ if (13 === e.which) {
16068
+ // Override enter if autocompleting.
16069
+ if (self.hasAutocomplete && $chips.find('.autocomplete-content.dropdown-content').length && $chips.find('.autocomplete-content.dropdown-content').children().length) {
16070
+ return;
16071
+ }
16072
+
16073
+ e.preventDefault();
16074
+ self.addChip({ tag: $target.val() }, $chips);
16075
+ $target.val('');
16076
+ return;
16077
+ }
16078
+
16079
+ // delete or left
16080
+ if ((8 === e.keyCode || 37 === e.keyCode) && '' === $target.val() && chipsLength) {
16081
+ e.preventDefault();
16082
+ self.selectChip(chipsLength - 1, $chips);
16083
+ $target.blur();
16084
+ return;
16085
+ }
16086
+ });
16087
+
16088
+ // Click on delete icon in chip.
16089
+ self.$document.off('click.chips-delete', SELS.CHIPS + ' ' + SELS.DELETE).on('click.chips-delete', SELS.CHIPS + ' ' + SELS.DELETE, function (e) {
16090
+ var $target = $(e.target);
16091
+ var $chips = $target.closest(SELS.CHIPS);
16092
+ var $chip = $target.closest(SELS.CHIP);
16093
+ e.stopPropagation();
16094
+ self.deleteChip($chip.index(), $chips);
16095
+ $chips.find('input').focus();
16096
+ });
16097
+ };
16098
+
16099
+ this.chips = function ($chips, chipId) {
16100
+ $chips.empty();
16101
+ $chips.data('chips').forEach(function (elem) {
16102
+ $chips.append(self.renderChip(elem));
16103
+ });
16104
+ $chips.append($('<input id="' + chipId + '" class="input" placeholder="">'));
16105
+ self.setPlaceholder($chips);
16106
+
16107
+ // Set for attribute for label
16108
+ var label = $chips.next('label');
16109
+ if (label.length) {
16110
+ label.attr('for', chipId);
16111
+
16112
+ if ($chips.data('chips') !== undefined && $chips.data('chips').length) {
16113
+ label.addClass('active');
16114
+ }
16115
+ }
16116
+
16117
+ // Setup autocomplete if needed.
16118
+ var input = $('#' + chipId);
16119
+ if (self.hasAutocomplete) {
16120
+ curr_options.autocompleteOptions.onAutocomplete = function (val) {
16121
+ self.addChip({ tag: val }, $chips);
16122
+ input.val('');
16123
+ input.focus();
16124
+ };
16125
+ input.autocomplete(curr_options.autocompleteOptions);
16126
+ }
16127
+ };
16128
+
16129
+ /**
16130
+ * Render chip jQuery element.
16131
+ * @param {Object} elem
16132
+ * @return {jQuery}
16133
+ */
16134
+ this.renderChip = function (elem) {
16135
+ if (!elem.tag) return;
16136
+
16137
+ var $renderedChip = $('<div class="chip"></div>');
16138
+ $renderedChip.text(elem.tag);
16139
+ if (elem.image) {
16140
+ $renderedChip.prepend($('<img />').attr('src', elem.image));
16141
+ }
16142
+ $renderedChip.append($('<i class="material-icons close">close</i>'));
16143
+ return $renderedChip;
16144
+ };
16145
+
16146
+ this.setPlaceholder = function ($chips) {
16147
+ if ($chips.data('chips') !== undefined && !$chips.data('chips').length && curr_options.placeholder) {
16148
+ $chips.find('input').prop('placeholder', curr_options.placeholder);
16149
+ } else if (($chips.data('chips') === undefined || !!$chips.data('chips').length) && curr_options.secondaryPlaceholder) {
16150
+ $chips.find('input').prop('placeholder', curr_options.secondaryPlaceholder);
16151
+ }
16152
+ };
16153
+
16154
+ this.isValid = function ($chips, elem) {
16155
+ var chips = $chips.data('chips');
16156
+ var exists = false;
16157
+ for (var i = 0; i < chips.length; i++) {
16158
+ if (chips[i].tag === elem.tag) {
16159
+ exists = true;
16160
+ return;
16161
+ }
16162
+ }
16163
+ return '' !== elem.tag && !exists;
16164
+ };
16165
+
16166
+ this.addChip = function (elem, $chips) {
16167
+ if (!self.isValid($chips, elem)) {
16168
+ return;
16169
+ }
16170
+ var $renderedChip = self.renderChip(elem);
16171
+ var newData = [];
16172
+ var oldData = $chips.data('chips');
16173
+ for (var i = 0; i < oldData.length; i++) {
16174
+ newData.push(oldData[i]);
16175
+ }
16176
+ newData.push(elem);
16177
+
16178
+ $chips.data('chips', newData);
16179
+ $renderedChip.insertBefore($chips.find('input'));
16180
+ $chips.trigger('chip.add', elem);
16181
+ self.setPlaceholder($chips);
16182
+ };
16183
+
16184
+ this.deleteChip = function (chipIndex, $chips) {
16185
+ var chip = $chips.data('chips')[chipIndex];
16186
+ $chips.find('.chip').eq(chipIndex).remove();
16187
+
16188
+ var newData = [];
16189
+ var oldData = $chips.data('chips');
16190
+ for (var i = 0; i < oldData.length; i++) {
16191
+ if (i !== chipIndex) {
16192
+ newData.push(oldData[i]);
16193
+ }
16194
+ }
16195
+
16196
+ $chips.data('chips', newData);
16197
+ $chips.trigger('chip.delete', chip);
16198
+ self.setPlaceholder($chips);
16199
+ };
16200
+
16201
+ this.selectChip = function (chipIndex, $chips) {
16202
+ var $chip = $chips.find('.chip').eq(chipIndex);
16203
+ if ($chip && false === $chip.hasClass('selected')) {
16204
+ $chip.addClass('selected');
16205
+ $chips.trigger('chip.select', $chips.data('chips')[chipIndex]);
16206
+ }
16207
+ };
16208
+
16209
+ this.getChipsElement = function (index, $chips) {
16210
+ return $chips.eq(index);
16211
+ };
16212
+
16213
+ // init
16214
+ this.init();
16215
+
16216
+ this.handleEvents();
16217
+ };
16218
+ })(jQuery);
16219
+ ;(function ($) {
16220
+ $.fn.pushpin = function (options) {
16221
+ // Defaults
16222
+ var defaults = {
16223
+ top: 0,
16224
+ bottom: Infinity,
16225
+ offset: 0
16226
+ };
16227
+
16228
+ // Remove pushpin event and classes
16229
+ if (options === "remove") {
16230
+ this.each(function () {
16231
+ if (id = $(this).data('pushpin-id')) {
16232
+ $(window).off('scroll.' + id);
16233
+ $(this).removeData('pushpin-id').removeClass('pin-top pinned pin-bottom').removeAttr('style');
16234
+ }
16235
+ });
16236
+ return false;
16237
+ }
16238
+
16239
+ options = $.extend(defaults, options);
16240
+
16241
+ $index = 0;
16242
+ return this.each(function () {
16243
+ var $uniqueId = Materialize.guid(),
16244
+ $this = $(this),
16245
+ $original_offset = $(this).offset().top;
16246
+
16247
+ function removePinClasses(object) {
16248
+ object.removeClass('pin-top');
16249
+ object.removeClass('pinned');
16250
+ object.removeClass('pin-bottom');
16251
+ }
16252
+
16253
+ function updateElements(objects, scrolled) {
16254
+ objects.each(function () {
16255
+ // Add position fixed (because its between top and bottom)
16256
+ if (options.top <= scrolled && options.bottom >= scrolled && !$(this).hasClass('pinned')) {
16257
+ removePinClasses($(this));
16258
+ $(this).css('top', options.offset);
16259
+ $(this).addClass('pinned');
16260
+ }
16261
+
16262
+ // Add pin-top (when scrolled position is above top)
16263
+ if (scrolled < options.top && !$(this).hasClass('pin-top')) {
16264
+ removePinClasses($(this));
16265
+ $(this).css('top', 0);
16266
+ $(this).addClass('pin-top');
16267
+ }
16268
+
16269
+ // Add pin-bottom (when scrolled position is below bottom)
16270
+ if (scrolled > options.bottom && !$(this).hasClass('pin-bottom')) {
16271
+ removePinClasses($(this));
16272
+ $(this).addClass('pin-bottom');
16273
+ $(this).css('top', options.bottom - $original_offset);
16274
+ }
16275
+ });
16276
+ }
16277
+
16278
+ $(this).data('pushpin-id', $uniqueId);
16279
+ updateElements($this, $(window).scrollTop());
16280
+ $(window).on('scroll.' + $uniqueId, function () {
16281
+ var $scrolled = $(window).scrollTop() + options.offset;
16282
+ updateElements($this, $scrolled);
16283
+ });
16284
+ });
16285
+ };
16286
+ })(jQuery);;(function ($) {
16287
+ $(document).ready(function () {
16288
+
16289
+ // jQuery reverse
16290
+ $.fn.reverse = [].reverse;
16291
+
16292
+ // Hover behaviour: make sure this doesn't work on .click-to-toggle FABs!
16293
+ $(document).on('mouseenter.fixedActionBtn', '.fixed-action-btn:not(.click-to-toggle):not(.toolbar)', function (e) {
16294
+ var $this = $(this);
16295
+ openFABMenu($this);
16296
+ });
16297
+ $(document).on('mouseleave.fixedActionBtn', '.fixed-action-btn:not(.click-to-toggle):not(.toolbar)', function (e) {
16298
+ var $this = $(this);
16299
+ closeFABMenu($this);
16300
+ });
16301
+
16302
+ // Toggle-on-click behaviour.
16303
+ $(document).on('click.fabClickToggle', '.fixed-action-btn.click-to-toggle > a', function (e) {
16304
+ var $this = $(this);
16305
+ var $menu = $this.parent();
16306
+ if ($menu.hasClass('active')) {
16307
+ closeFABMenu($menu);
16308
+ } else {
16309
+ openFABMenu($menu);
16310
+ }
16311
+ });
16312
+
16313
+ // Toolbar transition behaviour.
16314
+ $(document).on('click.fabToolbar', '.fixed-action-btn.toolbar > a', function (e) {
16315
+ var $this = $(this);
16316
+ var $menu = $this.parent();
16317
+ FABtoToolbar($menu);
16318
+ });
16319
+ });
16320
+
16321
+ $.fn.extend({
16322
+ openFAB: function () {
16323
+ openFABMenu($(this));
16324
+ },
16325
+ closeFAB: function () {
16326
+ closeFABMenu($(this));
16327
+ },
16328
+ openToolbar: function () {
16329
+ FABtoToolbar($(this));
16330
+ },
16331
+ closeToolbar: function () {
16332
+ toolbarToFAB($(this));
16333
+ }
16334
+ });
16335
+
16336
+ var openFABMenu = function (btn) {
16337
+ var $this = btn;
16338
+ if ($this.hasClass('active') === false) {
16339
+
16340
+ // Get direction option
16341
+ var horizontal = $this.hasClass('horizontal');
16342
+ var offsetY, offsetX;
16343
+
16344
+ if (horizontal === true) {
16345
+ offsetX = 40;
16346
+ } else {
16347
+ offsetY = 40;
16348
+ }
16349
+
16350
+ $this.addClass('active');
16351
+ $this.find('ul .btn-floating').velocity({ scaleY: ".4", scaleX: ".4", translateY: offsetY + 'px', translateX: offsetX + 'px' }, { duration: 0 });
16352
+
16353
+ var time = 0;
16354
+ $this.find('ul .btn-floating').reverse().each(function () {
16355
+ $(this).velocity({ opacity: "1", scaleX: "1", scaleY: "1", translateY: "0", translateX: '0' }, { duration: 80, delay: time });
16356
+ time += 40;
16357
+ });
16358
+ }
16359
+ };
16360
+
16361
+ var closeFABMenu = function (btn) {
16362
+ var $this = btn;
16363
+ // Get direction option
16364
+ var horizontal = $this.hasClass('horizontal');
16365
+ var offsetY, offsetX;
16366
+
16367
+ if (horizontal === true) {
16368
+ offsetX = 40;
16369
+ } else {
16370
+ offsetY = 40;
16371
+ }
16372
+
16373
+ $this.removeClass('active');
16374
+ var time = 0;
16375
+ $this.find('ul .btn-floating').velocity("stop", true);
16376
+ $this.find('ul .btn-floating').velocity({ opacity: "0", scaleX: ".4", scaleY: ".4", translateY: offsetY + 'px', translateX: offsetX + 'px' }, { duration: 80 });
16377
+ };
16378
+
16379
+ /**
16380
+ * Transform FAB into toolbar
16381
+ * @param {Object} object jQuery object
16382
+ */
16383
+ var FABtoToolbar = function (btn) {
16384
+ if (btn.attr('data-open') === "true") {
16385
+ return;
16386
+ }
16387
+
16388
+ var offsetX, offsetY, scaleFactor;
16389
+ var windowWidth = window.innerWidth;
16390
+ var windowHeight = window.innerHeight;
16391
+ var btnRect = btn[0].getBoundingClientRect();
16392
+ var anchor = btn.find('> a').first();
16393
+ var menu = btn.find('> ul').first();
16394
+ var backdrop = $('<div class="fab-backdrop"></div>');
16395
+ var fabColor = anchor.css('background-color');
16396
+ anchor.append(backdrop);
16397
+
16398
+ offsetX = btnRect.left - windowWidth / 2 + btnRect.width / 2;
16399
+ offsetY = windowHeight - btnRect.bottom;
16400
+ scaleFactor = windowWidth / backdrop.width();
16401
+ btn.attr('data-origin-bottom', btnRect.bottom);
16402
+ btn.attr('data-origin-left', btnRect.left);
16403
+ btn.attr('data-origin-width', btnRect.width);
16404
+
16405
+ // Set initial state
16406
+ btn.addClass('active');
16407
+ btn.attr('data-open', true);
16408
+ btn.css({
16409
+ 'text-align': 'center',
16410
+ width: '100%',
16411
+ bottom: 0,
16412
+ left: 0,
16413
+ transform: 'translateX(' + offsetX + 'px)',
16414
+ transition: 'none'
16415
+ });
16416
+ anchor.css({
16417
+ transform: 'translateY(' + -offsetY + 'px)',
16418
+ transition: 'none'
16419
+ });
16420
+ backdrop.css({
16421
+ 'background-color': fabColor
16422
+ });
16423
+
16424
+ setTimeout(function () {
16425
+ btn.css({
16426
+ transform: '',
16427
+ transition: 'transform .2s cubic-bezier(0.550, 0.085, 0.680, 0.530), background-color 0s linear .2s'
16428
+ });
16429
+ anchor.css({
16430
+ overflow: 'visible',
16431
+ transform: '',
16432
+ transition: 'transform .2s'
16433
+ });
16434
+
16435
+ setTimeout(function () {
16436
+ btn.css({
16437
+ overflow: 'hidden',
16438
+ 'background-color': fabColor
16439
+ });
16440
+ backdrop.css({
16441
+ transform: 'scale(' + scaleFactor + ')',
16442
+ transition: 'transform .2s cubic-bezier(0.550, 0.055, 0.675, 0.190)'
16443
+ });
16444
+ menu.find('> li > a').css({
16445
+ opacity: 1
16446
+ });
16447
+
16448
+ // Scroll to close.
16449
+ $(window).on('scroll.fabToolbarClose', function () {
16450
+ toolbarToFAB(btn);
16451
+ $(window).off('scroll.fabToolbarClose');
16452
+ $(document).off('click.fabToolbarClose');
16453
+ });
16454
+
16455
+ $(document).on('click.fabToolbarClose', function (e) {
16456
+ if (!$(e.target).closest(menu).length) {
16457
+ toolbarToFAB(btn);
16458
+ $(window).off('scroll.fabToolbarClose');
16459
+ $(document).off('click.fabToolbarClose');
16460
+ }
16461
+ });
16462
+ }, 100);
16463
+ }, 0);
16464
+ };
16465
+
16466
+ /**
16467
+ * Transform toolbar back into FAB
16468
+ * @param {Object} object jQuery object
16469
+ */
16470
+ var toolbarToFAB = function (btn) {
16471
+ if (btn.attr('data-open') !== "true") {
16472
+ return;
16473
+ }
16474
+
16475
+ var offsetX, offsetY, scaleFactor;
16476
+ var windowWidth = window.innerWidth;
16477
+ var windowHeight = window.innerHeight;
16478
+ var btnWidth = btn.attr('data-origin-width');
16479
+ var btnBottom = btn.attr('data-origin-bottom');
16480
+ var btnLeft = btn.attr('data-origin-left');
16481
+ var anchor = btn.find('> .btn-floating').first();
16482
+ var menu = btn.find('> ul').first();
16483
+ var backdrop = btn.find('.fab-backdrop');
16484
+ var fabColor = anchor.css('background-color');
16485
+
16486
+ offsetX = btnLeft - windowWidth / 2 + btnWidth / 2;
16487
+ offsetY = windowHeight - btnBottom;
16488
+ scaleFactor = windowWidth / backdrop.width();
16489
+
16490
+ // Hide backdrop
16491
+ btn.removeClass('active');
16492
+ btn.attr('data-open', false);
16493
+ btn.css({
16494
+ 'background-color': 'transparent',
16495
+ transition: 'none'
16496
+ });
16497
+ anchor.css({
16498
+ transition: 'none'
16499
+ });
16500
+ backdrop.css({
16501
+ transform: 'scale(0)',
16502
+ 'background-color': fabColor
16503
+ });
16504
+ menu.find('> li > a').css({
16505
+ opacity: ''
16506
+ });
16507
+
16508
+ setTimeout(function () {
16509
+ backdrop.remove();
16510
+
16511
+ // Set initial state.
16512
+ btn.css({
16513
+ 'text-align': '',
16514
+ width: '',
16515
+ bottom: '',
16516
+ left: '',
16517
+ overflow: '',
16518
+ 'background-color': '',
16519
+ transform: 'translate3d(' + -offsetX + 'px,0,0)'
16520
+ });
16521
+ anchor.css({
16522
+ overflow: '',
16523
+ transform: 'translate3d(0,' + offsetY + 'px,0)'
16524
+ });
16525
+
16526
+ setTimeout(function () {
16527
+ btn.css({
16528
+ transform: 'translate3d(0,0,0)',
16529
+ transition: 'transform .2s'
16530
+ });
16531
+ anchor.css({
16532
+ transform: 'translate3d(0,0,0)',
16533
+ transition: 'transform .2s cubic-bezier(0.550, 0.055, 0.675, 0.190)'
16534
+ });
16535
+ }, 20);
16536
+ }, 200);
16537
+ };
16538
+ })(jQuery);
16539
+ ;(function ($) {
16540
+ // Image transition function
16541
+ Materialize.fadeInImage = function (selectorOrEl) {
16542
+ var element;
16543
+ if (typeof selectorOrEl === 'string') {
16544
+ element = $(selectorOrEl);
16545
+ } else if (typeof selectorOrEl === 'object') {
16546
+ element = selectorOrEl;
16547
+ } else {
16548
+ return;
16549
+ }
16550
+ element.css({ opacity: 0 });
16551
+ $(element).velocity({ opacity: 1 }, {
16552
+ duration: 650,
16553
+ queue: false,
16554
+ easing: 'easeOutSine'
16555
+ });
16556
+ $(element).velocity({ opacity: 1 }, {
16557
+ duration: 1300,
16558
+ queue: false,
16559
+ easing: 'swing',
16560
+ step: function (now, fx) {
16561
+ fx.start = 100;
16562
+ var grayscale_setting = now / 100;
16563
+ var brightness_setting = 150 - (100 - now) / 1.75;
16564
+
16565
+ if (brightness_setting < 100) {
16566
+ brightness_setting = 100;
16567
+ }
16568
+ if (now >= 0) {
16569
+ $(this).css({
16570
+ "-webkit-filter": "grayscale(" + grayscale_setting + ")" + "brightness(" + brightness_setting + "%)",
16571
+ "filter": "grayscale(" + grayscale_setting + ")" + "brightness(" + brightness_setting + "%)"
16572
+ });
16573
+ }
16574
+ }
16575
+ });
16576
+ };
16577
+
16578
+ // Horizontal staggered list
16579
+ Materialize.showStaggeredList = function (selectorOrEl) {
16580
+ var element;
16581
+ if (typeof selectorOrEl === 'string') {
16582
+ element = $(selectorOrEl);
16583
+ } else if (typeof selectorOrEl === 'object') {
16584
+ element = selectorOrEl;
16585
+ } else {
16586
+ return;
16587
+ }
16588
+ var time = 0;
16589
+ element.find('li').velocity({ translateX: "-100px" }, { duration: 0 });
16590
+
16591
+ element.find('li').each(function () {
16592
+ $(this).velocity({ opacity: "1", translateX: "0" }, { duration: 800, delay: time, easing: [60, 10] });
16593
+ time += 120;
16594
+ });
16595
+ };
16596
+
16597
+ $(document).ready(function () {
16598
+ // Hardcoded .staggered-list scrollFire
16599
+ // var staggeredListOptions = [];
16600
+ // $('ul.staggered-list').each(function (i) {
16601
+
16602
+ // var label = 'scrollFire-' + i;
16603
+ // $(this).addClass(label);
16604
+ // staggeredListOptions.push(
16605
+ // {selector: 'ul.staggered-list.' + label,
16606
+ // offset: 200,
16607
+ // callback: 'showStaggeredList("ul.staggered-list.' + label + '")'});
16608
+ // });
16609
+ // scrollFire(staggeredListOptions);
16610
+
16611
+ // HammerJS, Swipe navigation
16612
+
16613
+ // Touch Event
16614
+ var swipeLeft = false;
16615
+ var swipeRight = false;
16616
+
16617
+ // Dismissible Collections
16618
+ $('.dismissable').each(function () {
16619
+ $(this).hammer({
16620
+ prevent_default: false
16621
+ }).on('pan', function (e) {
16622
+ if (e.gesture.pointerType === "touch") {
16623
+ var $this = $(this);
16624
+ var direction = e.gesture.direction;
16625
+ var x = e.gesture.deltaX;
16626
+ var velocityX = e.gesture.velocityX;
16627
+
16628
+ $this.velocity({ translateX: x
16629
+ }, { duration: 50, queue: false, easing: 'easeOutQuad' });
16630
+
16631
+ // Swipe Left
16632
+ if (direction === 4 && (x > $this.innerWidth() / 2 || velocityX < -0.75)) {
16633
+ swipeLeft = true;
16634
+ }
16635
+
16636
+ // Swipe Right
16637
+ if (direction === 2 && (x < -1 * $this.innerWidth() / 2 || velocityX > 0.75)) {
16638
+ swipeRight = true;
16639
+ }
16640
+ }
16641
+ }).on('panend', function (e) {
16642
+ // Reset if collection is moved back into original position
16643
+ if (Math.abs(e.gesture.deltaX) < $(this).innerWidth() / 2) {
16644
+ swipeRight = false;
16645
+ swipeLeft = false;
16646
+ }
16647
+
16648
+ if (e.gesture.pointerType === "touch") {
16649
+ var $this = $(this);
16650
+ if (swipeLeft || swipeRight) {
16651
+ var fullWidth;
16652
+ if (swipeLeft) {
16653
+ fullWidth = $this.innerWidth();
16654
+ } else {
16655
+ fullWidth = -1 * $this.innerWidth();
16656
+ }
16657
+
16658
+ $this.velocity({ translateX: fullWidth
16659
+ }, { duration: 100, queue: false, easing: 'easeOutQuad', complete: function () {
16660
+ $this.css('border', 'none');
16661
+ $this.velocity({ height: 0, padding: 0
16662
+ }, { duration: 200, queue: false, easing: 'easeOutQuad', complete: function () {
16663
+ $this.remove();
16664
+ }
16665
+ });
16666
+ }
16667
+ });
16668
+ } else {
16669
+ $this.velocity({ translateX: 0
16670
+ }, { duration: 100, queue: false, easing: 'easeOutQuad' });
16671
+ }
16672
+ swipeLeft = false;
16673
+ swipeRight = false;
16674
+ }
16675
+ });
16676
+ });
16677
+
16678
+ // time = 0
16679
+ // // Vertical Staggered list
16680
+ // $('ul.staggered-list.vertical li').velocity(
16681
+ // { translateY: "100px"},
16682
+ // { duration: 0 });
16683
+
16684
+ // $('ul.staggered-list.vertical li').each(function() {
16685
+ // $(this).velocity(
16686
+ // { opacity: "1", translateY: "0"},
16687
+ // { duration: 800, delay: time, easing: [60, 25] });
16688
+ // time += 120;
16689
+ // });
16690
+
16691
+ // // Fade in and Scale
16692
+ // $('.fade-in.scale').velocity(
16693
+ // { scaleX: .4, scaleY: .4, translateX: -600},
16694
+ // { duration: 0});
16695
+ // $('.fade-in').each(function() {
16696
+ // $(this).velocity(
16697
+ // { opacity: "1", scaleX: 1, scaleY: 1, translateX: 0},
16698
+ // { duration: 800, easing: [60, 10] });
16699
+ // });
16700
+ });
16701
+ })(jQuery);
16702
+ ;(function ($) {
16703
+
16704
+ var scrollFireEventsHandled = false;
16705
+
16706
+ // Input: Array of JSON objects {selector, offset, callback}
16707
+ Materialize.scrollFire = function (options) {
16708
+ var onScroll = function () {
16709
+ var windowScroll = window.pageYOffset + window.innerHeight;
16710
+
16711
+ for (var i = 0; i < options.length; i++) {
16712
+ // Get options from each line
16713
+ var value = options[i];
16714
+ var selector = value.selector,
16715
+ offset = value.offset,
16716
+ callback = value.callback;
16717
+
16718
+ var currentElement = document.querySelector(selector);
16719
+ if (currentElement !== null) {
16720
+ var elementOffset = currentElement.getBoundingClientRect().top + window.pageYOffset;
16721
+
16722
+ if (windowScroll > elementOffset + offset) {
16723
+ if (value.done !== true) {
16724
+ if (typeof callback === 'function') {
16725
+ callback.call(this, currentElement);
16726
+ } else if (typeof callback === 'string') {
16727
+ var callbackFunc = new Function(callback);
16728
+ callbackFunc(currentElement);
16729
+ }
16730
+ value.done = true;
16731
+ }
16732
+ }
16733
+ }
16734
+ }
16735
+ };
16736
+
16737
+ var throttledScroll = Materialize.throttle(function () {
16738
+ onScroll();
16739
+ }, options.throttle || 100);
16740
+
16741
+ if (!scrollFireEventsHandled) {
16742
+ window.addEventListener("scroll", throttledScroll);
16743
+ window.addEventListener("resize", throttledScroll);
16744
+ scrollFireEventsHandled = true;
16745
+ }
16746
+
16747
+ // perform a scan once, after current execution context, and after dom is ready
16748
+ setTimeout(throttledScroll, 0);
16749
+ };
16750
+ })(jQuery);
16751
+ ; /*!
16752
+ * pickadate.js v3.5.0, 2014/04/13
16753
+ * By Amsul, http://amsul.ca
16754
+ * Hosted on http://amsul.github.io/pickadate.js
16755
+ * Licensed under MIT
16756
+ */
16757
+
16758
+ (function (factory) {
16759
+
16760
+ Materialize.Picker = factory(jQuery);
16761
+ })(function ($) {
16762
+
16763
+ var $window = $(window);
16764
+ var $document = $(document);
16765
+ var $html = $(document.documentElement);
16766
+
16767
+ /**
16768
+ * The picker constructor that creates a blank picker.
16769
+ */
16770
+ function PickerConstructor(ELEMENT, NAME, COMPONENT, OPTIONS) {
16771
+
16772
+ // If there’s no element, return the picker constructor.
16773
+ if (!ELEMENT) return PickerConstructor;
16774
+
16775
+ var IS_DEFAULT_THEME = false,
16776
+
16777
+
16778
+ // The state of the picker.
16779
+ STATE = {
16780
+ id: ELEMENT.id || 'P' + Math.abs(~~(Math.random() * new Date()))
16781
+ },
16782
+
16783
+
16784
+ // Merge the defaults and options passed.
16785
+ SETTINGS = COMPONENT ? $.extend(true, {}, COMPONENT.defaults, OPTIONS) : OPTIONS || {},
16786
+
16787
+
16788
+ // Merge the default classes with the settings classes.
16789
+ CLASSES = $.extend({}, PickerConstructor.klasses(), SETTINGS.klass),
16790
+
16791
+
16792
+ // The element node wrapper into a jQuery object.
16793
+ $ELEMENT = $(ELEMENT),
16794
+
16795
+
16796
+ // Pseudo picker constructor.
16797
+ PickerInstance = function () {
16798
+ return this.start();
16799
+ },
16800
+
16801
+
16802
+ // The picker prototype.
16803
+ P = PickerInstance.prototype = {
16804
+
16805
+ constructor: PickerInstance,
16806
+
16807
+ $node: $ELEMENT,
16808
+
16809
+ /**
16810
+ * Initialize everything
16811
+ */
16812
+ start: function () {
16813
+
16814
+ // If it’s already started, do nothing.
16815
+ if (STATE && STATE.start) return P;
16816
+
16817
+ // Update the picker states.
16818
+ STATE.methods = {};
16819
+ STATE.start = true;
16820
+ STATE.open = false;
16821
+ STATE.type = ELEMENT.type;
16822
+
16823
+ // Confirm focus state, convert into text input to remove UA stylings,
16824
+ // and set as readonly to prevent keyboard popup.
16825
+ ELEMENT.autofocus = ELEMENT == getActiveElement();
16826
+ ELEMENT.readOnly = !SETTINGS.editable;
16827
+ ELEMENT.id = ELEMENT.id || STATE.id;
16828
+ if (ELEMENT.type != 'text') {
16829
+ ELEMENT.type = 'text';
16830
+ }
16831
+
16832
+ // Create a new picker component with the settings.
16833
+ P.component = new COMPONENT(P, SETTINGS);
16834
+
16835
+ // Create the picker root with a holder and then prepare it.
16836
+ P.$root = $(PickerConstructor._.node('div', createWrappedComponent(), CLASSES.picker, 'id="' + ELEMENT.id + '_root" tabindex="0"'));
16837
+ prepareElementRoot();
16838
+
16839
+ // If there’s a format for the hidden input element, create the element.
16840
+ if (SETTINGS.formatSubmit) {
16841
+ prepareElementHidden();
16842
+ }
16843
+
16844
+ // Prepare the input element.
16845
+ prepareElement();
16846
+
16847
+ // Insert the root as specified in the settings.
16848
+ if (SETTINGS.container) $(SETTINGS.container).append(P.$root);else $ELEMENT.before(P.$root);
16849
+
16850
+ // Bind the default component and settings events.
16851
+ P.on({
16852
+ start: P.component.onStart,
16853
+ render: P.component.onRender,
16854
+ stop: P.component.onStop,
16855
+ open: P.component.onOpen,
16856
+ close: P.component.onClose,
16857
+ set: P.component.onSet
16858
+ }).on({
16859
+ start: SETTINGS.onStart,
16860
+ render: SETTINGS.onRender,
16861
+ stop: SETTINGS.onStop,
16862
+ open: SETTINGS.onOpen,
16863
+ close: SETTINGS.onClose,
16864
+ set: SETTINGS.onSet
16865
+ });
16866
+
16867
+ // Once we’re all set, check the theme in use.
16868
+ IS_DEFAULT_THEME = isUsingDefaultTheme(P.$root.children()[0]);
16869
+
16870
+ // If the element has autofocus, open the picker.
16871
+ if (ELEMENT.autofocus) {
16872
+ P.open();
16873
+ }
16874
+
16875
+ // Trigger queued the “start” and “render” events.
16876
+ return P.trigger('start').trigger('render');
16877
+ }, //start
16878
+
16879
+
16880
+ /**
16881
+ * Render a new picker
16882
+ */
16883
+ render: function (entireComponent) {
16884
+
16885
+ // Insert a new component holder in the root or box.
16886
+ if (entireComponent) P.$root.html(createWrappedComponent());else P.$root.find('.' + CLASSES.box).html(P.component.nodes(STATE.open));
16887
+
16888
+ // Trigger the queued “render” events.
16889
+ return P.trigger('render');
16890
+ }, //render
16891
+
16892
+
16893
+ /**
16894
+ * Destroy everything
16895
+ */
16896
+ stop: function () {
16897
+
16898
+ // If it’s already stopped, do nothing.
16899
+ if (!STATE.start) return P;
16900
+
16901
+ // Then close the picker.
16902
+ P.close();
16903
+
16904
+ // Remove the hidden field.
16905
+ if (P._hidden) {
16906
+ P._hidden.parentNode.removeChild(P._hidden);
16907
+ }
16908
+
16909
+ // Remove the root.
16910
+ P.$root.remove();
16911
+
16912
+ // Remove the input class, remove the stored data, and unbind
16913
+ // the events (after a tick for IE - see `P.close`).
16914
+ $ELEMENT.removeClass(CLASSES.input).removeData(NAME);
16915
+ setTimeout(function () {
16916
+ $ELEMENT.off('.' + STATE.id);
16917
+ }, 0);
16918
+
16919
+ // Restore the element state
16920
+ ELEMENT.type = STATE.type;
16921
+ ELEMENT.readOnly = false;
16922
+
16923
+ // Trigger the queued “stop” events.
16924
+ P.trigger('stop');
16925
+
16926
+ // Reset the picker states.
16927
+ STATE.methods = {};
16928
+ STATE.start = false;
16929
+
16930
+ return P;
16931
+ }, //stop
16932
+
16933
+
16934
+ /**
16935
+ * Open up the picker
16936
+ */
16937
+ open: function (dontGiveFocus) {
16938
+
16939
+ // If it’s already open, do nothing.
16940
+ if (STATE.open) return P;
16941
+
16942
+ // Add the “active” class.
16943
+ $ELEMENT.addClass(CLASSES.active);
16944
+ aria(ELEMENT, 'expanded', true);
16945
+
16946
+ // * A Firefox bug, when `html` has `overflow:hidden`, results in
16947
+ // killing transitions :(. So add the “opened” state on the next tick.
16948
+ // Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=625289
16949
+ setTimeout(function () {
16950
+
16951
+ // Add the “opened” class to the picker root.
16952
+ P.$root.addClass(CLASSES.opened);
16953
+ aria(P.$root[0], 'hidden', false);
16954
+ }, 0);
16955
+
16956
+ // If we have to give focus, bind the element and doc events.
16957
+ if (dontGiveFocus !== false) {
16958
+
16959
+ // Set it as open.
16960
+ STATE.open = true;
16961
+
16962
+ // Prevent the page from scrolling.
16963
+ if (IS_DEFAULT_THEME) {
16964
+ $html.css('overflow', 'hidden').css('padding-right', '+=' + getScrollbarWidth());
16965
+ }
16966
+
16967
+ // Pass focus to the root element’s jQuery object.
16968
+ // * Workaround for iOS8 to bring the picker’s root into view.
16969
+ P.$root.eq(0).focus();
16970
+
16971
+ // Bind the document events.
16972
+ $document.on('click.' + STATE.id + ' focusin.' + STATE.id, function (event) {
16973
+
16974
+ var target = event.target;
16975
+
16976
+ // If the target of the event is not the element, close the picker picker.
16977
+ // * Don’t worry about clicks or focusins on the root because those don’t bubble up.
16978
+ // Also, for Firefox, a click on an `option` element bubbles up directly
16979
+ // to the doc. So make sure the target wasn't the doc.
16980
+ // * In Firefox stopPropagation() doesn’t prevent right-click events from bubbling,
16981
+ // which causes the picker to unexpectedly close when right-clicking it. So make
16982
+ // sure the event wasn’t a right-click.
16983
+ if (target != ELEMENT && target != document && event.which != 3) {
16984
+
16985
+ // If the target was the holder that covers the screen,
16986
+ // keep the element focused to maintain tabindex.
16987
+ P.close(target === P.$root.children()[0]);
16988
+ }
16989
+ }).on('keydown.' + STATE.id, function (event) {
16990
+
16991
+ var
16992
+ // Get the keycode.
16993
+ keycode = event.keyCode,
16994
+
16995
+
16996
+ // Translate that to a selection change.
16997
+ keycodeToMove = P.component.key[keycode],
16998
+
16999
+
17000
+ // Grab the target.
17001
+ target = event.target;
17002
+
17003
+ // On escape, close the picker and give focus.
17004
+ if (keycode == 27) {
17005
+ P.close(true);
17006
+ }
17007
+
17008
+ // Check if there is a key movement or “enter” keypress on the element.
17009
+ else if (target == P.$root[0] && (keycodeToMove || keycode == 13)) {
17010
+
17011
+ // Prevent the default action to stop page movement.
17012
+ event.preventDefault();
17013
+
17014
+ // Trigger the key movement action.
17015
+ if (keycodeToMove) {
17016
+ PickerConstructor._.trigger(P.component.key.go, P, [PickerConstructor._.trigger(keycodeToMove)]);
17017
+ }
17018
+
17019
+ // On “enter”, if the highlighted item isn’t disabled, set the value and close.
17020
+ else if (!P.$root.find('.' + CLASSES.highlighted).hasClass(CLASSES.disabled)) {
17021
+ P.set('select', P.component.item.highlight);
17022
+ if (SETTINGS.closeOnSelect) {
17023
+ P.close(true);
17024
+ }
17025
+ }
17026
+ }
17027
+
17028
+ // If the target is within the root and “enter” is pressed,
17029
+ // prevent the default action and trigger a click on the target instead.
17030
+ else if ($.contains(P.$root[0], target) && keycode == 13) {
17031
+ event.preventDefault();
17032
+ target.click();
17033
+ }
17034
+ });
17035
+ }
17036
+
17037
+ // Trigger the queued “open” events.
17038
+ return P.trigger('open');
17039
+ }, //open
17040
+
17041
+
17042
+ /**
17043
+ * Close the picker
17044
+ */
17045
+ close: function (giveFocus) {
17046
+
17047
+ // If we need to give focus, do it before changing states.
17048
+ if (giveFocus) {
17049
+ // ....ah yes! It would’ve been incomplete without a crazy workaround for IE :|
17050
+ // The focus is triggered *after* the close has completed - causing it
17051
+ // to open again. So unbind and rebind the event at the next tick.
17052
+ P.$root.off('focus.toOpen').eq(0).focus();
17053
+ setTimeout(function () {
17054
+ P.$root.on('focus.toOpen', handleFocusToOpenEvent);
17055
+ }, 0);
17056
+ }
17057
+
17058
+ // Remove the “active” class.
17059
+ $ELEMENT.removeClass(CLASSES.active);
17060
+ aria(ELEMENT, 'expanded', false);
17061
+
17062
+ // * A Firefox bug, when `html` has `overflow:hidden`, results in
17063
+ // killing transitions :(. So remove the “opened” state on the next tick.
17064
+ // Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=625289
17065
+ setTimeout(function () {
17066
+
17067
+ // Remove the “opened” and “focused” class from the picker root.
17068
+ P.$root.removeClass(CLASSES.opened + ' ' + CLASSES.focused);
17069
+ aria(P.$root[0], 'hidden', true);
17070
+ }, 0);
17071
+
17072
+ // If it’s already closed, do nothing more.
17073
+ if (!STATE.open) return P;
17074
+
17075
+ // Set it as closed.
17076
+ STATE.open = false;
17077
+
17078
+ // Allow the page to scroll.
17079
+ if (IS_DEFAULT_THEME) {
17080
+ $html.css('overflow', '').css('padding-right', '-=' + getScrollbarWidth());
17081
+ }
17082
+
17083
+ // Unbind the document events.
17084
+ $document.off('.' + STATE.id);
17085
+
17086
+ // Trigger the queued “close” events.
17087
+ return P.trigger('close');
17088
+ }, //close
17089
+
17090
+
17091
+ /**
17092
+ * Clear the values
17093
+ */
17094
+ clear: function (options) {
17095
+ return P.set('clear', null, options);
17096
+ }, //clear
17097
+
17098
+
17099
+ /**
17100
+ * Set something
17101
+ */
17102
+ set: function (thing, value, options) {
17103
+
17104
+ var thingItem,
17105
+ thingValue,
17106
+ thingIsObject = $.isPlainObject(thing),
17107
+ thingObject = thingIsObject ? thing : {};
17108
+
17109
+ // Make sure we have usable options.
17110
+ options = thingIsObject && $.isPlainObject(value) ? value : options || {};
17111
+
17112
+ if (thing) {
17113
+
17114
+ // If the thing isn’t an object, make it one.
17115
+ if (!thingIsObject) {
17116
+ thingObject[thing] = value;
17117
+ }
17118
+
17119
+ // Go through the things of items to set.
17120
+ for (thingItem in thingObject) {
17121
+
17122
+ // Grab the value of the thing.
17123
+ thingValue = thingObject[thingItem];
17124
+
17125
+ // First, if the item exists and there’s a value, set it.
17126
+ if (thingItem in P.component.item) {
17127
+ if (thingValue === undefined) thingValue = null;
17128
+ P.component.set(thingItem, thingValue, options);
17129
+ }
17130
+
17131
+ // Then, check to update the element value and broadcast a change.
17132
+ if (thingItem == 'select' || thingItem == 'clear') {
17133
+ $ELEMENT.val(thingItem == 'clear' ? '' : P.get(thingItem, SETTINGS.format)).trigger('change');
17134
+ }
17135
+ }
17136
+
17137
+ // Render a new picker.
17138
+ P.render();
17139
+ }
17140
+
17141
+ // When the method isn’t muted, trigger queued “set” events and pass the `thingObject`.
17142
+ return options.muted ? P : P.trigger('set', thingObject);
17143
+ }, //set
17144
+
17145
+
17146
+ /**
17147
+ * Get something
17148
+ */
17149
+ get: function (thing, format) {
17150
+
17151
+ // Make sure there’s something to get.
17152
+ thing = thing || 'value';
17153
+
17154
+ // If a picker state exists, return that.
17155
+ if (STATE[thing] != null) {
17156
+ return STATE[thing];
17157
+ }
17158
+
17159
+ // Return the submission value, if that.
17160
+ if (thing == 'valueSubmit') {
17161
+ if (P._hidden) {
17162
+ return P._hidden.value;
17163
+ }
17164
+ thing = 'value';
17165
+ }
17166
+
17167
+ // Return the value, if that.
17168
+ if (thing == 'value') {
17169
+ return ELEMENT.value;
17170
+ }
17171
+
17172
+ // Check if a component item exists, return that.
17173
+ if (thing in P.component.item) {
17174
+ if (typeof format == 'string') {
17175
+ var thingValue = P.component.get(thing);
17176
+ return thingValue ? PickerConstructor._.trigger(P.component.formats.toString, P.component, [format, thingValue]) : '';
17177
+ }
17178
+ return P.component.get(thing);
17179
+ }
17180
+ }, //get
17181
+
17182
+
17183
+ /**
17184
+ * Bind events on the things.
17185
+ */
17186
+ on: function (thing, method, internal) {
17187
+
17188
+ var thingName,
17189
+ thingMethod,
17190
+ thingIsObject = $.isPlainObject(thing),
17191
+ thingObject = thingIsObject ? thing : {};
17192
+
17193
+ if (thing) {
17194
+
17195
+ // If the thing isn’t an object, make it one.
17196
+ if (!thingIsObject) {
17197
+ thingObject[thing] = method;
17198
+ }
17199
+
17200
+ // Go through the things to bind to.
17201
+ for (thingName in thingObject) {
17202
+
17203
+ // Grab the method of the thing.
17204
+ thingMethod = thingObject[thingName];
17205
+
17206
+ // If it was an internal binding, prefix it.
17207
+ if (internal) {
17208
+ thingName = '_' + thingName;
17209
+ }
17210
+
17211
+ // Make sure the thing methods collection exists.
17212
+ STATE.methods[thingName] = STATE.methods[thingName] || [];
17213
+
17214
+ // Add the method to the relative method collection.
17215
+ STATE.methods[thingName].push(thingMethod);
17216
+ }
17217
+ }
17218
+
17219
+ return P;
17220
+ }, //on
17221
+
17222
+
17223
+ /**
17224
+ * Unbind events on the things.
17225
+ */
17226
+ off: function () {
17227
+ var i,
17228
+ thingName,
17229
+ names = arguments;
17230
+ for (i = 0, namesCount = names.length; i < namesCount; i += 1) {
17231
+ thingName = names[i];
17232
+ if (thingName in STATE.methods) {
17233
+ delete STATE.methods[thingName];
17234
+ }
17235
+ }
17236
+ return P;
17237
+ },
17238
+
17239
+ /**
17240
+ * Fire off method events.
17241
+ */
17242
+ trigger: function (name, data) {
17243
+ var _trigger = function (name) {
17244
+ var methodList = STATE.methods[name];
17245
+ if (methodList) {
17246
+ methodList.map(function (method) {
17247
+ PickerConstructor._.trigger(method, P, [data]);
17248
+ });
17249
+ }
17250
+ };
17251
+ _trigger('_' + name);
17252
+ _trigger(name);
17253
+ return P;
17254
+ } //trigger
17255
+ //PickerInstance.prototype
17256
+
17257
+
17258
+ /**
17259
+ * Wrap the picker holder components together.
17260
+ */
17261
+ };function createWrappedComponent() {
17262
+
17263
+ // Create a picker wrapper holder
17264
+ return PickerConstructor._.node('div',
17265
+
17266
+ // Create a picker wrapper node
17267
+ PickerConstructor._.node('div',
17268
+
17269
+ // Create a picker frame
17270
+ PickerConstructor._.node('div',
17271
+
17272
+ // Create a picker box node
17273
+ PickerConstructor._.node('div',
17274
+
17275
+ // Create the components nodes.
17276
+ P.component.nodes(STATE.open),
17277
+
17278
+ // The picker box class
17279
+ CLASSES.box),
17280
+
17281
+ // Picker wrap class
17282
+ CLASSES.wrap),
17283
+
17284
+ // Picker frame class
17285
+ CLASSES.frame),
17286
+
17287
+ // Picker holder class
17288
+ CLASSES.holder); //endreturn
17289
+ } //createWrappedComponent
17290
+
17291
+
17292
+ /**
17293
+ * Prepare the input element with all bindings.
17294
+ */
17295
+ function prepareElement() {
17296
+
17297
+ $ELEMENT.
17298
+
17299
+ // Store the picker data by component name.
17300
+ data(NAME, P).
17301
+
17302
+ // Add the “input” class name.
17303
+ addClass(CLASSES.input).
17304
+
17305
+ // Remove the tabindex.
17306
+ attr('tabindex', -1).
17307
+
17308
+ // If there’s a `data-value`, update the value of the element.
17309
+ val($ELEMENT.data('value') ? P.get('select', SETTINGS.format) : ELEMENT.value);
17310
+
17311
+ // Only bind keydown events if the element isn’t editable.
17312
+ if (!SETTINGS.editable) {
17313
+
17314
+ $ELEMENT.
17315
+
17316
+ // On focus/click, focus onto the root to open it up.
17317
+ on('focus.' + STATE.id + ' click.' + STATE.id, function (event) {
17318
+ event.preventDefault();
17319
+ P.$root.eq(0).focus();
17320
+ }).
17321
+
17322
+ // Handle keyboard event based on the picker being opened or not.
17323
+ on('keydown.' + STATE.id, handleKeydownEvent);
17324
+ }
17325
+
17326
+ // Update the aria attributes.
17327
+ aria(ELEMENT, {
17328
+ haspopup: true,
17329
+ expanded: false,
17330
+ readonly: false,
17331
+ owns: ELEMENT.id + '_root'
17332
+ });
17333
+ }
17334
+
17335
+ /**
17336
+ * Prepare the root picker element with all bindings.
17337
+ */
17338
+ function prepareElementRoot() {
17339
+
17340
+ P.$root.on({
17341
+
17342
+ // For iOS8.
17343
+ keydown: handleKeydownEvent,
17344
+
17345
+ // When something within the root is focused, stop from bubbling
17346
+ // to the doc and remove the “focused” state from the root.
17347
+ focusin: function (event) {
17348
+ P.$root.removeClass(CLASSES.focused);
17349
+ event.stopPropagation();
17350
+ },
17351
+
17352
+ // When something within the root holder is clicked, stop it
17353
+ // from bubbling to the doc.
17354
+ 'mousedown click': function (event) {
17355
+
17356
+ var target = event.target;
17357
+
17358
+ // Make sure the target isn’t the root holder so it can bubble up.
17359
+ if (target != P.$root.children()[0]) {
17360
+
17361
+ event.stopPropagation();
17362
+
17363
+ // * For mousedown events, cancel the default action in order to
17364
+ // prevent cases where focus is shifted onto external elements
17365
+ // when using things like jQuery mobile or MagnificPopup (ref: #249 & #120).
17366
+ // Also, for Firefox, don’t prevent action on the `option` element.
17367
+ if (event.type == 'mousedown' && !$(target).is('input, select, textarea, button, option')) {
17368
+
17369
+ event.preventDefault();
17370
+
17371
+ // Re-focus onto the root so that users can click away
17372
+ // from elements focused within the picker.
17373
+ P.$root.eq(0).focus();
17374
+ }
17375
+ }
17376
+ }
17377
+ }).
17378
+
17379
+ // Add/remove the “target” class on focus and blur.
17380
+ on({
17381
+ focus: function () {
17382
+ $ELEMENT.addClass(CLASSES.target);
17383
+ },
17384
+ blur: function () {
17385
+ $ELEMENT.removeClass(CLASSES.target);
17386
+ }
17387
+ }).
17388
+
17389
+ // Open the picker and adjust the root “focused” state
17390
+ on('focus.toOpen', handleFocusToOpenEvent).
17391
+
17392
+ // If there’s a click on an actionable element, carry out the actions.
17393
+ on('click', '[data-pick], [data-nav], [data-clear], [data-close]', function () {
17394
+
17395
+ var $target = $(this),
17396
+ targetData = $target.data(),
17397
+ targetDisabled = $target.hasClass(CLASSES.navDisabled) || $target.hasClass(CLASSES.disabled),
17398
+
17399
+
17400
+ // * For IE, non-focusable elements can be active elements as well
17401
+ // (http://stackoverflow.com/a/2684561).
17402
+ activeElement = getActiveElement();
17403
+ activeElement = activeElement && (activeElement.type || activeElement.href);
17404
+
17405
+ // If it’s disabled or nothing inside is actively focused, re-focus the element.
17406
+ if (targetDisabled || activeElement && !$.contains(P.$root[0], activeElement)) {
17407
+ P.$root.eq(0).focus();
17408
+ }
17409
+
17410
+ // If something is superficially changed, update the `highlight` based on the `nav`.
17411
+ if (!targetDisabled && targetData.nav) {
17412
+ P.set('highlight', P.component.item.highlight, { nav: targetData.nav });
17413
+ }
17414
+
17415
+ // If something is picked, set `select` then close with focus.
17416
+ else if (!targetDisabled && 'pick' in targetData) {
17417
+ P.set('select', targetData.pick);
17418
+ if (SETTINGS.closeOnSelect) {
17419
+ P.close(true);
17420
+ }
17421
+ }
17422
+
17423
+ // If a “clear” button is pressed, empty the values and close with focus.
17424
+ else if (targetData.clear) {
17425
+ P.clear();
17426
+ if (SETTINGS.closeOnSelect) {
17427
+ P.close(true);
17428
+ }
17429
+ } else if (targetData.close) {
17430
+ P.close(true);
17431
+ }
17432
+ }); //P.$root
17433
+
17434
+ aria(P.$root[0], 'hidden', true);
17435
+ }
17436
+
17437
+ /**
17438
+ * Prepare the hidden input element along with all bindings.
17439
+ */
17440
+ function prepareElementHidden() {
17441
+
17442
+ var name;
17443
+
17444
+ if (SETTINGS.hiddenName === true) {
17445
+ name = ELEMENT.name;
17446
+ ELEMENT.name = '';
17447
+ } else {
17448
+ name = [typeof SETTINGS.hiddenPrefix == 'string' ? SETTINGS.hiddenPrefix : '', typeof SETTINGS.hiddenSuffix == 'string' ? SETTINGS.hiddenSuffix : '_submit'];
17449
+ name = name[0] + ELEMENT.name + name[1];
17450
+ }
17451
+
17452
+ P._hidden = $('<input ' + 'type=hidden ' +
17453
+
17454
+ // Create the name using the original input’s with a prefix and suffix.
17455
+ 'name="' + name + '"' + (
17456
+
17457
+ // If the element has a value, set the hidden value as well.
17458
+ $ELEMENT.data('value') || ELEMENT.value ? ' value="' + P.get('select', SETTINGS.formatSubmit) + '"' : '') + '>')[0];
17459
+
17460
+ $ELEMENT.
17461
+
17462
+ // If the value changes, update the hidden input with the correct format.
17463
+ on('change.' + STATE.id, function () {
17464
+ P._hidden.value = ELEMENT.value ? P.get('select', SETTINGS.formatSubmit) : '';
17465
+ });
17466
+
17467
+ // Insert the hidden input as specified in the settings.
17468
+ if (SETTINGS.container) $(SETTINGS.container).append(P._hidden);else $ELEMENT.before(P._hidden);
17469
+ }
17470
+
17471
+ // For iOS8.
17472
+ function handleKeydownEvent(event) {
17473
+
17474
+ var keycode = event.keyCode,
17475
+
17476
+
17477
+ // Check if one of the delete keys was pressed.
17478
+ isKeycodeDelete = /^(8|46)$/.test(keycode);
17479
+
17480
+ // For some reason IE clears the input value on “escape”.
17481
+ if (keycode == 27) {
17482
+ P.close();
17483
+ return false;
17484
+ }
17485
+
17486
+ // Check if `space` or `delete` was pressed or the picker is closed with a key movement.
17487
+ if (keycode == 32 || isKeycodeDelete || !STATE.open && P.component.key[keycode]) {
17488
+
17489
+ // Prevent it from moving the page and bubbling to doc.
17490
+ event.preventDefault();
17491
+ event.stopPropagation();
17492
+
17493
+ // If `delete` was pressed, clear the values and close the picker.
17494
+ // Otherwise open the picker.
17495
+ if (isKeycodeDelete) {
17496
+ P.clear().close();
17497
+ } else {
17498
+ P.open();
17499
+ }
17500
+ }
17501
+ }
17502
+
17503
+ // Separated for IE
17504
+ function handleFocusToOpenEvent(event) {
17505
+
17506
+ // Stop the event from propagating to the doc.
17507
+ event.stopPropagation();
17508
+
17509
+ // If it’s a focus event, add the “focused” class to the root.
17510
+ if (event.type == 'focus') {
17511
+ P.$root.addClass(CLASSES.focused);
17512
+ }
17513
+
17514
+ // And then finally open the picker.
17515
+ P.open();
17516
+ }
17517
+
17518
+ // Return a new picker instance.
17519
+ return new PickerInstance();
17520
+ } //PickerConstructor
17521
+
17522
+
17523
+ /**
17524
+ * The default classes and prefix to use for the HTML classes.
17525
+ */
17526
+ PickerConstructor.klasses = function (prefix) {
17527
+ prefix = prefix || 'picker';
17528
+ return {
17529
+
17530
+ picker: prefix,
17531
+ opened: prefix + '--opened',
17532
+ focused: prefix + '--focused',
17533
+
17534
+ input: prefix + '__input',
17535
+ active: prefix + '__input--active',
17536
+ target: prefix + '__input--target',
17537
+
17538
+ holder: prefix + '__holder',
17539
+
17540
+ frame: prefix + '__frame',
17541
+ wrap: prefix + '__wrap',
17542
+
17543
+ box: prefix + '__box'
17544
+ };
17545
+ }; //PickerConstructor.klasses
17546
+
17547
+
17548
+ /**
17549
+ * Check if the default theme is being used.
17550
+ */
17551
+ function isUsingDefaultTheme(element) {
17552
+
17553
+ var theme,
17554
+ prop = 'position';
17555
+
17556
+ // For IE.
17557
+ if (element.currentStyle) {
17558
+ theme = element.currentStyle[prop];
17559
+ }
17560
+
17561
+ // For normal browsers.
17562
+ else if (window.getComputedStyle) {
17563
+ theme = getComputedStyle(element)[prop];
17564
+ }
17565
+
17566
+ return theme == 'fixed';
17567
+ }
17568
+
17569
+ /**
17570
+ * Get the width of the browser’s scrollbar.
17571
+ * Taken from: https://github.com/VodkaBears/Remodal/blob/master/src/jquery.remodal.js
17572
+ */
17573
+ function getScrollbarWidth() {
17574
+
17575
+ if ($html.height() <= $window.height()) {
17576
+ return 0;
17577
+ }
17578
+
17579
+ var $outer = $('<div style="visibility:hidden;width:100px" />').appendTo('body');
17580
+
17581
+ // Get the width without scrollbars.
17582
+ var widthWithoutScroll = $outer[0].offsetWidth;
17583
+
17584
+ // Force adding scrollbars.
17585
+ $outer.css('overflow', 'scroll');
17586
+
17587
+ // Add the inner div.
17588
+ var $inner = $('<div style="width:100%" />').appendTo($outer);
17589
+
17590
+ // Get the width with scrollbars.
17591
+ var widthWithScroll = $inner[0].offsetWidth;
17592
+
17593
+ // Remove the divs.
17594
+ $outer.remove();
17595
+
17596
+ // Return the difference between the widths.
17597
+ return widthWithoutScroll - widthWithScroll;
17598
+ }
17599
+
17600
+ /**
17601
+ * PickerConstructor helper methods.
17602
+ */
17603
+ PickerConstructor._ = {
17604
+
17605
+ /**
17606
+ * Create a group of nodes. Expects:
17607
+ * `
17608
+ {
17609
+ min: {Integer},
17610
+ max: {Integer},
17611
+ i: {Integer},
17612
+ node: {String},
17613
+ item: {Function}
17614
+ }
17615
+ * `
17616
+ */
17617
+ group: function (groupObject) {
17618
+
17619
+ var
17620
+ // Scope for the looped object
17621
+ loopObjectScope,
17622
+
17623
+
17624
+ // Create the nodes list
17625
+ nodesList = '',
17626
+
17627
+
17628
+ // The counter starts from the `min`
17629
+ counter = PickerConstructor._.trigger(groupObject.min, groupObject);
17630
+
17631
+ // Loop from the `min` to `max`, incrementing by `i`
17632
+ for (; counter <= PickerConstructor._.trigger(groupObject.max, groupObject, [counter]); counter += groupObject.i) {
17633
+
17634
+ // Trigger the `item` function within scope of the object
17635
+ loopObjectScope = PickerConstructor._.trigger(groupObject.item, groupObject, [counter]);
17636
+
17637
+ // Splice the subgroup and create nodes out of the sub nodes
17638
+ nodesList += PickerConstructor._.node(groupObject.node, loopObjectScope[0], // the node
17639
+ loopObjectScope[1], // the classes
17640
+ loopObjectScope[2] // the attributes
17641
+ );
17642
+ }
17643
+
17644
+ // Return the list of nodes
17645
+ return nodesList;
17646
+ }, //group
17647
+
17648
+
17649
+ /**
17650
+ * Create a dom node string
17651
+ */
17652
+ node: function (wrapper, item, klass, attribute) {
17653
+
17654
+ // If the item is false-y, just return an empty string
17655
+ if (!item) return '';
17656
+
17657
+ // If the item is an array, do a join
17658
+ item = $.isArray(item) ? item.join('') : item;
17659
+
17660
+ // Check for the class
17661
+ klass = klass ? ' class="' + klass + '"' : '';
17662
+
17663
+ // Check for any attributes
17664
+ attribute = attribute ? ' ' + attribute : '';
17665
+
17666
+ // Return the wrapped item
17667
+ return '<' + wrapper + klass + attribute + '>' + item + '</' + wrapper + '>';
17668
+ }, //node
17669
+
17670
+
17671
+ /**
17672
+ * Lead numbers below 10 with a zero.
17673
+ */
17674
+ lead: function (number) {
17675
+ return (number < 10 ? '0' : '') + number;
17676
+ },
17677
+
17678
+ /**
17679
+ * Trigger a function otherwise return the value.
17680
+ */
17681
+ trigger: function (callback, scope, args) {
17682
+ return typeof callback == 'function' ? callback.apply(scope, args || []) : callback;
17683
+ },
17684
+
17685
+ /**
17686
+ * If the second character is a digit, length is 2 otherwise 1.
17687
+ */
17688
+ digits: function (string) {
17689
+ return (/\d/.test(string[1]) ? 2 : 1
17690
+ );
17691
+ },
17692
+
17693
+ /**
17694
+ * Tell if something is a date object.
17695
+ */
17696
+ isDate: function (value) {
17697
+ return {}.toString.call(value).indexOf('Date') > -1 && this.isInteger(value.getDate());
17698
+ },
17699
+
17700
+ /**
17701
+ * Tell if something is an integer.
17702
+ */
17703
+ isInteger: function (value) {
17704
+ return {}.toString.call(value).indexOf('Number') > -1 && value % 1 === 0;
17705
+ },
17706
+
17707
+ /**
17708
+ * Create ARIA attribute strings.
17709
+ */
17710
+ ariaAttr: ariaAttr //PickerConstructor._
17711
+
17712
+
17713
+ /**
17714
+ * Extend the picker with a component and defaults.
17715
+ */
17716
+ };PickerConstructor.extend = function (name, Component) {
17717
+
17718
+ // Extend jQuery.
17719
+ $.fn[name] = function (options, action) {
17720
+
17721
+ // Grab the component data.
17722
+ var componentData = this.data(name);
17723
+
17724
+ // If the picker is requested, return the data object.
17725
+ if (options == 'picker') {
17726
+ return componentData;
17727
+ }
17728
+
17729
+ // If the component data exists and `options` is a string, carry out the action.
17730
+ if (componentData && typeof options == 'string') {
17731
+ return PickerConstructor._.trigger(componentData[options], componentData, [action]);
17732
+ }
17733
+
17734
+ // Otherwise go through each matched element and if the component
17735
+ // doesn’t exist, create a new picker using `this` element
17736
+ // and merging the defaults and options with a deep copy.
17737
+ return this.each(function () {
17738
+ var $this = $(this);
17739
+ if (!$this.data(name)) {
17740
+ new PickerConstructor(this, name, Component, options);
17741
+ }
17742
+ });
17743
+ };
17744
+
17745
+ // Set the defaults.
17746
+ $.fn[name].defaults = Component.defaults;
17747
+ }; //PickerConstructor.extend
17748
+
17749
+
17750
+ function aria(element, attribute, value) {
17751
+ if ($.isPlainObject(attribute)) {
17752
+ for (var key in attribute) {
17753
+ ariaSet(element, key, attribute[key]);
17754
+ }
17755
+ } else {
17756
+ ariaSet(element, attribute, value);
17757
+ }
17758
+ }
17759
+ function ariaSet(element, attribute, value) {
17760
+ element.setAttribute((attribute == 'role' ? '' : 'aria-') + attribute, value);
17761
+ }
17762
+ function ariaAttr(attribute, data) {
17763
+ if (!$.isPlainObject(attribute)) {
17764
+ attribute = { attribute: data };
17765
+ }
17766
+ data = '';
17767
+ for (var key in attribute) {
17768
+ var attr = (key == 'role' ? '' : 'aria-') + key,
17769
+ attrVal = attribute[key];
17770
+ data += attrVal == null ? '' : attr + '="' + attribute[key] + '"';
17771
+ }
17772
+ return data;
17773
+ }
17774
+
17775
+ // IE8 bug throws an error for activeElements within iframes.
17776
+ function getActiveElement() {
17777
+ try {
17778
+ return document.activeElement;
17779
+ } catch (err) {}
17780
+ }
17781
+
17782
+ // Expose the picker constructor.
17783
+ return PickerConstructor;
17784
+ });
17785
+ ; /*!
17786
+ * Date picker for pickadate.js v3.5.0
17787
+ * http://amsul.github.io/pickadate.js/date.htm
17788
+ */
17789
+
17790
+ (function (factory) {
17791
+ factory(Materialize.Picker, jQuery);
17792
+ })(function (Picker, $) {
17793
+
17794
+ /**
17795
+ * Globals and constants
17796
+ */
17797
+ var DAYS_IN_WEEK = 7,
17798
+ WEEKS_IN_CALENDAR = 6,
17799
+ _ = Picker._;
17800
+
17801
+ /**
17802
+ * The date picker constructor
17803
+ */
17804
+ function DatePicker(picker, settings) {
17805
+
17806
+ var calendar = this,
17807
+ element = picker.$node[0],
17808
+ elementValue = element.value,
17809
+ elementDataValue = picker.$node.data('value'),
17810
+ valueString = elementDataValue || elementValue,
17811
+ formatString = elementDataValue ? settings.formatSubmit : settings.format,
17812
+ isRTL = function () {
17813
+
17814
+ return element.currentStyle ?
17815
+
17816
+ // For IE.
17817
+ element.currentStyle.direction == 'rtl' :
17818
+
17819
+ // For normal browsers.
17820
+ getComputedStyle(picker.$root[0]).direction == 'rtl';
17821
+ };
17822
+
17823
+ calendar.settings = settings;
17824
+ calendar.$node = picker.$node;
17825
+
17826
+ // The queue of methods that will be used to build item objects.
17827
+ calendar.queue = {
17828
+ min: 'measure create',
17829
+ max: 'measure create',
17830
+ now: 'now create',
17831
+ select: 'parse create validate',
17832
+ highlight: 'parse navigate create validate',
17833
+ view: 'parse create validate viewset',
17834
+ disable: 'deactivate',
17835
+ enable: 'activate'
17836
+
17837
+ // The component's item object.
17838
+ };calendar.item = {};
17839
+
17840
+ calendar.item.clear = null;
17841
+ calendar.item.disable = (settings.disable || []).slice(0);
17842
+ calendar.item.enable = -function (collectionDisabled) {
17843
+ return collectionDisabled[0] === true ? collectionDisabled.shift() : -1;
17844
+ }(calendar.item.disable);
17845
+
17846
+ calendar.set('min', settings.min).set('max', settings.max).set('now');
17847
+
17848
+ // When there’s a value, set the `select`, which in turn
17849
+ // also sets the `highlight` and `view`.
17850
+ if (valueString) {
17851
+ calendar.set('select', valueString, { format: formatString });
17852
+ }
17853
+
17854
+ // If there’s no value, default to highlighting “today”.
17855
+ else {
17856
+ calendar.set('select', null).set('highlight', calendar.item.now);
17857
+ }
17858
+
17859
+ // The keycode to movement mapping.
17860
+ calendar.key = {
17861
+ 40: 7, // Down
17862
+ 38: -7, // Up
17863
+ 39: function () {
17864
+ return isRTL() ? -1 : 1;
17865
+ }, // Right
17866
+ 37: function () {
17867
+ return isRTL() ? 1 : -1;
17868
+ }, // Left
17869
+ go: function (timeChange) {
17870
+ var highlightedObject = calendar.item.highlight,
17871
+ targetDate = new Date(highlightedObject.year, highlightedObject.month, highlightedObject.date + timeChange);
17872
+ calendar.set('highlight', targetDate, { interval: timeChange });
17873
+ this.render();
17874
+ }
17875
+
17876
+ // Bind some picker events.
17877
+ };picker.on('render', function () {
17878
+ picker.$root.find('.' + settings.klass.selectMonth).on('change', function () {
17879
+ var value = this.value;
17880
+ if (value) {
17881
+ picker.set('highlight', [picker.get('view').year, value, picker.get('highlight').date]);
17882
+ picker.$root.find('.' + settings.klass.selectMonth).trigger('focus');
17883
+ }
17884
+ });
17885
+ picker.$root.find('.' + settings.klass.selectYear).on('change', function () {
17886
+ var value = this.value;
17887
+ if (value) {
17888
+ picker.set('highlight', [value, picker.get('view').month, picker.get('highlight').date]);
17889
+ picker.$root.find('.' + settings.klass.selectYear).trigger('focus');
17890
+ }
17891
+ });
17892
+ }, 1).on('open', function () {
17893
+ var includeToday = '';
17894
+ if (calendar.disabled(calendar.get('now'))) {
17895
+ includeToday = ':not(.' + settings.klass.buttonToday + ')';
17896
+ }
17897
+ picker.$root.find('button' + includeToday + ', select').attr('disabled', false);
17898
+ }, 1).on('close', function () {
17899
+ picker.$root.find('button, select').attr('disabled', true);
17900
+ }, 1);
17901
+ } //DatePicker
17902
+
17903
+
17904
+ /**
17905
+ * Set a datepicker item object.
17906
+ */
17907
+ DatePicker.prototype.set = function (type, value, options) {
17908
+
17909
+ var calendar = this,
17910
+ calendarItem = calendar.item;
17911
+
17912
+ // If the value is `null` just set it immediately.
17913
+ if (value === null) {
17914
+ if (type == 'clear') type = 'select';
17915
+ calendarItem[type] = value;
17916
+ return calendar;
17917
+ }
17918
+
17919
+ // Otherwise go through the queue of methods, and invoke the functions.
17920
+ // Update this as the time unit, and set the final value as this item.
17921
+ // * In the case of `enable`, keep the queue but set `disable` instead.
17922
+ // And in the case of `flip`, keep the queue but set `enable` instead.
17923
+ calendarItem[type == 'enable' ? 'disable' : type == 'flip' ? 'enable' : type] = calendar.queue[type].split(' ').map(function (method) {
17924
+ value = calendar[method](type, value, options);
17925
+ return value;
17926
+ }).pop();
17927
+
17928
+ // Check if we need to cascade through more updates.
17929
+ if (type == 'select') {
17930
+ calendar.set('highlight', calendarItem.select, options);
17931
+ } else if (type == 'highlight') {
17932
+ calendar.set('view', calendarItem.highlight, options);
17933
+ } else if (type.match(/^(flip|min|max|disable|enable)$/)) {
17934
+ if (calendarItem.select && calendar.disabled(calendarItem.select)) {
17935
+ calendar.set('select', calendarItem.select, options);
17936
+ }
17937
+ if (calendarItem.highlight && calendar.disabled(calendarItem.highlight)) {
17938
+ calendar.set('highlight', calendarItem.highlight, options);
17939
+ }
17940
+ }
17941
+
17942
+ return calendar;
17943
+ }; //DatePicker.prototype.set
17944
+
17945
+
17946
+ /**
17947
+ * Get a datepicker item object.
17948
+ */
17949
+ DatePicker.prototype.get = function (type) {
17950
+ return this.item[type];
17951
+ }; //DatePicker.prototype.get
17952
+
17953
+
17954
+ /**
17955
+ * Create a picker date object.
17956
+ */
17957
+ DatePicker.prototype.create = function (type, value, options) {
17958
+
17959
+ var isInfiniteValue,
17960
+ calendar = this;
17961
+
17962
+ // If there’s no value, use the type as the value.
17963
+ value = value === undefined ? type : value;
17964
+
17965
+ // If it’s infinity, update the value.
17966
+ if (value == -Infinity || value == Infinity) {
17967
+ isInfiniteValue = value;
17968
+ }
17969
+
17970
+ // If it’s an object, use the native date object.
17971
+ else if ($.isPlainObject(value) && _.isInteger(value.pick)) {
17972
+ value = value.obj;
17973
+ }
17974
+
17975
+ // If it’s an array, convert it into a date and make sure
17976
+ // that it’s a valid date – otherwise default to today.
17977
+ else if ($.isArray(value)) {
17978
+ value = new Date(value[0], value[1], value[2]);
17979
+ value = _.isDate(value) ? value : calendar.create().obj;
17980
+ }
17981
+
17982
+ // If it’s a number or date object, make a normalized date.
17983
+ else if (_.isInteger(value) || _.isDate(value)) {
17984
+ value = calendar.normalize(new Date(value), options);
17985
+ }
17986
+
17987
+ // If it’s a literal true or any other case, set it to now.
17988
+ else /*if ( value === true )*/{
17989
+ value = calendar.now(type, value, options);
17990
+ }
17991
+
17992
+ // Return the compiled object.
17993
+ return {
17994
+ year: isInfiniteValue || value.getFullYear(),
17995
+ month: isInfiniteValue || value.getMonth(),
17996
+ date: isInfiniteValue || value.getDate(),
17997
+ day: isInfiniteValue || value.getDay(),
17998
+ obj: isInfiniteValue || value,
17999
+ pick: isInfiniteValue || value.getTime()
18000
+ };
18001
+ }; //DatePicker.prototype.create
18002
+
18003
+
18004
+ /**
18005
+ * Create a range limit object using an array, date object,
18006
+ * literal “true”, or integer relative to another time.
18007
+ */
18008
+ DatePicker.prototype.createRange = function (from, to) {
18009
+
18010
+ var calendar = this,
18011
+ createDate = function (date) {
18012
+ if (date === true || $.isArray(date) || _.isDate(date)) {
18013
+ return calendar.create(date);
18014
+ }
18015
+ return date;
18016
+ };
18017
+
18018
+ // Create objects if possible.
18019
+ if (!_.isInteger(from)) {
18020
+ from = createDate(from);
18021
+ }
18022
+ if (!_.isInteger(to)) {
18023
+ to = createDate(to);
18024
+ }
18025
+
18026
+ // Create relative dates.
18027
+ if (_.isInteger(from) && $.isPlainObject(to)) {
18028
+ from = [to.year, to.month, to.date + from];
18029
+ } else if (_.isInteger(to) && $.isPlainObject(from)) {
18030
+ to = [from.year, from.month, from.date + to];
18031
+ }
18032
+
18033
+ return {
18034
+ from: createDate(from),
18035
+ to: createDate(to)
18036
+ };
18037
+ }; //DatePicker.prototype.createRange
18038
+
18039
+
18040
+ /**
18041
+ * Check if a date unit falls within a date range object.
18042
+ */
18043
+ DatePicker.prototype.withinRange = function (range, dateUnit) {
18044
+ range = this.createRange(range.from, range.to);
18045
+ return dateUnit.pick >= range.from.pick && dateUnit.pick <= range.to.pick;
18046
+ };
18047
+
18048
+ /**
18049
+ * Check if two date range objects overlap.
18050
+ */
18051
+ DatePicker.prototype.overlapRanges = function (one, two) {
18052
+
18053
+ var calendar = this;
18054
+
18055
+ // Convert the ranges into comparable dates.
18056
+ one = calendar.createRange(one.from, one.to);
18057
+ two = calendar.createRange(two.from, two.to);
18058
+
18059
+ return calendar.withinRange(one, two.from) || calendar.withinRange(one, two.to) || calendar.withinRange(two, one.from) || calendar.withinRange(two, one.to);
18060
+ };
18061
+
18062
+ /**
18063
+ * Get the date today.
18064
+ */
18065
+ DatePicker.prototype.now = function (type, value, options) {
18066
+ value = new Date();
18067
+ if (options && options.rel) {
18068
+ value.setDate(value.getDate() + options.rel);
18069
+ }
18070
+ return this.normalize(value, options);
18071
+ };
18072
+
18073
+ /**
18074
+ * Navigate to next/prev month.
18075
+ */
18076
+ DatePicker.prototype.navigate = function (type, value, options) {
18077
+
18078
+ var targetDateObject,
18079
+ targetYear,
18080
+ targetMonth,
18081
+ targetDate,
18082
+ isTargetArray = $.isArray(value),
18083
+ isTargetObject = $.isPlainObject(value),
18084
+ viewsetObject = this.item.view; /*,
18085
+ safety = 100*/
18086
+
18087
+ if (isTargetArray || isTargetObject) {
18088
+
18089
+ if (isTargetObject) {
18090
+ targetYear = value.year;
18091
+ targetMonth = value.month;
18092
+ targetDate = value.date;
18093
+ } else {
18094
+ targetYear = +value[0];
18095
+ targetMonth = +value[1];
18096
+ targetDate = +value[2];
18097
+ }
18098
+
18099
+ // If we’re navigating months but the view is in a different
18100
+ // month, navigate to the view’s year and month.
18101
+ if (options && options.nav && viewsetObject && viewsetObject.month !== targetMonth) {
18102
+ targetYear = viewsetObject.year;
18103
+ targetMonth = viewsetObject.month;
18104
+ }
18105
+
18106
+ // Figure out the expected target year and month.
18107
+ targetDateObject = new Date(targetYear, targetMonth + (options && options.nav ? options.nav : 0), 1);
18108
+ targetYear = targetDateObject.getFullYear();
18109
+ targetMonth = targetDateObject.getMonth();
18110
+
18111
+ // If the month we’re going to doesn’t have enough days,
18112
+ // keep decreasing the date until we reach the month’s last date.
18113
+ while ( /*safety &&*/new Date(targetYear, targetMonth, targetDate).getMonth() !== targetMonth) {
18114
+ targetDate -= 1;
18115
+ /*safety -= 1
18116
+ if ( !safety ) {
18117
+ throw 'Fell into an infinite loop while navigating to ' + new Date( targetYear, targetMonth, targetDate ) + '.'
18118
+ }*/
18119
+ }
18120
+
18121
+ value = [targetYear, targetMonth, targetDate];
18122
+ }
18123
+
18124
+ return value;
18125
+ }; //DatePicker.prototype.navigate
18126
+
18127
+
18128
+ /**
18129
+ * Normalize a date by setting the hours to midnight.
18130
+ */
18131
+ DatePicker.prototype.normalize = function (value /*, options*/) {
18132
+ value.setHours(0, 0, 0, 0);
18133
+ return value;
18134
+ };
18135
+
18136
+ /**
18137
+ * Measure the range of dates.
18138
+ */
18139
+ DatePicker.prototype.measure = function (type, value /*, options*/) {
18140
+
18141
+ var calendar = this;
18142
+
18143
+ // If it’s anything false-y, remove the limits.
18144
+ if (!value) {
18145
+ value = type == 'min' ? -Infinity : Infinity;
18146
+ }
18147
+
18148
+ // If it’s a string, parse it.
18149
+ else if (typeof value == 'string') {
18150
+ value = calendar.parse(type, value);
18151
+ }
18152
+
18153
+ // If it's an integer, get a date relative to today.
18154
+ else if (_.isInteger(value)) {
18155
+ value = calendar.now(type, value, { rel: value });
18156
+ }
18157
+
18158
+ return value;
18159
+ }; ///DatePicker.prototype.measure
18160
+
18161
+
18162
+ /**
18163
+ * Create a viewset object based on navigation.
18164
+ */
18165
+ DatePicker.prototype.viewset = function (type, dateObject /*, options*/) {
18166
+ return this.create([dateObject.year, dateObject.month, 1]);
18167
+ };
18168
+
18169
+ /**
18170
+ * Validate a date as enabled and shift if needed.
18171
+ */
18172
+ DatePicker.prototype.validate = function (type, dateObject, options) {
18173
+
18174
+ var calendar = this,
18175
+
18176
+
18177
+ // Keep a reference to the original date.
18178
+ originalDateObject = dateObject,
18179
+
18180
+
18181
+ // Make sure we have an interval.
18182
+ interval = options && options.interval ? options.interval : 1,
18183
+
18184
+
18185
+ // Check if the calendar enabled dates are inverted.
18186
+ isFlippedBase = calendar.item.enable === -1,
18187
+
18188
+
18189
+ // Check if we have any enabled dates after/before now.
18190
+ hasEnabledBeforeTarget,
18191
+ hasEnabledAfterTarget,
18192
+
18193
+
18194
+ // The min & max limits.
18195
+ minLimitObject = calendar.item.min,
18196
+ maxLimitObject = calendar.item.max,
18197
+
18198
+
18199
+ // Check if we’ve reached the limit during shifting.
18200
+ reachedMin,
18201
+ reachedMax,
18202
+
18203
+
18204
+ // Check if the calendar is inverted and at least one weekday is enabled.
18205
+ hasEnabledWeekdays = isFlippedBase && calendar.item.disable.filter(function (value) {
18206
+
18207
+ // If there’s a date, check where it is relative to the target.
18208
+ if ($.isArray(value)) {
18209
+ var dateTime = calendar.create(value).pick;
18210
+ if (dateTime < dateObject.pick) hasEnabledBeforeTarget = true;else if (dateTime > dateObject.pick) hasEnabledAfterTarget = true;
18211
+ }
18212
+
18213
+ // Return only integers for enabled weekdays.
18214
+ return _.isInteger(value);
18215
+ }).length; /*,
18216
+ safety = 100*/
18217
+
18218
+ // Cases to validate for:
18219
+ // [1] Not inverted and date disabled.
18220
+ // [2] Inverted and some dates enabled.
18221
+ // [3] Not inverted and out of range.
18222
+ //
18223
+ // Cases to **not** validate for:
18224
+ // • Navigating months.
18225
+ // • Not inverted and date enabled.
18226
+ // • Inverted and all dates disabled.
18227
+ // • ..and anything else.
18228
+ if (!options || !options.nav) if (
18229
+ /* 1 */!isFlippedBase && calendar.disabled(dateObject) ||
18230
+ /* 2 */isFlippedBase && calendar.disabled(dateObject) && (hasEnabledWeekdays || hasEnabledBeforeTarget || hasEnabledAfterTarget) ||
18231
+ /* 3 */!isFlippedBase && (dateObject.pick <= minLimitObject.pick || dateObject.pick >= maxLimitObject.pick)) {
18232
+
18233
+ // When inverted, flip the direction if there aren’t any enabled weekdays
18234
+ // and there are no enabled dates in the direction of the interval.
18235
+ if (isFlippedBase && !hasEnabledWeekdays && (!hasEnabledAfterTarget && interval > 0 || !hasEnabledBeforeTarget && interval < 0)) {
18236
+ interval *= -1;
18237
+ }
18238
+
18239
+ // Keep looping until we reach an enabled date.
18240
+ while ( /*safety &&*/calendar.disabled(dateObject)) {
18241
+
18242
+ /*safety -= 1
18243
+ if ( !safety ) {
18244
+ throw 'Fell into an infinite loop while validating ' + dateObject.obj + '.'
18245
+ }*/
18246
+
18247
+ // If we’ve looped into the next/prev month with a large interval, return to the original date and flatten the interval.
18248
+ if (Math.abs(interval) > 1 && (dateObject.month < originalDateObject.month || dateObject.month > originalDateObject.month)) {
18249
+ dateObject = originalDateObject;
18250
+ interval = interval > 0 ? 1 : -1;
18251
+ }
18252
+
18253
+ // If we’ve reached the min/max limit, reverse the direction, flatten the interval and set it to the limit.
18254
+ if (dateObject.pick <= minLimitObject.pick) {
18255
+ reachedMin = true;
18256
+ interval = 1;
18257
+ dateObject = calendar.create([minLimitObject.year, minLimitObject.month, minLimitObject.date + (dateObject.pick === minLimitObject.pick ? 0 : -1)]);
18258
+ } else if (dateObject.pick >= maxLimitObject.pick) {
18259
+ reachedMax = true;
18260
+ interval = -1;
18261
+ dateObject = calendar.create([maxLimitObject.year, maxLimitObject.month, maxLimitObject.date + (dateObject.pick === maxLimitObject.pick ? 0 : 1)]);
18262
+ }
18263
+
18264
+ // If we’ve reached both limits, just break out of the loop.
18265
+ if (reachedMin && reachedMax) {
18266
+ break;
18267
+ }
18268
+
18269
+ // Finally, create the shifted date using the interval and keep looping.
18270
+ dateObject = calendar.create([dateObject.year, dateObject.month, dateObject.date + interval]);
18271
+ }
18272
+ } //endif
18273
+
18274
+
18275
+ // Return the date object settled on.
18276
+ return dateObject;
18277
+ }; //DatePicker.prototype.validate
18278
+
18279
+
18280
+ /**
18281
+ * Check if a date is disabled.
18282
+ */
18283
+ DatePicker.prototype.disabled = function (dateToVerify) {
18284
+
18285
+ var calendar = this,
18286
+
18287
+
18288
+ // Filter through the disabled dates to check if this is one.
18289
+ isDisabledMatch = calendar.item.disable.filter(function (dateToDisable) {
18290
+
18291
+ // If the date is a number, match the weekday with 0index and `firstDay` check.
18292
+ if (_.isInteger(dateToDisable)) {
18293
+ return dateToVerify.day === (calendar.settings.firstDay ? dateToDisable : dateToDisable - 1) % 7;
18294
+ }
18295
+
18296
+ // If it’s an array or a native JS date, create and match the exact date.
18297
+ if ($.isArray(dateToDisable) || _.isDate(dateToDisable)) {
18298
+ return dateToVerify.pick === calendar.create(dateToDisable).pick;
18299
+ }
18300
+
18301
+ // If it’s an object, match a date within the “from” and “to” range.
18302
+ if ($.isPlainObject(dateToDisable)) {
18303
+ return calendar.withinRange(dateToDisable, dateToVerify);
18304
+ }
18305
+ });
18306
+
18307
+ // If this date matches a disabled date, confirm it’s not inverted.
18308
+ isDisabledMatch = isDisabledMatch.length && !isDisabledMatch.filter(function (dateToDisable) {
18309
+ return $.isArray(dateToDisable) && dateToDisable[3] == 'inverted' || $.isPlainObject(dateToDisable) && dateToDisable.inverted;
18310
+ }).length;
18311
+
18312
+ // Check the calendar “enabled” flag and respectively flip the
18313
+ // disabled state. Then also check if it’s beyond the min/max limits.
18314
+ return calendar.item.enable === -1 ? !isDisabledMatch : isDisabledMatch || dateToVerify.pick < calendar.item.min.pick || dateToVerify.pick > calendar.item.max.pick;
18315
+ }; //DatePicker.prototype.disabled
18316
+
18317
+
18318
+ /**
18319
+ * Parse a string into a usable type.
18320
+ */
18321
+ DatePicker.prototype.parse = function (type, value, options) {
18322
+
18323
+ var calendar = this,
18324
+ parsingObject = {};
18325
+
18326
+ // If it’s already parsed, we’re good.
18327
+ if (!value || typeof value != 'string') {
18328
+ return value;
18329
+ }
18330
+
18331
+ // We need a `.format` to parse the value with.
18332
+ if (!(options && options.format)) {
18333
+ options = options || {};
18334
+ options.format = calendar.settings.format;
18335
+ }
18336
+
18337
+ // Convert the format into an array and then map through it.
18338
+ calendar.formats.toArray(options.format).map(function (label) {
18339
+
18340
+ var
18341
+ // Grab the formatting label.
18342
+ formattingLabel = calendar.formats[label],
18343
+
18344
+
18345
+ // The format length is from the formatting label function or the
18346
+ // label length without the escaping exclamation (!) mark.
18347
+ formatLength = formattingLabel ? _.trigger(formattingLabel, calendar, [value, parsingObject]) : label.replace(/^!/, '').length;
18348
+
18349
+ // If there's a format label, split the value up to the format length.
18350
+ // Then add it to the parsing object with appropriate label.
18351
+ if (formattingLabel) {
18352
+ parsingObject[label] = value.substr(0, formatLength);
18353
+ }
18354
+
18355
+ // Update the value as the substring from format length to end.
18356
+ value = value.substr(formatLength);
18357
+ });
18358
+
18359
+ // Compensate for month 0index.
18360
+ return [parsingObject.yyyy || parsingObject.yy, +(parsingObject.mm || parsingObject.m) - 1, parsingObject.dd || parsingObject.d];
18361
+ }; //DatePicker.prototype.parse
18362
+
18363
+
18364
+ /**
18365
+ * Various formats to display the object in.
18366
+ */
18367
+ DatePicker.prototype.formats = function () {
18368
+
18369
+ // Return the length of the first word in a collection.
18370
+ function getWordLengthFromCollection(string, collection, dateObject) {
18371
+
18372
+ // Grab the first word from the string.
18373
+ var word = string.match(/\w+/)[0];
18374
+
18375
+ // If there's no month index, add it to the date object
18376
+ if (!dateObject.mm && !dateObject.m) {
18377
+ dateObject.m = collection.indexOf(word) + 1;
18378
+ }
18379
+
18380
+ // Return the length of the word.
18381
+ return word.length;
18382
+ }
18383
+
18384
+ // Get the length of the first word in a string.
18385
+ function getFirstWordLength(string) {
18386
+ return string.match(/\w+/)[0].length;
18387
+ }
18388
+
18389
+ return {
18390
+
18391
+ d: function (string, dateObject) {
18392
+
18393
+ // If there's string, then get the digits length.
18394
+ // Otherwise return the selected date.
18395
+ return string ? _.digits(string) : dateObject.date;
18396
+ },
18397
+ dd: function (string, dateObject) {
18398
+
18399
+ // If there's a string, then the length is always 2.
18400
+ // Otherwise return the selected date with a leading zero.
18401
+ return string ? 2 : _.lead(dateObject.date);
18402
+ },
18403
+ ddd: function (string, dateObject) {
18404
+
18405
+ // If there's a string, then get the length of the first word.
18406
+ // Otherwise return the short selected weekday.
18407
+ return string ? getFirstWordLength(string) : this.settings.weekdaysShort[dateObject.day];
18408
+ },
18409
+ dddd: function (string, dateObject) {
18410
+
18411
+ // If there's a string, then get the length of the first word.
18412
+ // Otherwise return the full selected weekday.
18413
+ return string ? getFirstWordLength(string) : this.settings.weekdaysFull[dateObject.day];
18414
+ },
18415
+ m: function (string, dateObject) {
18416
+
18417
+ // If there's a string, then get the length of the digits
18418
+ // Otherwise return the selected month with 0index compensation.
18419
+ return string ? _.digits(string) : dateObject.month + 1;
18420
+ },
18421
+ mm: function (string, dateObject) {
18422
+
18423
+ // If there's a string, then the length is always 2.
18424
+ // Otherwise return the selected month with 0index and leading zero.
18425
+ return string ? 2 : _.lead(dateObject.month + 1);
18426
+ },
18427
+ mmm: function (string, dateObject) {
18428
+
18429
+ var collection = this.settings.monthsShort;
18430
+
18431
+ // If there's a string, get length of the relevant month from the short
18432
+ // months collection. Otherwise return the selected month from that collection.
18433
+ return string ? getWordLengthFromCollection(string, collection, dateObject) : collection[dateObject.month];
18434
+ },
18435
+ mmmm: function (string, dateObject) {
18436
+
18437
+ var collection = this.settings.monthsFull;
18438
+
18439
+ // If there's a string, get length of the relevant month from the full
18440
+ // months collection. Otherwise return the selected month from that collection.
18441
+ return string ? getWordLengthFromCollection(string, collection, dateObject) : collection[dateObject.month];
18442
+ },
18443
+ yy: function (string, dateObject) {
18444
+
18445
+ // If there's a string, then the length is always 2.
18446
+ // Otherwise return the selected year by slicing out the first 2 digits.
18447
+ return string ? 2 : ('' + dateObject.year).slice(2);
18448
+ },
18449
+ yyyy: function (string, dateObject) {
18450
+
18451
+ // If there's a string, then the length is always 4.
18452
+ // Otherwise return the selected year.
18453
+ return string ? 4 : dateObject.year;
18454
+ },
18455
+
18456
+ // Create an array by splitting the formatting string passed.
18457
+ toArray: function (formatString) {
18458
+ return formatString.split(/(d{1,4}|m{1,4}|y{4}|yy|!.)/g);
18459
+ },
18460
+
18461
+ // Format an object into a string using the formatting options.
18462
+ toString: function (formatString, itemObject) {
18463
+ var calendar = this;
18464
+ return calendar.formats.toArray(formatString).map(function (label) {
18465
+ return _.trigger(calendar.formats[label], calendar, [0, itemObject]) || label.replace(/^!/, '');
18466
+ }).join('');
18467
+ }
18468
+ };
18469
+ }(); //DatePicker.prototype.formats
18470
+
18471
+
18472
+ /**
18473
+ * Check if two date units are the exact.
18474
+ */
18475
+ DatePicker.prototype.isDateExact = function (one, two) {
18476
+
18477
+ var calendar = this;
18478
+
18479
+ // When we’re working with weekdays, do a direct comparison.
18480
+ if (_.isInteger(one) && _.isInteger(two) || typeof one == 'boolean' && typeof two == 'boolean') {
18481
+ return one === two;
18482
+ }
18483
+
18484
+ // When we’re working with date representations, compare the “pick” value.
18485
+ if ((_.isDate(one) || $.isArray(one)) && (_.isDate(two) || $.isArray(two))) {
18486
+ return calendar.create(one).pick === calendar.create(two).pick;
18487
+ }
18488
+
18489
+ // When we’re working with range objects, compare the “from” and “to”.
18490
+ if ($.isPlainObject(one) && $.isPlainObject(two)) {
18491
+ return calendar.isDateExact(one.from, two.from) && calendar.isDateExact(one.to, two.to);
18492
+ }
18493
+
18494
+ return false;
18495
+ };
18496
+
18497
+ /**
18498
+ * Check if two date units overlap.
18499
+ */
18500
+ DatePicker.prototype.isDateOverlap = function (one, two) {
18501
+
18502
+ var calendar = this,
18503
+ firstDay = calendar.settings.firstDay ? 1 : 0;
18504
+
18505
+ // When we’re working with a weekday index, compare the days.
18506
+ if (_.isInteger(one) && (_.isDate(two) || $.isArray(two))) {
18507
+ one = one % 7 + firstDay;
18508
+ return one === calendar.create(two).day + 1;
18509
+ }
18510
+ if (_.isInteger(two) && (_.isDate(one) || $.isArray(one))) {
18511
+ two = two % 7 + firstDay;
18512
+ return two === calendar.create(one).day + 1;
18513
+ }
18514
+
18515
+ // When we’re working with range objects, check if the ranges overlap.
18516
+ if ($.isPlainObject(one) && $.isPlainObject(two)) {
18517
+ return calendar.overlapRanges(one, two);
18518
+ }
18519
+
18520
+ return false;
18521
+ };
18522
+
18523
+ /**
18524
+ * Flip the “enabled” state.
18525
+ */
18526
+ DatePicker.prototype.flipEnable = function (val) {
18527
+ var itemObject = this.item;
18528
+ itemObject.enable = val || (itemObject.enable == -1 ? 1 : -1);
18529
+ };
18530
+
18531
+ /**
18532
+ * Mark a collection of dates as “disabled”.
18533
+ */
18534
+ DatePicker.prototype.deactivate = function (type, datesToDisable) {
18535
+
18536
+ var calendar = this,
18537
+ disabledItems = calendar.item.disable.slice(0);
18538
+
18539
+ // If we’re flipping, that’s all we need to do.
18540
+ if (datesToDisable == 'flip') {
18541
+ calendar.flipEnable();
18542
+ } else if (datesToDisable === false) {
18543
+ calendar.flipEnable(1);
18544
+ disabledItems = [];
18545
+ } else if (datesToDisable === true) {
18546
+ calendar.flipEnable(-1);
18547
+ disabledItems = [];
18548
+ }
18549
+
18550
+ // Otherwise go through the dates to disable.
18551
+ else {
18552
+
18553
+ datesToDisable.map(function (unitToDisable) {
18554
+
18555
+ var matchFound;
18556
+
18557
+ // When we have disabled items, check for matches.
18558
+ // If something is matched, immediately break out.
18559
+ for (var index = 0; index < disabledItems.length; index += 1) {
18560
+ if (calendar.isDateExact(unitToDisable, disabledItems[index])) {
18561
+ matchFound = true;
18562
+ break;
18563
+ }
18564
+ }
18565
+
18566
+ // If nothing was found, add the validated unit to the collection.
18567
+ if (!matchFound) {
18568
+ if (_.isInteger(unitToDisable) || _.isDate(unitToDisable) || $.isArray(unitToDisable) || $.isPlainObject(unitToDisable) && unitToDisable.from && unitToDisable.to) {
18569
+ disabledItems.push(unitToDisable);
18570
+ }
18571
+ }
18572
+ });
18573
+ }
18574
+
18575
+ // Return the updated collection.
18576
+ return disabledItems;
18577
+ }; //DatePicker.prototype.deactivate
18578
+
18579
+
18580
+ /**
18581
+ * Mark a collection of dates as “enabled”.
18582
+ */
18583
+ DatePicker.prototype.activate = function (type, datesToEnable) {
18584
+
18585
+ var calendar = this,
18586
+ disabledItems = calendar.item.disable,
18587
+ disabledItemsCount = disabledItems.length;
18588
+
18589
+ // If we’re flipping, that’s all we need to do.
18590
+ if (datesToEnable == 'flip') {
18591
+ calendar.flipEnable();
18592
+ } else if (datesToEnable === true) {
18593
+ calendar.flipEnable(1);
18594
+ disabledItems = [];
18595
+ } else if (datesToEnable === false) {
18596
+ calendar.flipEnable(-1);
18597
+ disabledItems = [];
18598
+ }
18599
+
18600
+ // Otherwise go through the disabled dates.
18601
+ else {
18602
+
18603
+ datesToEnable.map(function (unitToEnable) {
18604
+
18605
+ var matchFound, disabledUnit, index, isExactRange;
18606
+
18607
+ // Go through the disabled items and try to find a match.
18608
+ for (index = 0; index < disabledItemsCount; index += 1) {
18609
+
18610
+ disabledUnit = disabledItems[index];
18611
+
18612
+ // When an exact match is found, remove it from the collection.
18613
+ if (calendar.isDateExact(disabledUnit, unitToEnable)) {
18614
+ matchFound = disabledItems[index] = null;
18615
+ isExactRange = true;
18616
+ break;
18617
+ }
18618
+
18619
+ // When an overlapped match is found, add the “inverted” state to it.
18620
+ else if (calendar.isDateOverlap(disabledUnit, unitToEnable)) {
18621
+ if ($.isPlainObject(unitToEnable)) {
18622
+ unitToEnable.inverted = true;
18623
+ matchFound = unitToEnable;
18624
+ } else if ($.isArray(unitToEnable)) {
18625
+ matchFound = unitToEnable;
18626
+ if (!matchFound[3]) matchFound.push('inverted');
18627
+ } else if (_.isDate(unitToEnable)) {
18628
+ matchFound = [unitToEnable.getFullYear(), unitToEnable.getMonth(), unitToEnable.getDate(), 'inverted'];
18629
+ }
18630
+ break;
18631
+ }
18632
+ }
18633
+
18634
+ // If a match was found, remove a previous duplicate entry.
18635
+ if (matchFound) for (index = 0; index < disabledItemsCount; index += 1) {
18636
+ if (calendar.isDateExact(disabledItems[index], unitToEnable)) {
18637
+ disabledItems[index] = null;
18638
+ break;
18639
+ }
18640
+ }
18641
+
18642
+ // In the event that we’re dealing with an exact range of dates,
18643
+ // make sure there are no “inverted” dates because of it.
18644
+ if (isExactRange) for (index = 0; index < disabledItemsCount; index += 1) {
18645
+ if (calendar.isDateOverlap(disabledItems[index], unitToEnable)) {
18646
+ disabledItems[index] = null;
18647
+ break;
18648
+ }
18649
+ }
18650
+
18651
+ // If something is still matched, add it into the collection.
18652
+ if (matchFound) {
18653
+ disabledItems.push(matchFound);
18654
+ }
18655
+ });
18656
+ }
18657
+
18658
+ // Return the updated collection.
18659
+ return disabledItems.filter(function (val) {
18660
+ return val != null;
18661
+ });
18662
+ }; //DatePicker.prototype.activate
18663
+
18664
+
18665
+ /**
18666
+ * Create a string for the nodes in the picker.
18667
+ */
18668
+ DatePicker.prototype.nodes = function (isOpen) {
18669
+
18670
+ var calendar = this,
18671
+ settings = calendar.settings,
18672
+ calendarItem = calendar.item,
18673
+ nowObject = calendarItem.now,
18674
+ selectedObject = calendarItem.select,
18675
+ highlightedObject = calendarItem.highlight,
18676
+ viewsetObject = calendarItem.view,
18677
+ disabledCollection = calendarItem.disable,
18678
+ minLimitObject = calendarItem.min,
18679
+ maxLimitObject = calendarItem.max,
18680
+
18681
+
18682
+ // Create the calendar table head using a copy of weekday labels collection.
18683
+ // * We do a copy so we don't mutate the original array.
18684
+ tableHead = function (collection, fullCollection) {
18685
+
18686
+ // If the first day should be Monday, move Sunday to the end.
18687
+ if (settings.firstDay) {
18688
+ collection.push(collection.shift());
18689
+ fullCollection.push(fullCollection.shift());
18690
+ }
18691
+
18692
+ // Create and return the table head group.
18693
+ return _.node('thead', _.node('tr', _.group({
18694
+ min: 0,
18695
+ max: DAYS_IN_WEEK - 1,
18696
+ i: 1,
18697
+ node: 'th',
18698
+ item: function (counter) {
18699
+ return [collection[counter], settings.klass.weekdays, 'scope=col title="' + fullCollection[counter] + '"'];
18700
+ }
18701
+ }))); //endreturn
18702
+
18703
+ // Materialize modified
18704
+ }((settings.showWeekdaysFull ? settings.weekdaysFull : settings.weekdaysLetter).slice(0), settings.weekdaysFull.slice(0)),
18705
+ //tableHead
18706
+
18707
+
18708
+ // Create the nav for next/prev month.
18709
+ createMonthNav = function (next) {
18710
+
18711
+ // Otherwise, return the created month tag.
18712
+ return _.node('div', ' ', settings.klass['nav' + (next ? 'Next' : 'Prev')] + (
18713
+
18714
+ // If the focused month is outside the range, disabled the button.
18715
+ next && viewsetObject.year >= maxLimitObject.year && viewsetObject.month >= maxLimitObject.month || !next && viewsetObject.year <= minLimitObject.year && viewsetObject.month <= minLimitObject.month ? ' ' + settings.klass.navDisabled : ''), 'data-nav=' + (next || -1) + ' ' + _.ariaAttr({
18716
+ role: 'button',
18717
+ controls: calendar.$node[0].id + '_table'
18718
+ }) + ' ' + 'title="' + (next ? settings.labelMonthNext : settings.labelMonthPrev) + '"'); //endreturn
18719
+ },
18720
+ //createMonthNav
18721
+
18722
+
18723
+ // Create the month label.
18724
+ //Materialize modified
18725
+ createMonthLabel = function (override) {
18726
+
18727
+ var monthsCollection = settings.showMonthsShort ? settings.monthsShort : settings.monthsFull;
18728
+
18729
+ // Materialize modified
18730
+ if (override == "short_months") {
18731
+ monthsCollection = settings.monthsShort;
18732
+ }
18733
+
18734
+ // If there are months to select, add a dropdown menu.
18735
+ if (settings.selectMonths && override == undefined) {
18736
+
18737
+ return _.node('select', _.group({
18738
+ min: 0,
18739
+ max: 11,
18740
+ i: 1,
18741
+ node: 'option',
18742
+ item: function (loopedMonth) {
18743
+
18744
+ return [
18745
+
18746
+ // The looped month and no classes.
18747
+ monthsCollection[loopedMonth], 0,
18748
+
18749
+ // Set the value and selected index.
18750
+ 'value=' + loopedMonth + (viewsetObject.month == loopedMonth ? ' selected' : '') + (viewsetObject.year == minLimitObject.year && loopedMonth < minLimitObject.month || viewsetObject.year == maxLimitObject.year && loopedMonth > maxLimitObject.month ? ' disabled' : '')];
18751
+ }
18752
+ }), settings.klass.selectMonth + ' browser-default', (isOpen ? '' : 'disabled') + ' ' + _.ariaAttr({ controls: calendar.$node[0].id + '_table' }) + ' ' + 'title="' + settings.labelMonthSelect + '"');
18753
+ }
18754
+
18755
+ // Materialize modified
18756
+ if (override == "short_months") if (selectedObject != null) return monthsCollection[selectedObject.month];else return monthsCollection[viewsetObject.month];
18757
+
18758
+ // If there's a need for a month selector
18759
+ return _.node('div', monthsCollection[viewsetObject.month], settings.klass.month);
18760
+ },
18761
+ //createMonthLabel
18762
+
18763
+
18764
+ // Create the year label.
18765
+ // Materialize modified
18766
+ createYearLabel = function (override) {
18767
+
18768
+ var focusedYear = viewsetObject.year,
18769
+
18770
+
18771
+ // If years selector is set to a literal "true", set it to 5. Otherwise
18772
+ // divide in half to get half before and half after focused year.
18773
+ numberYears = settings.selectYears === true ? 5 : ~~(settings.selectYears / 2);
18774
+
18775
+ // If there are years to select, add a dropdown menu.
18776
+ if (numberYears) {
18777
+
18778
+ var minYear = minLimitObject.year,
18779
+ maxYear = maxLimitObject.year,
18780
+ lowestYear = focusedYear - numberYears,
18781
+ highestYear = focusedYear + numberYears;
18782
+
18783
+ // If the min year is greater than the lowest year, increase the highest year
18784
+ // by the difference and set the lowest year to the min year.
18785
+ if (minYear > lowestYear) {
18786
+ highestYear += minYear - lowestYear;
18787
+ lowestYear = minYear;
18788
+ }
18789
+
18790
+ // If the max year is less than the highest year, decrease the lowest year
18791
+ // by the lower of the two: available and needed years. Then set the
18792
+ // highest year to the max year.
18793
+ if (maxYear < highestYear) {
18794
+
18795
+ var availableYears = lowestYear - minYear,
18796
+ neededYears = highestYear - maxYear;
18797
+
18798
+ lowestYear -= availableYears > neededYears ? neededYears : availableYears;
18799
+ highestYear = maxYear;
18800
+ }
18801
+
18802
+ if (settings.selectYears && override == undefined) {
18803
+ return _.node('select', _.group({
18804
+ min: lowestYear,
18805
+ max: highestYear,
18806
+ i: 1,
18807
+ node: 'option',
18808
+ item: function (loopedYear) {
18809
+ return [
18810
+
18811
+ // The looped year and no classes.
18812
+ loopedYear, 0,
18813
+
18814
+ // Set the value and selected index.
18815
+ 'value=' + loopedYear + (focusedYear == loopedYear ? ' selected' : '')];
18816
+ }
18817
+ }), settings.klass.selectYear + ' browser-default', (isOpen ? '' : 'disabled') + ' ' + _.ariaAttr({ controls: calendar.$node[0].id + '_table' }) + ' ' + 'title="' + settings.labelYearSelect + '"');
18818
+ }
18819
+ }
18820
+
18821
+ // Materialize modified
18822
+ if (override == "raw") return _.node('div', focusedYear);
18823
+
18824
+ // Otherwise just return the year focused
18825
+ return _.node('div', focusedYear, settings.klass.year);
18826
+ }; //createYearLabel
18827
+
18828
+
18829
+ // Materialize modified
18830
+ createDayLabel = function () {
18831
+ if (selectedObject != null) return selectedObject.date;else return nowObject.date;
18832
+ };
18833
+ createWeekdayLabel = function () {
18834
+ var display_day;
18835
+
18836
+ if (selectedObject != null) display_day = selectedObject.day;else display_day = nowObject.day;
18837
+ var weekday = settings.weekdaysShort[display_day];
18838
+ return weekday;
18839
+ };
18840
+
18841
+ // Create and return the entire calendar.
18842
+
18843
+ return _.node(
18844
+ // Date presentation View
18845
+ 'div', _.node(
18846
+ // Div for Year
18847
+ 'div', createYearLabel("raw"), settings.klass.year_display) + _.node('span', createWeekdayLabel() + ', ', "picker__weekday-display") + _.node(
18848
+ // Div for short Month
18849
+ 'span', createMonthLabel("short_months") + ' ', settings.klass.month_display) + _.node(
18850
+ // Div for Day
18851
+ 'span', createDayLabel(), settings.klass.day_display), settings.klass.date_display) +
18852
+ // Calendar container
18853
+ _.node('div', _.node('div', _.node('div', (settings.selectYears ? createMonthLabel() + createYearLabel() : createMonthLabel() + createYearLabel()) + createMonthNav() + createMonthNav(1), settings.klass.header) + _.node('table', tableHead + _.node('tbody', _.group({
18854
+ min: 0,
18855
+ max: WEEKS_IN_CALENDAR - 1,
18856
+ i: 1,
18857
+ node: 'tr',
18858
+ item: function (rowCounter) {
18859
+
18860
+ // If Monday is the first day and the month starts on Sunday, shift the date back a week.
18861
+ var shiftDateBy = settings.firstDay && calendar.create([viewsetObject.year, viewsetObject.month, 1]).day === 0 ? -7 : 0;
18862
+
18863
+ return [_.group({
18864
+ min: DAYS_IN_WEEK * rowCounter - viewsetObject.day + shiftDateBy + 1, // Add 1 for weekday 0index
18865
+ max: function () {
18866
+ return this.min + DAYS_IN_WEEK - 1;
18867
+ },
18868
+ i: 1,
18869
+ node: 'td',
18870
+ item: function (targetDate) {
18871
+
18872
+ // Convert the time date from a relative date to a target date.
18873
+ targetDate = calendar.create([viewsetObject.year, viewsetObject.month, targetDate + (settings.firstDay ? 1 : 0)]);
18874
+
18875
+ var isSelected = selectedObject && selectedObject.pick == targetDate.pick,
18876
+ isHighlighted = highlightedObject && highlightedObject.pick == targetDate.pick,
18877
+ isDisabled = disabledCollection && calendar.disabled(targetDate) || targetDate.pick < minLimitObject.pick || targetDate.pick > maxLimitObject.pick,
18878
+ formattedDate = _.trigger(calendar.formats.toString, calendar, [settings.format, targetDate]);
18879
+
18880
+ return [_.node('div', targetDate.date, function (klasses) {
18881
+
18882
+ // Add the `infocus` or `outfocus` classes based on month in view.
18883
+ klasses.push(viewsetObject.month == targetDate.month ? settings.klass.infocus : settings.klass.outfocus);
18884
+
18885
+ // Add the `today` class if needed.
18886
+ if (nowObject.pick == targetDate.pick) {
18887
+ klasses.push(settings.klass.now);
18888
+ }
18889
+
18890
+ // Add the `selected` class if something's selected and the time matches.
18891
+ if (isSelected) {
18892
+ klasses.push(settings.klass.selected);
18893
+ }
18894
+
18895
+ // Add the `highlighted` class if something's highlighted and the time matches.
18896
+ if (isHighlighted) {
18897
+ klasses.push(settings.klass.highlighted);
18898
+ }
18899
+
18900
+ // Add the `disabled` class if something's disabled and the object matches.
18901
+ if (isDisabled) {
18902
+ klasses.push(settings.klass.disabled);
18903
+ }
18904
+
18905
+ return klasses.join(' ');
18906
+ }([settings.klass.day]), 'data-pick=' + targetDate.pick + ' ' + _.ariaAttr({
18907
+ role: 'gridcell',
18908
+ label: formattedDate,
18909
+ selected: isSelected && calendar.$node.val() === formattedDate ? true : null,
18910
+ activedescendant: isHighlighted ? true : null,
18911
+ disabled: isDisabled ? true : null
18912
+ }) + ' ' + (isDisabled ? '' : 'tabindex="0"')), '', _.ariaAttr({ role: 'presentation' })]; //endreturn
18913
+ }
18914
+ })]; //endreturn
18915
+ }
18916
+ })), settings.klass.table, 'id="' + calendar.$node[0].id + '_table' + '" ' + _.ariaAttr({
18917
+ role: 'grid',
18918
+ controls: calendar.$node[0].id,
18919
+ readonly: true
18920
+ })), settings.klass.calendar_container) // end calendar
18921
+
18922
+ +
18923
+
18924
+ // * For Firefox forms to submit, make sure to set the buttons’ `type` attributes as “button”.
18925
+ _.node('div', _.node('button', settings.today, "btn-flat picker__today waves-effect", 'type=button data-pick=' + nowObject.pick + (isOpen && !calendar.disabled(nowObject) ? '' : ' disabled') + ' ' + _.ariaAttr({ controls: calendar.$node[0].id })) + _.node('button', settings.clear, "btn-flat picker__clear waves-effect", 'type=button data-clear=1' + (isOpen ? '' : ' disabled') + ' ' + _.ariaAttr({ controls: calendar.$node[0].id })) + _.node('button', settings.close, "btn-flat picker__close waves-effect", 'type=button data-close=true ' + (isOpen ? '' : ' disabled') + ' ' + _.ariaAttr({ controls: calendar.$node[0].id })), settings.klass.footer), 'picker__container__wrapper'); //endreturn
18926
+ }; //DatePicker.prototype.nodes
18927
+
18928
+
18929
+ /**
18930
+ * The date picker defaults.
18931
+ */
18932
+ DatePicker.defaults = function (prefix) {
18933
+
18934
+ return {
18935
+
18936
+ // The title label to use for the month nav buttons
18937
+ labelMonthNext: 'Next month',
18938
+ labelMonthPrev: 'Previous month',
18939
+
18940
+ // The title label to use for the dropdown selectors
18941
+ labelMonthSelect: 'Select a month',
18942
+ labelYearSelect: 'Select a year',
18943
+
18944
+ // Months and weekdays
18945
+ monthsFull: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
18946
+ monthsShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
18947
+ weekdaysFull: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
18948
+ weekdaysShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
18949
+
18950
+ // Materialize modified
18951
+ weekdaysLetter: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
18952
+
18953
+ // Today and clear
18954
+ today: 'Today',
18955
+ clear: 'Clear',
18956
+ close: 'Ok',
18957
+
18958
+ // Picker close behavior (Prevent a change in behaviour for backwards compatibility)
18959
+ closeOnSelect: false,
18960
+
18961
+ // The format to show on the `input` element
18962
+ format: 'd mmmm, yyyy',
18963
+
18964
+ // Classes
18965
+ klass: {
18966
+
18967
+ table: prefix + 'table',
18968
+
18969
+ header: prefix + 'header',
18970
+
18971
+ // Materialize Added klasses
18972
+ date_display: prefix + 'date-display',
18973
+ day_display: prefix + 'day-display',
18974
+ month_display: prefix + 'month-display',
18975
+ year_display: prefix + 'year-display',
18976
+ calendar_container: prefix + 'calendar-container',
18977
+ // end
18978
+
18979
+
18980
+ navPrev: prefix + 'nav--prev',
18981
+ navNext: prefix + 'nav--next',
18982
+ navDisabled: prefix + 'nav--disabled',
18983
+
18984
+ month: prefix + 'month',
18985
+ year: prefix + 'year',
18986
+
18987
+ selectMonth: prefix + 'select--month',
18988
+ selectYear: prefix + 'select--year',
18989
+
18990
+ weekdays: prefix + 'weekday',
18991
+
18992
+ day: prefix + 'day',
18993
+ disabled: prefix + 'day--disabled',
18994
+ selected: prefix + 'day--selected',
18995
+ highlighted: prefix + 'day--highlighted',
18996
+ now: prefix + 'day--today',
18997
+ infocus: prefix + 'day--infocus',
18998
+ outfocus: prefix + 'day--outfocus',
18999
+
19000
+ footer: prefix + 'footer',
19001
+
19002
+ buttonClear: prefix + 'button--clear',
19003
+ buttonToday: prefix + 'button--today',
19004
+ buttonClose: prefix + 'button--close'
19005
+ }
19006
+ };
19007
+ }(Picker.klasses().picker + '__');
19008
+
19009
+ /**
19010
+ * Extend the picker to add the date picker.
19011
+ */
19012
+ Picker.extend('pickadate', DatePicker);
19013
+ });
19014
+ ; /*!
19015
+ * ClockPicker v0.0.7 (http://weareoutman.github.io/clockpicker/)
19016
+ * Copyright 2014 Wang Shenwei.
19017
+ * Licensed under MIT (https://github.com/weareoutman/clockpicker/blob/gh-pages/LICENSE)
19018
+ *
19019
+ * Further modified
19020
+ * Copyright 2015 Ching Yaw Hao.
19021
+ */
19022
+
19023
+ (function () {
19024
+ var $ = window.jQuery,
19025
+ $win = $(window),
19026
+ $doc = $(document);
19027
+
19028
+ // Can I use inline svg ?
19029
+ var svgNS = 'http://www.w3.org/2000/svg',
19030
+ svgSupported = 'SVGAngle' in window && function () {
19031
+ var supported,
19032
+ el = document.createElement('div');
19033
+ el.innerHTML = '<svg/>';
19034
+ supported = (el.firstChild && el.firstChild.namespaceURI) == svgNS;
19035
+ el.innerHTML = '';
19036
+ return supported;
19037
+ }();
19038
+
19039
+ // Can I use transition ?
19040
+ var transitionSupported = function () {
19041
+ var style = document.createElement('div').style;
19042
+ return 'transition' in style || 'WebkitTransition' in style || 'MozTransition' in style || 'msTransition' in style || 'OTransition' in style;
19043
+ }();
19044
+
19045
+ // Listen touch events in touch screen device, instead of mouse events in desktop.
19046
+ var touchSupported = 'ontouchstart' in window,
19047
+ mousedownEvent = 'mousedown' + (touchSupported ? ' touchstart' : ''),
19048
+ mousemoveEvent = 'mousemove.clockpicker' + (touchSupported ? ' touchmove.clockpicker' : ''),
19049
+ mouseupEvent = 'mouseup.clockpicker' + (touchSupported ? ' touchend.clockpicker' : '');
19050
+
19051
+ // Vibrate the device if supported
19052
+ var vibrate = navigator.vibrate ? 'vibrate' : navigator.webkitVibrate ? 'webkitVibrate' : null;
19053
+
19054
+ function createSvgElement(name) {
19055
+ return document.createElementNS(svgNS, name);
19056
+ }
19057
+
19058
+ function leadingZero(num) {
19059
+ return (num < 10 ? '0' : '') + num;
19060
+ }
19061
+
19062
+ // Get a unique id
19063
+ var idCounter = 0;
19064
+ function uniqueId(prefix) {
19065
+ var id = ++idCounter + '';
19066
+ return prefix ? prefix + id : id;
19067
+ }
19068
+
19069
+ // Clock size
19070
+ var dialRadius = 135,
19071
+ outerRadius = 105,
19072
+
19073
+ // innerRadius = 80 on 12 hour clock
19074
+ innerRadius = 80,
19075
+ tickRadius = 20,
19076
+ diameter = dialRadius * 2,
19077
+ duration = transitionSupported ? 350 : 1;
19078
+
19079
+ // Popover template
19080
+ var tpl = ['<div class="clockpicker picker">', '<div class="picker__holder">', '<div class="picker__frame">', '<div class="picker__wrap">', '<div class="picker__box">', '<div class="picker__date-display">', '<div class="clockpicker-display">', '<div class="clockpicker-display-column">', '<span class="clockpicker-span-hours text-primary"></span>', ':', '<span class="clockpicker-span-minutes"></span>', '</div>', '<div class="clockpicker-display-column clockpicker-display-am-pm">', '<div class="clockpicker-span-am-pm"></div>', '</div>', '</div>', '</div>', '<div class="picker__container__wrapper">', '<div class="picker__calendar-container">', '<div class="clockpicker-plate">', '<div class="clockpicker-canvas"></div>', '<div class="clockpicker-dial clockpicker-hours"></div>', '<div class="clockpicker-dial clockpicker-minutes clockpicker-dial-out"></div>', '</div>', '<div class="clockpicker-am-pm-block">', '</div>', '</div>', '<div class="picker__footer">', '</div>', '</div>', '</div>', '</div>', '</div>', '</div>', '</div>'].join('');
19081
+
19082
+ // ClockPicker
19083
+ function ClockPicker(element, options) {
19084
+ var popover = $(tpl),
19085
+ plate = popover.find('.clockpicker-plate'),
19086
+ holder = popover.find('.picker__holder'),
19087
+ hoursView = popover.find('.clockpicker-hours'),
19088
+ minutesView = popover.find('.clockpicker-minutes'),
19089
+ amPmBlock = popover.find('.clockpicker-am-pm-block'),
19090
+ isInput = element.prop('tagName') === 'INPUT',
19091
+ input = isInput ? element : element.find('input'),
19092
+ label = $("label[for=" + input.attr("id") + "]"),
19093
+ self = this;
19094
+
19095
+ this.id = uniqueId('cp');
19096
+ this.element = element;
19097
+ this.holder = holder;
19098
+ this.options = options;
19099
+ this.isAppended = false;
19100
+ this.isShown = false;
19101
+ this.currentView = 'hours';
19102
+ this.isInput = isInput;
19103
+ this.input = input;
19104
+ this.label = label;
19105
+ this.popover = popover;
19106
+ this.plate = plate;
19107
+ this.hoursView = hoursView;
19108
+ this.minutesView = minutesView;
19109
+ this.amPmBlock = amPmBlock;
19110
+ this.spanHours = popover.find('.clockpicker-span-hours');
19111
+ this.spanMinutes = popover.find('.clockpicker-span-minutes');
19112
+ this.spanAmPm = popover.find('.clockpicker-span-am-pm');
19113
+ this.footer = popover.find('.picker__footer');
19114
+ this.amOrPm = "PM";
19115
+
19116
+ // Setup for for 12 hour clock if option is selected
19117
+ if (options.twelvehour) {
19118
+ if (!options.ampmclickable) {
19119
+ this.spanAmPm.empty();
19120
+ $('<div id="click-am">AM</div>').appendTo(this.spanAmPm);
19121
+ $('<div id="click-pm">PM</div>').appendTo(this.spanAmPm);
19122
+ } else {
19123
+ this.spanAmPm.empty();
19124
+ $('<div id="click-am">AM</div>').on("click", function () {
19125
+ self.spanAmPm.children('#click-am').addClass("text-primary");
19126
+ self.spanAmPm.children('#click-pm').removeClass("text-primary");
19127
+ self.amOrPm = "AM";
19128
+ }).appendTo(this.spanAmPm);
19129
+ $('<div id="click-pm">PM</div>').on("click", function () {
19130
+ self.spanAmPm.children('#click-pm').addClass("text-primary");
19131
+ self.spanAmPm.children('#click-am').removeClass("text-primary");
19132
+ self.amOrPm = 'PM';
19133
+ }).appendTo(this.spanAmPm);
19134
+ }
19135
+ }
19136
+
19137
+ // Add buttons to footer
19138
+ $('<button type="button" class="btn-flat picker__clear" tabindex="' + (options.twelvehour ? '3' : '1') + '">' + options.cleartext + '</button>').click($.proxy(this.clear, this)).appendTo(this.footer);
19139
+ $('<button type="button" class="btn-flat picker__close" tabindex="' + (options.twelvehour ? '3' : '1') + '">' + options.canceltext + '</button>').click($.proxy(this.hide, this)).appendTo(this.footer);
19140
+ $('<button type="button" class="btn-flat picker__close" tabindex="' + (options.twelvehour ? '3' : '1') + '">' + options.donetext + '</button>').click($.proxy(this.done, this)).appendTo(this.footer);
19141
+
19142
+ this.spanHours.click($.proxy(this.toggleView, this, 'hours'));
19143
+ this.spanMinutes.click($.proxy(this.toggleView, this, 'minutes'));
19144
+
19145
+ // Show or toggle
19146
+ input.on('focus.clockpicker click.clockpicker', $.proxy(this.show, this));
19147
+
19148
+ // Build ticks
19149
+ var tickTpl = $('<div class="clockpicker-tick"></div>'),
19150
+ i,
19151
+ tick,
19152
+ radian,
19153
+ radius;
19154
+
19155
+ // Hours view
19156
+ if (options.twelvehour) {
19157
+ for (i = 1; i < 13; i += 1) {
19158
+ tick = tickTpl.clone();
19159
+ radian = i / 6 * Math.PI;
19160
+ radius = outerRadius;
19161
+ tick.css({
19162
+ left: dialRadius + Math.sin(radian) * radius - tickRadius,
19163
+ top: dialRadius - Math.cos(radian) * radius - tickRadius
19164
+ });
19165
+ tick.html(i === 0 ? '00' : i);
19166
+ hoursView.append(tick);
19167
+ tick.on(mousedownEvent, mousedown);
19168
+ }
19169
+ } else {
19170
+ for (i = 0; i < 24; i += 1) {
19171
+ tick = tickTpl.clone();
19172
+ radian = i / 6 * Math.PI;
19173
+ var inner = i > 0 && i < 13;
19174
+ radius = inner ? innerRadius : outerRadius;
19175
+ tick.css({
19176
+ left: dialRadius + Math.sin(radian) * radius - tickRadius,
19177
+ top: dialRadius - Math.cos(radian) * radius - tickRadius
19178
+ });
19179
+ tick.html(i === 0 ? '00' : i);
19180
+ hoursView.append(tick);
19181
+ tick.on(mousedownEvent, mousedown);
19182
+ }
19183
+ }
19184
+
19185
+ // Minutes view
19186
+ for (i = 0; i < 60; i += 5) {
19187
+ tick = tickTpl.clone();
19188
+ radian = i / 30 * Math.PI;
19189
+ tick.css({
19190
+ left: dialRadius + Math.sin(radian) * outerRadius - tickRadius,
19191
+ top: dialRadius - Math.cos(radian) * outerRadius - tickRadius
19192
+ });
19193
+ tick.html(leadingZero(i));
19194
+ minutesView.append(tick);
19195
+ tick.on(mousedownEvent, mousedown);
19196
+ }
19197
+
19198
+ // Clicking on minutes view space
19199
+ plate.on(mousedownEvent, function (e) {
19200
+ if ($(e.target).closest('.clockpicker-tick').length === 0) {
19201
+ mousedown(e, true);
19202
+ }
19203
+ });
19204
+
19205
+ // Mousedown or touchstart
19206
+ function mousedown(e, space) {
19207
+ var offset = plate.offset(),
19208
+ isTouch = /^touch/.test(e.type),
19209
+ x0 = offset.left + dialRadius,
19210
+ y0 = offset.top + dialRadius,
19211
+ dx = (isTouch ? e.originalEvent.touches[0] : e).pageX - x0,
19212
+ dy = (isTouch ? e.originalEvent.touches[0] : e).pageY - y0,
19213
+ z = Math.sqrt(dx * dx + dy * dy),
19214
+ moved = false;
19215
+
19216
+ // When clicking on minutes view space, check the mouse position
19217
+ if (space && (z < outerRadius - tickRadius || z > outerRadius + tickRadius)) {
19218
+ return;
19219
+ }
19220
+ e.preventDefault();
19221
+
19222
+ // Set cursor style of body after 200ms
19223
+ var movingTimer = setTimeout(function () {
19224
+ self.popover.addClass('clockpicker-moving');
19225
+ }, 200);
19226
+
19227
+ // Clock
19228
+ self.setHand(dx, dy, !space, true);
19229
+
19230
+ // Mousemove on document
19231
+ $doc.off(mousemoveEvent).on(mousemoveEvent, function (e) {
19232
+ e.preventDefault();
19233
+ var isTouch = /^touch/.test(e.type),
19234
+ x = (isTouch ? e.originalEvent.touches[0] : e).pageX - x0,
19235
+ y = (isTouch ? e.originalEvent.touches[0] : e).pageY - y0;
19236
+ if (!moved && x === dx && y === dy) {
19237
+ // Clicking in chrome on windows will trigger a mousemove event
19238
+ return;
19239
+ }
19240
+ moved = true;
19241
+ self.setHand(x, y, false, true);
19242
+ });
19243
+
19244
+ // Mouseup on document
19245
+ $doc.off(mouseupEvent).on(mouseupEvent, function (e) {
19246
+ $doc.off(mouseupEvent);
19247
+ e.preventDefault();
19248
+ var isTouch = /^touch/.test(e.type),
19249
+ x = (isTouch ? e.originalEvent.changedTouches[0] : e).pageX - x0,
19250
+ y = (isTouch ? e.originalEvent.changedTouches[0] : e).pageY - y0;
19251
+ if ((space || moved) && x === dx && y === dy) {
19252
+ self.setHand(x, y);
19253
+ }
19254
+
19255
+ if (self.currentView === 'hours') {
19256
+ self.toggleView('minutes', duration / 2);
19257
+ } else if (options.autoclose) {
19258
+ self.minutesView.addClass('clockpicker-dial-out');
19259
+ setTimeout(function () {
19260
+ self.done();
19261
+ }, duration / 2);
19262
+ }
19263
+ plate.prepend(canvas);
19264
+
19265
+ // Reset cursor style of body
19266
+ clearTimeout(movingTimer);
19267
+ self.popover.removeClass('clockpicker-moving');
19268
+
19269
+ // Unbind mousemove event
19270
+ $doc.off(mousemoveEvent);
19271
+ });
19272
+ }
19273
+
19274
+ if (svgSupported) {
19275
+ // Draw clock hands and others
19276
+ var canvas = popover.find('.clockpicker-canvas'),
19277
+ svg = createSvgElement('svg');
19278
+ svg.setAttribute('class', 'clockpicker-svg');
19279
+ svg.setAttribute('width', diameter);
19280
+ svg.setAttribute('height', diameter);
19281
+ var g = createSvgElement('g');
19282
+ g.setAttribute('transform', 'translate(' + dialRadius + ',' + dialRadius + ')');
19283
+ var bearing = createSvgElement('circle');
19284
+ bearing.setAttribute('class', 'clockpicker-canvas-bearing');
19285
+ bearing.setAttribute('cx', 0);
19286
+ bearing.setAttribute('cy', 0);
19287
+ bearing.setAttribute('r', 4);
19288
+ var hand = createSvgElement('line');
19289
+ hand.setAttribute('x1', 0);
19290
+ hand.setAttribute('y1', 0);
19291
+ var bg = createSvgElement('circle');
19292
+ bg.setAttribute('class', 'clockpicker-canvas-bg');
19293
+ bg.setAttribute('r', tickRadius);
19294
+ g.appendChild(hand);
19295
+ g.appendChild(bg);
19296
+ g.appendChild(bearing);
19297
+ svg.appendChild(g);
19298
+ canvas.append(svg);
19299
+
19300
+ this.hand = hand;
19301
+ this.bg = bg;
19302
+ this.bearing = bearing;
19303
+ this.g = g;
19304
+ this.canvas = canvas;
19305
+ }
19306
+
19307
+ raiseCallback(this.options.init);
19308
+ }
19309
+
19310
+ function raiseCallback(callbackFunction) {
19311
+ if (callbackFunction && typeof callbackFunction === "function") callbackFunction();
19312
+ }
19313
+
19314
+ // Default options
19315
+ ClockPicker.DEFAULTS = {
19316
+ 'default': '', // default time, 'now' or '13:14' e.g.
19317
+ fromnow: 0, // set default time to * milliseconds from now (using with default = 'now')
19318
+ donetext: 'Ok', // done button text
19319
+ cleartext: 'Clear',
19320
+ canceltext: 'Cancel',
19321
+ autoclose: false, // auto close when minute is selected
19322
+ ampmclickable: true, // set am/pm button on itself
19323
+ darktheme: false, // set to dark theme
19324
+ twelvehour: true, // change to 12 hour AM/PM clock from 24 hour
19325
+ vibrate: true // vibrate the device when dragging clock hand
19326
+ };
19327
+
19328
+ // Show or hide popover
19329
+ ClockPicker.prototype.toggle = function () {
19330
+ this[this.isShown ? 'hide' : 'show']();
19331
+ };
19332
+
19333
+ // Set popover position
19334
+ ClockPicker.prototype.locate = function () {
19335
+ var element = this.element,
19336
+ popover = this.popover,
19337
+ offset = element.offset(),
19338
+ width = element.outerWidth(),
19339
+ height = element.outerHeight(),
19340
+ align = this.options.align,
19341
+ self = this;
19342
+
19343
+ popover.show();
19344
+ };
19345
+
19346
+ // Show popover
19347
+ ClockPicker.prototype.show = function (e) {
19348
+ // Not show again
19349
+ if (this.isShown) {
19350
+ return;
19351
+ }
19352
+ raiseCallback(this.options.beforeShow);
19353
+ $(':input').each(function () {
19354
+ $(this).attr('tabindex', -1);
19355
+ });
19356
+ var self = this;
19357
+ // Initialize
19358
+ this.input.blur();
19359
+ this.popover.addClass('picker--opened');
19360
+ this.input.addClass('picker__input picker__input--active');
19361
+ $(document.body).css('overflow', 'hidden');
19362
+ // Get the time
19363
+ var value = ((this.input.prop('value') || this.options['default'] || '') + '').split(':');
19364
+ if (this.options.twelvehour && !(typeof value[1] === 'undefined')) {
19365
+ if (value[1].indexOf("AM") > 0) {
19366
+ this.amOrPm = 'AM';
19367
+ } else {
19368
+ this.amOrPm = 'PM';
19369
+ }
19370
+ value[1] = value[1].replace("AM", "").replace("PM", "");
19371
+ }
19372
+ if (value[0] === 'now') {
19373
+ var now = new Date(+new Date() + this.options.fromnow);
19374
+ value = [now.getHours(), now.getMinutes()];
19375
+ if (this.options.twelvehour) {
19376
+ this.amOrPm = value[0] >= 12 && value[0] < 24 ? 'PM' : 'AM';
19377
+ }
19378
+ }
19379
+ this.hours = +value[0] || 0;
19380
+ this.minutes = +value[1] || 0;
19381
+ this.spanHours.html(this.hours);
19382
+ this.spanMinutes.html(leadingZero(this.minutes));
19383
+ if (!this.isAppended) {
19384
+ // Append popover to body
19385
+ this.popover.insertAfter(this.input);
19386
+ if (this.options.twelvehour) {
19387
+ if (this.amOrPm === 'PM') {
19388
+ this.spanAmPm.children('#click-pm').addClass("text-primary");
19389
+ this.spanAmPm.children('#click-am').removeClass("text-primary");
19390
+ } else {
19391
+ this.spanAmPm.children('#click-am').addClass("text-primary");
19392
+ this.spanAmPm.children('#click-pm').removeClass("text-primary");
19393
+ }
19394
+ }
19395
+ // Reset position when resize
19396
+ $win.on('resize.clockpicker' + this.id, function () {
19397
+ if (self.isShown) {
19398
+ self.locate();
19399
+ }
19400
+ });
19401
+ this.isAppended = true;
19402
+ }
19403
+ // Toggle to hours view
19404
+ this.toggleView('hours');
19405
+ // Set position
19406
+ this.locate();
19407
+ this.isShown = true;
19408
+ // Hide when clicking or tabbing on any element except the clock and input
19409
+ $doc.on('click.clockpicker.' + this.id + ' focusin.clockpicker.' + this.id, function (e) {
19410
+ var target = $(e.target);
19411
+ if (target.closest(self.popover.find('.picker__wrap')).length === 0 && target.closest(self.input).length === 0) {
19412
+ self.hide();
19413
+ }
19414
+ });
19415
+ // Hide when ESC is pressed
19416
+ $doc.on('keyup.clockpicker.' + this.id, function (e) {
19417
+ if (e.keyCode === 27) {
19418
+ self.hide();
19419
+ }
19420
+ });
19421
+ raiseCallback(this.options.afterShow);
19422
+ };
19423
+ // Hide popover
19424
+ ClockPicker.prototype.hide = function () {
19425
+ raiseCallback(this.options.beforeHide);
19426
+ this.input.removeClass('picker__input picker__input--active');
19427
+ this.popover.removeClass('picker--opened');
19428
+ $(document.body).css('overflow', 'visible');
19429
+ this.isShown = false;
19430
+ $(':input').each(function (index) {
19431
+ $(this).attr('tabindex', index + 1);
19432
+ });
19433
+ // Unbinding events on document
19434
+ $doc.off('click.clockpicker.' + this.id + ' focusin.clockpicker.' + this.id);
19435
+ $doc.off('keyup.clockpicker.' + this.id);
19436
+ this.popover.hide();
19437
+ raiseCallback(this.options.afterHide);
19438
+ };
19439
+ // Toggle to hours or minutes view
19440
+ ClockPicker.prototype.toggleView = function (view, delay) {
19441
+ var raiseAfterHourSelect = false;
19442
+ if (view === 'minutes' && $(this.hoursView).css("visibility") === "visible") {
19443
+ raiseCallback(this.options.beforeHourSelect);
19444
+ raiseAfterHourSelect = true;
19445
+ }
19446
+ var isHours = view === 'hours',
19447
+ nextView = isHours ? this.hoursView : this.minutesView,
19448
+ hideView = isHours ? this.minutesView : this.hoursView;
19449
+ this.currentView = view;
19450
+
19451
+ this.spanHours.toggleClass('text-primary', isHours);
19452
+ this.spanMinutes.toggleClass('text-primary', !isHours);
19453
+
19454
+ // Let's make transitions
19455
+ hideView.addClass('clockpicker-dial-out');
19456
+ nextView.css('visibility', 'visible').removeClass('clockpicker-dial-out');
19457
+
19458
+ // Reset clock hand
19459
+ this.resetClock(delay);
19460
+
19461
+ // After transitions ended
19462
+ clearTimeout(this.toggleViewTimer);
19463
+ this.toggleViewTimer = setTimeout(function () {
19464
+ hideView.css('visibility', 'hidden');
19465
+ }, duration);
19466
+
19467
+ if (raiseAfterHourSelect) {
19468
+ raiseCallback(this.options.afterHourSelect);
19469
+ }
19470
+ };
19471
+
19472
+ // Reset clock hand
19473
+ ClockPicker.prototype.resetClock = function (delay) {
19474
+ var view = this.currentView,
19475
+ value = this[view],
19476
+ isHours = view === 'hours',
19477
+ unit = Math.PI / (isHours ? 6 : 30),
19478
+ radian = value * unit,
19479
+ radius = isHours && value > 0 && value < 13 ? innerRadius : outerRadius,
19480
+ x = Math.sin(radian) * radius,
19481
+ y = -Math.cos(radian) * radius,
19482
+ self = this;
19483
+
19484
+ if (svgSupported && delay) {
19485
+ self.canvas.addClass('clockpicker-canvas-out');
19486
+ setTimeout(function () {
19487
+ self.canvas.removeClass('clockpicker-canvas-out');
19488
+ self.setHand(x, y);
19489
+ }, delay);
19490
+ } else this.setHand(x, y);
19491
+ };
19492
+
19493
+ // Set clock hand to (x, y)
19494
+ ClockPicker.prototype.setHand = function (x, y, roundBy5, dragging) {
19495
+ var radian = Math.atan2(x, -y),
19496
+ isHours = this.currentView === 'hours',
19497
+ unit = Math.PI / (isHours || roundBy5 ? 6 : 30),
19498
+ z = Math.sqrt(x * x + y * y),
19499
+ options = this.options,
19500
+ inner = isHours && z < (outerRadius + innerRadius) / 2,
19501
+ radius = inner ? innerRadius : outerRadius,
19502
+ value;
19503
+
19504
+ if (options.twelvehour) {
19505
+ radius = outerRadius;
19506
+ }
19507
+
19508
+ // Radian should in range [0, 2PI]
19509
+ if (radian < 0) {
19510
+ radian = Math.PI * 2 + radian;
19511
+ }
19512
+
19513
+ // Get the round value
19514
+ value = Math.round(radian / unit);
19515
+
19516
+ // Get the round radian
19517
+ radian = value * unit;
19518
+
19519
+ // Correct the hours or minutes
19520
+ if (options.twelvehour) {
19521
+ if (isHours) {
19522
+ if (value === 0) value = 12;
19523
+ } else {
19524
+ if (roundBy5) value *= 5;
19525
+ if (value === 60) value = 0;
19526
+ }
19527
+ } else {
19528
+ if (isHours) {
19529
+ if (value === 12) value = 0;
19530
+ value = inner ? value === 0 ? 12 : value : value === 0 ? 0 : value + 12;
19531
+ } else {
19532
+ if (roundBy5) value *= 5;
19533
+ if (value === 60) value = 0;
19534
+ }
19535
+ }
19536
+
19537
+ // Once hours or minutes changed, vibrate the device
19538
+ if (this[this.currentView] !== value) {
19539
+ if (vibrate && this.options.vibrate) {
19540
+ // Do not vibrate too frequently
19541
+ if (!this.vibrateTimer) {
19542
+ navigator[vibrate](10);
19543
+ this.vibrateTimer = setTimeout($.proxy(function () {
19544
+ this.vibrateTimer = null;
19545
+ }, this), 100);
19546
+ }
19547
+ }
19548
+ }
19549
+
19550
+ this[this.currentView] = value;
19551
+ if (isHours) {
19552
+ this['spanHours'].html(value);
19553
+ } else {
19554
+ this['spanMinutes'].html(leadingZero(value));
19555
+ }
19556
+
19557
+ // If svg is not supported, just add an active class to the tick
19558
+ if (!svgSupported) {
19559
+ this[isHours ? 'hoursView' : 'minutesView'].find('.clockpicker-tick').each(function () {
19560
+ var tick = $(this);
19561
+ tick.toggleClass('active', value === +tick.html());
19562
+ });
19563
+ return;
19564
+ }
19565
+
19566
+ // Set clock hand and others' position
19567
+ var cx1 = Math.sin(radian) * (radius - tickRadius),
19568
+ cy1 = -Math.cos(radian) * (radius - tickRadius),
19569
+ cx2 = Math.sin(radian) * radius,
19570
+ cy2 = -Math.cos(radian) * radius;
19571
+ this.hand.setAttribute('x2', cx1);
19572
+ this.hand.setAttribute('y2', cy1);
19573
+ this.bg.setAttribute('cx', cx2);
19574
+ this.bg.setAttribute('cy', cy2);
19575
+ };
19576
+
19577
+ // Hours and minutes are selected
19578
+ ClockPicker.prototype.done = function () {
19579
+ raiseCallback(this.options.beforeDone);
19580
+ this.hide();
19581
+ this.label.addClass('active');
19582
+
19583
+ var last = this.input.prop('value'),
19584
+ value = leadingZero(this.hours) + ':' + leadingZero(this.minutes);
19585
+ if (this.options.twelvehour) {
19586
+ value = value + this.amOrPm;
19587
+ }
19588
+
19589
+ this.input.prop('value', value);
19590
+ if (value !== last) {
19591
+ this.input.triggerHandler('change');
19592
+ if (!this.isInput) {
19593
+ this.element.trigger('change');
19594
+ }
19595
+ }
19596
+
19597
+ if (this.options.autoclose) this.input.trigger('blur');
19598
+
19599
+ raiseCallback(this.options.afterDone);
19600
+ };
19601
+
19602
+ // Clear input field
19603
+ ClockPicker.prototype.clear = function () {
19604
+ this.hide();
19605
+ this.label.removeClass('active');
19606
+
19607
+ var last = this.input.prop('value'),
19608
+ value = '';
19609
+
19610
+ this.input.prop('value', value);
19611
+ if (value !== last) {
19612
+ this.input.triggerHandler('change');
19613
+ if (!this.isInput) {
19614
+ this.element.trigger('change');
19615
+ }
19616
+ }
19617
+
19618
+ if (this.options.autoclose) {
19619
+ this.input.trigger('blur');
19620
+ }
19621
+ };
19622
+
19623
+ // Remove clockpicker from input
19624
+ ClockPicker.prototype.remove = function () {
19625
+ this.element.removeData('clockpicker');
19626
+ this.input.off('focus.clockpicker click.clockpicker');
19627
+ if (this.isShown) {
19628
+ this.hide();
19629
+ }
19630
+ if (this.isAppended) {
19631
+ $win.off('resize.clockpicker' + this.id);
19632
+ this.popover.remove();
19633
+ }
19634
+ };
19635
+
19636
+ // Extends $.fn.clockpicker
19637
+ $.fn.pickatime = function (option) {
19638
+ var args = Array.prototype.slice.call(arguments, 1);
19639
+ return this.each(function () {
19640
+ var $this = $(this),
19641
+ data = $this.data('clockpicker');
19642
+ if (!data) {
19643
+ var options = $.extend({}, ClockPicker.DEFAULTS, $this.data(), typeof option == 'object' && option);
19644
+ $this.data('clockpicker', new ClockPicker($this, options));
19645
+ } else {
19646
+ // Manual operatsions. show, hide, remove, e.g.
19647
+ if (typeof data[option] === 'function') {
19648
+ data[option].apply(data, args);
19649
+ }
19650
+ }
19651
+ });
19652
+ };
19653
+ })();
19654
+ ;(function ($) {
19655
+
19656
+ $.fn.characterCounter = function () {
19657
+ return this.each(function () {
19658
+ var $input = $(this);
19659
+ var $counterElement = $input.parent().find('span[class="character-counter"]');
19660
+
19661
+ // character counter has already been added appended to the parent container
19662
+ if ($counterElement.length) {
19663
+ return;
19664
+ }
19665
+
19666
+ var itHasLengthAttribute = $input.attr('data-length') !== undefined;
19667
+
19668
+ if (itHasLengthAttribute) {
19669
+ $input.on('input', updateCounter);
19670
+ $input.on('focus', updateCounter);
19671
+ $input.on('blur', removeCounterElement);
19672
+
19673
+ addCounterElement($input);
19674
+ }
19675
+ });
19676
+ };
19677
+
19678
+ function updateCounter() {
19679
+ var maxLength = +$(this).attr('data-length'),
19680
+ actualLength = +$(this).val().length,
19681
+ isValidLength = actualLength <= maxLength;
19682
+
19683
+ $(this).parent().find('span[class="character-counter"]').html(actualLength + '/' + maxLength);
19684
+
19685
+ addInputStyle(isValidLength, $(this));
19686
+ }
19687
+
19688
+ function addCounterElement($input) {
19689
+ var $counterElement = $input.parent().find('span[class="character-counter"]');
19690
+
19691
+ if ($counterElement.length) {
19692
+ return;
19693
+ }
19694
+
19695
+ $counterElement = $('<span/>').addClass('character-counter').css('float', 'right').css('font-size', '12px').css('height', 1);
19696
+
19697
+ $input.parent().append($counterElement);
19698
+ }
19699
+
19700
+ function removeCounterElement() {
19701
+ $(this).parent().find('span[class="character-counter"]').html('');
19702
+ }
19703
+
19704
+ function addInputStyle(isValidLength, $input) {
19705
+ var inputHasInvalidClass = $input.hasClass('invalid');
19706
+ if (isValidLength && inputHasInvalidClass) {
19707
+ $input.removeClass('invalid');
19708
+ } else if (!isValidLength && !inputHasInvalidClass) {
19709
+ $input.removeClass('valid');
19710
+ $input.addClass('invalid');
19711
+ }
19712
+ }
19713
+
19714
+ $(document).ready(function () {
19715
+ $('input, textarea').characterCounter();
19716
+ });
19717
+ })(jQuery);
19718
+ ;(function ($) {
19719
+
19720
+ var methods = {
19721
+
19722
+ init: function (options) {
19723
+ var defaults = {
19724
+ duration: 200, // ms
19725
+ dist: -100, // zoom scale TODO: make this more intuitive as an option
19726
+ shift: 0, // spacing for center image
19727
+ padding: 0, // Padding between non center items
19728
+ fullWidth: false, // Change to full width styles
19729
+ indicators: false, // Toggle indicators
19730
+ noWrap: false, // Don't wrap around and cycle through items.
19731
+ onCycleTo: null // Callback for when a new slide is cycled to.
19732
+ };
19733
+ options = $.extend(defaults, options);
19734
+ var namespace = Materialize.objectSelectorString($(this));
19735
+
19736
+ return this.each(function (i) {
19737
+
19738
+ var images, item_width, item_height, offset, center, pressed, dim, count, reference, referenceY, amplitude, target, velocity, scrolling, xform, frame, timestamp, ticker, dragged, vertical_dragged;
19739
+ var $indicators = $('<ul class="indicators"></ul>');
19740
+ var scrollingTimeout = null;
19741
+ var oneTimeCallback = null;
19742
+
19743
+ // Initialize
19744
+ var view = $(this);
19745
+ var hasMultipleSlides = view.find('.carousel-item').length > 1;
19746
+ var showIndicators = (view.attr('data-indicators') || options.indicators) && hasMultipleSlides;
19747
+ var noWrap = view.attr('data-no-wrap') || options.noWrap || !hasMultipleSlides;
19748
+ var uniqueNamespace = view.attr('data-namespace') || namespace + i;
19749
+ view.attr('data-namespace', uniqueNamespace);
19750
+
19751
+ // Options
19752
+ var setCarouselHeight = function (imageOnly) {
19753
+ var firstSlide = view.find('.carousel-item.active').length ? view.find('.carousel-item.active').first() : view.find('.carousel-item').first();
19754
+ var firstImage = firstSlide.find('img').first();
19755
+ if (firstImage.length) {
19756
+ if (firstImage[0].complete) {
19757
+ // If image won't trigger the load event
19758
+ var imageHeight = firstImage.height();
19759
+ if (imageHeight > 0) {
19760
+ view.css('height', firstImage.height());
19761
+ } else {
19762
+ // If image still has no height, use the natural dimensions to calculate
19763
+ var naturalWidth = firstImage[0].naturalWidth;
19764
+ var naturalHeight = firstImage[0].naturalHeight;
19765
+ var adjustedHeight = view.width() / naturalWidth * naturalHeight;
19766
+ view.css('height', adjustedHeight);
19767
+ }
19768
+ } else {
19769
+ // Get height when image is loaded normally
19770
+ firstImage.on('load', function () {
19771
+ view.css('height', $(this).height());
19772
+ });
19773
+ }
19774
+ } else if (!imageOnly) {
19775
+ var slideHeight = firstSlide.height();
19776
+ view.css('height', slideHeight);
19777
+ }
19778
+ };
19779
+
19780
+ if (options.fullWidth) {
19781
+ options.dist = 0;
19782
+ setCarouselHeight();
19783
+
19784
+ // Offset fixed items when indicators.
19785
+ if (showIndicators) {
19786
+ view.find('.carousel-fixed-item').addClass('with-indicators');
19787
+ }
19788
+ }
19789
+
19790
+ // Don't double initialize.
19791
+ if (view.hasClass('initialized')) {
19792
+ // Recalculate variables
19793
+ $(window).trigger('resize');
19794
+
19795
+ // Redraw carousel.
19796
+ view.trigger('carouselNext', [0.000001]);
19797
+ return true;
19798
+ }
19799
+
19800
+ view.addClass('initialized');
19801
+ pressed = false;
19802
+ offset = target = 0;
19803
+ images = [];
19804
+ item_width = view.find('.carousel-item').first().innerWidth();
19805
+ item_height = view.find('.carousel-item').first().innerHeight();
19806
+ dim = item_width * 2 + options.padding;
19807
+
19808
+ view.find('.carousel-item').each(function (i) {
19809
+ images.push($(this)[0]);
19810
+ if (showIndicators) {
19811
+ var $indicator = $('<li class="indicator-item"></li>');
19812
+
19813
+ // Add active to first by default.
19814
+ if (i === 0) {
19815
+ $indicator.addClass('active');
19816
+ }
19817
+
19818
+ // Handle clicks on indicators.
19819
+ $indicator.click(function (e) {
19820
+ e.stopPropagation();
19821
+
19822
+ var index = $(this).index();
19823
+ cycleTo(index);
19824
+ });
19825
+ $indicators.append($indicator);
19826
+ }
19827
+ });
19828
+
19829
+ if (showIndicators) {
19830
+ view.append($indicators);
19831
+ }
19832
+ count = images.length;
19833
+
19834
+ function setupEvents() {
19835
+ if (typeof window.ontouchstart !== 'undefined') {
19836
+ view.on('touchstart.carousel', tap);
19837
+ view.on('touchmove.carousel', drag);
19838
+ view.on('touchend.carousel', release);
19839
+ }
19840
+ view.on('mousedown.carousel', tap);
19841
+ view.on('mousemove.carousel', drag);
19842
+ view.on('mouseup.carousel', release);
19843
+ view.on('mouseleave.carousel', release);
19844
+ view.on('click.carousel', click);
19845
+ }
19846
+
19847
+ function xpos(e) {
19848
+ // touch event
19849
+ if (e.targetTouches && e.targetTouches.length >= 1) {
19850
+ return e.targetTouches[0].clientX;
19851
+ }
19852
+
19853
+ // mouse event
19854
+ return e.clientX;
19855
+ }
19856
+
19857
+ function ypos(e) {
19858
+ // touch event
19859
+ if (e.targetTouches && e.targetTouches.length >= 1) {
19860
+ return e.targetTouches[0].clientY;
19861
+ }
19862
+
19863
+ // mouse event
19864
+ return e.clientY;
19865
+ }
19866
+
19867
+ function wrap(x) {
19868
+ return x >= count ? x % count : x < 0 ? wrap(count + x % count) : x;
19869
+ }
19870
+
19871
+ function scroll(x) {
19872
+ // Track scrolling state
19873
+ scrolling = true;
19874
+ if (!view.hasClass('scrolling')) {
19875
+ view.addClass('scrolling');
19876
+ }
19877
+ if (scrollingTimeout != null) {
19878
+ window.clearTimeout(scrollingTimeout);
19879
+ }
19880
+ scrollingTimeout = window.setTimeout(function () {
19881
+ scrolling = false;
19882
+ view.removeClass('scrolling');
19883
+ }, options.duration);
19884
+
19885
+ // Start actual scroll
19886
+ var i, half, delta, dir, tween, el, alignment, xTranslation;
19887
+ var lastCenter = center;
19888
+
19889
+ offset = typeof x === 'number' ? x : offset;
19890
+ center = Math.floor((offset + dim / 2) / dim);
19891
+ delta = offset - center * dim;
19892
+ dir = delta < 0 ? 1 : -1;
19893
+ tween = -dir * delta * 2 / dim;
19894
+ half = count >> 1;
19895
+
19896
+ if (!options.fullWidth) {
19897
+ alignment = 'translateX(' + (view[0].clientWidth - item_width) / 2 + 'px) ';
19898
+ alignment += 'translateY(' + (view[0].clientHeight - item_height) / 2 + 'px)';
19899
+ } else {
19900
+ alignment = 'translateX(0)';
19901
+ }
19902
+
19903
+ // Set indicator active
19904
+ if (showIndicators) {
19905
+ var diff = center % count;
19906
+ var activeIndicator = $indicators.find('.indicator-item.active');
19907
+ if (activeIndicator.index() !== diff) {
19908
+ activeIndicator.removeClass('active');
19909
+ $indicators.find('.indicator-item').eq(diff).addClass('active');
19910
+ }
19911
+ }
19912
+
19913
+ // center
19914
+ // Don't show wrapped items.
19915
+ if (!noWrap || center >= 0 && center < count) {
19916
+ el = images[wrap(center)];
19917
+
19918
+ // Add active class to center item.
19919
+ if (!$(el).hasClass('active')) {
19920
+ view.find('.carousel-item').removeClass('active');
19921
+ $(el).addClass('active');
19922
+ }
19923
+ el.style[xform] = alignment + ' translateX(' + -delta / 2 + 'px)' + ' translateX(' + dir * options.shift * tween * i + 'px)' + ' translateZ(' + options.dist * tween + 'px)';
19924
+ el.style.zIndex = 0;
19925
+ if (options.fullWidth) {
19926
+ tweenedOpacity = 1;
19927
+ } else {
19928
+ tweenedOpacity = 1 - 0.2 * tween;
19929
+ }
19930
+ el.style.opacity = tweenedOpacity;
19931
+ el.style.display = 'block';
19932
+ }
19933
+
19934
+ for (i = 1; i <= half; ++i) {
19935
+ // right side
19936
+ if (options.fullWidth) {
19937
+ zTranslation = options.dist;
19938
+ tweenedOpacity = i === half && delta < 0 ? 1 - tween : 1;
19939
+ } else {
19940
+ zTranslation = options.dist * (i * 2 + tween * dir);
19941
+ tweenedOpacity = 1 - 0.2 * (i * 2 + tween * dir);
19942
+ }
19943
+ // Don't show wrapped items.
19944
+ if (!noWrap || center + i < count) {
19945
+ el = images[wrap(center + i)];
19946
+ el.style[xform] = alignment + ' translateX(' + (options.shift + (dim * i - delta) / 2) + 'px)' + ' translateZ(' + zTranslation + 'px)';
19947
+ el.style.zIndex = -i;
19948
+ el.style.opacity = tweenedOpacity;
19949
+ el.style.display = 'block';
19950
+ }
19951
+
19952
+ // left side
19953
+ if (options.fullWidth) {
19954
+ zTranslation = options.dist;
19955
+ tweenedOpacity = i === half && delta > 0 ? 1 - tween : 1;
19956
+ } else {
19957
+ zTranslation = options.dist * (i * 2 - tween * dir);
19958
+ tweenedOpacity = 1 - 0.2 * (i * 2 - tween * dir);
19959
+ }
19960
+ // Don't show wrapped items.
19961
+ if (!noWrap || center - i >= 0) {
19962
+ el = images[wrap(center - i)];
19963
+ el.style[xform] = alignment + ' translateX(' + (-options.shift + (-dim * i - delta) / 2) + 'px)' + ' translateZ(' + zTranslation + 'px)';
19964
+ el.style.zIndex = -i;
19965
+ el.style.opacity = tweenedOpacity;
19966
+ el.style.display = 'block';
19967
+ }
19968
+ }
19969
+
19970
+ // center
19971
+ // Don't show wrapped items.
19972
+ if (!noWrap || center >= 0 && center < count) {
19973
+ el = images[wrap(center)];
19974
+ el.style[xform] = alignment + ' translateX(' + -delta / 2 + 'px)' + ' translateX(' + dir * options.shift * tween + 'px)' + ' translateZ(' + options.dist * tween + 'px)';
19975
+ el.style.zIndex = 0;
19976
+ if (options.fullWidth) {
19977
+ tweenedOpacity = 1;
19978
+ } else {
19979
+ tweenedOpacity = 1 - 0.2 * tween;
19980
+ }
19981
+ el.style.opacity = tweenedOpacity;
19982
+ el.style.display = 'block';
19983
+ }
19984
+
19985
+ // onCycleTo callback
19986
+ if (lastCenter !== center && typeof options.onCycleTo === "function") {
19987
+ var $curr_item = view.find('.carousel-item').eq(wrap(center));
19988
+ options.onCycleTo.call(this, $curr_item, dragged);
19989
+ }
19990
+
19991
+ // One time callback
19992
+ if (typeof oneTimeCallback === "function") {
19993
+ oneTimeCallback.call(this, $curr_item, dragged);
19994
+ oneTimeCallback = null;
19995
+ }
19996
+ }
19997
+
19998
+ function track() {
19999
+ var now, elapsed, delta, v;
20000
+
20001
+ now = Date.now();
20002
+ elapsed = now - timestamp;
20003
+ timestamp = now;
20004
+ delta = offset - frame;
20005
+ frame = offset;
20006
+
20007
+ v = 1000 * delta / (1 + elapsed);
20008
+ velocity = 0.8 * v + 0.2 * velocity;
20009
+ }
20010
+
20011
+ function autoScroll() {
20012
+ var elapsed, delta;
20013
+
20014
+ if (amplitude) {
20015
+ elapsed = Date.now() - timestamp;
20016
+ delta = amplitude * Math.exp(-elapsed / options.duration);
20017
+ if (delta > 2 || delta < -2) {
20018
+ scroll(target - delta);
20019
+ requestAnimationFrame(autoScroll);
20020
+ } else {
20021
+ scroll(target);
20022
+ }
20023
+ }
20024
+ }
20025
+
20026
+ function click(e) {
20027
+ // Disable clicks if carousel was dragged.
20028
+ if (dragged) {
20029
+ e.preventDefault();
20030
+ e.stopPropagation();
20031
+ return false;
20032
+ } else if (!options.fullWidth) {
20033
+ var clickedIndex = $(e.target).closest('.carousel-item').index();
20034
+ var diff = wrap(center) - clickedIndex;
20035
+
20036
+ // Disable clicks if carousel was shifted by click
20037
+ if (diff !== 0) {
20038
+ e.preventDefault();
20039
+ e.stopPropagation();
20040
+ }
20041
+ cycleTo(clickedIndex);
20042
+ }
20043
+ }
20044
+
20045
+ function cycleTo(n) {
20046
+ var diff = center % count - n;
20047
+
20048
+ // Account for wraparound.
20049
+ if (!noWrap) {
20050
+ if (diff < 0) {
20051
+ if (Math.abs(diff + count) < Math.abs(diff)) {
20052
+ diff += count;
20053
+ }
20054
+ } else if (diff > 0) {
20055
+ if (Math.abs(diff - count) < diff) {
20056
+ diff -= count;
20057
+ }
20058
+ }
20059
+ }
20060
+
20061
+ // Call prev or next accordingly.
20062
+ if (diff < 0) {
20063
+ view.trigger('carouselNext', [Math.abs(diff)]);
20064
+ } else if (diff > 0) {
20065
+ view.trigger('carouselPrev', [diff]);
20066
+ }
20067
+ }
20068
+
20069
+ function tap(e) {
20070
+ // Fixes firefox draggable image bug
20071
+ if (e.type === 'mousedown' && $(e.target).is('img')) {
20072
+ e.preventDefault();
20073
+ }
20074
+ pressed = true;
20075
+ dragged = false;
20076
+ vertical_dragged = false;
20077
+ reference = xpos(e);
20078
+ referenceY = ypos(e);
20079
+
20080
+ velocity = amplitude = 0;
20081
+ frame = offset;
20082
+ timestamp = Date.now();
20083
+ clearInterval(ticker);
20084
+ ticker = setInterval(track, 100);
20085
+ }
20086
+
20087
+ function drag(e) {
20088
+ var x, delta, deltaY;
20089
+ if (pressed) {
20090
+ x = xpos(e);
20091
+ y = ypos(e);
20092
+ delta = reference - x;
20093
+ deltaY = Math.abs(referenceY - y);
20094
+ if (deltaY < 30 && !vertical_dragged) {
20095
+ // If vertical scrolling don't allow dragging.
20096
+ if (delta > 2 || delta < -2) {
20097
+ dragged = true;
20098
+ reference = x;
20099
+ scroll(offset + delta);
20100
+ }
20101
+ } else if (dragged) {
20102
+ // If dragging don't allow vertical scroll.
20103
+ e.preventDefault();
20104
+ e.stopPropagation();
20105
+ return false;
20106
+ } else {
20107
+ // Vertical scrolling.
20108
+ vertical_dragged = true;
20109
+ }
20110
+ }
20111
+
20112
+ if (dragged) {
20113
+ // If dragging don't allow vertical scroll.
20114
+ e.preventDefault();
20115
+ e.stopPropagation();
20116
+ return false;
20117
+ }
20118
+ }
20119
+
20120
+ function release(e) {
20121
+ if (pressed) {
20122
+ pressed = false;
20123
+ } else {
20124
+ return;
20125
+ }
20126
+
20127
+ clearInterval(ticker);
20128
+ target = offset;
20129
+ if (velocity > 10 || velocity < -10) {
20130
+ amplitude = 0.9 * velocity;
20131
+ target = offset + amplitude;
20132
+ }
20133
+ target = Math.round(target / dim) * dim;
20134
+
20135
+ // No wrap of items.
20136
+ if (noWrap) {
20137
+ if (target >= dim * (count - 1)) {
20138
+ target = dim * (count - 1);
20139
+ } else if (target < 0) {
20140
+ target = 0;
20141
+ }
20142
+ }
20143
+ amplitude = target - offset;
20144
+ timestamp = Date.now();
20145
+ requestAnimationFrame(autoScroll);
20146
+
20147
+ if (dragged) {
20148
+ e.preventDefault();
20149
+ e.stopPropagation();
20150
+ }
20151
+ return false;
20152
+ }
20153
+
20154
+ xform = 'transform';
20155
+ ['webkit', 'Moz', 'O', 'ms'].every(function (prefix) {
20156
+ var e = prefix + 'Transform';
20157
+ if (typeof document.body.style[e] !== 'undefined') {
20158
+ xform = e;
20159
+ return false;
20160
+ }
20161
+ return true;
20162
+ });
20163
+
20164
+ var throttledResize = Materialize.throttle(function () {
20165
+ if (options.fullWidth) {
20166
+ item_width = view.find('.carousel-item').first().innerWidth();
20167
+ var imageHeight = view.find('.carousel-item.active').height();
20168
+ dim = item_width * 2 + options.padding;
20169
+ offset = center * 2 * item_width;
20170
+ target = offset;
20171
+ setCarouselHeight(true);
20172
+ } else {
20173
+ scroll();
20174
+ }
20175
+ }, 200);
20176
+ $(window).off('resize.carousel-' + uniqueNamespace).on('resize.carousel-' + uniqueNamespace, throttledResize);
20177
+
20178
+ setupEvents();
20179
+ scroll(offset);
20180
+
20181
+ $(this).on('carouselNext', function (e, n, callback) {
20182
+ if (n === undefined) {
20183
+ n = 1;
20184
+ }
20185
+ if (typeof callback === "function") {
20186
+ oneTimeCallback = callback;
20187
+ }
20188
+
20189
+ target = dim * Math.round(offset / dim) + dim * n;
20190
+ if (offset !== target) {
20191
+ amplitude = target - offset;
20192
+ timestamp = Date.now();
20193
+ requestAnimationFrame(autoScroll);
20194
+ }
20195
+ });
20196
+
20197
+ $(this).on('carouselPrev', function (e, n, callback) {
20198
+ if (n === undefined) {
20199
+ n = 1;
20200
+ }
20201
+ if (typeof callback === "function") {
20202
+ oneTimeCallback = callback;
20203
+ }
20204
+
20205
+ target = dim * Math.round(offset / dim) - dim * n;
20206
+ if (offset !== target) {
20207
+ amplitude = target - offset;
20208
+ timestamp = Date.now();
20209
+ requestAnimationFrame(autoScroll);
20210
+ }
20211
+ });
20212
+
20213
+ $(this).on('carouselSet', function (e, n, callback) {
20214
+ if (n === undefined) {
20215
+ n = 0;
20216
+ }
20217
+ if (typeof callback === "function") {
20218
+ oneTimeCallback = callback;
20219
+ }
20220
+
20221
+ cycleTo(n);
20222
+ });
20223
+ });
20224
+ },
20225
+ next: function (n, callback) {
20226
+ $(this).trigger('carouselNext', [n, callback]);
20227
+ },
20228
+ prev: function (n, callback) {
20229
+ $(this).trigger('carouselPrev', [n, callback]);
20230
+ },
20231
+ set: function (n, callback) {
20232
+ $(this).trigger('carouselSet', [n, callback]);
20233
+ },
20234
+ destroy: function () {
20235
+ var uniqueNamespace = $(this).attr('data-namespace');
20236
+ $(this).removeAttr('data-namespace');
20237
+ $(this).removeClass('initialized');
20238
+ $(this).find('.indicators').remove();
20239
+
20240
+ // Remove event handlers
20241
+ $(this).off('carouselNext carouselPrev carouselSet');
20242
+ $(window).off('resize.carousel-' + uniqueNamespace);
20243
+ if (typeof window.ontouchstart !== 'undefined') {
20244
+ $(this).off('touchstart.carousel touchmove.carousel touchend.carousel');
20245
+ }
20246
+ $(this).off('mousedown.carousel mousemove.carousel mouseup.carousel mouseleave.carousel click.carousel');
20247
+ }
20248
+ };
20249
+
20250
+ $.fn.carousel = function (methodOrOptions) {
20251
+ if (methods[methodOrOptions]) {
20252
+ return methods[methodOrOptions].apply(this, Array.prototype.slice.call(arguments, 1));
20253
+ } else if (typeof methodOrOptions === 'object' || !methodOrOptions) {
20254
+ // Default to "init"
20255
+ return methods.init.apply(this, arguments);
20256
+ } else {
20257
+ $.error('Method ' + methodOrOptions + ' does not exist on jQuery.carousel');
20258
+ }
20259
+ }; // Plugin end
20260
+ })(jQuery);
20261
+ ;(function ($) {
20262
+
20263
+ var methods = {
20264
+ init: function (options) {
20265
+ return this.each(function () {
20266
+ var origin = $('#' + $(this).attr('data-activates'));
20267
+ var screen = $('body');
20268
+
20269
+ // Creating tap target
20270
+ var tapTargetEl = $(this);
20271
+ var tapTargetWrapper = tapTargetEl.parent('.tap-target-wrapper');
20272
+ var tapTargetWave = tapTargetWrapper.find('.tap-target-wave');
20273
+ var tapTargetOriginEl = tapTargetWrapper.find('.tap-target-origin');
20274
+ var tapTargetContentEl = tapTargetEl.find('.tap-target-content');
20275
+
20276
+ // Creating wrapper
20277
+ if (!tapTargetWrapper.length) {
20278
+ tapTargetWrapper = tapTargetEl.wrap($('<div class="tap-target-wrapper"></div>')).parent();
20279
+ }
20280
+
20281
+ // Creating content
20282
+ if (!tapTargetContentEl.length) {
20283
+ tapTargetContentEl = $('<div class="tap-target-content"></div>');
20284
+ tapTargetEl.append(tapTargetContentEl);
20285
+ }
20286
+
20287
+ // Creating foreground wave
20288
+ if (!tapTargetWave.length) {
20289
+ tapTargetWave = $('<div class="tap-target-wave"></div>');
20290
+
20291
+ // Creating origin
20292
+ if (!tapTargetOriginEl.length) {
20293
+ tapTargetOriginEl = origin.clone(true, true);
20294
+ tapTargetOriginEl.addClass('tap-target-origin');
20295
+ tapTargetOriginEl.removeAttr('id');
20296
+ tapTargetOriginEl.removeAttr('style');
20297
+ tapTargetWave.append(tapTargetOriginEl);
20298
+ }
20299
+
20300
+ tapTargetWrapper.append(tapTargetWave);
20301
+ }
20302
+
20303
+ // Open
20304
+ var openTapTarget = function () {
20305
+ if (tapTargetWrapper.is('.open')) {
20306
+ return;
20307
+ }
20308
+
20309
+ // Adding open class
20310
+ tapTargetWrapper.addClass('open');
20311
+
20312
+ setTimeout(function () {
20313
+ tapTargetOriginEl.off('click.tapTarget').on('click.tapTarget', function (e) {
20314
+ closeTapTarget();
20315
+ tapTargetOriginEl.off('click.tapTarget');
20316
+ });
20317
+
20318
+ $(document).off('click.tapTarget').on('click.tapTarget', function (e) {
20319
+ closeTapTarget();
20320
+ $(document).off('click.tapTarget');
20321
+ });
20322
+
20323
+ var throttledCalc = Materialize.throttle(function () {
20324
+ calculateTapTarget();
20325
+ }, 200);
20326
+ $(window).off('resize.tapTarget').on('resize.tapTarget', throttledCalc);
20327
+ }, 0);
20328
+ };
20329
+
20330
+ // Close
20331
+ var closeTapTarget = function () {
20332
+ if (!tapTargetWrapper.is('.open')) {
20333
+ return;
20334
+ }
20335
+
20336
+ tapTargetWrapper.removeClass('open');
20337
+ tapTargetOriginEl.off('click.tapTarget');
20338
+ $(document).off('click.tapTarget');
20339
+ $(window).off('resize.tapTarget');
20340
+ };
20341
+
20342
+ // Pre calculate
20343
+ var calculateTapTarget = function () {
20344
+ // Element or parent is fixed position?
20345
+ var isFixed = origin.css('position') === 'fixed';
20346
+ if (!isFixed) {
20347
+ var parents = origin.parents();
20348
+ for (var i = 0; i < parents.length; i++) {
20349
+ isFixed = $(parents[i]).css('position') == 'fixed';
20350
+ if (isFixed) {
20351
+ break;
20352
+ }
20353
+ }
20354
+ }
20355
+
20356
+ // Calculating origin
20357
+ var originWidth = origin.outerWidth();
20358
+ var originHeight = origin.outerHeight();
20359
+ var originTop = isFixed ? origin.offset().top - $(document).scrollTop() : origin.offset().top;
20360
+ var originLeft = isFixed ? origin.offset().left - $(document).scrollLeft() : origin.offset().left;
20361
+
20362
+ // Calculating screen
20363
+ var windowWidth = $(window).width();
20364
+ var windowHeight = $(window).height();
20365
+ var centerX = windowWidth / 2;
20366
+ var centerY = windowHeight / 2;
20367
+ var isLeft = originLeft <= centerX;
20368
+ var isRight = originLeft > centerX;
20369
+ var isTop = originTop <= centerY;
20370
+ var isBottom = originTop > centerY;
20371
+ var isCenterX = originLeft >= windowWidth * 0.25 && originLeft <= windowWidth * 0.75;
20372
+ var isCenterY = originTop >= windowHeight * 0.25 && originTop <= windowHeight * 0.75;
20373
+
20374
+ // Calculating tap target
20375
+ var tapTargetWidth = tapTargetEl.outerWidth();
20376
+ var tapTargetHeight = tapTargetEl.outerHeight();
20377
+ var tapTargetTop = originTop + originHeight / 2 - tapTargetHeight / 2;
20378
+ var tapTargetLeft = originLeft + originWidth / 2 - tapTargetWidth / 2;
20379
+ var tapTargetPosition = isFixed ? 'fixed' : 'absolute';
20380
+
20381
+ // Calculating content
20382
+ var tapTargetTextWidth = isCenterX ? tapTargetWidth : tapTargetWidth / 2 + originWidth;
20383
+ var tapTargetTextHeight = tapTargetHeight / 2;
20384
+ var tapTargetTextTop = isTop ? tapTargetHeight / 2 : 0;
20385
+ var tapTargetTextBottom = 0;
20386
+ var tapTargetTextLeft = isLeft && !isCenterX ? tapTargetWidth / 2 - originWidth : 0;
20387
+ var tapTargetTextRight = 0;
20388
+ var tapTargetTextPadding = originWidth;
20389
+ var tapTargetTextAlign = isBottom ? 'bottom' : 'top';
20390
+
20391
+ // Calculating wave
20392
+ var tapTargetWaveWidth = originWidth > originHeight ? originWidth * 2 : originWidth * 2;
20393
+ var tapTargetWaveHeight = tapTargetWaveWidth;
20394
+ var tapTargetWaveTop = tapTargetHeight / 2 - tapTargetWaveHeight / 2;
20395
+ var tapTargetWaveLeft = tapTargetWidth / 2 - tapTargetWaveWidth / 2;
20396
+
20397
+ // Setting tap target
20398
+ var tapTargetWrapperCssObj = {};
20399
+ tapTargetWrapperCssObj.top = isTop ? tapTargetTop : '';
20400
+ tapTargetWrapperCssObj.right = isRight ? windowWidth - tapTargetLeft - tapTargetWidth : '';
20401
+ tapTargetWrapperCssObj.bottom = isBottom ? windowHeight - tapTargetTop - tapTargetHeight : '';
20402
+ tapTargetWrapperCssObj.left = isLeft ? tapTargetLeft : '';
20403
+ tapTargetWrapperCssObj.position = tapTargetPosition;
20404
+ tapTargetWrapper.css(tapTargetWrapperCssObj);
20405
+
20406
+ // Setting content
20407
+ tapTargetContentEl.css({
20408
+ width: tapTargetTextWidth,
20409
+ height: tapTargetTextHeight,
20410
+ top: tapTargetTextTop,
20411
+ right: tapTargetTextRight,
20412
+ bottom: tapTargetTextBottom,
20413
+ left: tapTargetTextLeft,
20414
+ padding: tapTargetTextPadding,
20415
+ verticalAlign: tapTargetTextAlign
20416
+ });
20417
+
20418
+ // Setting wave
20419
+ tapTargetWave.css({
20420
+ top: tapTargetWaveTop,
20421
+ left: tapTargetWaveLeft,
20422
+ width: tapTargetWaveWidth,
20423
+ height: tapTargetWaveHeight
20424
+ });
20425
+ };
20426
+
20427
+ if (options == 'open') {
20428
+ calculateTapTarget();
20429
+ openTapTarget();
20430
+ }
20431
+
20432
+ if (options == 'close') closeTapTarget();
20433
+ });
20434
+ },
20435
+ open: function () {},
20436
+ close: function () {}
20437
+ };
20438
+
20439
+ $.fn.tapTarget = function (methodOrOptions) {
20440
+ if (methods[methodOrOptions] || typeof methodOrOptions === 'object') return methods.init.apply(this, arguments);
20441
+
20442
+ $.error('Method ' + methodOrOptions + ' does not exist on jQuery.tap-target');
20443
+ };
20444
+ })(jQuery);
20445
+
20446
+
20447
+ /***/ }),
20448
+ /* 7 */
20449
+ /***/ (function(module, exports) {
20450
+
20451
+ /* WEBPACK VAR INJECTION */(function(__webpack_amd_options__) {/* globals __webpack_amd_options__ */
20452
+ module.exports = __webpack_amd_options__;
20453
+
20454
+ /* WEBPACK VAR INJECTION */}.call(exports, {}))
20455
+
20456
+ /***/ }),
20457
+ /* 8 */
20458
+ /***/ (function(module, exports, __webpack_require__) {
20459
+
20460
+ var __WEBPACK_AMD_DEFINE_RESULT__;/*! Hammer.JS - v2.0.7 - 2016-04-22
20461
+ * http://hammerjs.github.io/
20462
+ *
20463
+ * Copyright (c) 2016 Jorik Tangelder;
20464
+ * Licensed under the MIT license */
20465
+ (function(window, document, exportName, undefined) {
20466
+ 'use strict';
20467
+
20468
+ var VENDOR_PREFIXES = ['', 'webkit', 'Moz', 'MS', 'ms', 'o'];
20469
+ var TEST_ELEMENT = document.createElement('div');
20470
+
20471
+ var TYPE_FUNCTION = 'function';
20472
+
20473
+ var round = Math.round;
20474
+ var abs = Math.abs;
20475
+ var now = Date.now;
20476
+
20477
+ /**
20478
+ * set a timeout with a given scope
20479
+ * @param {Function} fn
20480
+ * @param {Number} timeout
20481
+ * @param {Object} context
20482
+ * @returns {number}
20483
+ */
20484
+ function setTimeoutContext(fn, timeout, context) {
20485
+ return setTimeout(bindFn(fn, context), timeout);
20486
+ }
20487
+
20488
+ /**
20489
+ * if the argument is an array, we want to execute the fn on each entry
20490
+ * if it aint an array we don't want to do a thing.
20491
+ * this is used by all the methods that accept a single and array argument.
20492
+ * @param {*|Array} arg
20493
+ * @param {String} fn
20494
+ * @param {Object} [context]
20495
+ * @returns {Boolean}
20496
+ */
20497
+ function invokeArrayArg(arg, fn, context) {
20498
+ if (Array.isArray(arg)) {
20499
+ each(arg, context[fn], context);
20500
+ return true;
20501
+ }
20502
+ return false;
20503
+ }
20504
+
20505
+ /**
20506
+ * walk objects and arrays
20507
+ * @param {Object} obj
20508
+ * @param {Function} iterator
20509
+ * @param {Object} context
20510
+ */
20511
+ function each(obj, iterator, context) {
20512
+ var i;
20513
+
20514
+ if (!obj) {
20515
+ return;
20516
+ }
20517
+
20518
+ if (obj.forEach) {
20519
+ obj.forEach(iterator, context);
20520
+ } else if (obj.length !== undefined) {
20521
+ i = 0;
20522
+ while (i < obj.length) {
20523
+ iterator.call(context, obj[i], i, obj);
20524
+ i++;
20525
+ }
20526
+ } else {
20527
+ for (i in obj) {
20528
+ obj.hasOwnProperty(i) && iterator.call(context, obj[i], i, obj);
20529
+ }
20530
+ }
20531
+ }
20532
+
20533
+ /**
20534
+ * wrap a method with a deprecation warning and stack trace
20535
+ * @param {Function} method
20536
+ * @param {String} name
20537
+ * @param {String} message
20538
+ * @returns {Function} A new function wrapping the supplied method.
20539
+ */
20540
+ function deprecate(method, name, message) {
20541
+ var deprecationMessage = 'DEPRECATED METHOD: ' + name + '\n' + message + ' AT \n';
20542
+ return function() {
20543
+ var e = new Error('get-stack-trace');
20544
+ var stack = e && e.stack ? e.stack.replace(/^[^\(]+?[\n$]/gm, '')
20545
+ .replace(/^\s+at\s+/gm, '')
20546
+ .replace(/^Object.<anonymous>\s*\(/gm, '{anonymous}()@') : 'Unknown Stack Trace';
20547
+
20548
+ var log = window.console && (window.console.warn || window.console.log);
20549
+ if (log) {
20550
+ log.call(window.console, deprecationMessage, stack);
20551
+ }
20552
+ return method.apply(this, arguments);
20553
+ };
20554
+ }
20555
+
20556
+ /**
20557
+ * extend object.
20558
+ * means that properties in dest will be overwritten by the ones in src.
20559
+ * @param {Object} target
20560
+ * @param {...Object} objects_to_assign
20561
+ * @returns {Object} target
20562
+ */
20563
+ var assign;
20564
+ if (typeof Object.assign !== 'function') {
20565
+ assign = function assign(target) {
20566
+ if (target === undefined || target === null) {
20567
+ throw new TypeError('Cannot convert undefined or null to object');
20568
+ }
20569
+
20570
+ var output = Object(target);
20571
+ for (var index = 1; index < arguments.length; index++) {
20572
+ var source = arguments[index];
20573
+ if (source !== undefined && source !== null) {
20574
+ for (var nextKey in source) {
20575
+ if (source.hasOwnProperty(nextKey)) {
20576
+ output[nextKey] = source[nextKey];
20577
+ }
20578
+ }
20579
+ }
20580
+ }
20581
+ return output;
20582
+ };
20583
+ } else {
20584
+ assign = Object.assign;
20585
+ }
20586
+
20587
+ /**
20588
+ * extend object.
20589
+ * means that properties in dest will be overwritten by the ones in src.
20590
+ * @param {Object} dest
20591
+ * @param {Object} src
20592
+ * @param {Boolean} [merge=false]
20593
+ * @returns {Object} dest
20594
+ */
20595
+ var extend = deprecate(function extend(dest, src, merge) {
20596
+ var keys = Object.keys(src);
20597
+ var i = 0;
20598
+ while (i < keys.length) {
20599
+ if (!merge || (merge && dest[keys[i]] === undefined)) {
20600
+ dest[keys[i]] = src[keys[i]];
20601
+ }
20602
+ i++;
20603
+ }
20604
+ return dest;
20605
+ }, 'extend', 'Use `assign`.');
20606
+
20607
+ /**
20608
+ * merge the values from src in the dest.
20609
+ * means that properties that exist in dest will not be overwritten by src
20610
+ * @param {Object} dest
20611
+ * @param {Object} src
20612
+ * @returns {Object} dest
20613
+ */
20614
+ var merge = deprecate(function merge(dest, src) {
20615
+ return extend(dest, src, true);
20616
+ }, 'merge', 'Use `assign`.');
20617
+
20618
+ /**
20619
+ * simple class inheritance
20620
+ * @param {Function} child
20621
+ * @param {Function} base
20622
+ * @param {Object} [properties]
20623
+ */
20624
+ function inherit(child, base, properties) {
20625
+ var baseP = base.prototype,
20626
+ childP;
20627
+
20628
+ childP = child.prototype = Object.create(baseP);
20629
+ childP.constructor = child;
20630
+ childP._super = baseP;
20631
+
20632
+ if (properties) {
20633
+ assign(childP, properties);
20634
+ }
20635
+ }
20636
+
20637
+ /**
20638
+ * simple function bind
20639
+ * @param {Function} fn
20640
+ * @param {Object} context
20641
+ * @returns {Function}
20642
+ */
20643
+ function bindFn(fn, context) {
20644
+ return function boundFn() {
20645
+ return fn.apply(context, arguments);
20646
+ };
20647
+ }
20648
+
20649
+ /**
20650
+ * let a boolean value also be a function that must return a boolean
20651
+ * this first item in args will be used as the context
20652
+ * @param {Boolean|Function} val
20653
+ * @param {Array} [args]
20654
+ * @returns {Boolean}
20655
+ */
20656
+ function boolOrFn(val, args) {
20657
+ if (typeof val == TYPE_FUNCTION) {
20658
+ return val.apply(args ? args[0] || undefined : undefined, args);
20659
+ }
20660
+ return val;
20661
+ }
20662
+
20663
+ /**
20664
+ * use the val2 when val1 is undefined
20665
+ * @param {*} val1
20666
+ * @param {*} val2
20667
+ * @returns {*}
20668
+ */
20669
+ function ifUndefined(val1, val2) {
20670
+ return (val1 === undefined) ? val2 : val1;
20671
+ }
20672
+
20673
+ /**
20674
+ * addEventListener with multiple events at once
20675
+ * @param {EventTarget} target
20676
+ * @param {String} types
20677
+ * @param {Function} handler
20678
+ */
20679
+ function addEventListeners(target, types, handler) {
20680
+ each(splitStr(types), function(type) {
20681
+ target.addEventListener(type, handler, false);
20682
+ });
20683
+ }
20684
+
20685
+ /**
20686
+ * removeEventListener with multiple events at once
20687
+ * @param {EventTarget} target
20688
+ * @param {String} types
20689
+ * @param {Function} handler
20690
+ */
20691
+ function removeEventListeners(target, types, handler) {
20692
+ each(splitStr(types), function(type) {
20693
+ target.removeEventListener(type, handler, false);
20694
+ });
20695
+ }
20696
+
20697
+ /**
20698
+ * find if a node is in the given parent
20699
+ * @method hasParent
20700
+ * @param {HTMLElement} node
20701
+ * @param {HTMLElement} parent
20702
+ * @return {Boolean} found
20703
+ */
20704
+ function hasParent(node, parent) {
20705
+ while (node) {
20706
+ if (node == parent) {
20707
+ return true;
20708
+ }
20709
+ node = node.parentNode;
20710
+ }
20711
+ return false;
20712
+ }
20713
+
20714
+ /**
20715
+ * small indexOf wrapper
20716
+ * @param {String} str
20717
+ * @param {String} find
20718
+ * @returns {Boolean} found
20719
+ */
20720
+ function inStr(str, find) {
20721
+ return str.indexOf(find) > -1;
20722
+ }
20723
+
20724
+ /**
20725
+ * split string on whitespace
20726
+ * @param {String} str
20727
+ * @returns {Array} words
20728
+ */
20729
+ function splitStr(str) {
20730
+ return str.trim().split(/\s+/g);
20731
+ }
20732
+
20733
+ /**
20734
+ * find if a array contains the object using indexOf or a simple polyFill
20735
+ * @param {Array} src
20736
+ * @param {String} find
20737
+ * @param {String} [findByKey]
20738
+ * @return {Boolean|Number} false when not found, or the index
20739
+ */
20740
+ function inArray(src, find, findByKey) {
20741
+ if (src.indexOf && !findByKey) {
20742
+ return src.indexOf(find);
20743
+ } else {
20744
+ var i = 0;
20745
+ while (i < src.length) {
20746
+ if ((findByKey && src[i][findByKey] == find) || (!findByKey && src[i] === find)) {
20747
+ return i;
20748
+ }
20749
+ i++;
20750
+ }
20751
+ return -1;
20752
+ }
20753
+ }
20754
+
20755
+ /**
20756
+ * convert array-like objects to real arrays
20757
+ * @param {Object} obj
20758
+ * @returns {Array}
20759
+ */
20760
+ function toArray(obj) {
20761
+ return Array.prototype.slice.call(obj, 0);
20762
+ }
20763
+
20764
+ /**
20765
+ * unique array with objects based on a key (like 'id') or just by the array's value
20766
+ * @param {Array} src [{id:1},{id:2},{id:1}]
20767
+ * @param {String} [key]
20768
+ * @param {Boolean} [sort=False]
20769
+ * @returns {Array} [{id:1},{id:2}]
20770
+ */
20771
+ function uniqueArray(src, key, sort) {
20772
+ var results = [];
20773
+ var values = [];
20774
+ var i = 0;
20775
+
20776
+ while (i < src.length) {
20777
+ var val = key ? src[i][key] : src[i];
20778
+ if (inArray(values, val) < 0) {
20779
+ results.push(src[i]);
20780
+ }
20781
+ values[i] = val;
20782
+ i++;
20783
+ }
20784
+
20785
+ if (sort) {
20786
+ if (!key) {
20787
+ results = results.sort();
20788
+ } else {
20789
+ results = results.sort(function sortUniqueArray(a, b) {
20790
+ return a[key] > b[key];
20791
+ });
20792
+ }
20793
+ }
20794
+
20795
+ return results;
20796
+ }
20797
+
20798
+ /**
20799
+ * get the prefixed property
20800
+ * @param {Object} obj
20801
+ * @param {String} property
20802
+ * @returns {String|Undefined} prefixed
20803
+ */
20804
+ function prefixed(obj, property) {
20805
+ var prefix, prop;
20806
+ var camelProp = property[0].toUpperCase() + property.slice(1);
20807
+
20808
+ var i = 0;
20809
+ while (i < VENDOR_PREFIXES.length) {
20810
+ prefix = VENDOR_PREFIXES[i];
20811
+ prop = (prefix) ? prefix + camelProp : property;
20812
+
20813
+ if (prop in obj) {
20814
+ return prop;
20815
+ }
20816
+ i++;
20817
+ }
20818
+ return undefined;
20819
+ }
20820
+
20821
+ /**
20822
+ * get a unique id
20823
+ * @returns {number} uniqueId
20824
+ */
20825
+ var _uniqueId = 1;
20826
+ function uniqueId() {
20827
+ return _uniqueId++;
20828
+ }
20829
+
20830
+ /**
20831
+ * get the window object of an element
20832
+ * @param {HTMLElement} element
20833
+ * @returns {DocumentView|Window}
20834
+ */
20835
+ function getWindowForElement(element) {
20836
+ var doc = element.ownerDocument || element;
20837
+ return (doc.defaultView || doc.parentWindow || window);
20838
+ }
20839
+
20840
+ var MOBILE_REGEX = /mobile|tablet|ip(ad|hone|od)|android/i;
20841
+
20842
+ var SUPPORT_TOUCH = ('ontouchstart' in window);
20843
+ var SUPPORT_POINTER_EVENTS = prefixed(window, 'PointerEvent') !== undefined;
20844
+ var SUPPORT_ONLY_TOUCH = SUPPORT_TOUCH && MOBILE_REGEX.test(navigator.userAgent);
20845
+
20846
+ var INPUT_TYPE_TOUCH = 'touch';
20847
+ var INPUT_TYPE_PEN = 'pen';
20848
+ var INPUT_TYPE_MOUSE = 'mouse';
20849
+ var INPUT_TYPE_KINECT = 'kinect';
20850
+
20851
+ var COMPUTE_INTERVAL = 25;
20852
+
20853
+ var INPUT_START = 1;
20854
+ var INPUT_MOVE = 2;
20855
+ var INPUT_END = 4;
20856
+ var INPUT_CANCEL = 8;
20857
+
20858
+ var DIRECTION_NONE = 1;
20859
+ var DIRECTION_LEFT = 2;
20860
+ var DIRECTION_RIGHT = 4;
20861
+ var DIRECTION_UP = 8;
20862
+ var DIRECTION_DOWN = 16;
20863
+
20864
+ var DIRECTION_HORIZONTAL = DIRECTION_LEFT | DIRECTION_RIGHT;
20865
+ var DIRECTION_VERTICAL = DIRECTION_UP | DIRECTION_DOWN;
20866
+ var DIRECTION_ALL = DIRECTION_HORIZONTAL | DIRECTION_VERTICAL;
20867
+
20868
+ var PROPS_XY = ['x', 'y'];
20869
+ var PROPS_CLIENT_XY = ['clientX', 'clientY'];
20870
+
20871
+ /**
20872
+ * create new input type manager
20873
+ * @param {Manager} manager
20874
+ * @param {Function} callback
20875
+ * @returns {Input}
20876
+ * @constructor
20877
+ */
20878
+ function Input(manager, callback) {
20879
+ var self = this;
20880
+ this.manager = manager;
20881
+ this.callback = callback;
20882
+ this.element = manager.element;
20883
+ this.target = manager.options.inputTarget;
20884
+
20885
+ // smaller wrapper around the handler, for the scope and the enabled state of the manager,
20886
+ // so when disabled the input events are completely bypassed.
20887
+ this.domHandler = function(ev) {
20888
+ if (boolOrFn(manager.options.enable, [manager])) {
20889
+ self.handler(ev);
20890
+ }
20891
+ };
20892
+
20893
+ this.init();
20894
+
20895
+ }
20896
+
20897
+ Input.prototype = {
20898
+ /**
20899
+ * should handle the inputEvent data and trigger the callback
20900
+ * @virtual
20901
+ */
20902
+ handler: function() { },
20903
+
20904
+ /**
20905
+ * bind the events
20906
+ */
20907
+ init: function() {
20908
+ this.evEl && addEventListeners(this.element, this.evEl, this.domHandler);
20909
+ this.evTarget && addEventListeners(this.target, this.evTarget, this.domHandler);
20910
+ this.evWin && addEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);
20911
+ },
20912
+
20913
+ /**
20914
+ * unbind the events
20915
+ */
20916
+ destroy: function() {
20917
+ this.evEl && removeEventListeners(this.element, this.evEl, this.domHandler);
20918
+ this.evTarget && removeEventListeners(this.target, this.evTarget, this.domHandler);
20919
+ this.evWin && removeEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);
20920
+ }
20921
+ };
20922
+
20923
+ /**
20924
+ * create new input type manager
20925
+ * called by the Manager constructor
20926
+ * @param {Hammer} manager
20927
+ * @returns {Input}
20928
+ */
20929
+ function createInputInstance(manager) {
20930
+ var Type;
20931
+ var inputClass = manager.options.inputClass;
20932
+
20933
+ if (inputClass) {
20934
+ Type = inputClass;
20935
+ } else if (SUPPORT_POINTER_EVENTS) {
20936
+ Type = PointerEventInput;
20937
+ } else if (SUPPORT_ONLY_TOUCH) {
20938
+ Type = TouchInput;
20939
+ } else if (!SUPPORT_TOUCH) {
20940
+ Type = MouseInput;
20941
+ } else {
20942
+ Type = TouchMouseInput;
20943
+ }
20944
+ return new (Type)(manager, inputHandler);
20945
+ }
20946
+
20947
+ /**
20948
+ * handle input events
20949
+ * @param {Manager} manager
20950
+ * @param {String} eventType
20951
+ * @param {Object} input
20952
+ */
20953
+ function inputHandler(manager, eventType, input) {
20954
+ var pointersLen = input.pointers.length;
20955
+ var changedPointersLen = input.changedPointers.length;
20956
+ var isFirst = (eventType & INPUT_START && (pointersLen - changedPointersLen === 0));
20957
+ var isFinal = (eventType & (INPUT_END | INPUT_CANCEL) && (pointersLen - changedPointersLen === 0));
20958
+
20959
+ input.isFirst = !!isFirst;
20960
+ input.isFinal = !!isFinal;
20961
+
20962
+ if (isFirst) {
20963
+ manager.session = {};
20964
+ }
20965
+
20966
+ // source event is the normalized value of the domEvents
20967
+ // like 'touchstart, mouseup, pointerdown'
20968
+ input.eventType = eventType;
20969
+
20970
+ // compute scale, rotation etc
20971
+ computeInputData(manager, input);
20972
+
20973
+ // emit secret event
20974
+ manager.emit('hammer.input', input);
20975
+
20976
+ manager.recognize(input);
20977
+ manager.session.prevInput = input;
20978
+ }
20979
+
20980
+ /**
20981
+ * extend the data with some usable properties like scale, rotate, velocity etc
20982
+ * @param {Object} manager
20983
+ * @param {Object} input
20984
+ */
20985
+ function computeInputData(manager, input) {
20986
+ var session = manager.session;
20987
+ var pointers = input.pointers;
20988
+ var pointersLength = pointers.length;
20989
+
20990
+ // store the first input to calculate the distance and direction
20991
+ if (!session.firstInput) {
20992
+ session.firstInput = simpleCloneInputData(input);
20993
+ }
20994
+
20995
+ // to compute scale and rotation we need to store the multiple touches
20996
+ if (pointersLength > 1 && !session.firstMultiple) {
20997
+ session.firstMultiple = simpleCloneInputData(input);
20998
+ } else if (pointersLength === 1) {
20999
+ session.firstMultiple = false;
21000
+ }
21001
+
21002
+ var firstInput = session.firstInput;
21003
+ var firstMultiple = session.firstMultiple;
21004
+ var offsetCenter = firstMultiple ? firstMultiple.center : firstInput.center;
21005
+
21006
+ var center = input.center = getCenter(pointers);
21007
+ input.timeStamp = now();
21008
+ input.deltaTime = input.timeStamp - firstInput.timeStamp;
21009
+
21010
+ input.angle = getAngle(offsetCenter, center);
21011
+ input.distance = getDistance(offsetCenter, center);
21012
+
21013
+ computeDeltaXY(session, input);
21014
+ input.offsetDirection = getDirection(input.deltaX, input.deltaY);
21015
+
21016
+ var overallVelocity = getVelocity(input.deltaTime, input.deltaX, input.deltaY);
21017
+ input.overallVelocityX = overallVelocity.x;
21018
+ input.overallVelocityY = overallVelocity.y;
21019
+ input.overallVelocity = (abs(overallVelocity.x) > abs(overallVelocity.y)) ? overallVelocity.x : overallVelocity.y;
21020
+
21021
+ input.scale = firstMultiple ? getScale(firstMultiple.pointers, pointers) : 1;
21022
+ input.rotation = firstMultiple ? getRotation(firstMultiple.pointers, pointers) : 0;
21023
+
21024
+ input.maxPointers = !session.prevInput ? input.pointers.length : ((input.pointers.length >
21025
+ session.prevInput.maxPointers) ? input.pointers.length : session.prevInput.maxPointers);
21026
+
21027
+ computeIntervalInputData(session, input);
21028
+
21029
+ // find the correct target
21030
+ var target = manager.element;
21031
+ if (hasParent(input.srcEvent.target, target)) {
21032
+ target = input.srcEvent.target;
21033
+ }
21034
+ input.target = target;
21035
+ }
21036
+
21037
+ function computeDeltaXY(session, input) {
21038
+ var center = input.center;
21039
+ var offset = session.offsetDelta || {};
21040
+ var prevDelta = session.prevDelta || {};
21041
+ var prevInput = session.prevInput || {};
21042
+
21043
+ if (input.eventType === INPUT_START || prevInput.eventType === INPUT_END) {
21044
+ prevDelta = session.prevDelta = {
21045
+ x: prevInput.deltaX || 0,
21046
+ y: prevInput.deltaY || 0
21047
+ };
21048
+
21049
+ offset = session.offsetDelta = {
21050
+ x: center.x,
21051
+ y: center.y
21052
+ };
21053
+ }
21054
+
21055
+ input.deltaX = prevDelta.x + (center.x - offset.x);
21056
+ input.deltaY = prevDelta.y + (center.y - offset.y);
21057
+ }
21058
+
21059
+ /**
21060
+ * velocity is calculated every x ms
21061
+ * @param {Object} session
21062
+ * @param {Object} input
21063
+ */
21064
+ function computeIntervalInputData(session, input) {
21065
+ var last = session.lastInterval || input,
21066
+ deltaTime = input.timeStamp - last.timeStamp,
21067
+ velocity, velocityX, velocityY, direction;
21068
+
21069
+ if (input.eventType != INPUT_CANCEL && (deltaTime > COMPUTE_INTERVAL || last.velocity === undefined)) {
21070
+ var deltaX = input.deltaX - last.deltaX;
21071
+ var deltaY = input.deltaY - last.deltaY;
21072
+
21073
+ var v = getVelocity(deltaTime, deltaX, deltaY);
21074
+ velocityX = v.x;
21075
+ velocityY = v.y;
21076
+ velocity = (abs(v.x) > abs(v.y)) ? v.x : v.y;
21077
+ direction = getDirection(deltaX, deltaY);
21078
+
21079
+ session.lastInterval = input;
21080
+ } else {
21081
+ // use latest velocity info if it doesn't overtake a minimum period
21082
+ velocity = last.velocity;
21083
+ velocityX = last.velocityX;
21084
+ velocityY = last.velocityY;
21085
+ direction = last.direction;
21086
+ }
21087
+
21088
+ input.velocity = velocity;
21089
+ input.velocityX = velocityX;
21090
+ input.velocityY = velocityY;
21091
+ input.direction = direction;
21092
+ }
21093
+
21094
+ /**
21095
+ * create a simple clone from the input used for storage of firstInput and firstMultiple
21096
+ * @param {Object} input
21097
+ * @returns {Object} clonedInputData
21098
+ */
21099
+ function simpleCloneInputData(input) {
21100
+ // make a simple copy of the pointers because we will get a reference if we don't
21101
+ // we only need clientXY for the calculations
21102
+ var pointers = [];
21103
+ var i = 0;
21104
+ while (i < input.pointers.length) {
21105
+ pointers[i] = {
21106
+ clientX: round(input.pointers[i].clientX),
21107
+ clientY: round(input.pointers[i].clientY)
21108
+ };
21109
+ i++;
21110
+ }
21111
+
21112
+ return {
21113
+ timeStamp: now(),
21114
+ pointers: pointers,
21115
+ center: getCenter(pointers),
21116
+ deltaX: input.deltaX,
21117
+ deltaY: input.deltaY
21118
+ };
21119
+ }
21120
+
21121
+ /**
21122
+ * get the center of all the pointers
21123
+ * @param {Array} pointers
21124
+ * @return {Object} center contains `x` and `y` properties
21125
+ */
21126
+ function getCenter(pointers) {
21127
+ var pointersLength = pointers.length;
21128
+
21129
+ // no need to loop when only one touch
21130
+ if (pointersLength === 1) {
21131
+ return {
21132
+ x: round(pointers[0].clientX),
21133
+ y: round(pointers[0].clientY)
21134
+ };
21135
+ }
21136
+
21137
+ var x = 0, y = 0, i = 0;
21138
+ while (i < pointersLength) {
21139
+ x += pointers[i].clientX;
21140
+ y += pointers[i].clientY;
21141
+ i++;
21142
+ }
21143
+
21144
+ return {
21145
+ x: round(x / pointersLength),
21146
+ y: round(y / pointersLength)
21147
+ };
21148
+ }
21149
+
21150
+ /**
21151
+ * calculate the velocity between two points. unit is in px per ms.
21152
+ * @param {Number} deltaTime
21153
+ * @param {Number} x
21154
+ * @param {Number} y
21155
+ * @return {Object} velocity `x` and `y`
21156
+ */
21157
+ function getVelocity(deltaTime, x, y) {
21158
+ return {
21159
+ x: x / deltaTime || 0,
21160
+ y: y / deltaTime || 0
21161
+ };
21162
+ }
21163
+
21164
+ /**
21165
+ * get the direction between two points
21166
+ * @param {Number} x
21167
+ * @param {Number} y
21168
+ * @return {Number} direction
21169
+ */
21170
+ function getDirection(x, y) {
21171
+ if (x === y) {
21172
+ return DIRECTION_NONE;
21173
+ }
21174
+
21175
+ if (abs(x) >= abs(y)) {
21176
+ return x < 0 ? DIRECTION_LEFT : DIRECTION_RIGHT;
21177
+ }
21178
+ return y < 0 ? DIRECTION_UP : DIRECTION_DOWN;
21179
+ }
21180
+
21181
+ /**
21182
+ * calculate the absolute distance between two points
21183
+ * @param {Object} p1 {x, y}
21184
+ * @param {Object} p2 {x, y}
21185
+ * @param {Array} [props] containing x and y keys
21186
+ * @return {Number} distance
21187
+ */
21188
+ function getDistance(p1, p2, props) {
21189
+ if (!props) {
21190
+ props = PROPS_XY;
21191
+ }
21192
+ var x = p2[props[0]] - p1[props[0]],
21193
+ y = p2[props[1]] - p1[props[1]];
21194
+
21195
+ return Math.sqrt((x * x) + (y * y));
21196
+ }
21197
+
21198
+ /**
21199
+ * calculate the angle between two coordinates
21200
+ * @param {Object} p1
21201
+ * @param {Object} p2
21202
+ * @param {Array} [props] containing x and y keys
21203
+ * @return {Number} angle
21204
+ */
21205
+ function getAngle(p1, p2, props) {
21206
+ if (!props) {
21207
+ props = PROPS_XY;
21208
+ }
21209
+ var x = p2[props[0]] - p1[props[0]],
21210
+ y = p2[props[1]] - p1[props[1]];
21211
+ return Math.atan2(y, x) * 180 / Math.PI;
21212
+ }
21213
+
21214
+ /**
21215
+ * calculate the rotation degrees between two pointersets
21216
+ * @param {Array} start array of pointers
21217
+ * @param {Array} end array of pointers
21218
+ * @return {Number} rotation
21219
+ */
21220
+ function getRotation(start, end) {
21221
+ return getAngle(end[1], end[0], PROPS_CLIENT_XY) + getAngle(start[1], start[0], PROPS_CLIENT_XY);
21222
+ }
21223
+
21224
+ /**
21225
+ * calculate the scale factor between two pointersets
21226
+ * no scale is 1, and goes down to 0 when pinched together, and bigger when pinched out
21227
+ * @param {Array} start array of pointers
21228
+ * @param {Array} end array of pointers
21229
+ * @return {Number} scale
21230
+ */
21231
+ function getScale(start, end) {
21232
+ return getDistance(end[0], end[1], PROPS_CLIENT_XY) / getDistance(start[0], start[1], PROPS_CLIENT_XY);
21233
+ }
21234
+
21235
+ var MOUSE_INPUT_MAP = {
21236
+ mousedown: INPUT_START,
21237
+ mousemove: INPUT_MOVE,
21238
+ mouseup: INPUT_END
21239
+ };
21240
+
21241
+ var MOUSE_ELEMENT_EVENTS = 'mousedown';
21242
+ var MOUSE_WINDOW_EVENTS = 'mousemove mouseup';
21243
+
21244
+ /**
21245
+ * Mouse events input
21246
+ * @constructor
21247
+ * @extends Input
21248
+ */
21249
+ function MouseInput() {
21250
+ this.evEl = MOUSE_ELEMENT_EVENTS;
21251
+ this.evWin = MOUSE_WINDOW_EVENTS;
21252
+
21253
+ this.pressed = false; // mousedown state
21254
+
21255
+ Input.apply(this, arguments);
21256
+ }
21257
+
21258
+ inherit(MouseInput, Input, {
21259
+ /**
21260
+ * handle mouse events
21261
+ * @param {Object} ev
21262
+ */
21263
+ handler: function MEhandler(ev) {
21264
+ var eventType = MOUSE_INPUT_MAP[ev.type];
21265
+
21266
+ // on start we want to have the left mouse button down
21267
+ if (eventType & INPUT_START && ev.button === 0) {
21268
+ this.pressed = true;
21269
+ }
21270
+
21271
+ if (eventType & INPUT_MOVE && ev.which !== 1) {
21272
+ eventType = INPUT_END;
21273
+ }
21274
+
21275
+ // mouse must be down
21276
+ if (!this.pressed) {
21277
+ return;
21278
+ }
21279
+
21280
+ if (eventType & INPUT_END) {
21281
+ this.pressed = false;
21282
+ }
21283
+
21284
+ this.callback(this.manager, eventType, {
21285
+ pointers: [ev],
21286
+ changedPointers: [ev],
21287
+ pointerType: INPUT_TYPE_MOUSE,
21288
+ srcEvent: ev
21289
+ });
21290
+ }
21291
+ });
21292
+
21293
+ var POINTER_INPUT_MAP = {
21294
+ pointerdown: INPUT_START,
21295
+ pointermove: INPUT_MOVE,
21296
+ pointerup: INPUT_END,
21297
+ pointercancel: INPUT_CANCEL,
21298
+ pointerout: INPUT_CANCEL
21299
+ };
21300
+
21301
+ // in IE10 the pointer types is defined as an enum
21302
+ var IE10_POINTER_TYPE_ENUM = {
21303
+ 2: INPUT_TYPE_TOUCH,
21304
+ 3: INPUT_TYPE_PEN,
21305
+ 4: INPUT_TYPE_MOUSE,
21306
+ 5: INPUT_TYPE_KINECT // see https://twitter.com/jacobrossi/status/480596438489890816
21307
+ };
21308
+
21309
+ var POINTER_ELEMENT_EVENTS = 'pointerdown';
21310
+ var POINTER_WINDOW_EVENTS = 'pointermove pointerup pointercancel';
21311
+
21312
+ // IE10 has prefixed support, and case-sensitive
21313
+ if (window.MSPointerEvent && !window.PointerEvent) {
21314
+ POINTER_ELEMENT_EVENTS = 'MSPointerDown';
21315
+ POINTER_WINDOW_EVENTS = 'MSPointerMove MSPointerUp MSPointerCancel';
21316
+ }
21317
+
21318
+ /**
21319
+ * Pointer events input
21320
+ * @constructor
21321
+ * @extends Input
21322
+ */
21323
+ function PointerEventInput() {
21324
+ this.evEl = POINTER_ELEMENT_EVENTS;
21325
+ this.evWin = POINTER_WINDOW_EVENTS;
21326
+
21327
+ Input.apply(this, arguments);
21328
+
21329
+ this.store = (this.manager.session.pointerEvents = []);
21330
+ }
21331
+
21332
+ inherit(PointerEventInput, Input, {
21333
+ /**
21334
+ * handle mouse events
21335
+ * @param {Object} ev
21336
+ */
21337
+ handler: function PEhandler(ev) {
21338
+ var store = this.store;
21339
+ var removePointer = false;
21340
+
21341
+ var eventTypeNormalized = ev.type.toLowerCase().replace('ms', '');
21342
+ var eventType = POINTER_INPUT_MAP[eventTypeNormalized];
21343
+ var pointerType = IE10_POINTER_TYPE_ENUM[ev.pointerType] || ev.pointerType;
21344
+
21345
+ var isTouch = (pointerType == INPUT_TYPE_TOUCH);
21346
+
21347
+ // get index of the event in the store
21348
+ var storeIndex = inArray(store, ev.pointerId, 'pointerId');
21349
+
21350
+ // start and mouse must be down
21351
+ if (eventType & INPUT_START && (ev.button === 0 || isTouch)) {
21352
+ if (storeIndex < 0) {
21353
+ store.push(ev);
21354
+ storeIndex = store.length - 1;
21355
+ }
21356
+ } else if (eventType & (INPUT_END | INPUT_CANCEL)) {
21357
+ removePointer = true;
21358
+ }
21359
+
21360
+ // it not found, so the pointer hasn't been down (so it's probably a hover)
21361
+ if (storeIndex < 0) {
21362
+ return;
21363
+ }
21364
+
21365
+ // update the event in the store
21366
+ store[storeIndex] = ev;
21367
+
21368
+ this.callback(this.manager, eventType, {
21369
+ pointers: store,
21370
+ changedPointers: [ev],
21371
+ pointerType: pointerType,
21372
+ srcEvent: ev
21373
+ });
21374
+
21375
+ if (removePointer) {
21376
+ // remove from the store
21377
+ store.splice(storeIndex, 1);
21378
+ }
21379
+ }
21380
+ });
21381
+
21382
+ var SINGLE_TOUCH_INPUT_MAP = {
21383
+ touchstart: INPUT_START,
21384
+ touchmove: INPUT_MOVE,
21385
+ touchend: INPUT_END,
21386
+ touchcancel: INPUT_CANCEL
21387
+ };
21388
+
21389
+ var SINGLE_TOUCH_TARGET_EVENTS = 'touchstart';
21390
+ var SINGLE_TOUCH_WINDOW_EVENTS = 'touchstart touchmove touchend touchcancel';
21391
+
21392
+ /**
21393
+ * Touch events input
21394
+ * @constructor
21395
+ * @extends Input
21396
+ */
21397
+ function SingleTouchInput() {
21398
+ this.evTarget = SINGLE_TOUCH_TARGET_EVENTS;
21399
+ this.evWin = SINGLE_TOUCH_WINDOW_EVENTS;
21400
+ this.started = false;
21401
+
21402
+ Input.apply(this, arguments);
21403
+ }
21404
+
21405
+ inherit(SingleTouchInput, Input, {
21406
+ handler: function TEhandler(ev) {
21407
+ var type = SINGLE_TOUCH_INPUT_MAP[ev.type];
21408
+
21409
+ // should we handle the touch events?
21410
+ if (type === INPUT_START) {
21411
+ this.started = true;
21412
+ }
21413
+
21414
+ if (!this.started) {
21415
+ return;
21416
+ }
21417
+
21418
+ var touches = normalizeSingleTouches.call(this, ev, type);
21419
+
21420
+ // when done, reset the started state
21421
+ if (type & (INPUT_END | INPUT_CANCEL) && touches[0].length - touches[1].length === 0) {
21422
+ this.started = false;
21423
+ }
21424
+
21425
+ this.callback(this.manager, type, {
21426
+ pointers: touches[0],
21427
+ changedPointers: touches[1],
21428
+ pointerType: INPUT_TYPE_TOUCH,
21429
+ srcEvent: ev
21430
+ });
21431
+ }
21432
+ });
21433
+
21434
+ /**
21435
+ * @this {TouchInput}
21436
+ * @param {Object} ev
21437
+ * @param {Number} type flag
21438
+ * @returns {undefined|Array} [all, changed]
21439
+ */
21440
+ function normalizeSingleTouches(ev, type) {
21441
+ var all = toArray(ev.touches);
21442
+ var changed = toArray(ev.changedTouches);
21443
+
21444
+ if (type & (INPUT_END | INPUT_CANCEL)) {
21445
+ all = uniqueArray(all.concat(changed), 'identifier', true);
21446
+ }
21447
+
21448
+ return [all, changed];
21449
+ }
21450
+
21451
+ var TOUCH_INPUT_MAP = {
21452
+ touchstart: INPUT_START,
21453
+ touchmove: INPUT_MOVE,
21454
+ touchend: INPUT_END,
21455
+ touchcancel: INPUT_CANCEL
21456
+ };
21457
+
21458
+ var TOUCH_TARGET_EVENTS = 'touchstart touchmove touchend touchcancel';
21459
+
21460
+ /**
21461
+ * Multi-user touch events input
21462
+ * @constructor
21463
+ * @extends Input
21464
+ */
21465
+ function TouchInput() {
21466
+ this.evTarget = TOUCH_TARGET_EVENTS;
21467
+ this.targetIds = {};
21468
+
21469
+ Input.apply(this, arguments);
21470
+ }
21471
+
21472
+ inherit(TouchInput, Input, {
21473
+ handler: function MTEhandler(ev) {
21474
+ var type = TOUCH_INPUT_MAP[ev.type];
21475
+ var touches = getTouches.call(this, ev, type);
21476
+ if (!touches) {
21477
+ return;
21478
+ }
21479
+
21480
+ this.callback(this.manager, type, {
21481
+ pointers: touches[0],
21482
+ changedPointers: touches[1],
21483
+ pointerType: INPUT_TYPE_TOUCH,
21484
+ srcEvent: ev
21485
+ });
21486
+ }
21487
+ });
21488
+
21489
+ /**
21490
+ * @this {TouchInput}
21491
+ * @param {Object} ev
21492
+ * @param {Number} type flag
21493
+ * @returns {undefined|Array} [all, changed]
21494
+ */
21495
+ function getTouches(ev, type) {
21496
+ var allTouches = toArray(ev.touches);
21497
+ var targetIds = this.targetIds;
21498
+
21499
+ // when there is only one touch, the process can be simplified
21500
+ if (type & (INPUT_START | INPUT_MOVE) && allTouches.length === 1) {
21501
+ targetIds[allTouches[0].identifier] = true;
21502
+ return [allTouches, allTouches];
21503
+ }
21504
+
21505
+ var i,
21506
+ targetTouches,
21507
+ changedTouches = toArray(ev.changedTouches),
21508
+ changedTargetTouches = [],
21509
+ target = this.target;
21510
+
21511
+ // get target touches from touches
21512
+ targetTouches = allTouches.filter(function(touch) {
21513
+ return hasParent(touch.target, target);
21514
+ });
21515
+
21516
+ // collect touches
21517
+ if (type === INPUT_START) {
21518
+ i = 0;
21519
+ while (i < targetTouches.length) {
21520
+ targetIds[targetTouches[i].identifier] = true;
21521
+ i++;
21522
+ }
21523
+ }
21524
+
21525
+ // filter changed touches to only contain touches that exist in the collected target ids
21526
+ i = 0;
21527
+ while (i < changedTouches.length) {
21528
+ if (targetIds[changedTouches[i].identifier]) {
21529
+ changedTargetTouches.push(changedTouches[i]);
21530
+ }
21531
+
21532
+ // cleanup removed touches
21533
+ if (type & (INPUT_END | INPUT_CANCEL)) {
21534
+ delete targetIds[changedTouches[i].identifier];
21535
+ }
21536
+ i++;
21537
+ }
21538
+
21539
+ if (!changedTargetTouches.length) {
21540
+ return;
21541
+ }
21542
+
21543
+ return [
21544
+ // merge targetTouches with changedTargetTouches so it contains ALL touches, including 'end' and 'cancel'
21545
+ uniqueArray(targetTouches.concat(changedTargetTouches), 'identifier', true),
21546
+ changedTargetTouches
21547
+ ];
21548
+ }
21549
+
21550
+ /**
21551
+ * Combined touch and mouse input
21552
+ *
21553
+ * Touch has a higher priority then mouse, and while touching no mouse events are allowed.
21554
+ * This because touch devices also emit mouse events while doing a touch.
21555
+ *
21556
+ * @constructor
21557
+ * @extends Input
21558
+ */
21559
+
21560
+ var DEDUP_TIMEOUT = 2500;
21561
+ var DEDUP_DISTANCE = 25;
21562
+
21563
+ function TouchMouseInput() {
21564
+ Input.apply(this, arguments);
21565
+
21566
+ var handler = bindFn(this.handler, this);
21567
+ this.touch = new TouchInput(this.manager, handler);
21568
+ this.mouse = new MouseInput(this.manager, handler);
21569
+
21570
+ this.primaryTouch = null;
21571
+ this.lastTouches = [];
21572
+ }
21573
+
21574
+ inherit(TouchMouseInput, Input, {
21575
+ /**
21576
+ * handle mouse and touch events
21577
+ * @param {Hammer} manager
21578
+ * @param {String} inputEvent
21579
+ * @param {Object} inputData
21580
+ */
21581
+ handler: function TMEhandler(manager, inputEvent, inputData) {
21582
+ var isTouch = (inputData.pointerType == INPUT_TYPE_TOUCH),
21583
+ isMouse = (inputData.pointerType == INPUT_TYPE_MOUSE);
21584
+
21585
+ if (isMouse && inputData.sourceCapabilities && inputData.sourceCapabilities.firesTouchEvents) {
21586
+ return;
21587
+ }
21588
+
21589
+ // when we're in a touch event, record touches to de-dupe synthetic mouse event
21590
+ if (isTouch) {
21591
+ recordTouches.call(this, inputEvent, inputData);
21592
+ } else if (isMouse && isSyntheticEvent.call(this, inputData)) {
21593
+ return;
21594
+ }
21595
+
21596
+ this.callback(manager, inputEvent, inputData);
21597
+ },
21598
+
21599
+ /**
21600
+ * remove the event listeners
21601
+ */
21602
+ destroy: function destroy() {
21603
+ this.touch.destroy();
21604
+ this.mouse.destroy();
21605
+ }
21606
+ });
21607
+
21608
+ function recordTouches(eventType, eventData) {
21609
+ if (eventType & INPUT_START) {
21610
+ this.primaryTouch = eventData.changedPointers[0].identifier;
21611
+ setLastTouch.call(this, eventData);
21612
+ } else if (eventType & (INPUT_END | INPUT_CANCEL)) {
21613
+ setLastTouch.call(this, eventData);
21614
+ }
21615
+ }
21616
+
21617
+ function setLastTouch(eventData) {
21618
+ var touch = eventData.changedPointers[0];
21619
+
21620
+ if (touch.identifier === this.primaryTouch) {
21621
+ var lastTouch = {x: touch.clientX, y: touch.clientY};
21622
+ this.lastTouches.push(lastTouch);
21623
+ var lts = this.lastTouches;
21624
+ var removeLastTouch = function() {
21625
+ var i = lts.indexOf(lastTouch);
21626
+ if (i > -1) {
21627
+ lts.splice(i, 1);
21628
+ }
21629
+ };
21630
+ setTimeout(removeLastTouch, DEDUP_TIMEOUT);
21631
+ }
21632
+ }
21633
+
21634
+ function isSyntheticEvent(eventData) {
21635
+ var x = eventData.srcEvent.clientX, y = eventData.srcEvent.clientY;
21636
+ for (var i = 0; i < this.lastTouches.length; i++) {
21637
+ var t = this.lastTouches[i];
21638
+ var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y);
21639
+ if (dx <= DEDUP_DISTANCE && dy <= DEDUP_DISTANCE) {
21640
+ return true;
21641
+ }
21642
+ }
21643
+ return false;
21644
+ }
21645
+
21646
+ var PREFIXED_TOUCH_ACTION = prefixed(TEST_ELEMENT.style, 'touchAction');
21647
+ var NATIVE_TOUCH_ACTION = PREFIXED_TOUCH_ACTION !== undefined;
21648
+
21649
+ // magical touchAction value
21650
+ var TOUCH_ACTION_COMPUTE = 'compute';
21651
+ var TOUCH_ACTION_AUTO = 'auto';
21652
+ var TOUCH_ACTION_MANIPULATION = 'manipulation'; // not implemented
21653
+ var TOUCH_ACTION_NONE = 'none';
21654
+ var TOUCH_ACTION_PAN_X = 'pan-x';
21655
+ var TOUCH_ACTION_PAN_Y = 'pan-y';
21656
+ var TOUCH_ACTION_MAP = getTouchActionProps();
21657
+
21658
+ /**
21659
+ * Touch Action
21660
+ * sets the touchAction property or uses the js alternative
21661
+ * @param {Manager} manager
21662
+ * @param {String} value
21663
+ * @constructor
21664
+ */
21665
+ function TouchAction(manager, value) {
21666
+ this.manager = manager;
21667
+ this.set(value);
21668
+ }
21669
+
21670
+ TouchAction.prototype = {
21671
+ /**
21672
+ * set the touchAction value on the element or enable the polyfill
21673
+ * @param {String} value
21674
+ */
21675
+ set: function(value) {
21676
+ // find out the touch-action by the event handlers
21677
+ if (value == TOUCH_ACTION_COMPUTE) {
21678
+ value = this.compute();
21679
+ }
21680
+
21681
+ if (NATIVE_TOUCH_ACTION && this.manager.element.style && TOUCH_ACTION_MAP[value]) {
21682
+ this.manager.element.style[PREFIXED_TOUCH_ACTION] = value;
21683
+ }
21684
+ this.actions = value.toLowerCase().trim();
21685
+ },
21686
+
21687
+ /**
21688
+ * just re-set the touchAction value
21689
+ */
21690
+ update: function() {
21691
+ this.set(this.manager.options.touchAction);
21692
+ },
21693
+
21694
+ /**
21695
+ * compute the value for the touchAction property based on the recognizer's settings
21696
+ * @returns {String} value
21697
+ */
21698
+ compute: function() {
21699
+ var actions = [];
21700
+ each(this.manager.recognizers, function(recognizer) {
21701
+ if (boolOrFn(recognizer.options.enable, [recognizer])) {
21702
+ actions = actions.concat(recognizer.getTouchAction());
21703
+ }
21704
+ });
21705
+ return cleanTouchActions(actions.join(' '));
21706
+ },
21707
+
21708
+ /**
21709
+ * this method is called on each input cycle and provides the preventing of the browser behavior
21710
+ * @param {Object} input
21711
+ */
21712
+ preventDefaults: function(input) {
21713
+ var srcEvent = input.srcEvent;
21714
+ var direction = input.offsetDirection;
21715
+
21716
+ // if the touch action did prevented once this session
21717
+ if (this.manager.session.prevented) {
21718
+ srcEvent.preventDefault();
21719
+ return;
21720
+ }
21721
+
21722
+ var actions = this.actions;
21723
+ var hasNone = inStr(actions, TOUCH_ACTION_NONE) && !TOUCH_ACTION_MAP[TOUCH_ACTION_NONE];
21724
+ var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_Y];
21725
+ var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_X];
21726
+
21727
+ if (hasNone) {
21728
+ //do not prevent defaults if this is a tap gesture
21729
+
21730
+ var isTapPointer = input.pointers.length === 1;
21731
+ var isTapMovement = input.distance < 2;
21732
+ var isTapTouchTime = input.deltaTime < 250;
21733
+
21734
+ if (isTapPointer && isTapMovement && isTapTouchTime) {
21735
+ return;
21736
+ }
21737
+ }
21738
+
21739
+ if (hasPanX && hasPanY) {
21740
+ // `pan-x pan-y` means browser handles all scrolling/panning, do not prevent
21741
+ return;
21742
+ }
21743
+
21744
+ if (hasNone ||
21745
+ (hasPanY && direction & DIRECTION_HORIZONTAL) ||
21746
+ (hasPanX && direction & DIRECTION_VERTICAL)) {
21747
+ return this.preventSrc(srcEvent);
21748
+ }
21749
+ },
21750
+
21751
+ /**
21752
+ * call preventDefault to prevent the browser's default behavior (scrolling in most cases)
21753
+ * @param {Object} srcEvent
21754
+ */
21755
+ preventSrc: function(srcEvent) {
21756
+ this.manager.session.prevented = true;
21757
+ srcEvent.preventDefault();
21758
+ }
21759
+ };
21760
+
21761
+ /**
21762
+ * when the touchActions are collected they are not a valid value, so we need to clean things up. *
21763
+ * @param {String} actions
21764
+ * @returns {*}
21765
+ */
21766
+ function cleanTouchActions(actions) {
21767
+ // none
21768
+ if (inStr(actions, TOUCH_ACTION_NONE)) {
21769
+ return TOUCH_ACTION_NONE;
21770
+ }
21771
+
21772
+ var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X);
21773
+ var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y);
21774
+
21775
+ // if both pan-x and pan-y are set (different recognizers
21776
+ // for different directions, e.g. horizontal pan but vertical swipe?)
21777
+ // we need none (as otherwise with pan-x pan-y combined none of these
21778
+ // recognizers will work, since the browser would handle all panning
21779
+ if (hasPanX && hasPanY) {
21780
+ return TOUCH_ACTION_NONE;
21781
+ }
21782
+
21783
+ // pan-x OR pan-y
21784
+ if (hasPanX || hasPanY) {
21785
+ return hasPanX ? TOUCH_ACTION_PAN_X : TOUCH_ACTION_PAN_Y;
21786
+ }
21787
+
21788
+ // manipulation
21789
+ if (inStr(actions, TOUCH_ACTION_MANIPULATION)) {
21790
+ return TOUCH_ACTION_MANIPULATION;
21791
+ }
21792
+
21793
+ return TOUCH_ACTION_AUTO;
21794
+ }
21795
+
21796
+ function getTouchActionProps() {
21797
+ if (!NATIVE_TOUCH_ACTION) {
21798
+ return false;
21799
+ }
21800
+ var touchMap = {};
21801
+ var cssSupports = window.CSS && window.CSS.supports;
21802
+ ['auto', 'manipulation', 'pan-y', 'pan-x', 'pan-x pan-y', 'none'].forEach(function(val) {
21803
+
21804
+ // If css.supports is not supported but there is native touch-action assume it supports
21805
+ // all values. This is the case for IE 10 and 11.
21806
+ touchMap[val] = cssSupports ? window.CSS.supports('touch-action', val) : true;
21807
+ });
21808
+ return touchMap;
21809
+ }
21810
+
21811
+ /**
21812
+ * Recognizer flow explained; *
21813
+ * All recognizers have the initial state of POSSIBLE when a input session starts.
21814
+ * The definition of a input session is from the first input until the last input, with all it's movement in it. *
21815
+ * Example session for mouse-input: mousedown -> mousemove -> mouseu