Version Description
- July 8, 2021 =
- Improvement: Added 2FA and reCAPTCHA support for WooCommerce login and registration forms
- Improvement: Added option to require 2FA for any role
- Improvement: Added logic to automatically disable NTP after repeated failures and option to manually disable NTP
- Change: Updated reCAPTCHA setup note
- Change: Updated plugin headers for compatibility with WordPress 5.8
Download this release
Release Info
Developer | wfalexk |
Plugin | Wordfence Login Security |
Version | 1.0.7 |
Comparing to | |
See all releases |
Code changes from version 1.0.6 to 1.0.7
- classes/controller/ajax.php +159 -72
- classes/controller/captcha.php +26 -0
- classes/controller/notices.php +23 -0
- classes/controller/permissions.php +49 -10
- classes/controller/settings.php +126 -6
- classes/controller/support.php +2 -0
- classes/controller/time.php +14 -5
- classes/controller/users.php +315 -36
- classes/controller/wordfencels.php +317 -149
- classes/model/view/title.php +1 -1
- css/{admin-global.1610634190.css → admin-global.1625749951.css} +1 -1
- css/admin.1610634190.css +0 -1
- css/admin.1625749951.css +1 -0
- css/{colorbox.1610634190.css → colorbox.1625749951.css} +0 -0
- css/{font-awesome.1610634190.css → font-awesome.1625749951.css} +0 -0
- css/{ionicons.1610634190.css → ionicons.1625749951.css} +0 -0
- css/jquery-ui-timepicker-addon.1610634190.css +0 -1
- css/{jquery-ui.min.1610634190.css → jquery-ui.min.1625749951.css} +0 -0
- css/{jquery-ui.structure.min.1610634190.css → jquery-ui.structure.min.1625749951.css} +0 -0
- css/{jquery-ui.theme.min.1610634190.css → jquery-ui.theme.min.1625749951.css} +0 -0
- css/login.1610634190.css +0 -1
- css/login.1625749951.css +1 -0
- css/{wfselect2.min.1610634190.css → wfselect2.min.1625749951.css} +0 -0
- js/{Chart.bundle.min.1610634190.js → Chart.bundle.min.1625749951.js} +0 -0
- js/{admin-global.1610634190.js → admin-global.1625749951.js} +17 -1
- js/{admin.1610634190.js → admin.1625749951.js} +36 -0
- js/jquery-ui-timepicker-addon.1610634190.js +0 -2291
- js/{jquery.colorbox.1610634190.js → jquery.colorbox.1625749951.js} +0 -0
- js/{jquery.colorbox.min.1610634190.js → jquery.colorbox.min.1625749951.js} +0 -0
- js/{jquery.qrcode.min.1610634190.js → jquery.qrcode.min.1625749951.js} +0 -0
- js/{jquery.tmpl.min.1610634190.js → jquery.tmpl.min.1625749951.js} +0 -0
- js/{login.1610634190.js → login.1625749951.js} +51 -24
- js/{wfselect2.min.1610634190.js → wfselect2.min.1625749951.js} +0 -0
- readme.txt +9 -2
- views/common/reset-grace-period.php +89 -0
- views/common/revoke-grace-period.php +67 -0
- views/email/login-verification.php +6 -6
- views/manage/activate.php +8 -8
- views/manage/code.php +1 -1
- views/manage/deactivate.php +3 -3
- views/manage/grace-period.php +56 -0
- views/manage/regenerate.php +3 -3
- views/onboarding/standalone-header.php +2 -2
- views/options/option-captcha-threshold.php +3 -3
- views/options/option-captcha.php +4 -12
- views/options/option-ip-source.php +3 -3
- views/options/option-ntp.php +88 -0
- views/options/option-require-2fa.php +0 -245
- views/options/option-roles.php +133 -0
- views/options/option-select.php +1 -1
- views/options/option-text.php +1 -1
- views/options/option-toggled-boolean-switch.php +1 -1
- views/options/option-toggled-segmented.php +1 -1
- views/options/option-toggled-select.php +1 -1
- views/options/option-toggled-sub.php +2 -2
- views/options/option-toggled-textarea.php +1 -1
- views/options/option-token.php +1 -1
- views/page/manage.php +23 -9
- views/page/role.php +55 -0
- views/page/settings.php +2 -2
- views/settings/options.php +36 -29
- views/settings/user-stats.php +24 -11
- views/user/grace-period-toggle.php +13 -0
- wordfence-login-security.php +8 -4
classes/controller/ajax.php
CHANGED
@@ -6,6 +6,9 @@ use WordfenceLS\Crypto\Model_JWT;
|
|
6 |
use WordfenceLS\Crypto\Model_Symmetric;
|
7 |
|
8 |
class Controller_AJAX {
|
|
|
|
|
|
|
9 |
protected $_actions = null; //Populated on init
|
10 |
|
11 |
/**
|
@@ -35,7 +38,7 @@ class Controller_AJAX {
|
|
35 |
'nopriv' => true,
|
36 |
'nonce' => false,
|
37 |
'permissions' => array(),
|
38 |
-
'required_parameters' => array('
|
39 |
),
|
40 |
'activate' => array(
|
41 |
'handler' => array($this, '_ajax_activate_callback'),
|
@@ -77,6 +80,31 @@ class Controller_AJAX {
|
|
77 |
'permissions' => array(Controller_Permissions::CAP_MANAGE_SETTINGS => __('You do not have permission to reset reCAPTCHA statistics.', 'wordfence-2fa')),
|
78 |
'required_parameters' => array('nonce'),
|
79 |
),
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
80 |
);
|
81 |
|
82 |
$this->_init_actions();
|
@@ -105,17 +133,17 @@ class Controller_AJAX {
|
|
105 |
|
106 |
public function _ajax_handler() {
|
107 |
$action = (isset($_POST['action']) && is_string($_POST['action']) && $_POST['action']) ? $_POST['action'] : $_GET['action'];
|
108 |
-
if (preg_match('~wordfence_ls_([a-zA-
|
109 |
$action = $matches[1];
|
110 |
if (!isset($this->_actions[$action])) {
|
111 |
-
self::send_json(array('error' =>
|
112 |
}
|
113 |
|
114 |
$parameters = $this->_actions[$action];
|
115 |
if (!empty($parameters['required_parameters'])) {
|
116 |
foreach ($parameters['required_parameters'] as $k) {
|
117 |
if (!isset($_POST[$k])) {
|
118 |
-
self::send_json(array('error' =>
|
119 |
}
|
120 |
}
|
121 |
}
|
@@ -123,7 +151,7 @@ class Controller_AJAX {
|
|
123 |
if (!isset($parameters['nonce']) || $parameters['nonce']) {
|
124 |
$nonce = (isset($_POST['nonce']) && is_string($_POST['nonce']) && $_POST['nonce']) ? $_POST['nonce'] : $_GET['nonce'];
|
125 |
if (!is_string($nonce) || !wp_verify_nonce($nonce, 'wp-ajax')) {
|
126 |
-
self::send_json(array('error' =>
|
127 |
}
|
128 |
}
|
129 |
|
@@ -141,8 +169,21 @@ class Controller_AJAX {
|
|
141 |
}
|
142 |
|
143 |
public function _ajax_authenticate_callback() {
|
144 |
-
|
145 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
146 |
}
|
147 |
|
148 |
$legacy2FAActive = Controller_WordfenceLS::shared()->legacy_2fa_active();
|
@@ -150,8 +191,6 @@ class Controller_AJAX {
|
|
150 |
self::send_json(array('login' => 1));
|
151 |
}
|
152 |
|
153 |
-
$username = $_POST['log'];
|
154 |
-
$password = $_POST['pwd'];
|
155 |
do_action_ref_array('wp_authenticate', array(&$username, &$password));
|
156 |
|
157 |
define('WORDFENCE_LS_AUTHENTICATION_CHECK', true); //Prevents our auth filter from recursing
|
@@ -192,7 +231,7 @@ class Controller_AJAX {
|
|
192 |
$reset = false;
|
193 |
foreach ($user->get_error_codes() as $code) {
|
194 |
if ($code == 'invalid_username' || $code == 'invalid_email' || $code == 'incorrect_password' || $code == 'authentication_failed') {
|
195 |
-
$errors[] = sprintf(__('<strong>ERROR</strong>: The username or password you entered is incorrect. <a href="%s" title="Password Lost and Found">Lost your password</a>?'), wp_lostpassword_url());
|
196 |
}
|
197 |
else {
|
198 |
if ($code == 'wfls_twofactor_invalid') {
|
@@ -224,24 +263,33 @@ class Controller_AJAX {
|
|
224 |
}
|
225 |
}
|
226 |
|
227 |
-
self::send_json(array('error' => sprintf(__('<strong>ERROR</strong>: The username or password you entered is incorrect. <a href="%s" title="Password Lost and Found">Lost your password</a>?'), wp_lostpassword_url())));
|
228 |
}
|
229 |
|
230 |
public function _ajax_register_support_callback() {
|
231 |
-
|
232 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
233 |
!isset($_POST['wfls-message']) || !is_string($_POST['wfls-message']) ||
|
234 |
!isset($_POST['wfls-message-nonce']) || !is_string($_POST['wfls-message-nonce'])) {
|
235 |
-
self::send_json(array('error' => sprintf(__('<strong>ERROR</strong>: Unable to send message. Please refresh the page and try again.'))));
|
236 |
}
|
237 |
|
238 |
-
$
|
239 |
-
$
|
|
|
|
|
240 |
$message = strip_tags($_POST['wfls-message']);
|
241 |
$nonce = $_POST['wfls-message-nonce'];
|
242 |
-
|
243 |
-
if (empty($login) || empty($email) || !filter_var($email, FILTER_VALIDATE_EMAIL) || empty($message)) {
|
244 |
-
self::send_json(array('error' => sprintf(__('<strong>ERROR</strong>: Unable to send message. Please refresh the page and try again.'))));
|
245 |
}
|
246 |
|
247 |
$jwt = Model_JWT::decode_jwt($_POST['wfls-message-nonce']);
|
@@ -249,13 +297,13 @@ class Controller_AJAX {
|
|
249 |
$decryptedIP = Model_Symmetric::decrypt($jwt->payload['ip']);
|
250 |
$decryptedScore = Model_Symmetric::decrypt($jwt->payload['score']);
|
251 |
if ($decryptedIP === false || $decryptedScore === false || Model_IP::inet_pton($decryptedIP) !== Model_IP::inet_pton(Model_Request::current()->ip())) { //JWT IP and the current request's IP don't match, refuse the message
|
252 |
-
self::send_json(array('error' => sprintf(__('<strong>ERROR</strong>: Unable to send message. Please refresh the page and try again.'))));
|
253 |
}
|
254 |
|
255 |
$identifier = bin2hex(Model_IP::inet_pton($decryptedIP));
|
256 |
$tokenBucket = new Model_TokenBucket('rate:' . $identifier, 2, 1 / (6 * Model_TokenBucket::HOUR)); //Maximum of two requests, refilling at a rate of one per six hours
|
257 |
if (!$tokenBucket->consume(1)) {
|
258 |
-
self::send_json(array('error' => sprintf(__('<strong>ERROR</strong>: Unable to send message. You have exceeded the maximum number of messages that may be sent at this time. Please try again later.'))));
|
259 |
}
|
260 |
|
261 |
$email = array(
|
@@ -266,13 +314,13 @@ class Controller_AJAX {
|
|
266 |
);
|
267 |
$success = wp_mail($email['to'], $email['subject'], $email['body'], $email['headers']);
|
268 |
if ($success) {
|
269 |
-
self::send_json(array('message' => sprintf(__('<strong>MESSAGE SENT</strong>: Your message was sent to the site owner.'))));
|
270 |
}
|
271 |
|
272 |
-
self::send_json(array('error' => sprintf(__('<strong>ERROR</strong>: An error occurred while sending the message. Please try again.'))));
|
273 |
}
|
274 |
|
275 |
-
self::send_json(array('error' => sprintf(__('<strong>ERROR</strong>: Unable to send message. Please refresh the page and try again.'))));
|
276 |
}
|
277 |
|
278 |
public function _ajax_activate_callback() {
|
@@ -280,31 +328,31 @@ class Controller_AJAX {
|
|
280 |
$user = wp_get_current_user();
|
281 |
if ($user->ID != $userID) {
|
282 |
if (!user_can($user, Controller_Permissions::CAP_ACTIVATE_2FA_OTHERS)) {
|
283 |
-
self::send_json(array('error' =>
|
284 |
}
|
285 |
else {
|
286 |
$user = new \WP_User($userID);
|
287 |
if (!$user->exists()) {
|
288 |
-
self::send_json(array('error' =>
|
289 |
}
|
290 |
}
|
291 |
}
|
292 |
else if (!user_can($user, Controller_Permissions::CAP_ACTIVATE_2FA_SELF)) {
|
293 |
-
self::send_json(array('error' =>
|
294 |
}
|
295 |
|
296 |
if (Controller_Users::shared()->has_2fa_active($user)) {
|
297 |
-
self::send_json(array('error' =>
|
298 |
}
|
299 |
|
300 |
$matches = (isset($_POST['secret']) && isset($_POST['code']) && is_string($_POST['secret']) && is_string($_POST['code']) && Controller_TOTP::shared()->check_code($_POST['secret'], $_POST['code']));
|
301 |
if ($matches === false) {
|
302 |
-
self::send_json(array('error' =>
|
303 |
}
|
304 |
|
305 |
Controller_TOTP::shared()->activate_2fa($user, $_POST['secret'], $_POST['recovery'], $matches);
|
306 |
Controller_Notices::shared()->remove_notice(false, 'wfls-will-be-required', $user);
|
307 |
-
self::send_json(array('activated' => 1, 'text' => sprintf(count($_POST['recovery']) == 1 ?
|
308 |
}
|
309 |
|
310 |
public function _ajax_deactivate_callback() {
|
@@ -312,21 +360,21 @@ class Controller_AJAX {
|
|
312 |
$user = wp_get_current_user();
|
313 |
if ($user->ID != $userID) {
|
314 |
if (!user_can($user, Controller_Permissions::CAP_ACTIVATE_2FA_OTHERS)) {
|
315 |
-
self::send_json(array('error' =>
|
316 |
}
|
317 |
else {
|
318 |
$user = new \WP_User($userID);
|
319 |
if (!$user->exists()) {
|
320 |
-
self::send_json(array('error' =>
|
321 |
}
|
322 |
}
|
323 |
}
|
324 |
else if (!user_can($user, Controller_Permissions::CAP_ACTIVATE_2FA_SELF)) {
|
325 |
-
self::send_json(array('error' =>
|
326 |
}
|
327 |
|
328 |
if (!Controller_Users::shared()->has_2fa_active($user)) {
|
329 |
-
self::send_json(array('error' =>
|
330 |
}
|
331 |
|
332 |
Controller_Users::shared()->deactivate_2fa($user);
|
@@ -338,25 +386,25 @@ class Controller_AJAX {
|
|
338 |
$user = wp_get_current_user();
|
339 |
if ($user->ID != $userID) {
|
340 |
if (!user_can($user, Controller_Permissions::CAP_ACTIVATE_2FA_OTHERS)) {
|
341 |
-
self::send_json(array('error' =>
|
342 |
}
|
343 |
else {
|
344 |
$user = new \WP_User($userID);
|
345 |
if (!$user->exists()) {
|
346 |
-
self::send_json(array('error' =>
|
347 |
}
|
348 |
}
|
349 |
}
|
350 |
else if (!user_can($user, Controller_Permissions::CAP_ACTIVATE_2FA_SELF)) {
|
351 |
-
self::send_json(array('error' =>
|
352 |
}
|
353 |
|
354 |
if (!Controller_Users::shared()->has_2fa_active($user)) {
|
355 |
-
self::send_json(array('error' =>
|
356 |
}
|
357 |
|
358 |
$codes = Controller_Users::shared()->regenerate_recovery_codes($user);
|
359 |
-
self::send_json(array('regenerated' => 1, 'recovery' => array_map(function($r) { return implode(' ', str_split(bin2hex($r), 4)); }, $codes), 'text' => sprintf(count($codes) == 1 ?
|
360 |
}
|
361 |
|
362 |
public function _ajax_save_options_callback() {
|
@@ -366,7 +414,7 @@ class Controller_AJAX {
|
|
366 |
if ($errors !== true) {
|
367 |
if (count($errors) == 1) {
|
368 |
$e = array_shift($errors);
|
369 |
-
self::send_json(array('error' => sprintf(__('An error occurred while saving the configuration: %s', 'wordfence-2fa'), $e)));
|
370 |
}
|
371 |
else if (count($errors) > 1) {
|
372 |
$compoundMessage = array();
|
@@ -374,13 +422,13 @@ class Controller_AJAX {
|
|
374 |
$compoundMessage[] = esc_html($e);
|
375 |
}
|
376 |
self::send_json(array(
|
377 |
-
'error' => sprintf(__('Errors occurred while saving the configuration: %s', 'wordfence-2fa'), '<ul><li>' . implode('</li><li>', $compoundMessage) . '</li></ul>'),
|
378 |
'html' => true,
|
379 |
));
|
380 |
}
|
381 |
|
382 |
self::send_json(array(
|
383 |
-
'error' =>
|
384 |
));
|
385 |
}
|
386 |
|
@@ -397,47 +445,44 @@ class Controller_AJAX {
|
|
397 |
}
|
398 |
|
399 |
self::send_json(array(
|
400 |
-
'error' =>
|
401 |
));
|
402 |
}
|
403 |
|
404 |
public function _ajax_send_grace_period_notification_callback() {
|
405 |
-
|
406 |
-
|
407 |
-
|
408 |
-
|
409 |
-
|
410 |
-
self::send_json(array('error' => __('A valid grace period is not configured to allow administrators time to activate two-factor authentication.', 'wordfence-2fa')));
|
411 |
-
}
|
412 |
-
|
413 |
-
$subject = sprintf(__('2FA will soon be required on %s', 'wordfence-2fa'), home_url());
|
414 |
-
$requiredDate = Controller_Time::format_local_time('F j, Y', Controller_Settings::shared()->get_int(Controller_Settings::OPTION_REQUIRE_2FA_GRACE_PERIOD));
|
415 |
-
|
416 |
-
$admins = Controller_Users::shared()->admin_users();
|
417 |
$sent = 0;
|
418 |
-
foreach ($
|
419 |
-
|
420 |
-
if (Controller_Users::shared()->has_2fa_active($
|
421 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
422 |
}
|
|
|
423 |
|
424 |
-
|
425 |
-
|
426 |
-
$requiredDate,
|
427 |
-
(is_multisite() && is_super_admin($a->ID)) ? network_admin_url('admin.php?page=WFLS') : admin_url('admin.php?page=WFLS')
|
428 |
-
);
|
429 |
-
|
430 |
-
wp_mail($a->user_email, $subject, $message);
|
431 |
-
$sent++;
|
432 |
}
|
433 |
-
|
434 |
-
|
435 |
-
self::send_json(array('confirmation' => __('All administrators already have two-factor authenication activated.', 'wordfence-2fa')));
|
436 |
}
|
437 |
else if ($sent == 1) {
|
438 |
-
self::send_json(array('confirmation' => sprintf(__('A reminder to activate two-factor authentication was sent to %d
|
439 |
}
|
440 |
-
self::send_json(array('confirmation' => sprintf(__('A reminder to activate two-factor authentication was sent to %d
|
441 |
}
|
442 |
|
443 |
public function _ajax_update_ip_preview_callback() {
|
@@ -476,4 +521,46 @@ class Controller_AJAX {
|
|
476 |
$response = array('success' => true);
|
477 |
self::send_json($response);
|
478 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
479 |
}
|
6 |
use WordfenceLS\Crypto\Model_Symmetric;
|
7 |
|
8 |
class Controller_AJAX {
|
9 |
+
|
10 |
+
const MAX_USERS_TO_NOTIFY = 100;
|
11 |
+
|
12 |
protected $_actions = null; //Populated on init
|
13 |
|
14 |
/**
|
38 |
'nopriv' => true,
|
39 |
'nonce' => false,
|
40 |
'permissions' => array(),
|
41 |
+
'required_parameters' => array('wfls-message-nonce', 'wfls-message'),
|
42 |
),
|
43 |
'activate' => array(
|
44 |
'handler' => array($this, '_ajax_activate_callback'),
|
80 |
'permissions' => array(Controller_Permissions::CAP_MANAGE_SETTINGS => __('You do not have permission to reset reCAPTCHA statistics.', 'wordfence-2fa')),
|
81 |
'required_parameters' => array('nonce'),
|
82 |
),
|
83 |
+
'reset_2fa_grace_period' => array (
|
84 |
+
'handler' => array($this, '_ajax_reset_2fa_grace_period_callback'),
|
85 |
+
'permissions' => array(Controller_Permissions::CAP_MANAGE_SETTINGS => __('You do not have permission to reset the 2FA grace period.', 'wordfence-2fa')),
|
86 |
+
'required_parameters' => array('nonce', 'user_id')
|
87 |
+
),
|
88 |
+
'revoke_2fa_grace_period' => array (
|
89 |
+
'handler' => array($this, '_ajax_revoke_2fa_grace_period_callback'),
|
90 |
+
'permissions' => array(Controller_Permissions::CAP_MANAGE_SETTINGS => __('You do not have permission to revoke the 2FA grace period.', 'wordfence-2fa')),
|
91 |
+
'required_parameters' => array('nonce', 'user_id')
|
92 |
+
),
|
93 |
+
'reset_ntp_failure_count' => array(
|
94 |
+
'handler' => array($this, '_ajax_reset_ntp_failure_count_callback'),
|
95 |
+
'permissions' => array(Controller_Permissions::CAP_MANAGE_SETTINGS => __('You do not have permission to reset the NTP failure count.', 'wordfence-2fa')),
|
96 |
+
'required_parameters' => array(),
|
97 |
+
),
|
98 |
+
'disable_ntp' => array(
|
99 |
+
'handler' => array($this, '_ajax_disable_ntp_callback'),
|
100 |
+
'permissions' => array(Controller_Permissions::CAP_MANAGE_SETTINGS => __('You do not have permission to disable NTP.', 'wordfence-2fa')),
|
101 |
+
'required_parameters' => array(),
|
102 |
+
),
|
103 |
+
'dismiss_persistent_notice' => array(
|
104 |
+
'handler' => array($this, '_ajax_dismiss_persistent_notice_callback'),
|
105 |
+
'permissions' => array(Controller_Permissions::CAP_MANAGE_SETTINGS => __('You do not have permission to dismiss this notice.', 'wordfence-2fa')),
|
106 |
+
'required_parameters' => array('nonce', 'notice_id')
|
107 |
+
)
|
108 |
);
|
109 |
|
110 |
$this->_init_actions();
|
133 |
|
134 |
public function _ajax_handler() {
|
135 |
$action = (isset($_POST['action']) && is_string($_POST['action']) && $_POST['action']) ? $_POST['action'] : $_GET['action'];
|
136 |
+
if (preg_match('~wordfence_ls_([a-zA-Z_0-9]+)$~', $action, $matches)) {
|
137 |
$action = $matches[1];
|
138 |
if (!isset($this->_actions[$action])) {
|
139 |
+
self::send_json(array('error' => esc_html__('An unknown action was provided.', 'wordfence-2fa')));
|
140 |
}
|
141 |
|
142 |
$parameters = $this->_actions[$action];
|
143 |
if (!empty($parameters['required_parameters'])) {
|
144 |
foreach ($parameters['required_parameters'] as $k) {
|
145 |
if (!isset($_POST[$k])) {
|
146 |
+
self::send_json(array('error' => esc_html__('An expected parameter was not provided.', 'wordfence-2fa')));
|
147 |
}
|
148 |
}
|
149 |
}
|
151 |
if (!isset($parameters['nonce']) || $parameters['nonce']) {
|
152 |
$nonce = (isset($_POST['nonce']) && is_string($_POST['nonce']) && $_POST['nonce']) ? $_POST['nonce'] : $_GET['nonce'];
|
153 |
if (!is_string($nonce) || !wp_verify_nonce($nonce, 'wp-ajax')) {
|
154 |
+
self::send_json(array('error' => esc_html__('Your browser sent an invalid security token. Please try reloading this page.', 'wordfence-2fa'), 'tokenInvalid' => 1));
|
155 |
}
|
156 |
}
|
157 |
|
169 |
}
|
170 |
|
171 |
public function _ajax_authenticate_callback() {
|
172 |
+
$credentialKeys = array(
|
173 |
+
'log' => 'pwd',
|
174 |
+
'username' => 'password'
|
175 |
+
);
|
176 |
+
$username = null;
|
177 |
+
$password = null;
|
178 |
+
foreach ($credentialKeys as $usernameKey => $passwordKey) {
|
179 |
+
if (array_key_exists($usernameKey, $_POST) && array_key_exists($passwordKey, $_POST) && is_string($_POST[$usernameKey]) && is_string($_POST[$passwordKey])) {
|
180 |
+
$username = $_POST[$usernameKey];
|
181 |
+
$password = $_POST[$passwordKey];
|
182 |
+
break;
|
183 |
+
}
|
184 |
+
}
|
185 |
+
if (empty($username) || empty($password)) {
|
186 |
+
self::send_json(array('error' => wp_kses(sprintf(__('<strong>ERROR</strong>: A username and password must be provided. <a href="%s" title="Password Lost and Found">Lost your password</a>?'), wp_lostpassword_url()), array('strong'=>array(), 'a'=>array('href'=>array(), 'title'=>array())))));
|
187 |
}
|
188 |
|
189 |
$legacy2FAActive = Controller_WordfenceLS::shared()->legacy_2fa_active();
|
191 |
self::send_json(array('login' => 1));
|
192 |
}
|
193 |
|
|
|
|
|
194 |
do_action_ref_array('wp_authenticate', array(&$username, &$password));
|
195 |
|
196 |
define('WORDFENCE_LS_AUTHENTICATION_CHECK', true); //Prevents our auth filter from recursing
|
231 |
$reset = false;
|
232 |
foreach ($user->get_error_codes() as $code) {
|
233 |
if ($code == 'invalid_username' || $code == 'invalid_email' || $code == 'incorrect_password' || $code == 'authentication_failed') {
|
234 |
+
$errors[] = wp_kses(sprintf(__('<strong>ERROR</strong>: The username or password you entered is incorrect. <a href="%s" title="Password Lost and Found">Lost your password</a>?'), wp_lostpassword_url()), array('strong'=>array(), 'a'=>array('href'=>array(), 'title'=>array())));
|
235 |
}
|
236 |
else {
|
237 |
if ($code == 'wfls_twofactor_invalid') {
|
263 |
}
|
264 |
}
|
265 |
|
266 |
+
self::send_json(array('error' => wp_kses(sprintf(__('<strong>ERROR</strong>: The username or password you entered is incorrect. <a href="%s" title="Password Lost and Found">Lost your password</a>?'), wp_lostpassword_url()), array('strong'=>array(), 'a'=>array('href'=>array(), 'title'=>array())))));
|
267 |
}
|
268 |
|
269 |
public function _ajax_register_support_callback() {
|
270 |
+
$email = null;
|
271 |
+
if (array_key_exists('email', $_POST) && is_string($_POST['email'])) {
|
272 |
+
$email = $_POST['email'];
|
273 |
+
}
|
274 |
+
else if (array_key_exists('user_email', $_POST) && is_string($_POST['user_email'])) {
|
275 |
+
$email = $_POST['user_email'];
|
276 |
+
}
|
277 |
+
if (
|
278 |
+
$email === null ||
|
279 |
!isset($_POST['wfls-message']) || !is_string($_POST['wfls-message']) ||
|
280 |
!isset($_POST['wfls-message-nonce']) || !is_string($_POST['wfls-message-nonce'])) {
|
281 |
+
self::send_json(array('error' => wp_kses(sprintf(__('<strong>ERROR</strong>: Unable to send message. Please refresh the page and try again.')), array('strong'=>array()))));
|
282 |
}
|
283 |
|
284 |
+
$email = sanitize_email($email);
|
285 |
+
$login = '';
|
286 |
+
if (array_key_exists('user_login', $_POST) && is_string($_POST['user_login']))
|
287 |
+
$login = sanitize_user($_POST['user_login']);
|
288 |
$message = strip_tags($_POST['wfls-message']);
|
289 |
$nonce = $_POST['wfls-message-nonce'];
|
290 |
+
|
291 |
+
if ((isset($_POST['user_login']) && empty($login)) || empty($email) || !filter_var($email, FILTER_VALIDATE_EMAIL) || empty($message)) {
|
292 |
+
self::send_json(array('error' => wp_kses(sprintf(__('<strong>ERROR</strong>: Unable to send message. Please refresh the page and try again.')), array('strong'=>array()))));
|
293 |
}
|
294 |
|
295 |
$jwt = Model_JWT::decode_jwt($_POST['wfls-message-nonce']);
|
297 |
$decryptedIP = Model_Symmetric::decrypt($jwt->payload['ip']);
|
298 |
$decryptedScore = Model_Symmetric::decrypt($jwt->payload['score']);
|
299 |
if ($decryptedIP === false || $decryptedScore === false || Model_IP::inet_pton($decryptedIP) !== Model_IP::inet_pton(Model_Request::current()->ip())) { //JWT IP and the current request's IP don't match, refuse the message
|
300 |
+
self::send_json(array('error' => wp_kses(sprintf(__('<strong>ERROR</strong>: Unable to send message. Please refresh the page and try again.')), array('strong'=>array()))));
|
301 |
}
|
302 |
|
303 |
$identifier = bin2hex(Model_IP::inet_pton($decryptedIP));
|
304 |
$tokenBucket = new Model_TokenBucket('rate:' . $identifier, 2, 1 / (6 * Model_TokenBucket::HOUR)); //Maximum of two requests, refilling at a rate of one per six hours
|
305 |
if (!$tokenBucket->consume(1)) {
|
306 |
+
self::send_json(array('error' => wp_kses(sprintf(__('<strong>ERROR</strong>: Unable to send message. You have exceeded the maximum number of messages that may be sent at this time. Please try again later.')), array('strong'=>array()))));
|
307 |
}
|
308 |
|
309 |
$email = array(
|
314 |
);
|
315 |
$success = wp_mail($email['to'], $email['subject'], $email['body'], $email['headers']);
|
316 |
if ($success) {
|
317 |
+
self::send_json(array('message' => wp_kses(sprintf(__('<strong>MESSAGE SENT</strong>: Your message was sent to the site owner.')), array('strong'=>array()))));
|
318 |
}
|
319 |
|
320 |
+
self::send_json(array('error' => wp_kses(sprintf(__('<strong>ERROR</strong>: An error occurred while sending the message. Please try again.')), array('strong'=>array()))));
|
321 |
}
|
322 |
|
323 |
+
self::send_json(array('error' => wp_kses(sprintf(__('<strong>ERROR</strong>: Unable to send message. Please refresh the page and try again.')), array('strong'=>array()))));
|
324 |
}
|
325 |
|
326 |
public function _ajax_activate_callback() {
|
328 |
$user = wp_get_current_user();
|
329 |
if ($user->ID != $userID) {
|
330 |
if (!user_can($user, Controller_Permissions::CAP_ACTIVATE_2FA_OTHERS)) {
|
331 |
+
self::send_json(array('error' => esc_html__('You do not have permission to activate the given user.', 'wordfence-2fa')));
|
332 |
}
|
333 |
else {
|
334 |
$user = new \WP_User($userID);
|
335 |
if (!$user->exists()) {
|
336 |
+
self::send_json(array('error' => esc_html__('The given user does not exist.', 'wordfence-2fa')));
|
337 |
}
|
338 |
}
|
339 |
}
|
340 |
else if (!user_can($user, Controller_Permissions::CAP_ACTIVATE_2FA_SELF)) {
|
341 |
+
self::send_json(array('error' => esc_html__('You do not have permission to activate 2FA.', 'wordfence-2fa')));
|
342 |
}
|
343 |
|
344 |
if (Controller_Users::shared()->has_2fa_active($user)) {
|
345 |
+
self::send_json(array('error' => esc_html__('The given user already has two-factor authentication active.', 'wordfence-2fa')));
|
346 |
}
|
347 |
|
348 |
$matches = (isset($_POST['secret']) && isset($_POST['code']) && is_string($_POST['secret']) && is_string($_POST['code']) && Controller_TOTP::shared()->check_code($_POST['secret'], $_POST['code']));
|
349 |
if ($matches === false) {
|
350 |
+
self::send_json(array('error' => esc_html__('The code provided does not match the expected value. Please verify that the time on your authenticator device is correct and that this server\'s time is correct.', 'wordfence-2fa')));
|
351 |
}
|
352 |
|
353 |
Controller_TOTP::shared()->activate_2fa($user, $_POST['secret'], $_POST['recovery'], $matches);
|
354 |
Controller_Notices::shared()->remove_notice(false, 'wfls-will-be-required', $user);
|
355 |
+
self::send_json(array('activated' => 1, 'text' => sprintf(count($_POST['recovery']) == 1 ? esc_html__('%d unused recovery code remains. You may generate a new set by clicking below.', 'wordfence-2fa') : esc_html__('%d unused recovery codes remain. You may generate a new set by clicking below.', 'wordfence-2fa'), count($_POST['recovery']))));
|
356 |
}
|
357 |
|
358 |
public function _ajax_deactivate_callback() {
|
360 |
$user = wp_get_current_user();
|
361 |
if ($user->ID != $userID) {
|
362 |
if (!user_can($user, Controller_Permissions::CAP_ACTIVATE_2FA_OTHERS)) {
|
363 |
+
self::send_json(array('error' => esc_html__('You do not have permission to deactivate the given user.', 'wordfence-2fa')));
|
364 |
}
|
365 |
else {
|
366 |
$user = new \WP_User($userID);
|
367 |
if (!$user->exists()) {
|
368 |
+
self::send_json(array('error' => esc_html__('The user does not exist.', 'wordfence-2fa')));
|
369 |
}
|
370 |
}
|
371 |
}
|
372 |
else if (!user_can($user, Controller_Permissions::CAP_ACTIVATE_2FA_SELF)) {
|
373 |
+
self::send_json(array('error' => esc_html__('You do not have permission to deactivate 2FA.', 'wordfence-2fa')));
|
374 |
}
|
375 |
|
376 |
if (!Controller_Users::shared()->has_2fa_active($user)) {
|
377 |
+
self::send_json(array('error' => esc_html__('The user specified does not have two-factor authentication active.', 'wordfence-2fa')));
|
378 |
}
|
379 |
|
380 |
Controller_Users::shared()->deactivate_2fa($user);
|
386 |
$user = wp_get_current_user();
|
387 |
if ($user->ID != $userID) {
|
388 |
if (!user_can($user, Controller_Permissions::CAP_ACTIVATE_2FA_OTHERS)) {
|
389 |
+
self::send_json(array('error' => esc_html__('You do not have permission to generate new recovery codes for the given user.', 'wordfence-2fa')));
|
390 |
}
|
391 |
else {
|
392 |
$user = new \WP_User($userID);
|
393 |
if (!$user->exists()) {
|
394 |
+
self::send_json(array('error' => esc_html__('The user does not exist.', 'wordfence-2fa')));
|
395 |
}
|
396 |
}
|
397 |
}
|
398 |
else if (!user_can($user, Controller_Permissions::CAP_ACTIVATE_2FA_SELF)) {
|
399 |
+
self::send_json(array('error' => esc_html__('You do not have permission to generate new recovery codes.', 'wordfence-2fa')));
|
400 |
}
|
401 |
|
402 |
if (!Controller_Users::shared()->has_2fa_active($user)) {
|
403 |
+
self::send_json(array('error' => esc_html__('The user specified does not have two-factor authentication active.', 'wordfence-2fa')));
|
404 |
}
|
405 |
|
406 |
$codes = Controller_Users::shared()->regenerate_recovery_codes($user);
|
407 |
+
self::send_json(array('regenerated' => 1, 'recovery' => array_map(function($r) { return implode(' ', str_split(bin2hex($r), 4)); }, $codes), 'text' => sprintf(count($codes) == 1 ? esc_html__('%d unused recovery code remains. You may generate a new set by clicking below.', 'wordfence-2fa') : esc_html__('%d unused recovery codes remain. You may generate a new set by clicking below.', 'wordfence-2fa'), count($codes))));
|
408 |
}
|
409 |
|
410 |
public function _ajax_save_options_callback() {
|
414 |
if ($errors !== true) {
|
415 |
if (count($errors) == 1) {
|
416 |
$e = array_shift($errors);
|
417 |
+
self::send_json(array('error' => esc_html(sprintf(__('An error occurred while saving the configuration: %s', 'wordfence-2fa'), $e))));
|
418 |
}
|
419 |
else if (count($errors) > 1) {
|
420 |
$compoundMessage = array();
|
422 |
$compoundMessage[] = esc_html($e);
|
423 |
}
|
424 |
self::send_json(array(
|
425 |
+
'error' => wp_kses(sprintf(__('Errors occurred while saving the configuration: %s', 'wordfence-2fa'), '<ul><li>' . implode('</li><li>', $compoundMessage) . '</li></ul>'), array('ul'=>array(), 'li'=>array())),
|
426 |
'html' => true,
|
427 |
));
|
428 |
}
|
429 |
|
430 |
self::send_json(array(
|
431 |
+
'error' => esc_html__('Errors occurred while saving the configuration.', 'wordfence-2fa'),
|
432 |
));
|
433 |
}
|
434 |
|
445 |
}
|
446 |
|
447 |
self::send_json(array(
|
448 |
+
'error' => esc_html__('No configuration changes were provided to save.', 'wordfence'),
|
449 |
));
|
450 |
}
|
451 |
|
452 |
public function _ajax_send_grace_period_notification_callback() {
|
453 |
+
$notifyAll = isset($_POST['notify_all']);
|
454 |
+
$users = Controller_Users::shared()->get_users_by_role($_POST['role'], $notifyAll ? null: self::MAX_USERS_TO_NOTIFY + 1);
|
455 |
+
$userCount = count($users);
|
456 |
+
if (!$notifyAll && $userCount > self::MAX_USERS_TO_NOTIFY)
|
457 |
+
self::send_json(array('error' => esc_html(sprintf(__('More than %d users exist for the selected role. This notification is not designed to handle large groups of users. In such instances, using a different solution for notifying users of upcoming 2FA requirements is recommended.', 'wordfence-2fa'), self::MAX_USERS_TO_NOTIFY)), 'limit_exceeded' => true));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
458 |
$sent = 0;
|
459 |
+
foreach ($users as $user) {
|
460 |
+
Controller_Users::shared()->requires_2fa($user, $inGracePeriod, $requiredAt);
|
461 |
+
if ($inGracePeriod && !Controller_Users::shared()->has_2fa_active($user)) {
|
462 |
+
$subject = sprintf(__('2FA will soon be required on %s', 'wordfence-2fa'), home_url());
|
463 |
+
$requiredDate = Controller_Time::format_local_time('F j, Y g:i A', $requiredAt);
|
464 |
+
|
465 |
+
$message = sprintf(
|
466 |
+
__("You do not currently have two-factor authentication active on your account, which will be required beginning %s.\n\nConfigure 2FA: %s", 'wordfence-2fa'),
|
467 |
+
$requiredDate,
|
468 |
+
(is_multisite() && is_super_admin($user->ID)) ? network_admin_url('admin.php?page=WFLS') : admin_url('admin.php?page=WFLS')
|
469 |
+
);
|
470 |
+
|
471 |
+
wp_mail($user->user_email, $subject, $message);
|
472 |
+
$sent++;
|
473 |
}
|
474 |
+
}
|
475 |
|
476 |
+
if ($userCount == 0) {
|
477 |
+
self::send_json(array('error' => esc_html__('No users currently exist with the selected role.', 'wordfence-2fa')));
|
|
|
|
|
|
|
|
|
|
|
|
|
478 |
}
|
479 |
+
else if ($sent == 0) {
|
480 |
+
self::send_json(array('confirmation' => esc_html__('All users with the selected role already have two-factor authentication activated or have been locked out.', 'wordfence-2fa')));
|
|
|
481 |
}
|
482 |
else if ($sent == 1) {
|
483 |
+
self::send_json(array('confirmation' => esc_html(sprintf(__('A reminder to activate two-factor authentication was sent to %d user.', 'wordfence-2fa'), $sent))));
|
484 |
}
|
485 |
+
self::send_json(array('confirmation' => esc_html(sprintf(__('A reminder to activate two-factor authentication was sent to %d users.', 'wordfence-2fa'), $sent))));
|
486 |
}
|
487 |
|
488 |
public function _ajax_update_ip_preview_callback() {
|
521 |
$response = array('success' => true);
|
522 |
self::send_json($response);
|
523 |
}
|
524 |
+
|
525 |
+
public function _ajax_reset_2fa_grace_period_callback() {
|
526 |
+
$userId = (int) $_POST['user_id'];
|
527 |
+
$gracePeriodOverride = array_key_exists('grace_period_override', $_POST) ? (int) $_POST['grace_period_override'] : null;
|
528 |
+
$user = get_userdata($userId);
|
529 |
+
if ($user === false)
|
530 |
+
self::send_json(array('error' => esc_html__('Invalid user specified', 'wordfence-2fa')));
|
531 |
+
if ($gracePeriodOverride < 0 || $gracePeriodOverride > Controller_Settings::MAX_REQUIRE_2FA_USER_GRACE_PERIOD)
|
532 |
+
self::send_json(array('error' => esc_html__('Invalid grace period override', 'wordfence-2fa')));
|
533 |
+
$gracePeriodAllowed = Controller_Users::shared()->get_grace_period_allowed_flag($userId);
|
534 |
+
if (!$gracePeriodAllowed)
|
535 |
+
Controller_Users::shared()->allow_grace_period($userId);
|
536 |
+
if (!Controller_Users::shared()->reset_2fa_grace_period($user, $gracePeriodOverride))
|
537 |
+
self::send_json(array('error' => esc_html__('Failed to reset grace period', 'wordfence-2fa')));
|
538 |
+
self::send_json(array('success' => true));
|
539 |
+
}
|
540 |
+
|
541 |
+
public function _ajax_revoke_2fa_grace_period_callback() {
|
542 |
+
$user = get_userdata((int) $_POST['user_id']);
|
543 |
+
if ($user === false)
|
544 |
+
self::send_json(array('error' => esc_html__('Invalid user specified', 'wordfence-2fa')));
|
545 |
+
Controller_Users::shared()->revoke_grace_period($user);
|
546 |
+
self::send_json(array('success' => true));
|
547 |
+
}
|
548 |
+
|
549 |
+
public function _ajax_reset_ntp_failure_count_callback() {
|
550 |
+
Controller_Settings::shared()->reset_ntp_failure_count();
|
551 |
+
}
|
552 |
+
|
553 |
+
public function _ajax_disable_ntp_callback() {
|
554 |
+
Controller_Settings::shared()->disable_ntp_cron();
|
555 |
+
}
|
556 |
+
|
557 |
+
public function _ajax_dismiss_persistent_notice_callback() {
|
558 |
+
$userId = get_current_user_id();
|
559 |
+
$noticeId = $_POST['notice_id'];
|
560 |
+
if ($userId !== 0 && Controller_Notices::shared()->dismiss_persistent_notice($userId, $noticeId))
|
561 |
+
self::send_json(array('success' => true));
|
562 |
+
self::send_json(array(
|
563 |
+
'error' => esc_html__('Unable to dismiss notice', 'wordfence')
|
564 |
+
));
|
565 |
+
}
|
566 |
}
|
classes/controller/captcha.php
CHANGED
@@ -127,4 +127,30 @@ class Controller_CAPTCHA {
|
|
127 |
$threshold = $this->threshold();
|
128 |
return ($score >= $threshold || abs($score - $threshold) < 0.0001);
|
129 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
130 |
}
|
127 |
$threshold = $this->threshold();
|
128 |
return ($score >= $threshold || abs($score - $threshold) < 0.0001);
|
129 |
}
|
130 |
+
|
131 |
+
/**
|
132 |
+
* Check if the current request is an XML RPC request
|
133 |
+
* @return bool
|
134 |
+
*/
|
135 |
+
private static function is_xml_rpc() {
|
136 |
+
return defined('XMLRPC_REQUEST') && XMLRPC_REQUEST;
|
137 |
+
}
|
138 |
+
|
139 |
+
/**
|
140 |
+
* Check if captcha is required for the current request
|
141 |
+
* @return bool
|
142 |
+
*/
|
143 |
+
public function is_captcha_required() {
|
144 |
+
$required = $this->enabled() && !self::is_xml_rpc();
|
145 |
+
return apply_filters('wordfence_ls_require_captcha', $required);
|
146 |
+
}
|
147 |
+
|
148 |
+
/**
|
149 |
+
* Get the captcha token provided with the current request
|
150 |
+
* @param string $key if specified, override the default token parameter
|
151 |
+
* @return string|null the captcha token, if present, null otherwise
|
152 |
+
*/
|
153 |
+
public function get_token($key = 'wfls-captcha-token') {
|
154 |
+
return (isset($_POST[$key]) && is_string($_POST[$key]) && !empty($_POST[$key]) ? $_POST[$key] : null);
|
155 |
+
}
|
156 |
}
|
classes/controller/notices.php
CHANGED
@@ -6,6 +6,8 @@ use WordfenceLS\Text\Model_HTML;
|
|
6 |
|
7 |
class Controller_Notices {
|
8 |
const USER_META_KEY = 'wfls_notices';
|
|
|
|
|
9 |
|
10 |
/**
|
11 |
* Returns the singleton Controller_Notices.
|
@@ -163,4 +165,25 @@ class Controller_Notices {
|
|
163 |
}
|
164 |
Controller_Settings::shared()->set_array(Controller_Settings::OPTION_GLOBAL_NOTICES, $notices, true);
|
165 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
166 |
}
|
6 |
|
7 |
class Controller_Notices {
|
8 |
const USER_META_KEY = 'wfls_notices';
|
9 |
+
const PERSISTENT_NOTICE_DISMISS_PREFIX = 'wfls-dismiss-';
|
10 |
+
const PERSISTENT_NOTICE_WOOCOMMERCE_INTEGRATION = 'wfls-woocommerce-integration-notice';
|
11 |
|
12 |
/**
|
13 |
* Returns the singleton Controller_Notices.
|
165 |
}
|
166 |
Controller_Settings::shared()->set_array(Controller_Settings::OPTION_GLOBAL_NOTICES, $notices, true);
|
167 |
}
|
168 |
+
|
169 |
+
public function get_persistent_notice_ids() {
|
170 |
+
return array(
|
171 |
+
self::PERSISTENT_NOTICE_WOOCOMMERCE_INTEGRATION
|
172 |
+
);
|
173 |
+
}
|
174 |
+
|
175 |
+
private static function get_persistent_notice_dismiss_key($noticeId) {
|
176 |
+
return self::PERSISTENT_NOTICE_DISMISS_PREFIX . $noticeId;
|
177 |
+
}
|
178 |
+
|
179 |
+
public function dismiss_persistent_notice($userId, $noticeId) {
|
180 |
+
if (!in_array($noticeId, $this->get_persistent_notice_ids(), true))
|
181 |
+
return false;
|
182 |
+
update_user_option($userId, self::get_persistent_notice_dismiss_key($noticeId), true, true);
|
183 |
+
return true;
|
184 |
+
}
|
185 |
+
|
186 |
+
public function is_persistent_notice_dismissed($userId, $noticeId) {
|
187 |
+
return (bool) get_user_option(self::get_persistent_notice_dismiss_key($noticeId), $userId);
|
188 |
+
}
|
189 |
}
|
classes/controller/permissions.php
CHANGED
@@ -164,23 +164,23 @@ class Controller_Permissions {
|
|
164 |
public function allow_2fa_self($role_name) {
|
165 |
$this->on_role_change();
|
166 |
if (is_multisite()) {
|
167 |
-
$this->_add_cap_multisite($role_name, self::CAP_ACTIVATE_2FA_SELF, $this->get_primary_sites());
|
168 |
}
|
169 |
else {
|
170 |
-
$this->_add_cap($role_name, self::CAP_ACTIVATE_2FA_SELF);
|
171 |
}
|
172 |
}
|
173 |
|
174 |
public function disallow_2fa_self($role_name) {
|
175 |
$this->on_role_change();
|
176 |
if (is_multisite()) {
|
177 |
-
$this->_remove_cap_multisite($role_name, self::CAP_ACTIVATE_2FA_SELF, $this->get_primary_sites());
|
178 |
}
|
179 |
else {
|
180 |
if ($role_name == 'administrator') {
|
181 |
-
return;
|
182 |
}
|
183 |
-
$this->_remove_cap($role_name, self::CAP_ACTIVATE_2FA_SELF);
|
184 |
}
|
185 |
}
|
186 |
|
@@ -194,6 +194,15 @@ class Controller_Permissions {
|
|
194 |
}
|
195 |
return $user->has_cap(self::CAP_MANAGE_SETTINGS);
|
196 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
197 |
|
198 |
private function _wp_roles($site_id = null) {
|
199 |
require(ABSPATH . 'wp-includes/version.php'); /** @var string $wp_version */
|
@@ -201,22 +210,30 @@ class Controller_Permissions {
|
|
201 |
return new \WP_Roles($site_id);
|
202 |
}
|
203 |
|
204 |
-
//\WP_Roles in WP < 4.9 initializes based on the current blog ID
|
205 |
-
|
|
|
|
|
206 |
$wp_roles = new \WP_Roles();
|
207 |
-
|
|
|
|
|
208 |
return $wp_roles;
|
209 |
}
|
210 |
|
211 |
private function _add_cap_multisite($role_name, $cap, $blog_ids=null) {
|
|
|
|
|
212 |
global $wpdb;
|
213 |
$blogs = $blog_ids===null?$wpdb->get_col("SELECT `blog_id` FROM `{$wpdb->blogs}` WHERE `deleted` = 0"):$blog_ids;
|
|
|
214 |
foreach ($blogs as $id) {
|
215 |
$wp_roles = $this->_wp_roles($id);
|
216 |
switch_to_blog($id);
|
217 |
-
$this->_add_cap($role_name, $cap, $wp_roles);
|
218 |
restore_current_blog();
|
219 |
}
|
|
|
220 |
}
|
221 |
|
222 |
private function _add_cap($role_name, $cap, $wp_roles = null) {
|
@@ -231,14 +248,18 @@ class Controller_Permissions {
|
|
231 |
}
|
232 |
|
233 |
private function _remove_cap_multisite($role_name, $cap, $blog_ids=null) {
|
|
|
|
|
234 |
global $wpdb;
|
235 |
$blogs = $blog_ids===null?$wpdb->get_col("SELECT `blog_id` FROM `{$wpdb->blogs}` WHERE `deleted` = 0"):$blog_ids;
|
|
|
236 |
foreach ($blogs as $id) {
|
237 |
$wp_roles = $this->_wp_roles($id);
|
238 |
switch_to_blog($id);
|
239 |
-
$this->_remove_cap($role_name, $cap, $wp_roles);
|
240 |
restore_current_blog();
|
241 |
}
|
|
|
242 |
}
|
243 |
|
244 |
private function _remove_cap($role_name, $cap, $wp_roles = null) {
|
@@ -251,4 +272,22 @@ class Controller_Permissions {
|
|
251 |
$wp_roles->remove_cap($role_name, $cap);
|
252 |
return true;
|
253 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
254 |
}
|
164 |
public function allow_2fa_self($role_name) {
|
165 |
$this->on_role_change();
|
166 |
if (is_multisite()) {
|
167 |
+
return $this->_add_cap_multisite($role_name, self::CAP_ACTIVATE_2FA_SELF, $this->get_primary_sites());
|
168 |
}
|
169 |
else {
|
170 |
+
return $this->_add_cap($role_name, self::CAP_ACTIVATE_2FA_SELF);
|
171 |
}
|
172 |
}
|
173 |
|
174 |
public function disallow_2fa_self($role_name) {
|
175 |
$this->on_role_change();
|
176 |
if (is_multisite()) {
|
177 |
+
return $this->_remove_cap_multisite($role_name, self::CAP_ACTIVATE_2FA_SELF, $this->get_primary_sites());
|
178 |
}
|
179 |
else {
|
180 |
if ($role_name == 'administrator') {
|
181 |
+
return true;
|
182 |
}
|
183 |
+
return $this->_remove_cap($role_name, self::CAP_ACTIVATE_2FA_SELF);
|
184 |
}
|
185 |
}
|
186 |
|
194 |
}
|
195 |
return $user->has_cap(self::CAP_MANAGE_SETTINGS);
|
196 |
}
|
197 |
+
|
198 |
+
public function can_role_manage_settings($role) {
|
199 |
+
if (is_string($role)) {
|
200 |
+
$role = get_role($role);
|
201 |
+
}
|
202 |
+
if ($role)
|
203 |
+
return $role->has_cap(self::CAP_MANAGE_SETTINGS);
|
204 |
+
return false;
|
205 |
+
}
|
206 |
|
207 |
private function _wp_roles($site_id = null) {
|
208 |
require(ABSPATH . 'wp-includes/version.php'); /** @var string $wp_version */
|
210 |
return new \WP_Roles($site_id);
|
211 |
}
|
212 |
|
213 |
+
//\WP_Roles in WP < 4.9 initializes based on the current blog ID
|
214 |
+
if (is_multisite()) {
|
215 |
+
switch_to_blog($site_id);
|
216 |
+
}
|
217 |
$wp_roles = new \WP_Roles();
|
218 |
+
if (is_multisite()) {
|
219 |
+
restore_current_blog();
|
220 |
+
}
|
221 |
return $wp_roles;
|
222 |
}
|
223 |
|
224 |
private function _add_cap_multisite($role_name, $cap, $blog_ids=null) {
|
225 |
+
if ($role_name === 'super-admin')
|
226 |
+
return true;
|
227 |
global $wpdb;
|
228 |
$blogs = $blog_ids===null?$wpdb->get_col("SELECT `blog_id` FROM `{$wpdb->blogs}` WHERE `deleted` = 0"):$blog_ids;
|
229 |
+
$added = false;
|
230 |
foreach ($blogs as $id) {
|
231 |
$wp_roles = $this->_wp_roles($id);
|
232 |
switch_to_blog($id);
|
233 |
+
$added = $this->_add_cap($role_name, $cap, $wp_roles) || $added;
|
234 |
restore_current_blog();
|
235 |
}
|
236 |
+
return $added;
|
237 |
}
|
238 |
|
239 |
private function _add_cap($role_name, $cap, $wp_roles = null) {
|
248 |
}
|
249 |
|
250 |
private function _remove_cap_multisite($role_name, $cap, $blog_ids=null) {
|
251 |
+
if ($role_name === 'super-admin')
|
252 |
+
return false;
|
253 |
global $wpdb;
|
254 |
$blogs = $blog_ids===null?$wpdb->get_col("SELECT `blog_id` FROM `{$wpdb->blogs}` WHERE `deleted` = 0"):$blog_ids;
|
255 |
+
$removed = false;
|
256 |
foreach ($blogs as $id) {
|
257 |
$wp_roles = $this->_wp_roles($id);
|
258 |
switch_to_blog($id);
|
259 |
+
$removed = $this->_remove_cap($role_name, $cap, $wp_roles) || $removed;
|
260 |
restore_current_blog();
|
261 |
}
|
262 |
+
return $removed;
|
263 |
}
|
264 |
|
265 |
private function _remove_cap($role_name, $cap, $wp_roles = null) {
|
272 |
$wp_roles->remove_cap($role_name, $cap);
|
273 |
return true;
|
274 |
}
|
275 |
+
|
276 |
+
public function get_all_roles($user) {
|
277 |
+
if (is_multisite()) {
|
278 |
+
$roles = array();
|
279 |
+
if (is_super_admin($user->ID))
|
280 |
+
$roles[] = 'super-admin';
|
281 |
+
foreach (get_blogs_of_user($user->ID) as $id => $blog) {
|
282 |
+
switch_to_blog($id);
|
283 |
+
$blogUser = new \WP_User($user->ID);
|
284 |
+
$roles = array_merge($roles, $blogUser->roles);
|
285 |
+
restore_current_blog();
|
286 |
+
}
|
287 |
+
return array_unique($roles);
|
288 |
+
}
|
289 |
+
else {
|
290 |
+
return $user->roles;
|
291 |
+
}
|
292 |
+
}
|
293 |
}
|
classes/controller/settings.php
CHANGED
@@ -14,6 +14,7 @@ class Controller_Settings {
|
|
14 |
const OPTION_REQUIRE_2FA_ADMIN = 'require-2fa.administrator';
|
15 |
const OPTION_REQUIRE_2FA_GRACE_PERIOD_ENABLED = 'require-2fa-grace-period-enabled';
|
16 |
const OPTION_REQUIRE_2FA_GRACE_PERIOD = 'require-2fa-grace-period';
|
|
|
17 |
const OPTION_REMEMBER_DEVICE_ENABLED = 'remember-device';
|
18 |
const OPTION_REMEMBER_DEVICE_DURATION = 'remember-device-duration';
|
19 |
const OPTION_ALLOW_XML_RPC = 'allow-xml-rpc';
|
@@ -23,16 +24,27 @@ class Controller_Settings {
|
|
23 |
const OPTION_RECAPTCHA_SECRET = 'recaptcha-secret';
|
24 |
const OPTION_RECAPTCHA_THRESHOLD = 'recaptcha-threshold';
|
25 |
const OPTION_DELETE_ON_DEACTIVATION = 'delete-deactivation';
|
|
|
|
|
26 |
|
27 |
//Internal
|
28 |
const OPTION_GLOBAL_NOTICES = 'global-notices';
|
29 |
const OPTION_LAST_SECRET_REFRESH = 'last-secret-refresh';
|
30 |
const OPTION_USE_NTP = 'use-ntp';
|
|
|
|
|
31 |
const OPTION_NTP_OFFSET = 'ntp-offset';
|
32 |
const OPTION_SHARED_HASH_SECRET_KEY = 'shared-hash-secret';
|
33 |
const OPTION_SHARED_SYMMETRIC_SECRET_KEY = 'shared-symmetric-secret';
|
34 |
const OPTION_DISMISSED_FRESH_INSTALL_MODAL = 'dismissed-fresh-install-modal';
|
35 |
const OPTION_CAPTCHA_STATS = 'captcha-stats';
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
36 |
|
37 |
protected $_settingsStorage;
|
38 |
|
@@ -54,6 +66,7 @@ class Controller_Settings {
|
|
54 |
$settingsStorage = new Model_DB();
|
55 |
}
|
56 |
$this->_settingsStorage = $settingsStorage;
|
|
|
57 |
}
|
58 |
|
59 |
public function set_defaults() {
|
@@ -64,6 +77,7 @@ class Controller_Settings {
|
|
64 |
self::OPTION_IP_TRUSTED_PROXIES => array('value' => '', 'autoload' => Model_Settings::AUTOLOAD_YES, 'allowOverwrite' => false),
|
65 |
self::OPTION_REQUIRE_2FA_ADMIN => array('value' => false, 'autoload' => Model_Settings::AUTOLOAD_YES, 'allowOverwrite' => false),
|
66 |
self::OPTION_REQUIRE_2FA_GRACE_PERIOD_ENABLED => array('value' => false, 'autoload' => Model_Settings::AUTOLOAD_YES, 'allowOverwrite' => false),
|
|
|
67 |
self::OPTION_GLOBAL_NOTICES => array('value' => '[]', 'autoload' => Model_Settings::AUTOLOAD_YES, 'allowOverwrite' => false),
|
68 |
self::OPTION_REMEMBER_DEVICE_ENABLED => array('value' => false, 'autoload' => Model_Settings::AUTOLOAD_YES, 'allowOverwrite' => false),
|
69 |
self::OPTION_REMEMBER_DEVICE_DURATION => array('value' => (30 * 86400), 'autoload' => Model_Settings::AUTOLOAD_YES, 'allowOverwrite' => false),
|
@@ -73,6 +87,7 @@ class Controller_Settings {
|
|
73 |
self::OPTION_RECAPTCHA_THRESHOLD => array('value' => 0.5, 'autoload' => Model_Settings::AUTOLOAD_YES, 'allowOverwrite' => false),
|
74 |
self::OPTION_LAST_SECRET_REFRESH => array('value' => 0, 'autoload' => Model_Settings::AUTOLOAD_YES, 'allowOverwrite' => false),
|
75 |
self::OPTION_DELETE_ON_DEACTIVATION => array('value' => false, 'autoload' => Model_Settings::AUTOLOAD_YES, 'allowOverwrite' => false),
|
|
|
76 |
));
|
77 |
}
|
78 |
|
@@ -193,6 +208,8 @@ class Controller_Settings {
|
|
193 |
return true;
|
194 |
}
|
195 |
return sprintf(__('An error was encountered while validating the reCAPTCHA site key: %s', 'wordfence-2fa'), $response->get_error_message());
|
|
|
|
|
196 |
}
|
197 |
return true;
|
198 |
}
|
@@ -237,6 +254,7 @@ class Controller_Settings {
|
|
237 |
//Int
|
238 |
case self::OPTION_REMEMBER_DEVICE_DURATION:
|
239 |
case self::OPTION_LAST_SECRET_REFRESH:
|
|
|
240 |
return (int) $value;
|
241 |
|
242 |
//Float
|
@@ -269,24 +287,45 @@ class Controller_Settings {
|
|
269 |
}
|
270 |
return $cleaned;
|
271 |
}
|
272 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
273 |
/**
|
274 |
* Preprocesses the value, returning true if it was saved here (e.g., saved 2fa enabled by assigning a role
|
275 |
* capability) or false if it is to be saved by the backing storage.
|
276 |
*
|
277 |
* @param string $key
|
278 |
* @param mixed $value
|
|
|
279 |
* @return bool
|
280 |
*/
|
281 |
-
public function preprocess($key, $value) {
|
282 |
if (preg_match('/^enabled-roles\.(.+)$/', $key, $matches)) { //Enabled roles are stored as capabilities rather than in the settings storage
|
283 |
$role = $matches[1];
|
284 |
-
if ($
|
285 |
-
|
|
|
|
|
|
|
286 |
}
|
287 |
else {
|
288 |
-
Controller_Permissions::shared()->disallow_2fa_self($role);
|
289 |
}
|
|
|
|
|
290 |
return true;
|
291 |
}
|
292 |
return false;
|
@@ -295,7 +334,7 @@ class Controller_Settings {
|
|
295 |
public function preprocess_multiple($changes) {
|
296 |
$remaining = array();
|
297 |
foreach ($changes as $key => $value) {
|
298 |
-
if (!$this->preprocess($key, $value)) {
|
299 |
$remaining[$key] = $value;
|
300 |
}
|
301 |
}
|
@@ -323,6 +362,60 @@ class Controller_Settings {
|
|
323 |
public function trusted_proxies() {
|
324 |
return array_filter(array_map(function($s) { return trim($s); }, preg_split('/[\r\n]/', $this->get(self::OPTION_IP_TRUSTED_PROXIES, ''))));
|
325 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
326 |
|
327 |
/**
|
328 |
* Utility
|
@@ -407,4 +500,31 @@ class Controller_Settings {
|
|
407 |
|
408 |
return $range;
|
409 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
410 |
}
|
14 |
const OPTION_REQUIRE_2FA_ADMIN = 'require-2fa.administrator';
|
15 |
const OPTION_REQUIRE_2FA_GRACE_PERIOD_ENABLED = 'require-2fa-grace-period-enabled';
|
16 |
const OPTION_REQUIRE_2FA_GRACE_PERIOD = 'require-2fa-grace-period';
|
17 |
+
const OPTION_REQUIRE_2FA_USER_GRACE_PERIOD = '2fa-user-grace-period';
|
18 |
const OPTION_REMEMBER_DEVICE_ENABLED = 'remember-device';
|
19 |
const OPTION_REMEMBER_DEVICE_DURATION = 'remember-device-duration';
|
20 |
const OPTION_ALLOW_XML_RPC = 'allow-xml-rpc';
|
24 |
const OPTION_RECAPTCHA_SECRET = 'recaptcha-secret';
|
25 |
const OPTION_RECAPTCHA_THRESHOLD = 'recaptcha-threshold';
|
26 |
const OPTION_DELETE_ON_DEACTIVATION = 'delete-deactivation';
|
27 |
+
const OPTION_PREFIX_REQUIRED_2FA_ROLE = 'required-2fa-role';
|
28 |
+
const OPTION_ENABLE_WOOCOMMERCE_INTEGRATION = 'enable-woocommerce-integration';
|
29 |
|
30 |
//Internal
|
31 |
const OPTION_GLOBAL_NOTICES = 'global-notices';
|
32 |
const OPTION_LAST_SECRET_REFRESH = 'last-secret-refresh';
|
33 |
const OPTION_USE_NTP = 'use-ntp';
|
34 |
+
const OPTION_ALLOW_DISABLING_NTP = 'allow-disabling-ntp';
|
35 |
+
const OPTION_NTP_FAILURE_COUNT = 'ntp-failure-count';
|
36 |
const OPTION_NTP_OFFSET = 'ntp-offset';
|
37 |
const OPTION_SHARED_HASH_SECRET_KEY = 'shared-hash-secret';
|
38 |
const OPTION_SHARED_SYMMETRIC_SECRET_KEY = 'shared-symmetric-secret';
|
39 |
const OPTION_DISMISSED_FRESH_INSTALL_MODAL = 'dismissed-fresh-install-modal';
|
40 |
const OPTION_CAPTCHA_STATS = 'captcha-stats';
|
41 |
+
|
42 |
+
const DEFAULT_REQUIRE_2FA_USER_GRACE_PERIOD = 10;
|
43 |
+
const MAX_REQUIRE_2FA_USER_GRACE_PERIOD = 99;
|
44 |
+
|
45 |
+
const STATE_2FA_DISABLED = 'disabled';
|
46 |
+
const STATE_2FA_OPTIONAL = 'optional';
|
47 |
+
const STATE_2FA_REQUIRED = 'required';
|
48 |
|
49 |
protected $_settingsStorage;
|
50 |
|
66 |
$settingsStorage = new Model_DB();
|
67 |
}
|
68 |
$this->_settingsStorage = $settingsStorage;
|
69 |
+
$this->_migrate_admin_2fa_requirements_to_roles();
|
70 |
}
|
71 |
|
72 |
public function set_defaults() {
|
77 |
self::OPTION_IP_TRUSTED_PROXIES => array('value' => '', 'autoload' => Model_Settings::AUTOLOAD_YES, 'allowOverwrite' => false),
|
78 |
self::OPTION_REQUIRE_2FA_ADMIN => array('value' => false, 'autoload' => Model_Settings::AUTOLOAD_YES, 'allowOverwrite' => false),
|
79 |
self::OPTION_REQUIRE_2FA_GRACE_PERIOD_ENABLED => array('value' => false, 'autoload' => Model_Settings::AUTOLOAD_YES, 'allowOverwrite' => false),
|
80 |
+
self::OPTION_REQUIRE_2FA_USER_GRACE_PERIOD => array('value' => self::DEFAULT_REQUIRE_2FA_USER_GRACE_PERIOD, 'autoload' => Model_Settings::AUTOLOAD_YES, 'allowOverwrite' => false),
|
81 |
self::OPTION_GLOBAL_NOTICES => array('value' => '[]', 'autoload' => Model_Settings::AUTOLOAD_YES, 'allowOverwrite' => false),
|
82 |
self::OPTION_REMEMBER_DEVICE_ENABLED => array('value' => false, 'autoload' => Model_Settings::AUTOLOAD_YES, 'allowOverwrite' => false),
|
83 |
self::OPTION_REMEMBER_DEVICE_DURATION => array('value' => (30 * 86400), 'autoload' => Model_Settings::AUTOLOAD_YES, 'allowOverwrite' => false),
|
87 |
self::OPTION_RECAPTCHA_THRESHOLD => array('value' => 0.5, 'autoload' => Model_Settings::AUTOLOAD_YES, 'allowOverwrite' => false),
|
88 |
self::OPTION_LAST_SECRET_REFRESH => array('value' => 0, 'autoload' => Model_Settings::AUTOLOAD_YES, 'allowOverwrite' => false),
|
89 |
self::OPTION_DELETE_ON_DEACTIVATION => array('value' => false, 'autoload' => Model_Settings::AUTOLOAD_YES, 'allowOverwrite' => false),
|
90 |
+
self::OPTION_ENABLE_WOOCOMMERCE_INTEGRATION => array('value' => false, 'autoload' => Model_Settings::AUTOLOAD_YES, 'allowOverwrite' => false)
|
91 |
));
|
92 |
}
|
93 |
|
208 |
return true;
|
209 |
}
|
210 |
return sprintf(__('An error was encountered while validating the reCAPTCHA site key: %s', 'wordfence-2fa'), $response->get_error_message());
|
211 |
+
case self::OPTION_REQUIRE_2FA_USER_GRACE_PERIOD:
|
212 |
+
return is_numeric($value) && $value >= 0 && $value <= self::MAX_REQUIRE_2FA_USER_GRACE_PERIOD;
|
213 |
}
|
214 |
return true;
|
215 |
}
|
254 |
//Int
|
255 |
case self::OPTION_REMEMBER_DEVICE_DURATION:
|
256 |
case self::OPTION_LAST_SECRET_REFRESH:
|
257 |
+
case self::OPTION_REQUIRE_2FA_USER_GRACE_PERIOD:
|
258 |
return (int) $value;
|
259 |
|
260 |
//Float
|
287 |
}
|
288 |
return $cleaned;
|
289 |
}
|
290 |
+
|
291 |
+
private function get_required_2fa_role_key($role) {
|
292 |
+
return implode('.', array(self::OPTION_PREFIX_REQUIRED_2FA_ROLE, $role));
|
293 |
+
}
|
294 |
+
|
295 |
+
public function get_required_2fa_role_activation_time($role) {
|
296 |
+
$time = $this->get_int($this->get_required_2fa_role_key($role), -1);
|
297 |
+
if ($time < 0)
|
298 |
+
return false;
|
299 |
+
return $time;
|
300 |
+
}
|
301 |
+
|
302 |
+
public function get_user_2fa_grace_period() {
|
303 |
+
return $this->get_int(self::OPTION_REQUIRE_2FA_USER_GRACE_PERIOD, self::DEFAULT_REQUIRE_2FA_USER_GRACE_PERIOD);
|
304 |
+
}
|
305 |
+
|
306 |
/**
|
307 |
* Preprocesses the value, returning true if it was saved here (e.g., saved 2fa enabled by assigning a role
|
308 |
* capability) or false if it is to be saved by the backing storage.
|
309 |
*
|
310 |
* @param string $key
|
311 |
* @param mixed $value
|
312 |
+
* @param array &$settings the array of settings to process, this function may append additional values from preprocessing
|
313 |
* @return bool
|
314 |
*/
|
315 |
+
public function preprocess($key, $value, &$settings) {
|
316 |
if (preg_match('/^enabled-roles\.(.+)$/', $key, $matches)) { //Enabled roles are stored as capabilities rather than in the settings storage
|
317 |
$role = $matches[1];
|
318 |
+
if ($role === 'super-admin') {
|
319 |
+
$roleValid = true;
|
320 |
+
}
|
321 |
+
elseif (in_array($value, array(self::STATE_2FA_OPTIONAL, self::STATE_2FA_REQUIRED))) {
|
322 |
+
$roleValid = Controller_Permissions::shared()->allow_2fa_self($role);
|
323 |
}
|
324 |
else {
|
325 |
+
$roleValid = Controller_Permissions::shared()->disallow_2fa_self($role);
|
326 |
}
|
327 |
+
if ($roleValid)
|
328 |
+
$settings[$this->get_required_2fa_role_key($role)] = ($value === self::STATE_2FA_REQUIRED ? time() : -1);
|
329 |
return true;
|
330 |
}
|
331 |
return false;
|
334 |
public function preprocess_multiple($changes) {
|
335 |
$remaining = array();
|
336 |
foreach ($changes as $key => $value) {
|
337 |
+
if (!$this->preprocess($key, $value, $remaining)) {
|
338 |
$remaining[$key] = $value;
|
339 |
}
|
340 |
}
|
362 |
public function trusted_proxies() {
|
363 |
return array_filter(array_map(function($s) { return trim($s); }, preg_split('/[\r\n]/', $this->get(self::OPTION_IP_TRUSTED_PROXIES, ''))));
|
364 |
}
|
365 |
+
|
366 |
+
public function get_ntp_failure_count() {
|
367 |
+
return $this->get_int(self::OPTION_NTP_FAILURE_COUNT, 0);
|
368 |
+
}
|
369 |
+
|
370 |
+
public function reset_ntp_failure_count() {
|
371 |
+
$this->set(self::OPTION_NTP_FAILURE_COUNT, 0);
|
372 |
+
}
|
373 |
+
|
374 |
+
public function increment_ntp_failure_count() {
|
375 |
+
$count = $this->get_ntp_failure_count();
|
376 |
+
if ($count < 0)
|
377 |
+
return false;
|
378 |
+
$count++;
|
379 |
+
$this->set(self::OPTION_NTP_FAILURE_COUNT, $count);
|
380 |
+
return $count;
|
381 |
+
}
|
382 |
+
|
383 |
+
public function is_ntp_disabled_via_constant() {
|
384 |
+
return defined('WORDFENCE_LS_DISABLE_NTP') && WORDFENCE_LS_DISABLE_NTP;
|
385 |
+
}
|
386 |
+
|
387 |
+
public function is_ntp_enabled($requireOffset = true) {
|
388 |
+
if ($this->is_ntp_cron_disabled())
|
389 |
+
return false;
|
390 |
+
if ($this->get_bool(self::OPTION_USE_NTP, true)) {
|
391 |
+
if ($requireOffset) {
|
392 |
+
$offset = $this->get(self::OPTION_NTP_OFFSET, null);
|
393 |
+
return $offset !== null && abs((int)$offset) <= Controller_TOTP::TIME_WINDOW_LENGTH;
|
394 |
+
}
|
395 |
+
else {
|
396 |
+
return true;
|
397 |
+
}
|
398 |
+
}
|
399 |
+
return false;
|
400 |
+
}
|
401 |
+
|
402 |
+
public function is_ntp_cron_disabled(&$failureCount = null) {
|
403 |
+
if ($this->is_ntp_disabled_via_constant())
|
404 |
+
return true;
|
405 |
+
$failureCount = $this->get_ntp_failure_count();
|
406 |
+
if ($failureCount >= Controller_Time::FAILURE_LIMIT) {
|
407 |
+
return true;
|
408 |
+
}
|
409 |
+
else if ($failureCount < 0) {
|
410 |
+
$failureCount = 0;
|
411 |
+
return true;
|
412 |
+
}
|
413 |
+
return false;
|
414 |
+
}
|
415 |
+
|
416 |
+
public function disable_ntp_cron() {
|
417 |
+
$this->set(self::OPTION_NTP_FAILURE_COUNT, -1);
|
418 |
+
}
|
419 |
|
420 |
/**
|
421 |
* Utility
|
500 |
|
501 |
return $range;
|
502 |
}
|
503 |
+
|
504 |
+
private function _migrate_admin_2fa_requirements_to_roles() {
|
505 |
+
if (!$this->get_bool(self::OPTION_REQUIRE_2FA_ADMIN))
|
506 |
+
return;
|
507 |
+
$time = time();
|
508 |
+
if (is_multisite()) {
|
509 |
+
$this->set($this->get_required_2fa_role_key('super-admin'), $time, true);
|
510 |
+
}
|
511 |
+
else {
|
512 |
+
$roles = new \WP_Roles();
|
513 |
+
foreach ($roles->roles as $key => $data) {
|
514 |
+
$role = $roles->get_role($key);
|
515 |
+
if (Controller_Permissions::shared()->can_role_manage_settings($role) && Controller_Permissions::shared()->allow_2fa_self($role->name)) {
|
516 |
+
$this->set($this->get_required_2fa_role_key($role->name), $time, true);
|
517 |
+
}
|
518 |
+
}
|
519 |
+
}
|
520 |
+
$this->remove(self::OPTION_REQUIRE_2FA_ADMIN);
|
521 |
+
$this->remove(self::OPTION_REQUIRE_2FA_GRACE_PERIOD);
|
522 |
+
$this->remove(self::OPTION_REQUIRE_2FA_GRACE_PERIOD_ENABLED);
|
523 |
+
}
|
524 |
+
|
525 |
+
public function reset_ntp_disabled_flag() {
|
526 |
+
$this->remove(self::OPTION_USE_NTP);
|
527 |
+
$this->remove(self::OPTION_NTP_OFFSET);
|
528 |
+
$this->remove(self::OPTION_NTP_FAILURE_COUNT);
|
529 |
+
}
|
530 |
}
|
classes/controller/support.php
CHANGED
@@ -18,6 +18,7 @@ class Controller_Support {
|
|
18 |
const ITEM_MODULE_LOGIN_SECURITY_2FA = 'module-login-security-2fa';
|
19 |
const ITEM_MODULE_LOGIN_SECURITY_2FA_APPS = 'module-login-security-2fa-apps';
|
20 |
const ITEM_MODULE_LOGIN_SECURITY_CAPTCHA = 'module-login-security-captcha';
|
|
|
21 |
|
22 |
public static function esc_supportURL($item = self::ITEM_INDEX) {
|
23 |
return esc_url(self::supportURL($item));
|
@@ -41,6 +42,7 @@ class Controller_Support {
|
|
41 |
case self::ITEM_MODULE_LOGIN_SECURITY:
|
42 |
case self::ITEM_MODULE_LOGIN_SECURITY_2FA:
|
43 |
case self::ITEM_MODULE_LOGIN_SECURITY_CAPTCHA:
|
|
|
44 |
return $base . '?query=' . $item;
|
45 |
}
|
46 |
|
18 |
const ITEM_MODULE_LOGIN_SECURITY_2FA = 'module-login-security-2fa';
|
19 |
const ITEM_MODULE_LOGIN_SECURITY_2FA_APPS = 'module-login-security-2fa-apps';
|
20 |
const ITEM_MODULE_LOGIN_SECURITY_CAPTCHA = 'module-login-security-captcha';
|
21 |
+
const ITEM_MODULE_LOGIN_SECURITY_ROLES = 'module-login-security-roles';
|
22 |
|
23 |
public static function esc_supportURL($item = self::ITEM_INDEX) {
|
24 |
return esc_url(self::supportURL($item));
|
42 |
case self::ITEM_MODULE_LOGIN_SECURITY:
|
43 |
case self::ITEM_MODULE_LOGIN_SECURITY_2FA:
|
44 |
case self::ITEM_MODULE_LOGIN_SECURITY_CAPTCHA:
|
45 |
+
case self::ITEM_MODULE_LOGIN_SECURITY_ROLES:
|
46 |
return $base . '?query=' . $item;
|
47 |
}
|
48 |
|
classes/controller/time.php
CHANGED
@@ -5,6 +5,7 @@ namespace WordfenceLS;
|
|
5 |
class Controller_Time {
|
6 |
const NTP_VERSION = 3; // https://www.ietf.org/rfc/rfc1305.txt
|
7 |
const NTP_EPOCH_CONVERT = 2208988800; //RFC 5905, page 13
|
|
|
8 |
|
9 |
/**
|
10 |
* Returns the singleton Controller_Time.
|
@@ -24,10 +25,12 @@ class Controller_Time {
|
|
24 |
if (is_main_site()) {
|
25 |
wp_schedule_event(time() + 10, 'hourly', 'wordfence_ls_ntp_cron');
|
26 |
}
|
|
|
27 |
}
|
28 |
|
29 |
public function uninstall() {
|
30 |
wp_clear_scheduled_hook('wordfence_ls_ntp_cron');
|
|
|
31 |
}
|
32 |
|
33 |
public function init() {
|
@@ -39,18 +42,24 @@ class Controller_Time {
|
|
39 |
}
|
40 |
|
41 |
public function _wordfence_ls_ntp_cron() {
|
|
|
|
|
42 |
$ntp = self::ntp_time();
|
43 |
$time = time();
|
44 |
|
45 |
if ($ntp === false) {
|
46 |
-
Controller_Settings::shared()->
|
47 |
-
|
|
|
|
|
|
|
48 |
}
|
49 |
else {
|
50 |
-
|
51 |
-
Controller_Settings::shared()->set(Controller_Settings::OPTION_USE_NTP,
|
52 |
Controller_Settings::shared()->set(Controller_Settings::OPTION_NTP_OFFSET, $ntp - $time);
|
53 |
}
|
|
|
54 |
}
|
55 |
|
56 |
/**
|
@@ -66,7 +75,7 @@ class Controller_Time {
|
|
66 |
}
|
67 |
|
68 |
$offset = 0;
|
69 |
-
if (Controller_Settings::shared()->
|
70 |
$offset = Controller_Settings::shared()->get_int(Controller_Settings::OPTION_NTP_OFFSET);
|
71 |
}
|
72 |
else if (WORDFENCE_LS_FROM_CORE) {
|
5 |
class Controller_Time {
|
6 |
const NTP_VERSION = 3; // https://www.ietf.org/rfc/rfc1305.txt
|
7 |
const NTP_EPOCH_CONVERT = 2208988800; //RFC 5905, page 13
|
8 |
+
const FAILURE_LIMIT = 3;
|
9 |
|
10 |
/**
|
11 |
* Returns the singleton Controller_Time.
|
25 |
if (is_main_site()) {
|
26 |
wp_schedule_event(time() + 10, 'hourly', 'wordfence_ls_ntp_cron');
|
27 |
}
|
28 |
+
Controller_Settings::shared()->reset_ntp_disabled_flag();
|
29 |
}
|
30 |
|
31 |
public function uninstall() {
|
32 |
wp_clear_scheduled_hook('wordfence_ls_ntp_cron');
|
33 |
+
Controller_Settings::shared()->reset_ntp_disabled_flag();
|
34 |
}
|
35 |
|
36 |
public function init() {
|
42 |
}
|
43 |
|
44 |
public function _wordfence_ls_ntp_cron() {
|
45 |
+
if (Controller_Settings::shared()->get_bool(Controller_Settings::OPTION_ALLOW_DISABLING_NTP) && Controller_Settings::shared()->is_ntp_cron_disabled())
|
46 |
+
return;
|
47 |
$ntp = self::ntp_time();
|
48 |
$time = time();
|
49 |
|
50 |
if ($ntp === false) {
|
51 |
+
$failureCount = Controller_Settings::shared()->increment_ntp_failure_count();
|
52 |
+
if ($failureCount >= self::FAILURE_LIMIT) {
|
53 |
+
Controller_Settings::shared()->set(Controller_Settings::OPTION_USE_NTP, false);
|
54 |
+
Controller_Settings::shared()->set(Controller_Settings::OPTION_NTP_OFFSET, 0);
|
55 |
+
}
|
56 |
}
|
57 |
else {
|
58 |
+
Controller_Settings::shared()->reset_ntp_failure_count();
|
59 |
+
Controller_Settings::shared()->set(Controller_Settings::OPTION_USE_NTP, true);
|
60 |
Controller_Settings::shared()->set(Controller_Settings::OPTION_NTP_OFFSET, $ntp - $time);
|
61 |
}
|
62 |
+
Controller_Settings::shared()->set(Controller_Settings::OPTION_ALLOW_DISABLING_NTP, true);
|
63 |
}
|
64 |
|
65 |
/**
|
75 |
}
|
76 |
|
77 |
$offset = 0;
|
78 |
+
if (Controller_Settings::shared()->is_ntp_enabled()) {
|
79 |
$offset = Controller_Settings::shared()->get_int(Controller_Settings::OPTION_NTP_OFFSET);
|
80 |
}
|
81 |
else if (WORDFENCE_LS_FROM_CORE) {
|
classes/controller/users.php
CHANGED
@@ -8,6 +8,10 @@ use WordfenceLS\Crypto\Model_Symmetric;
|
|
8 |
class Controller_Users {
|
9 |
const RECOVERY_CODE_COUNT = 5;
|
10 |
const RECOVERY_CODE_SIZE = 8;
|
|
|
|
|
|
|
|
|
11 |
|
12 |
/**
|
13 |
* Returns the singleton Controller_Users.
|
@@ -65,9 +69,23 @@ class Controller_Users {
|
|
65 |
return $users;
|
66 |
}
|
67 |
|
68 |
-
$query = new \WP_User_Query(array('role' =>
|
69 |
return $query->get_results();
|
70 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
71 |
|
72 |
/**
|
73 |
* Returns whether or not the user has a valid remembered device.
|
@@ -232,42 +250,44 @@ class Controller_Users {
|
|
232 |
$table = Controller_DB::shared()->secrets;
|
233 |
$wpdb->query($wpdb->prepare("DELETE FROM `{$table}` WHERE `user_id` = %d", $user->ID));
|
234 |
}
|
235 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
236 |
/**
|
237 |
* Returns whether or not 2FA is required for the user regardless of activation status. 2FA is considered required
|
238 |
* when the option to require it is enabled and there is at least one administrator with it active.
|
239 |
*
|
240 |
* @param \WP_User $user
|
|
|
|
|
241 |
* @return bool
|
242 |
*/
|
243 |
-
public function requires_2fa($user) {
|
244 |
-
static $
|
245 |
-
if ($
|
246 |
-
|
|
|
247 |
}
|
248 |
-
|
249 |
-
|
250 |
-
|
251 |
-
|
252 |
-
|
253 |
-
|
254 |
-
}
|
255 |
-
|
256 |
-
if ($this->has_2fa_active($user)) {
|
257 |
-
$_cachedRequired = true;
|
258 |
-
return true;
|
259 |
-
}
|
260 |
-
|
261 |
-
$activeIDs = $this->_user_ids_with_2fa_active();
|
262 |
-
foreach ($activeIDs as $id) {
|
263 |
-
if (Controller_Permissions::shared()->can_manage_settings(new \WP_User($id))) {
|
264 |
-
$_cachedRequired = true;
|
265 |
-
return true;
|
266 |
-
}
|
267 |
-
}
|
268 |
}
|
269 |
-
$_cachedRequired = false;
|
270 |
-
return false;
|
271 |
}
|
272 |
|
273 |
/**
|
@@ -402,13 +422,28 @@ class Controller_Users {
|
|
402 |
}
|
403 |
|
404 |
$role_counts['none'] = (int) $row[$col++];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
405 |
|
406 |
// Get the meta_value index from the end of the result set.
|
407 |
$total_users = (int) $row[$col];
|
408 |
|
409 |
$counts['active_total_users'] = $total_users;
|
410 |
$counts['active_avail_roles'] =& $role_counts;
|
411 |
-
|
412 |
return $counts;
|
413 |
}
|
414 |
|
@@ -456,13 +491,13 @@ class Controller_Users {
|
|
456 |
|
457 |
public function _manage_users_columns($columns = array()) {
|
458 |
if (user_can(wp_get_current_user(), Controller_Permissions::CAP_ACTIVATE_2FA_OTHERS)) {
|
459 |
-
$columns['wfls_2fa_status'] =
|
460 |
}
|
461 |
|
462 |
if (Controller_Permissions::shared()->can_manage_settings(wp_get_current_user())) {
|
463 |
-
$columns['wfls_last_login'] =
|
464 |
if (Controller_CAPTCHA::shared()->enabled()) {
|
465 |
-
$columns['wfls_last_captcha'] =
|
466 |
}
|
467 |
}
|
468 |
return $columns;
|
@@ -474,7 +509,20 @@ class Controller_Users {
|
|
474 |
$user = new \WP_User($user_id);
|
475 |
$value = __('Not Allowed', 'wordfence-2fa');
|
476 |
if (Controller_Users::shared()->can_activate_2fa($user)) {
|
477 |
-
$
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
478 |
}
|
479 |
break;
|
480 |
case 'wfls_last_login':
|
@@ -580,7 +628,7 @@ class Controller_Users {
|
|
580 |
//Format is 'view' => '<a href="https://wfpremium.dev1.ryanbritton.com/author/ryan/" aria-label="View posts by ryan">View</a>'
|
581 |
if (user_can(wp_get_current_user(), Controller_Permissions::CAP_ACTIVATE_2FA_OTHERS) && (Controller_Users::shared()->can_activate_2fa($user) || Controller_Users::shared()->has_2fa_active($user))) {
|
582 |
$url = (is_multisite() ? network_admin_url('admin.php?page=WFLS&user=' . $user->ID) : admin_url('admin.php?page=WFLS&user=' . $user->ID));
|
583 |
-
$actions['wf2fa'] = '<a href="' . esc_url($url) . '" aria-label="' . esc_attr(sprintf(__('Edit two-factor authentication for %s', 'wordfence-2fa'), $user->user_login)) . '">' .
|
584 |
}
|
585 |
return $actions;
|
586 |
}
|
@@ -591,9 +639,240 @@ class Controller_Users {
|
|
591 |
if (user_can(wp_get_current_user(), Controller_Permissions::CAP_ACTIVATE_2FA_OTHERS) && version_compare($wp_version, '4.4.0', '>=')) {
|
592 |
$counts = $this->user_counts();
|
593 |
$views['all'] = str_replace(' class="current" aria-current="page"', '', $views['all']);
|
594 |
-
$views['wfls-active'] = '<a href="' . esc_url(add_query_arg('wf2fa', 'active', 'users.php')) . '"' . (isset($_GET['wf2fa']) && $_GET['wf2fa'] == 'active' ? ' class="current" aria-current="page"' : '') . '>' .
|
595 |
-
$views['wfls-inactive'] = '<a href="' . esc_url(add_query_arg('wf2fa', 'inactive', 'users.php')) . '"' . (isset($_GET['wf2fa']) && $_GET['wf2fa'] == 'inactive' ? ' class="current" aria-current="page"' : '') . '>' .
|
596 |
}
|
597 |
return $views;
|
598 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
599 |
}
|
8 |
class Controller_Users {
|
9 |
const RECOVERY_CODE_COUNT = 5;
|
10 |
const RECOVERY_CODE_SIZE = 8;
|
11 |
+
const SECONDS_PER_DAY = 86400;
|
12 |
+
const META_KEY_GRACE_PERIOD_RESET = 'wfls-grace-period-reset';
|
13 |
+
const META_KEY_GRACE_PERIOD_OVERRIDE = 'wfls-grace-period-override';
|
14 |
+
const META_KEY_ALLOW_GRACE_PERIOD = 'wfls-allow-grace-period';
|
15 |
|
16 |
/**
|
17 |
* Returns the singleton Controller_Users.
|
69 |
return $users;
|
70 |
}
|
71 |
|
72 |
+
$query = new \WP_User_Query(http_build_query(array('role' => 'administrator', 'number' => -1)));
|
73 |
return $query->get_results();
|
74 |
}
|
75 |
+
|
76 |
+
public function get_users_by_role($role, $limit = -1) {
|
77 |
+
if ($role === 'super-admin') {
|
78 |
+
$superAdmins = array();
|
79 |
+
foreach(get_super_admins() as $username) {
|
80 |
+
$superAdmins[] = new \WP_User($username);
|
81 |
+
}
|
82 |
+
return $superAdmins;
|
83 |
+
}
|
84 |
+
else {
|
85 |
+
$query = new \WP_User_Query(http_build_query(array('role' => $role, 'number' => is_int($limit) ? $limit : -1)));
|
86 |
+
return $query->get_results();
|
87 |
+
}
|
88 |
+
}
|
89 |
|
90 |
/**
|
91 |
* Returns whether or not the user has a valid remembered device.
|
250 |
$table = Controller_DB::shared()->secrets;
|
251 |
$wpdb->query($wpdb->prepare("DELETE FROM `{$table}` WHERE `user_id` = %d", $user->ID));
|
252 |
}
|
253 |
+
|
254 |
+
private function has_admin_with_2fa_active() {
|
255 |
+
static $cache = null;
|
256 |
+
if ($cache === null) {
|
257 |
+
$activeIDs = $this->_user_ids_with_2fa_active();
|
258 |
+
foreach ($activeIDs as $id) {
|
259 |
+
if (Controller_Permissions::shared()->can_manage_settings(new \WP_User($id))) {
|
260 |
+
$cache = true;
|
261 |
+
return $cache;
|
262 |
+
}
|
263 |
+
}
|
264 |
+
$cache = false;
|
265 |
+
}
|
266 |
+
return $cache;
|
267 |
+
}
|
268 |
+
|
269 |
/**
|
270 |
* Returns whether or not 2FA is required for the user regardless of activation status. 2FA is considered required
|
271 |
* when the option to require it is enabled and there is at least one administrator with it active.
|
272 |
*
|
273 |
* @param \WP_User $user
|
274 |
+
* @param bool &$gracePeriod
|
275 |
+
* @param int &$requiredAt
|
276 |
* @return bool
|
277 |
*/
|
278 |
+
public function requires_2fa($user, &$gracePeriod = false, &$requiredAt = null) {
|
279 |
+
static $cache = array();
|
280 |
+
if (array_key_exists($user->ID, $cache)) {
|
281 |
+
list($required, $gracePeriod, $requiredAt) = $cache[$user->ID];
|
282 |
+
return $required;
|
283 |
}
|
284 |
+
else {
|
285 |
+
$gracePeriod = false;
|
286 |
+
$requiredAt = null;
|
287 |
+
$required = $this->does_user_role_require_2fa($user, $gracePeriod, $requiredAt);
|
288 |
+
$cache[$user->ID] = array($required, $gracePeriod, $requiredAt);
|
289 |
+
return $required;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
290 |
}
|
|
|
|
|
291 |
}
|
292 |
|
293 |
/**
|
422 |
}
|
423 |
|
424 |
$role_counts['none'] = (int) $row[$col++];
|
425 |
+
|
426 |
+
// Separately add super admins for multisite
|
427 |
+
if (is_multisite()) {
|
428 |
+
$superAdmins = 0;
|
429 |
+
$activeSuperAdmins = 0;
|
430 |
+
foreach(get_super_admins() as $username) {
|
431 |
+
$superAdmins++;
|
432 |
+
$user = new \WP_User($username);
|
433 |
+
if ($this->has_2fa_active($user)) {
|
434 |
+
$activeSuperAdmins++;
|
435 |
+
}
|
436 |
+
}
|
437 |
+
$counts['avail_roles']['super-admin'] = $superAdmins;
|
438 |
+
$role_counts['super-admin'] = $activeSuperAdmins;
|
439 |
+
}
|
440 |
|
441 |
// Get the meta_value index from the end of the result set.
|
442 |
$total_users = (int) $row[$col];
|
443 |
|
444 |
$counts['active_total_users'] = $total_users;
|
445 |
$counts['active_avail_roles'] =& $role_counts;
|
446 |
+
|
447 |
return $counts;
|
448 |
}
|
449 |
|
491 |
|
492 |
public function _manage_users_columns($columns = array()) {
|
493 |
if (user_can(wp_get_current_user(), Controller_Permissions::CAP_ACTIVATE_2FA_OTHERS)) {
|
494 |
+
$columns['wfls_2fa_status'] = esc_html__('2FA Status', 'wordfence-2fa');
|
495 |
}
|
496 |
|
497 |
if (Controller_Permissions::shared()->can_manage_settings(wp_get_current_user())) {
|
498 |
+
$columns['wfls_last_login'] = esc_html__('Last Login', 'wordfence-2fa');
|
499 |
if (Controller_CAPTCHA::shared()->enabled()) {
|
500 |
+
$columns['wfls_last_captcha'] = esc_html__('Last CAPTCHA', 'wordfence-2fa');
|
501 |
}
|
502 |
}
|
503 |
return $columns;
|
509 |
$user = new \WP_User($user_id);
|
510 |
$value = __('Not Allowed', 'wordfence-2fa');
|
511 |
if (Controller_Users::shared()->can_activate_2fa($user)) {
|
512 |
+
$has2fa = Controller_Users::shared()->has_2fa_active($user);
|
513 |
+
$requires2fa = $this->requires_2fa($user, $inGracePeriod);
|
514 |
+
if ($has2fa) {
|
515 |
+
$value = esc_html__('Active', 'wordfence-2fa');
|
516 |
+
}
|
517 |
+
elseif ($inGracePeriod) {
|
518 |
+
$value = wp_kses(__('Inactive<small class="wfls-sub-status">(Grace Period)</small>', 'wordfence-2fa'), array('small'=>array('class'=>array())));
|
519 |
+
}
|
520 |
+
elseif (($requires2fa && !$has2fa)) {
|
521 |
+
$value = wp_kses($inGracePeriod === null ? __('Locked Out<small class="wfls-sub-status">(Grace Period Disabled)</small>') : __('Locked Out<small class="wfls-sub-status">(Grace Period Exceeded)</small>', 'wordfence-2fa'), array('small'=>array('class'=>array())));
|
522 |
+
}
|
523 |
+
else {
|
524 |
+
$value = esc_html__('Inactive', 'wordfence-2fa');
|
525 |
+
}
|
526 |
}
|
527 |
break;
|
528 |
case 'wfls_last_login':
|
628 |
//Format is 'view' => '<a href="https://wfpremium.dev1.ryanbritton.com/author/ryan/" aria-label="View posts by ryan">View</a>'
|
629 |
if (user_can(wp_get_current_user(), Controller_Permissions::CAP_ACTIVATE_2FA_OTHERS) && (Controller_Users::shared()->can_activate_2fa($user) || Controller_Users::shared()->has_2fa_active($user))) {
|
630 |
$url = (is_multisite() ? network_admin_url('admin.php?page=WFLS&user=' . $user->ID) : admin_url('admin.php?page=WFLS&user=' . $user->ID));
|
631 |
+
$actions['wf2fa'] = '<a href="' . esc_url($url) . '" aria-label="' . esc_attr(sprintf(__('Edit two-factor authentication for %s', 'wordfence-2fa'), $user->user_login)) . '">' . esc_html__('2FA', 'wordfence-2fa') . '</a>';
|
632 |
}
|
633 |
return $actions;
|
634 |
}
|
639 |
if (user_can(wp_get_current_user(), Controller_Permissions::CAP_ACTIVATE_2FA_OTHERS) && version_compare($wp_version, '4.4.0', '>=')) {
|
640 |
$counts = $this->user_counts();
|
641 |
$views['all'] = str_replace(' class="current" aria-current="page"', '', $views['all']);
|
642 |
+
$views['wfls-active'] = '<a href="' . esc_url(add_query_arg('wf2fa', 'active', 'users.php')) . '"' . (isset($_GET['wf2fa']) && $_GET['wf2fa'] == 'active' ? ' class="current" aria-current="page"' : '') . '>' . esc_html__('2FA Active', 'wordfence-2fa') . ' <span class="count">(' . number_format($counts['active_users']) . ')</span></a>';
|
643 |
+
$views['wfls-inactive'] = '<a href="' . esc_url(add_query_arg('wf2fa', 'inactive', 'users.php')) . '"' . (isset($_GET['wf2fa']) && $_GET['wf2fa'] == 'inactive' ? ' class="current" aria-current="page"' : '') . '>' . esc_html__('2FA Inactive', 'wordfence-2fa') . ' <span class="count">(' . number_format($counts['inactive_users']) . ')</span></a>';
|
644 |
}
|
645 |
return $views;
|
646 |
}
|
647 |
+
|
648 |
+
private function get_grace_period_reset_time($user) {
|
649 |
+
$time = get_user_option(self::META_KEY_GRACE_PERIOD_RESET, $user->ID);
|
650 |
+
if (empty($time))
|
651 |
+
return null;
|
652 |
+
return (int) $time;
|
653 |
+
}
|
654 |
+
|
655 |
+
public function get_grace_period_override($user) {
|
656 |
+
$override = get_user_option(self::META_KEY_GRACE_PERIOD_OVERRIDE, $user->ID);
|
657 |
+
if ($override === false)
|
658 |
+
return null;
|
659 |
+
return (int) $override;
|
660 |
+
}
|
661 |
+
|
662 |
+
private function does_user_role_require_2fa($user, &$inGracePeriod = null, &$requiredAt = null) {
|
663 |
+
$is2faAdmin = Controller_Permissions::shared()->can_manage_settings($user);
|
664 |
+
$userDate = self::get_grace_period_reset_time($user);
|
665 |
+
if ($userDate === null)
|
666 |
+
$userDate = self::get_registration_date($user);
|
667 |
+
if ($is2faAdmin && !$this->get_grace_period_allowed_flag($user->ID)) {
|
668 |
+
$gracePeriod = 0;
|
669 |
+
$inGracePeriod = null;
|
670 |
+
}
|
671 |
+
else {
|
672 |
+
$gracePeriod = self::get_grace_period_override($user);
|
673 |
+
if ($gracePeriod === null)
|
674 |
+
$gracePeriod = Controller_Settings::shared()->get_user_2fa_grace_period();
|
675 |
+
$gracePeriod *= self::SECONDS_PER_DAY;
|
676 |
+
$inGracePeriod = false;
|
677 |
+
}
|
678 |
+
$now = time();
|
679 |
+
foreach (Controller_Permissions::shared()->get_all_roles($user) as $role) {
|
680 |
+
$roleDate = Controller_Settings::shared()->get_required_2fa_role_activation_time($role);
|
681 |
+
if ($roleDate === false)
|
682 |
+
continue;
|
683 |
+
$effectiveDate = max($userDate, $roleDate) + $gracePeriod;
|
684 |
+
if ($requiredAt === null || $effectiveDate < $requiredAt)
|
685 |
+
$requiredAt = $effectiveDate;
|
686 |
+
if ($effectiveDate <= $now && (!$is2faAdmin || $this->has_admin_with_2fa_active())) {
|
687 |
+
if ($inGracePeriod)
|
688 |
+
$inGracePeriod = false;
|
689 |
+
return true;
|
690 |
+
}
|
691 |
+
else if ($inGracePeriod !== null) {
|
692 |
+
$inGracePeriod = true;
|
693 |
+
}
|
694 |
+
}
|
695 |
+
return false;
|
696 |
+
}
|
697 |
+
|
698 |
+
private static function get_registration_date($user) {
|
699 |
+
return strtotime($user->user_registered);
|
700 |
+
}
|
701 |
+
|
702 |
+
public function reset_2fa_grace_period($user, $override = null) {
|
703 |
+
if (!$this->can_activate_2fa($user) || $this->has_2fa_active($user))
|
704 |
+
return false;
|
705 |
+
update_user_option($user->ID, self::META_KEY_GRACE_PERIOD_RESET, time(), true);
|
706 |
+
if ($override !== null)
|
707 |
+
update_user_option($user->ID, self::META_KEY_GRACE_PERIOD_OVERRIDE, (int) $override, true);
|
708 |
+
return true;
|
709 |
+
}
|
710 |
+
|
711 |
+
public function revoke_grace_period($user) {
|
712 |
+
foreach(array(
|
713 |
+
self::META_KEY_GRACE_PERIOD_RESET,
|
714 |
+
self::META_KEY_GRACE_PERIOD_OVERRIDE,
|
715 |
+
self::META_KEY_ALLOW_GRACE_PERIOD
|
716 |
+
) as $option) {
|
717 |
+
delete_user_option($user->ID, $option, true);
|
718 |
+
}
|
719 |
+
}
|
720 |
+
|
721 |
+
public function allow_grace_period($userId) {
|
722 |
+
update_user_option($userId, self::META_KEY_ALLOW_GRACE_PERIOD, true, true);
|
723 |
+
}
|
724 |
+
|
725 |
+
public function get_grace_period_allowed_flag($userId) {
|
726 |
+
return (bool) get_user_option(self::META_KEY_ALLOW_GRACE_PERIOD, $userId);
|
727 |
+
}
|
728 |
+
|
729 |
+
public function has_revokable_grace_period($user) {
|
730 |
+
return $this->get_grace_period_allowed_flag($user->ID) || $this->get_grace_period_reset_time($user) !== null;
|
731 |
+
}
|
732 |
+
|
733 |
+
private function get_inactive_2fa_super_admins($gracePeriod = false) {
|
734 |
+
$inactive = array();
|
735 |
+
foreach(get_super_admins() as $username) {
|
736 |
+
$user = new \WP_User($username);
|
737 |
+
if (!$this->has_2fa_active($user)) {
|
738 |
+
$this->requires_2fa($user, $inGracePeriod, $requiredAt);
|
739 |
+
if ($gracePeriod === null || $gracePeriod == $inGracePeriod) {
|
740 |
+
$current = new \StdClass();
|
741 |
+
$current->user_id = $user->ID;
|
742 |
+
$current->user_login = $username;
|
743 |
+
$current->required_at = $requiredAt;
|
744 |
+
$inactive[] = $current;
|
745 |
+
}
|
746 |
+
}
|
747 |
+
}
|
748 |
+
return $inactive;
|
749 |
+
}
|
750 |
+
|
751 |
+
private function generate_inactive_2fa_user_query($roleKey, $gracePeriod = null, $page = null, $perPage = null) {
|
752 |
+
global $wpdb;
|
753 |
+
$secondsPerDay = (int) self::SECONDS_PER_DAY;
|
754 |
+
$gracePeriodSeconds = (int) (Controller_Settings::shared()->get_user_2fa_grace_period() * self::SECONDS_PER_DAY);
|
755 |
+
$roleTime = (int) (Controller_Settings::shared()->get_required_2fa_role_activation_time($roleKey));
|
756 |
+
$siteId = get_current_blog_id();
|
757 |
+
$blogPrefix = $wpdb->get_blog_prefix($siteId);
|
758 |
+
$usermeta = $wpdb->usermeta;
|
759 |
+
$users = $wpdb->users;
|
760 |
+
$secrets = Controller_DB::shared()->secrets;
|
761 |
+
$admin = Controller_Permissions::shared()->can_role_manage_settings($roleKey);
|
762 |
+
$parameters = array(
|
763 |
+
self::META_KEY_GRACE_PERIOD_RESET,
|
764 |
+
self::META_KEY_GRACE_PERIOD_OVERRIDE
|
765 |
+
);
|
766 |
+
$gracePeriodClause = "IF(overrides.days IS NULL, $gracePeriodSeconds, overrides.days * $secondsPerDay)";
|
767 |
+
$registeredTimestampClause = "UNIX_TIMESTAMP(CONVERT_TZ($users.user_registered, '+00:00', @@time_zone))";
|
768 |
+
$now = time();
|
769 |
+
if ($admin) {
|
770 |
+
$allowancesJoin = <<<SQL
|
771 |
+
LEFT JOIN (
|
772 |
+
SELECT
|
773 |
+
user_id,
|
774 |
+
meta_value AS allowed
|
775 |
+
FROM
|
776 |
+
$usermeta
|
777 |
+
WHERE
|
778 |
+
meta_key = %s
|
779 |
+
) allowances ON allowances.user_id = $usermeta.user_id
|
780 |
+
SQL;
|
781 |
+
$parameters[] = self::META_KEY_ALLOW_GRACE_PERIOD;
|
782 |
+
$allowedClause = 'IFNULL(allowances.allowed, 0)';
|
783 |
+
$gracePeriodClause = "IF($allowedClause = 0, 0, $gracePeriodClause)";
|
784 |
+
}
|
785 |
+
else {
|
786 |
+
$allowancesJoin = null;
|
787 |
+
$allowedClause = null;
|
788 |
+
}
|
789 |
+
$timeClause = "GREATEST($roleTime, $registeredTimestampClause, IFNULL(resets.time, 0)) + $gracePeriodClause";
|
790 |
+
$query = <<<SQL
|
791 |
+
SELECT
|
792 |
+
$usermeta.user_id,
|
793 |
+
$users.user_login,
|
794 |
+
$timeClause AS required_at
|
795 |
+
FROM
|
796 |
+
$usermeta
|
797 |
+
JOIN $users ON $users.ID = $usermeta.user_id
|
798 |
+
LEFT JOIN (
|
799 |
+
SELECT
|
800 |
+
user_id,
|
801 |
+
meta_value AS time
|
802 |
+
FROM
|
803 |
+
$usermeta
|
804 |
+
WHERE
|
805 |
+
meta_key = %s
|
806 |
+
) resets ON resets.user_id = $usermeta.user_id
|
807 |
+
LEFT JOIN (
|
808 |
+
SELECT
|
809 |
+
user_id,
|
810 |
+
meta_value AS days
|
811 |
+
FROM
|
812 |
+
$usermeta
|
813 |
+
WHERE
|
814 |
+
meta_key = %s
|
815 |
+
) overrides ON overrides.user_id = $usermeta.user_id
|
816 |
+
$allowancesJoin
|
817 |
+
WHERE
|
818 |
+
meta_key = '{$blogPrefix}capabilities'
|
819 |
+
AND meta_value LIKE %s
|
820 |
+
AND NOT $usermeta.user_id IN(SELECT user_id FROM {$secrets})
|
821 |
+
SQL;
|
822 |
+
$conditions = array();
|
823 |
+
$operator = 'AND';
|
824 |
+
if ($gracePeriod !== null) {
|
825 |
+
if ($gracePeriod) {
|
826 |
+
$conditions[] = "$timeClause > $now";
|
827 |
+
}
|
828 |
+
else {
|
829 |
+
$conditions[] = "$timeClause <= $now";
|
830 |
+
$operator = 'OR';
|
831 |
+
}
|
832 |
+
}
|
833 |
+
if ($admin) {
|
834 |
+
$conditions[] = $allowedClause . ' = ' . ($gracePeriod ? 1 : 0);
|
835 |
+
}
|
836 |
+
if (!empty($conditions))
|
837 |
+
$query .= ' AND (' . implode(" $operator ", $conditions). ')';
|
838 |
+
if ($page !== null && $perPage !== null) {
|
839 |
+
$offset = (int) (($page - 1) * $perPage);
|
840 |
+
$limit = (int) ($perPage + 1);
|
841 |
+
if ($offset >= 0 && $perPage > 0)
|
842 |
+
$query .= " LIMIT $offset, $limit";
|
843 |
+
}
|
844 |
+
$serializedRoleKey = serialize($roleKey);
|
845 |
+
$roleMatch = '%' . (method_exists($wpdb, 'esc_like') ? $wpdb->esc_like($serializedRoleKey) : addcslashes($serializedRoleKey, '_%\\')). '%';
|
846 |
+
$parameters[] = $roleMatch;
|
847 |
+
return $wpdb->prepare(
|
848 |
+
$query.';',
|
849 |
+
$parameters
|
850 |
+
);
|
851 |
+
}
|
852 |
+
|
853 |
+
public function get_inactive_2fa_users($roleKey, $gracePeriod = null, $page = null, $perPage = null, &$lastPage = null) {
|
854 |
+
global $wpdb;
|
855 |
+
if (is_multisite() && $roleKey === 'super-admin') {
|
856 |
+
$superAdmins = $this->get_inactive_2fa_super_admins($gracePeriod);
|
857 |
+
if ($page !== null && $perPage !== null) {
|
858 |
+
$start = ($page - 1) * $perPage;
|
859 |
+
$end = $start + $perPage;
|
860 |
+
$lastPage = $end >= count($superAdmins);
|
861 |
+
$superAdmins = array_slice($superAdmins, $start, $perPage);
|
862 |
+
}
|
863 |
+
return $superAdmins;
|
864 |
+
}
|
865 |
+
else {
|
866 |
+
$query = $this->generate_inactive_2fa_user_query($roleKey, $gracePeriod, $page, $perPage);
|
867 |
+
$results = $wpdb->get_results($query);
|
868 |
+
if (count($results) > $perPage) {
|
869 |
+
$lastPage = false;
|
870 |
+
array_pop($results);
|
871 |
+
}
|
872 |
+
else {
|
873 |
+
$lastPage = true;
|
874 |
+
}
|
875 |
+
return $results;
|
876 |
+
}
|
877 |
+
}
|
878 |
}
|
classes/controller/wordfencels.php
CHANGED
@@ -10,6 +10,7 @@ use WordfenceLS\View\Model_Title;
|
|
10 |
|
11 |
class Controller_WordfenceLS {
|
12 |
const VERSION_KEY = 'wordfence_ls_version';
|
|
|
13 |
|
14 |
/**
|
15 |
* Returns the singleton Controller_Wordfence2FA.
|
@@ -52,6 +53,13 @@ class Controller_WordfenceLS {
|
|
52 |
add_action('wp_login', array($this, '_record_login'), 999, 1);
|
53 |
add_action('register_post', array($this, '_register_post'), 25, 3);
|
54 |
add_filter('wp_login_errors', array($this, '_wp_login_errors'), 25, 3);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
55 |
|
56 |
$useSubmenu = WORDFENCE_LS_FROM_CORE;
|
57 |
if (is_multisite() && !is_network_admin()) {
|
@@ -116,22 +124,28 @@ class Controller_WordfenceLS {
|
|
116 |
END
|
117 |
);
|
118 |
}
|
119 |
-
|
120 |
-
if (
|
121 |
-
if (is_multisite()) {
|
122 |
-
|
123 |
-
|
124 |
-
|
125 |
-
|
|
|
|
|
126 |
}
|
127 |
-
|
128 |
-
|
129 |
-
|
130 |
-
|
131 |
-
|
|
|
|
|
|
|
132 |
}
|
133 |
-
|
134 |
-
|
|
|
135 |
}
|
136 |
}
|
137 |
}
|
@@ -141,11 +155,25 @@ END
|
|
141 |
*/
|
142 |
|
143 |
public function _jetpack_xml_rpc_notice() {
|
144 |
-
echo '<div class="notice notice-warning"><p>' . sprintf(__('XML-RPC authentication is disabled. Jetpack is currently active and requires XML-RPC authentication to work correctly. <a href="%s">Manage Settings</a>', 'wordfence-2fa'), esc_url(network_admin_url('admin.php?page=WFLS#top#settings'))) . '</p></div>';
|
145 |
}
|
146 |
|
147 |
public function _recaptcha_test_notice() {
|
148 |
-
echo '<div class="notice notice-warning"><p>' . sprintf(__('reCAPTCHA test mode is enabled. While enabled, login and registration requests will be checked for their score but will not be blocked if the score is below the minimum score. <a href="%s">Manage Settings</a>', 'wordfence-2fa'), esc_url(network_admin_url('admin.php?page=WFLS#top#settings'))) . '</p></div>';
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
149 |
}
|
150 |
|
151 |
/**
|
@@ -210,11 +238,30 @@ END
|
|
210 |
do_action('wfls_xml_rpc_blocked', 2);
|
211 |
return false;
|
212 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
213 |
|
214 |
/**
|
215 |
* Login Page
|
216 |
-
*/
|
217 |
-
|
218 |
public function _login_enqueue_scripts() {
|
219 |
$useCAPTCHA = Controller_CAPTCHA::shared()->enabled();
|
220 |
if ($useCAPTCHA) {
|
@@ -242,22 +289,19 @@ END
|
|
242 |
));
|
243 |
}
|
244 |
}
|
245 |
-
|
246 |
/**
|
247 |
* Admin Pages
|
248 |
*/
|
249 |
-
public function _admin_enqueue_scripts() {
|
250 |
if (isset($_GET['page']) && $_GET['page'] == 'WFLS') {
|
251 |
wp_enqueue_script('wordfence-ls-jquery.qrcode', Model_Asset::js('jquery.qrcode.min.js'), array('jquery'), WORDFENCE_LS_VERSION);
|
252 |
wp_enqueue_script('wordfence-ls-jquery.tmpl', Model_Asset::js('jquery.tmpl.min.js'), array('jquery'), WORDFENCE_LS_VERSION);
|
253 |
wp_enqueue_script('wordfence-ls-jquery.colorbox', Model_Asset::js('jquery.colorbox.min.js'), array('jquery'), WORDFENCE_LS_VERSION);
|
254 |
if (Controller_Permissions::shared()->can_manage_settings()) {
|
255 |
-
wp_enqueue_script('wordfence-ls-jquery-ui.timepicker', Model_Asset::js('jquery-ui-timepicker-addon.js'), array('jquery', 'jquery-ui-datepicker', 'jquery-ui-slider'), WORDFENCE_LS_VERSION);
|
256 |
-
|
257 |
wp_enqueue_style('wordfence-ls-jquery-ui-css', Model_Asset::css('jquery-ui.min.css'), array(), WORDFENCE_LS_VERSION);
|
258 |
wp_enqueue_style('wordfence-ls-jquery-ui-css.structure', Model_Asset::css('jquery-ui.structure.min.css'), array(), WORDFENCE_LS_VERSION);
|
259 |
wp_enqueue_style('wordfence-ls-jquery-ui-css.theme', Model_Asset::css('jquery-ui.theme.min.css'), array(), WORDFENCE_LS_VERSION);
|
260 |
-
wp_enqueue_style('wordfence-ls-jquery-ui-css.timepicker', Model_Asset::css('jquery-ui-timepicker-addon.css'), array(), WORDFENCE_LS_VERSION);
|
261 |
}
|
262 |
wp_enqueue_script('wordfence-ls-admin', Model_Asset::js('admin.js'), array('jquery'), WORDFENCE_LS_VERSION);
|
263 |
if (!WORDFENCE_LS_FROM_CORE) {
|
@@ -284,7 +328,7 @@ END
|
|
284 |
wp_enqueue_style('wordfence-ls-admin-global', Model_Asset::css('admin-global.css'), array(), WORDFENCE_LS_VERSION);
|
285 |
}
|
286 |
|
287 |
-
if (Controller_Notices::shared()->has_notice(wp_get_current_user())) {
|
288 |
wp_enqueue_script('wordfence-ls-admin-global', Model_Asset::js('admin-global.js'), array('jquery'), WORDFENCE_LS_VERSION);
|
289 |
|
290 |
wp_localize_script('wordfence-ls-admin-global', 'GWFLSVars', array(
|
@@ -292,6 +336,7 @@ END
|
|
292 |
'nonce' => wp_create_nonce('wp-ajax'),
|
293 |
));
|
294 |
}
|
|
|
295 |
}
|
296 |
|
297 |
public function _edit_user_profile($user) {
|
@@ -310,44 +355,82 @@ END
|
|
310 |
$manageURL = network_admin_url('admin.php?page=WFLS&user=' . ((int) $user->ID));
|
311 |
}
|
312 |
}
|
313 |
-
|
314 |
-
|
315 |
-
|
316 |
-
|
317 |
-
|
318 |
-
|
319 |
-
|
320 |
-
|
321 |
-
|
322 |
-
|
323 |
-
</td>
|
324 |
-
</tr>
|
325 |
-
</table>
|
326 |
-
<?php
|
327 |
-
elseif (current_user_can(Controller_Permissions::CAP_ACTIVATE_2FA_OTHERS)):
|
328 |
-
?>
|
329 |
-
<h2><?php _e('Wordfence Login Security', 'wordfence-2fa'); ?></h2>
|
330 |
<table class="form-table">
|
331 |
<tr id="wordfence-ls">
|
332 |
-
<th><label for="wordfence-ls-btn"><?php
|
333 |
<td>
|
334 |
-
|
335 |
-
|
336 |
-
|
337 |
-
|
338 |
-
|
339 |
-
|
340 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
341 |
</td>
|
342 |
</tr>
|
343 |
</table>
|
344 |
-
|
345 |
endif;
|
346 |
}
|
347 |
|
348 |
/**
|
349 |
* Authentication
|
350 |
*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
351 |
|
352 |
public function _authenticate($user, $username, $password) {
|
353 |
if (defined('XMLRPC_REQUEST') && XMLRPC_REQUEST && !Controller_Settings::shared()->get_bool(Controller_Settings::OPTION_XMLRPC_ENABLED)) { //XML-RPC call and we're not enforcing 2FA on it
|
@@ -370,13 +453,14 @@ END
|
|
370 |
* themselves to opt out of the requirement.
|
371 |
* 4. The user does not have 2FA enabled. 2FA exempts the user from requiring email verification if the score is
|
372 |
* below the threshold.
|
|
|
373 |
*/
|
374 |
-
if (!empty($username)) { //Login attempt, not just a wp-login.php page load
|
375 |
-
|
376 |
-
$requireCAPTCHA =
|
377 |
|
378 |
$performVerification = false;
|
379 |
-
$token = (
|
380 |
if ($requireCAPTCHA && empty($token) && !Controller_CAPTCHA::shared()->test_mode()) { //No CAPTCHA token means forced additional verification (if neither 2FA nor test mode are active)
|
381 |
$performVerification = true;
|
382 |
}
|
@@ -448,17 +532,23 @@ END
|
|
448 |
if ($requireCAPTCHA && $performVerification) {
|
449 |
$encrypted = Model_Symmetric::encrypt((string) $user->ID);
|
450 |
if ($encrypted) {
|
|
|
|
|
|
|
|
|
|
|
|
|
451 |
$jwt = new Model_JWT(array('user' => $encrypted), Controller_Time::time() + 60 * WORDFENCE_LS_EMAIL_VALIDITY_DURATION_MINUTES);
|
452 |
$view = new Model_View('email/login-verification', array(
|
453 |
'siteName' => get_bloginfo('name', 'raw'),
|
454 |
'siteURL' => rtrim(site_url(), '/') . '/',
|
455 |
-
'verificationURL' => add_query_arg(array('wfls-email-verification' => (string) $jwt),
|
456 |
'ip' => Model_Request::current()->ip(),
|
457 |
'canEnable2FA' => Controller_Users::shared()->can_activate_2fa($user),
|
458 |
));
|
459 |
wp_mail($user->user_email, __('Login Verification Required', 'wordfence-ls'), $view->render(), "Content-Type: text/html");
|
460 |
|
461 |
-
return new \WP_Error('wfls_captcha_verify', __('<strong>VERIFICATION REQUIRED</strong>: Additional verification is required for login. Please check the email address associated with the account for a verification link.', 'wordfence-ls'));
|
462 |
}
|
463 |
//else -- Can't generate payload due to host failure, allow it to proceed
|
464 |
}
|
@@ -473,11 +563,11 @@ END
|
|
473 |
if (isset($_POST['wfls-token-jwt']) && is_string($_POST['wfls-token-jwt'])) {
|
474 |
$jwt = Model_JWT::decode_jwt($_POST['wfls-token-jwt']);
|
475 |
if (!$jwt) { //Possibly user-corrupted or expired JWT
|
476 |
-
return new \WP_Error('wfls_twofactor_invalid', __('<strong>VALIDATION FAILED</strong>: The 2FA code could not be validated. Please try logging in again.', 'wordfence-2fa'));
|
477 |
}
|
478 |
|
479 |
if (!isset($jwt->payload['user'])) { //Possibly user-corrupted JWT
|
480 |
-
return new \WP_Error('wfls_twofactor_invalid', __('<strong>VALIDATION FAILED</strong>: The 2FA code could not be validated. Please try logging in again.', 'wordfence-2fa'));
|
481 |
}
|
482 |
|
483 |
$decryptedUser = Model_Symmetric::decrypt($jwt->payload['user']);
|
@@ -500,7 +590,7 @@ END
|
|
500 |
}
|
501 |
|
502 |
//Invalid nonce or expired nonce
|
503 |
-
return new \WP_Error('wfls_twofactor_invalid', __('<strong>VALIDATION FAILED</strong>: The 2FA code could not be validated. Please try logging in again.', 'wordfence-2fa'));
|
504 |
}
|
505 |
}
|
506 |
|
@@ -558,7 +648,7 @@ END
|
|
558 |
return $jwtUser;
|
559 |
}
|
560 |
|
561 |
-
return new \WP_Error('wfls_twofactor_failed', __('<strong>CODE INVALID</strong>: The 2FA code provided is either expired or invalid. Please try again.', 'wordfence-2fa'));
|
562 |
}
|
563 |
}
|
564 |
|
@@ -577,18 +667,20 @@ END
|
|
577 |
return $user;
|
578 |
}
|
579 |
|
|
|
|
|
580 |
if (Controller_Users::shared()->has_2fa_active($user)) {
|
581 |
$legacy2FAActive = Controller_WordfenceLS::shared()->legacy_2fa_active();
|
582 |
if ($legacy2FAActive) {
|
583 |
-
return new \WP_Error('wfls_twofactor_required', __('<strong>CODE REQUIRED</strong>: Please enter your 2FA code immediately after your password in the same field.', 'wordfence-2fa'));
|
584 |
}
|
585 |
-
return new \WP_Error('wfls_twofactor_required', __('<strong>CODE REQUIRED</strong>: Please provide your 2FA code when prompted.', 'wordfence-2fa'));
|
586 |
}
|
587 |
-
else if (Controller_Users::shared()->requires_2fa($user)) {
|
588 |
-
return new \WP_Error('wfls_twofactor_blocked', __('<strong>LOGIN BLOCKED</strong>: 2FA is required to be active on
|
589 |
}
|
590 |
-
else if (
|
591 |
-
Controller_Notices::shared()->add_notice(Model_Notice::SEVERITY_CRITICAL, new Model_HTML(sprintf(__('You do not currently have two-factor authentication active on your account, which will be required beginning %s. <a href="%s">Configure 2FA</a>', 'wordfence-2fa'), Controller_Time::format_local_time('F j, Y',
|
592 |
}
|
593 |
}
|
594 |
|
@@ -611,78 +703,34 @@ END
|
|
611 |
}
|
612 |
|
613 |
public function _register_post($sanitized_user_login, $user_email, $errors) {
|
614 |
-
if (
|
615 |
-
|
616 |
-
|
617 |
-
|
618 |
-
|
619 |
-
|
620 |
-
|
621 |
-
|
622 |
-
|
623 |
-
|
624 |
-
|
625 |
-
|
626 |
-
|
627 |
-
* themselves to opt out of the requirement.
|
628 |
-
*/
|
629 |
-
$requireCAPTCHA = Controller_CAPTCHA::shared()->enabled() && !(defined('XMLRPC_REQUEST') && XMLRPC_REQUEST); //CAPTCHA is enabled, not an XML-RPC request
|
630 |
-
$requireCAPTCHA = apply_filters('wordfence_ls_require_captcha', $requireCAPTCHA);
|
631 |
-
|
632 |
-
$token = (isset($_POST['wfls-captcha-token']) && is_string($_POST['wfls-captcha-token']) ? $_POST['wfls-captcha-token'] : '');
|
633 |
-
|
634 |
-
if ($requireCAPTCHA && empty($token) && !empty($sanitized_user_login) && !Controller_CAPTCHA::shared()->test_mode()) { //A CAPTCHA token must be provided for the login attempt to proceed past this point except in test mode
|
635 |
-
$errors->add('wfls_captcha_required', __('<strong>REGISTRATION ATTEMPT BLOCKED</strong>: This site requires a security token created when the page loads for all registration attempts. Please ensure JavaScript is enabled and try again.', 'wordfence-ls'));
|
636 |
-
return;
|
637 |
-
}
|
638 |
-
|
639 |
-
$score = false;
|
640 |
-
if ($requireCAPTCHA) {
|
641 |
-
$score = Controller_CAPTCHA::shared()->score($token);
|
642 |
-
if ($score === false && !Controller_CAPTCHA::shared()->test_mode()) { //The token must be valid except in test mode
|
643 |
-
$errors->add('wfls_captcha_required', __('<strong>REGISTRATION ATTEMPT BLOCKED</strong>: The security token for the login attempt was invalid or expired. Please reload the page and try again.', 'wordfence-ls'));
|
644 |
-
return;
|
645 |
-
}
|
646 |
-
}
|
647 |
-
|
648 |
-
if ($requireCAPTCHA) {
|
649 |
-
Controller_Users::shared()->record_captcha_score(null, $score);
|
650 |
-
|
651 |
-
if (!Controller_CAPTCHA::shared()->is_human($score)) { //Score is below the human threshold, block the user registration
|
652 |
-
$encryptedIP = Model_Symmetric::encrypt(Model_Request::current()->ip());
|
653 |
-
$encryptedScore = Model_Symmetric::encrypt($score);
|
654 |
-
if ($encryptedIP && $encryptedScore && filter_var(get_site_option('admin_email'), FILTER_VALIDATE_EMAIL)) {
|
655 |
-
$jwt = new Model_JWT(array('ip' => $encryptedIP, 'score' => $encryptedScore), Controller_Time::time() + 600);
|
656 |
-
$token = (string) $jwt;
|
657 |
|
658 |
-
|
659 |
-
|
660 |
-
|
661 |
-
|
|
|
|
|
|
|
|
|
662 |
}
|
663 |
-
|
664 |
-
/**
|
665 |
-
* Fires just prior to blocking user registration due to a failed CAPTCHA. After firing this action hook
|
666 |
-
* the registration attempt is blocked.
|
667 |
-
*
|
668 |
-
* @param int $source The source code of the block.
|
669 |
-
*/
|
670 |
-
do_action('wfls_registration_blocked', 1);
|
671 |
-
|
672 |
-
/**
|
673 |
-
* Filters the message to show if registration is blocked due to a captcha rejection.
|
674 |
-
*
|
675 |
-
* @since 1.0.0
|
676 |
-
*
|
677 |
-
* @param string $message The message to display, HTML allowed.
|
678 |
-
*/
|
679 |
-
$message = apply_filters('wfls_registration_blocked_message', $message);
|
680 |
-
$errors->add('wfls_registration_blocked', $message);
|
681 |
-
return;
|
682 |
}
|
683 |
}
|
684 |
}
|
685 |
-
|
686 |
/**
|
687 |
* @param \WP_Error $errors
|
688 |
* @param string $redirect_to
|
@@ -693,10 +741,10 @@ END
|
|
693 |
if (!$has_errors && isset($_REQUEST['wfls-email-verification']) && is_string($_REQUEST['wfls-email-verification'])) {
|
694 |
$jwt = Model_JWT::decode_jwt($_REQUEST['wfls-email-verification']);
|
695 |
if ($jwt && isset($jwt->payload['user'])) {
|
696 |
-
$errors->add('wfls_email_verified',
|
697 |
}
|
698 |
else {
|
699 |
-
$errors->add('wfls_email_not_verified',
|
700 |
}
|
701 |
}
|
702 |
return $errors;
|
@@ -732,7 +780,8 @@ END
|
|
732 |
public function _admin_menu() {
|
733 |
$user = wp_get_current_user();
|
734 |
if (Controller_Notices::shared()->has_notice($user)) {
|
735 |
-
|
|
|
736 |
Controller_Notices::shared()->remove_notice(false, 'wfls-will-be-required', $user);
|
737 |
}
|
738 |
}
|
@@ -773,25 +822,71 @@ END
|
|
773 |
}
|
774 |
}
|
775 |
}
|
776 |
-
|
777 |
-
$sections = array(
|
778 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
779 |
'tab' => new Model_Tab('manage', 'manage', __('Two-Factor Authentication', 'wordfence-2fa'), __('Two-Factor Authentication', 'wordfence-2fa')),
|
780 |
-
'title' => new Model_Title('manage', __('Two-Factor Authentication', 'wordfence-2fa'), Controller_Support::supportURL(Controller_Support::ITEM_MODULE_LOGIN_SECURITY_2FA), new Model_HTML(__('Learn more<span class="wfls-hidden-xs"> about Two-Factor Authentication</span>', 'wordfence'))),
|
781 |
'content' => new Model_View('page/manage', array(
|
782 |
'user' => $user,
|
783 |
'canEditUsers' => $canEditUsers,
|
784 |
)),
|
785 |
-
),
|
786 |
-
);
|
787 |
-
|
788 |
-
if ($administrator) {
|
789 |
-
$sections[] = array(
|
790 |
-
'tab' => new Model_Tab('settings', 'settings', __('Settings', 'wordfence-2fa'), __('Settings', 'wordfence-2fa')),
|
791 |
-
'title' => new Model_Title('settings', __('Login Security Settings', 'wordfence-2fa'), Controller_Support::supportURL(Controller_Support::ITEM_MODULE_LOGIN_SECURITY), new Model_HTML(__('Learn more<span class="wfls-hidden-xs"> about Login Security</span>', 'wordfence'))),
|
792 |
-
'content' => new Model_View('page/settings', array(
|
793 |
-
)),
|
794 |
);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
795 |
}
|
796 |
|
797 |
$view = new Model_View('page/page', array(
|
@@ -799,4 +894,77 @@ END
|
|
799 |
));
|
800 |
echo $view->render();
|
801 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
802 |
}
|
10 |
|
11 |
class Controller_WordfenceLS {
|
12 |
const VERSION_KEY = 'wordfence_ls_version';
|
13 |
+
const USERS_PER_PAGE = 25;
|
14 |
|
15 |
/**
|
16 |
* Returns the singleton Controller_Wordfence2FA.
|
53 |
add_action('wp_login', array($this, '_record_login'), 999, 1);
|
54 |
add_action('register_post', array($this, '_register_post'), 25, 3);
|
55 |
add_filter('wp_login_errors', array($this, '_wp_login_errors'), 25, 3);
|
56 |
+
if ($this->has_woocommerce() && Controller_Settings::shared()->get_bool(Controller_Settings::OPTION_ENABLE_WOOCOMMERCE_INTEGRATION)) {
|
57 |
+
add_action('woocommerce_before_customer_login_form', array($this, '_woocommerce_login_enqueue_scripts'));
|
58 |
+
add_action('woocommerce_before_checkout_form', array($this, '_woocommerce_checkout_login_enqueue_scripts'));
|
59 |
+
add_action('wp_loaded', array($this, '_handle_woocommerce_registration'), 10, 0); //Woocommerce uses priority 20
|
60 |
+
}
|
61 |
+
add_action('user_new_form', array($this, '_user_new_form'));
|
62 |
+
add_action('user_register', array($this, '_user_register'));
|
63 |
|
64 |
$useSubmenu = WORDFENCE_LS_FROM_CORE;
|
65 |
if (is_multisite() && !is_network_admin()) {
|
124 |
END
|
125 |
);
|
126 |
}
|
127 |
+
|
128 |
+
if (Controller_Permissions::shared()->can_manage_settings()) {
|
129 |
+
if ((is_plugin_active('jetpack/jetpack.php') || (is_multisite() && is_plugin_active_for_network('jetpack/jetpack.php'))) && !Controller_Settings::shared()->get_bool(Controller_Settings::OPTION_ALLOW_XML_RPC)) {
|
130 |
+
if (is_multisite()) {
|
131 |
+
add_action('network_admin_notices', array($this, '_jetpack_xml_rpc_notice'));
|
132 |
+
}
|
133 |
+
else {
|
134 |
+
add_action('admin_notices', array($this, '_jetpack_xml_rpc_notice'));
|
135 |
+
}
|
136 |
}
|
137 |
+
|
138 |
+
if (Controller_Settings::shared()->get_bool(Controller_Settings::OPTION_CAPTCHA_TEST_MODE) && Controller_CAPTCHA::shared()->enabled()) {
|
139 |
+
if (is_multisite()) {
|
140 |
+
add_action('network_admin_notices', array($this, '_recaptcha_test_notice'));
|
141 |
+
}
|
142 |
+
else {
|
143 |
+
add_action('admin_notices', array($this, '_recaptcha_test_notice'));
|
144 |
+
}
|
145 |
}
|
146 |
+
|
147 |
+
if ($this->has_woocommerce() && !Controller_Settings::shared()->get_bool(Controller_Settings::OPTION_ENABLE_WOOCOMMERCE_INTEGRATION)) {
|
148 |
+
add_action(is_multisite() ? 'network_admin_notices' : 'admin_notices', array($this, '_woocommerce_integration_notice'));
|
149 |
}
|
150 |
}
|
151 |
}
|
155 |
*/
|
156 |
|
157 |
public function _jetpack_xml_rpc_notice() {
|
158 |
+
echo '<div class="notice notice-warning"><p>' . wp_kses(sprintf(__('XML-RPC authentication is disabled. Jetpack is currently active and requires XML-RPC authentication to work correctly. <a href="%s">Manage Settings</a>', 'wordfence-2fa'), esc_url(network_admin_url('admin.php?page=WFLS#top#settings'))), array('a'=>array('href'=>array()))) . '</p></div>';
|
159 |
}
|
160 |
|
161 |
public function _recaptcha_test_notice() {
|
162 |
+
echo '<div class="notice notice-warning"><p>' . wp_kses(sprintf(__('reCAPTCHA test mode is enabled. While enabled, login and registration requests will be checked for their score but will not be blocked if the score is below the minimum score. <a href="%s">Manage Settings</a>', 'wordfence-2fa'), esc_url(network_admin_url('admin.php?page=WFLS#top#settings'))), array('a'=>array('href'=>array()))) . '</p></div>';
|
163 |
+
}
|
164 |
+
|
165 |
+
public function _woocommerce_integration_notice() {
|
166 |
+
$id = Controller_Notices::PERSISTENT_NOTICE_WOOCOMMERCE_INTEGRATION;
|
167 |
+
if (Controller_Notices::shared()->is_persistent_notice_dismissed(get_current_user_id(), $id))
|
168 |
+
return;
|
169 |
+
?>
|
170 |
+
<div id="<?php echo esc_attr($id) ?>" class="notice notice-warning is-dismissible wfls-persistent-notice">
|
171 |
+
<p>
|
172 |
+
<?php esc_html_e('WooCommerce appears to be installed, but the Wordfence Login Security WooCommerce integration is not currently enabled. Without this feature, WooCommerce forms will not support all functionality provided by Wordfence Login Security, including CAPTCHA for the login page and user registration.', 'wordfence-2fa'); ?>
|
173 |
+
<a href="<?php echo esc_attr(esc_url(network_admin_url('admin.php?page=WFLS#top#settings'))) ?>"><?php esc_html_e('Manage Settings', 'wordfence-2fa') ?></a>
|
174 |
+
</p>
|
175 |
+
</div>
|
176 |
+
<?php
|
177 |
}
|
178 |
|
179 |
/**
|
238 |
do_action('wfls_xml_rpc_blocked', 2);
|
239 |
return false;
|
240 |
}
|
241 |
+
|
242 |
+
private function has_woocommerce() {
|
243 |
+
return class_exists('woocommerce');
|
244 |
+
}
|
245 |
+
|
246 |
+
public function _woocommerce_login_enqueue_scripts() {
|
247 |
+
wp_enqueue_style('dashicons');
|
248 |
+
$this->_login_enqueue_scripts();
|
249 |
+
}
|
250 |
+
|
251 |
+
public function _woocommerce_checkout_login_enqueue_scripts() {
|
252 |
+
/**
|
253 |
+
* This is the same check used in WooCommerce to determine whether or not to display the checkout login form
|
254 |
+
* @see templates/checkout/form-login.php in WooCommerce
|
255 |
+
*/
|
256 |
+
if ( is_user_logged_in() || 'no' === get_option( 'woocommerce_enable_checkout_login_reminder' ) ) {
|
257 |
+
return;
|
258 |
+
}
|
259 |
+
$this->_woocommerce_login_enqueue_scripts();
|
260 |
+
}
|
261 |
|
262 |
/**
|
263 |
* Login Page
|
264 |
+
*/
|
|
|
265 |
public function _login_enqueue_scripts() {
|
266 |
$useCAPTCHA = Controller_CAPTCHA::shared()->enabled();
|
267 |
if ($useCAPTCHA) {
|
289 |
));
|
290 |
}
|
291 |
}
|
292 |
+
|
293 |
/**
|
294 |
* Admin Pages
|
295 |
*/
|
296 |
+
public function _admin_enqueue_scripts($hookSuffix) {
|
297 |
if (isset($_GET['page']) && $_GET['page'] == 'WFLS') {
|
298 |
wp_enqueue_script('wordfence-ls-jquery.qrcode', Model_Asset::js('jquery.qrcode.min.js'), array('jquery'), WORDFENCE_LS_VERSION);
|
299 |
wp_enqueue_script('wordfence-ls-jquery.tmpl', Model_Asset::js('jquery.tmpl.min.js'), array('jquery'), WORDFENCE_LS_VERSION);
|
300 |
wp_enqueue_script('wordfence-ls-jquery.colorbox', Model_Asset::js('jquery.colorbox.min.js'), array('jquery'), WORDFENCE_LS_VERSION);
|
301 |
if (Controller_Permissions::shared()->can_manage_settings()) {
|
|
|
|
|
302 |
wp_enqueue_style('wordfence-ls-jquery-ui-css', Model_Asset::css('jquery-ui.min.css'), array(), WORDFENCE_LS_VERSION);
|
303 |
wp_enqueue_style('wordfence-ls-jquery-ui-css.structure', Model_Asset::css('jquery-ui.structure.min.css'), array(), WORDFENCE_LS_VERSION);
|
304 |
wp_enqueue_style('wordfence-ls-jquery-ui-css.theme', Model_Asset::css('jquery-ui.theme.min.css'), array(), WORDFENCE_LS_VERSION);
|
|
|
305 |
}
|
306 |
wp_enqueue_script('wordfence-ls-admin', Model_Asset::js('admin.js'), array('jquery'), WORDFENCE_LS_VERSION);
|
307 |
if (!WORDFENCE_LS_FROM_CORE) {
|
328 |
wp_enqueue_style('wordfence-ls-admin-global', Model_Asset::css('admin-global.css'), array(), WORDFENCE_LS_VERSION);
|
329 |
}
|
330 |
|
331 |
+
if (Controller_Notices::shared()->has_notice(wp_get_current_user()) || in_array($hookSuffix, array('user-edit.php', 'user-new.php', 'profile.php'))) {
|
332 |
wp_enqueue_script('wordfence-ls-admin-global', Model_Asset::js('admin-global.js'), array('jquery'), WORDFENCE_LS_VERSION);
|
333 |
|
334 |
wp_localize_script('wordfence-ls-admin-global', 'GWFLSVars', array(
|
336 |
'nonce' => wp_create_nonce('wp-ajax'),
|
337 |
));
|
338 |
}
|
339 |
+
|
340 |
}
|
341 |
|
342 |
public function _edit_user_profile($user) {
|
355 |
$manageURL = network_admin_url('admin.php?page=WFLS&user=' . ((int) $user->ID));
|
356 |
}
|
357 |
}
|
358 |
+
$userAllowed2fa = Controller_Users::shared()->can_activate_2fa($user);
|
359 |
+
$viewerIsUser = $user->ID == get_current_user_id();
|
360 |
+
$viewerCanManage2fa = current_user_can(Controller_Permissions::CAP_ACTIVATE_2FA_OTHERS);
|
361 |
+
$requires2fa = Controller_Users::shared()->requires_2fa($user, $inGracePeriod, $requiredAt);
|
362 |
+
$has2fa = Controller_Users::shared()->has_2fa_active($user);
|
363 |
+
$lockedOut = $requires2fa && !$has2fa;
|
364 |
+
$hasGracePeriod = Controller_Settings::shared()->get_user_2fa_grace_period() > 0;
|
365 |
+
if ($userAllowed2fa && ($viewerIsUser || $viewerCanManage2fa)):
|
366 |
+
?>
|
367 |
+
<h2 id="wfls-user-settings"><?php esc_html_e('Wordfence Login Security', 'wordfence-2fa'); ?></h2>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
368 |
<table class="form-table">
|
369 |
<tr id="wordfence-ls">
|
370 |
+
<th><label for="wordfence-ls-btn"><?php esc_html_e('2FA Status'); ?></label></th>
|
371 |
<td>
|
372 |
+
<?php if ($userAllowed2fa): ?>
|
373 |
+
<p>
|
374 |
+
<strong><?php echo $lockedOut ? esc_html__('Locked Out', 'wordfence-2fa') : ($has2fa ? esc_html__('Active', 'wordfence-2fa') : esc_html__('Inactive', 'wordfence-2fa')); ?>:</strong>
|
375 |
+
<?php echo $lockedOut ?
|
376 |
+
($viewerIsUser ? esc_html__('Two-factor authentication is required for your account, but has not been configured.', 'wordfence-2fa') : esc_html__('Two-factor authentication is required for this account, but has not been configured.', 'wordfence-2fa'))
|
377 |
+
: ($has2fa ? esc_html__('Wordfence 2FA is active.', 'wordfence-2fa') : esc_html__('Wordfence 2FA is inactive.', 'wordfence-2fa')); ?>
|
378 |
+
<a href="<?php echo Controller_Support::esc_supportURL(Controller_Support::ITEM_MODULE_LOGIN_SECURITY_2FA); ?>" target="_blank" rel="noopener noreferrer"><?php esc_html_e('Learn More', 'wordfence-2fa'); ?></a>
|
379 |
+
</p>
|
380 |
+
<?php if (!$has2fa && $inGracePeriod): ?>
|
381 |
+
<p><strong><?php echo sprintf($viewerIsUser ?
|
382 |
+
esc_html__('Two-factor authentication must be activated for your account prior to %s to avoid losing access.', 'wordfence-2fa')
|
383 |
+
: esc_html__('Two-factor authentication must be activated for this account prior to %s.', 'wordfence-2fa')
|
384 |
+
, Controller_Time::format_local_time('F j, Y g:i A', $requiredAt)) ?></strong></p>
|
385 |
+
<?php endif ?>
|
386 |
+
<?php if ($has2fa || $viewerIsUser): ?><p><a href="<?php echo esc_url($manageURL); ?>" class="button"><?php echo (Controller_Users::shared()->has_2fa_active($user) ? esc_html__('Manage 2FA', 'wordfence-2fa') : esc_html__('Activate 2FA', 'wordfence-2fa')); ?></a></p><?php endif ?>
|
387 |
+
<?php endif ?>
|
388 |
+
<?php if ($viewerCanManage2fa): ?>
|
389 |
+
<?php if (!$userAllowed2fa): ?>
|
390 |
+
<p><strong><?php esc_html_e('Disabled', 'wordfence-2fa'); ?>:</strong> <?php esc_html_e('Two-factor authentication is not currently enabled for this account type. To enable it, visit the Wordfence 2FA Settings page.', 'wordfence-2fa'); ?> <a href="#"><?php esc_html_e('Learn More', 'wordfence-2fa'); ?></a></p>
|
391 |
+
<?php endif ?>
|
392 |
+
<?php if ($lockedOut): ?>
|
393 |
+
<?php echo Model_View::create(
|
394 |
+
'common/reset-grace-period',
|
395 |
+
array(
|
396 |
+
'user' => $user,
|
397 |
+
'gracePeriod' => $inGracePeriod
|
398 |
+
))->render() ?>
|
399 |
+
<?php elseif ($inGracePeriod && Controller_Users::shared()->has_revokable_grace_period($user)): ?>
|
400 |
+
<?php echo Model_View::create(
|
401 |
+
'common/revoke-grace-period',
|
402 |
+
array(
|
403 |
+
'user' => $user
|
404 |
+
))->render() ?>
|
405 |
+
<?php endif ?>
|
406 |
+
<p>
|
407 |
+
<a href="<?php echo esc_url(is_multisite() ? network_admin_url('admin.php?page=WFLS#top#settings') : admin_url('admin.php?page=WFLS#top#settings')); ?>" class="button"><?php esc_html_e('Manage 2FA Settings', 'wordfence-2fa'); ?></a>
|
408 |
+
</p>
|
409 |
+
<?php endif ?>
|
410 |
</td>
|
411 |
</tr>
|
412 |
</table>
|
413 |
+
<?php
|
414 |
endif;
|
415 |
}
|
416 |
|
417 |
/**
|
418 |
* Authentication
|
419 |
*/
|
420 |
+
|
421 |
+
private function _is_woocommerce_login() {
|
422 |
+
if (!$this->has_woocommerce())
|
423 |
+
return false;
|
424 |
+
$nonceValue = '';
|
425 |
+
foreach (array('woocommerce-login-nonce', '_wpnonce') as $key) {
|
426 |
+
if (array_key_exists($key, $_REQUEST)) {
|
427 |
+
$nonceValue = $_REQUEST[$key];
|
428 |
+
break;
|
429 |
+
}
|
430 |
+
}
|
431 |
+
|
432 |
+
return ( isset( $_POST['login'], $_POST['username'], $_POST['password'] ) && is_string($nonceValue) && wp_verify_nonce( $nonceValue, 'woocommerce-login' ) );
|
433 |
+
}
|
434 |
|
435 |
public function _authenticate($user, $username, $password) {
|
436 |
if (defined('XMLRPC_REQUEST') && XMLRPC_REQUEST && !Controller_Settings::shared()->get_bool(Controller_Settings::OPTION_XMLRPC_ENABLED)) { //XML-RPC call and we're not enforcing 2FA on it
|
453 |
* themselves to opt out of the requirement.
|
454 |
* 4. The user does not have 2FA enabled. 2FA exempts the user from requiring email verification if the score is
|
455 |
* below the threshold.
|
456 |
+
* 5. The request is not a WooCommerce login while WC integration is disabled
|
457 |
*/
|
458 |
+
if (!empty($username) && (!$this->_is_woocommerce_login() || Controller_Settings::shared()->get_bool(Controller_Settings::OPTION_ENABLE_WOOCOMMERCE_INTEGRATION))) { //Login attempt, not just a wp-login.php page load
|
459 |
+
|
460 |
+
$requireCAPTCHA = Controller_CAPTCHA::shared()->is_captcha_required();
|
461 |
|
462 |
$performVerification = false;
|
463 |
+
$token = Controller_CAPTCHA::shared()->get_token();
|
464 |
if ($requireCAPTCHA && empty($token) && !Controller_CAPTCHA::shared()->test_mode()) { //No CAPTCHA token means forced additional verification (if neither 2FA nor test mode are active)
|
465 |
$performVerification = true;
|
466 |
}
|
532 |
if ($requireCAPTCHA && $performVerification) {
|
533 |
$encrypted = Model_Symmetric::encrypt((string) $user->ID);
|
534 |
if ($encrypted) {
|
535 |
+
if ($this->has_woocommerce() && array_key_exists('woocommerce-login-nonce', $_POST)) {
|
536 |
+
$loginUrl = get_permalink(get_option('woocommerce_myaccount_page_id'));
|
537 |
+
}
|
538 |
+
else {
|
539 |
+
$loginUrl = wp_login_url();
|
540 |
+
}
|
541 |
$jwt = new Model_JWT(array('user' => $encrypted), Controller_Time::time() + 60 * WORDFENCE_LS_EMAIL_VALIDITY_DURATION_MINUTES);
|
542 |
$view = new Model_View('email/login-verification', array(
|
543 |
'siteName' => get_bloginfo('name', 'raw'),
|
544 |
'siteURL' => rtrim(site_url(), '/') . '/',
|
545 |
+
'verificationURL' => add_query_arg(array('wfls-email-verification' => (string) $jwt), $loginUrl),
|
546 |
'ip' => Model_Request::current()->ip(),
|
547 |
'canEnable2FA' => Controller_Users::shared()->can_activate_2fa($user),
|
548 |
));
|
549 |
wp_mail($user->user_email, __('Login Verification Required', 'wordfence-ls'), $view->render(), "Content-Type: text/html");
|
550 |
|
551 |
+
return new \WP_Error('wfls_captcha_verify', wp_kses(__('<strong>VERIFICATION REQUIRED</strong>: Additional verification is required for login. Please check the email address associated with the account for a verification link.', 'wordfence-ls'), array('strong'=>array())));
|
552 |
}
|
553 |
//else -- Can't generate payload due to host failure, allow it to proceed
|
554 |
}
|
563 |
if (isset($_POST['wfls-token-jwt']) && is_string($_POST['wfls-token-jwt'])) {
|
564 |
$jwt = Model_JWT::decode_jwt($_POST['wfls-token-jwt']);
|
565 |
if (!$jwt) { //Possibly user-corrupted or expired JWT
|
566 |
+
return new \WP_Error('wfls_twofactor_invalid', wp_kses(__('<strong>VALIDATION FAILED</strong>: The 2FA code could not be validated. Please try logging in again.', 'wordfence-2fa'), array('strong'=>array())));
|
567 |
}
|
568 |
|
569 |
if (!isset($jwt->payload['user'])) { //Possibly user-corrupted JWT
|
570 |
+
return new \WP_Error('wfls_twofactor_invalid', wp_kses(__('<strong>VALIDATION FAILED</strong>: The 2FA code could not be validated. Please try logging in again.', 'wordfence-2fa'), array('strong'=>array())));
|
571 |
}
|
572 |
|
573 |
$decryptedUser = Model_Symmetric::decrypt($jwt->payload['user']);
|
590 |
}
|
591 |
|
592 |
//Invalid nonce or expired nonce
|
593 |
+
return new \WP_Error('wfls_twofactor_invalid', wp_kses(__('<strong>VALIDATION FAILED</strong>: The 2FA code could not be validated. Please try logging in again.', 'wordfence-2fa'), array('strong'=>array())));
|
594 |
}
|
595 |
}
|
596 |
|
648 |
return $jwtUser;
|
649 |
}
|
650 |
|
651 |
+
return new \WP_Error('wfls_twofactor_failed', wp_kses(__('<strong>CODE INVALID</strong>: The 2FA code provided is either expired or invalid. Please try again.', 'wordfence-2fa'), array('strong'=>array())));
|
652 |
}
|
653 |
}
|
654 |
|
667 |
return $user;
|
668 |
}
|
669 |
|
670 |
+
$in2faGracePeriod = false;
|
671 |
+
$time2faRequired = null;
|
672 |
if (Controller_Users::shared()->has_2fa_active($user)) {
|
673 |
$legacy2FAActive = Controller_WordfenceLS::shared()->legacy_2fa_active();
|
674 |
if ($legacy2FAActive) {
|
675 |
+
return new \WP_Error('wfls_twofactor_required', wp_kses(__('<strong>CODE REQUIRED</strong>: Please enter your 2FA code immediately after your password in the same field.', 'wordfence-2fa'), array('strong'=>array())));
|
676 |
}
|
677 |
+
return new \WP_Error('wfls_twofactor_required', wp_kses(__('<strong>CODE REQUIRED</strong>: Please provide your 2FA code when prompted.', 'wordfence-2fa'), array('strong'=>array())));
|
678 |
}
|
679 |
+
else if (Controller_Users::shared()->requires_2fa($user, $in2faGracePeriod, $time2faRequired)) {
|
680 |
+
return new \WP_Error('wfls_twofactor_blocked', wp_kses(__('<strong>LOGIN BLOCKED</strong>: 2FA is required to be active on your account. Please contact the site administrator.', 'wordfence-2fa'), array('strong'=>array())));
|
681 |
}
|
682 |
+
else if ($in2faGracePeriod) {
|
683 |
+
Controller_Notices::shared()->add_notice(Model_Notice::SEVERITY_CRITICAL, new Model_HTML(wp_kses(sprintf(__('You do not currently have two-factor authentication active on your account, which will be required beginning %s. <a href="%s">Configure 2FA</a>', 'wordfence-2fa'), Controller_Time::format_local_time('F j, Y g:i A', $time2faRequired), esc_url((is_multisite() && is_super_admin($user->ID)) ? network_admin_url('admin.php?page=WFLS') : admin_url('admin.php?page=WFLS'))), array('a'=>array('href'=>array())))), 'wfls-will-be-required', $user);
|
684 |
}
|
685 |
}
|
686 |
|
703 |
}
|
704 |
|
705 |
public function _register_post($sanitized_user_login, $user_email, $errors) {
|
706 |
+
if (!empty($sanitized_user_login)) {
|
707 |
+
$captchaResult = $this->process_registration_captcha();
|
708 |
+
if ($captchaResult !== true) {
|
709 |
+
$message = $captchaResult['message'];
|
710 |
+
$category = $captchaResult['category'];
|
711 |
+
if ($category === 'wfls_registration_blocked') {
|
712 |
+
/**
|
713 |
+
* Fires just prior to blocking user registration due to a failed CAPTCHA. After firing this action hook
|
714 |
+
* the registration attempt is blocked.
|
715 |
+
*
|
716 |
+
* @param int $source The source code of the block.
|
717 |
+
*/
|
718 |
+
do_action('wfls_registration_blocked', 1);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
719 |
|
720 |
+
/**
|
721 |
+
* Filters the message to show if registration is blocked due to a captcha rejection.
|
722 |
+
*
|
723 |
+
* @since 1.0.0
|
724 |
+
*
|
725 |
+
* @param string $message The message to display, HTML allowed.
|
726 |
+
*/
|
727 |
+
$message = apply_filters('wfls_registration_blocked_message', $message);
|
728 |
}
|
729 |
+
$errors->add($category, $message);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
730 |
}
|
731 |
}
|
732 |
}
|
733 |
+
|
734 |
/**
|
735 |
* @param \WP_Error $errors
|
736 |
* @param string $redirect_to
|
741 |
if (!$has_errors && isset($_REQUEST['wfls-email-verification']) && is_string($_REQUEST['wfls-email-verification'])) {
|
742 |
$jwt = Model_JWT::decode_jwt($_REQUEST['wfls-email-verification']);
|
743 |
if ($jwt && isset($jwt->payload['user'])) {
|
744 |
+
$errors->add('wfls_email_verified', esc_html__('Email verification succeeded. Please continue logging in.', 'wordfence-2fa'), 'message');
|
745 |
}
|
746 |
else {
|
747 |
+
$errors->add('wfls_email_not_verified', esc_html__('Email verification invalid or expired. Please try again.', 'wordfence-2fa'), 'message');
|
748 |
}
|
749 |
}
|
750 |
return $errors;
|
780 |
public function _admin_menu() {
|
781 |
$user = wp_get_current_user();
|
782 |
if (Controller_Notices::shared()->has_notice($user)) {
|
783 |
+
Controller_Users::shared()->requires_2fa($user, $gracePeriod);
|
784 |
+
if (!$gracePeriod) {
|
785 |
Controller_Notices::shared()->remove_notice(false, 'wfls-will-be-required', $user);
|
786 |
}
|
787 |
}
|
822 |
}
|
823 |
}
|
824 |
}
|
825 |
+
|
826 |
+
$sections = array();
|
827 |
+
|
828 |
+
if (isset($_GET['role']) && $canEditUsers) {
|
829 |
+
$roleKey = $_GET['role'];
|
830 |
+
$roles = new \WP_Roles();
|
831 |
+
$role = $roles->get_role($roleKey);
|
832 |
+
$roleTitle = $roleKey === 'super-admin' ? __('Super Administrator', 'wordfence-2fa') : $roles->role_names[$roleKey];
|
833 |
+
$requiredAt = Controller_Settings::shared()->get_required_2fa_role_activation_time($roleKey);
|
834 |
+
$states = array(
|
835 |
+
'grace_period' => array(
|
836 |
+
'title' => __('Grace Period', 'wordfence-2fa'),
|
837 |
+
'gracePeriod' => true
|
838 |
+
),
|
839 |
+
'locked_out' => array(
|
840 |
+
'title' => __('Locked Out', 'wordfence-2fa'),
|
841 |
+
'gracePeriod' => false
|
842 |
+
)
|
843 |
+
);
|
844 |
+
foreach ($states as $key => $state) {
|
845 |
+
$pageKey = "page_$key";
|
846 |
+
$page = isset($_GET[$pageKey]) ? max((int) $_GET[$pageKey], 1) : 1;
|
847 |
+
$title = $state['title'];
|
848 |
+
$lastPage = true;
|
849 |
+
if ($requiredAt === false)
|
850 |
+
$users = array();
|
851 |
+
else
|
852 |
+
$users = Controller_Users::shared()->get_inactive_2fa_users($roleKey, $state['gracePeriod'], $page, self::USERS_PER_PAGE, $lastPage);
|
853 |
+
$sections[] = array(
|
854 |
+
'tab' => new Model_Tab($key, $key, $title, $title),
|
855 |
+
'title' => new Model_Title($key, sprintf(__('Users without 2FA active (%s)', 'wordfence-2fa'), $title) . ' - ' . $roleTitle),
|
856 |
+
'content' => new Model_View('page/role', array(
|
857 |
+
'role' => $role,
|
858 |
+
'roleTitle' => $roleTitle,
|
859 |
+
'stateTitle' => $title,
|
860 |
+
'requiredAt' => $requiredAt,
|
861 |
+
'state' => $state,
|
862 |
+
'users' => $users,
|
863 |
+
'page' => $page,
|
864 |
+
'lastPage' => $lastPage,
|
865 |
+
'pageKey' => $pageKey,
|
866 |
+
'stateKey' => $key
|
867 |
+
)),
|
868 |
+
);
|
869 |
+
}
|
870 |
+
}
|
871 |
+
else {
|
872 |
+
$sections[] = array(
|
873 |
'tab' => new Model_Tab('manage', 'manage', __('Two-Factor Authentication', 'wordfence-2fa'), __('Two-Factor Authentication', 'wordfence-2fa')),
|
874 |
+
'title' => new Model_Title('manage', __('Two-Factor Authentication', 'wordfence-2fa'), Controller_Support::supportURL(Controller_Support::ITEM_MODULE_LOGIN_SECURITY_2FA), new Model_HTML(wp_kses(__('Learn more<span class="wfls-hidden-xs"> about Two-Factor Authentication</span>', 'wordfence'), array('span'=>array('class'=>array()))))),
|
875 |
'content' => new Model_View('page/manage', array(
|
876 |
'user' => $user,
|
877 |
'canEditUsers' => $canEditUsers,
|
878 |
)),
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
879 |
);
|
880 |
+
|
881 |
+
if ($administrator) {
|
882 |
+
$sections[] = array(
|
883 |
+
'tab' => new Model_Tab('settings', 'settings', __('Settings', 'wordfence-2fa'), __('Settings', 'wordfence-2fa')),
|
884 |
+
'title' => new Model_Title('settings', __('Login Security Settings', 'wordfence-2fa'), Controller_Support::supportURL(Controller_Support::ITEM_MODULE_LOGIN_SECURITY), new Model_HTML(wp_kses(__('Learn more<span class="wfls-hidden-xs"> about Login Security</span>', 'wordfence'), array('span'=>array('class'=>array()))))),
|
885 |
+
'content' => new Model_View('page/settings', array(
|
886 |
+
'hasWoocommerce' => $this->has_woocommerce()
|
887 |
+
)),
|
888 |
+
);
|
889 |
+
}
|
890 |
}
|
891 |
|
892 |
$view = new Model_View('page/page', array(
|
894 |
));
|
895 |
echo $view->render();
|
896 |
}
|
897 |
+
|
898 |
+
private function process_registration_captcha() {
|
899 |
+
if (Controller_Whitelist::shared()->is_whitelisted(Model_Request::current()->ip())) { //Whitelisted, so we're not enforcing 2FA
|
900 |
+
return true;
|
901 |
+
}
|
902 |
+
|
903 |
+
$captchaController = Controller_CAPTCHA::shared();
|
904 |
+
$requireCaptcha = $captchaController->is_captcha_required();
|
905 |
+
$token = $captchaController->get_token();
|
906 |
+
|
907 |
+
if ($requireCaptcha) {
|
908 |
+
if ($token === null && !$captchaController->test_mode()) {
|
909 |
+
return array(
|
910 |
+
'message' => wp_kses(__('<strong>REGISTRATION ATTEMPT BLOCKED</strong>: This site requires a security token created when the page loads for all registration attempts. Please ensure JavaScript is enabled and try again.', 'wordfence-ls'), array('strong'=>array())),
|
911 |
+
'category' => 'wfls_captcha_required'
|
912 |
+
);
|
913 |
+
}
|
914 |
+
$score = $captchaController->score($token);
|
915 |
+
if ($score === false && !$captchaController->test_mode()) {
|
916 |
+
return array(
|
917 |
+
'message' => wp_kses(__('<strong>REGISTRATION ATTEMPT BLOCKED</strong>: The security token for the login attempt was invalid or expired. Please reload the page and try again.', 'wordfence-ls'), array('strong'=>array())),
|
918 |
+
'category' => 'wfls_captcha_required'
|
919 |
+
);
|
920 |
+
}
|
921 |
+
Controller_Users::shared()->record_captcha_score(null, $token);
|
922 |
+
if (!$captchaController->is_human($score)) {
|
923 |
+
$encryptedIP = Model_Symmetric::encrypt(Model_Request::current()->ip());
|
924 |
+
$encryptedScore = Model_Symmetric::encrypt($score);
|
925 |
+
$result = array(
|
926 |
+
'category' => 'wfls_registration_blocked'
|
927 |
+
);
|
928 |
+
if ($encryptedIP && $encryptedScore && filter_var(get_site_option('admin_email'), FILTER_VALIDATE_EMAIL)) {
|
929 |
+
$jwt = new Model_JWT(array('ip' => $encryptedIP, 'score' => $encryptedScore), Controller_Time::time() + 600);
|
930 |
+
$result['message'] = wp_kses(sprintf(__('<strong>REGISTRATION BLOCKED</strong>: The registration request was blocked because it was flagged as spam. Please try again or <a href="#" class="wfls-registration-captcha-contact" data-token="%s">contact the site owner</a> for help.', 'wordfence-ls'), esc_attr((string)$jwt)), array('strong'=>array(), 'a'=>array('href'=>array(), 'class'=>array(), 'data-token'=>array())));
|
931 |
+
}
|
932 |
+
else {
|
933 |
+
$result['message'] = wp_kses(__('<strong>REGISTRATION BLOCKED</strong>: The registration request was blocked because it was flagged as spam. Please try again or contact the site owner for help.', 'wordfence-ls'), array('strong'=>array()));
|
934 |
+
}
|
935 |
+
return $result;
|
936 |
+
}
|
937 |
+
}
|
938 |
+
return true;
|
939 |
+
}
|
940 |
+
|
941 |
+
private function disable_woocommerce_registration($message) {
|
942 |
+
if ($this->has_woocommerce()) {
|
943 |
+
remove_action('wp_loaded', array('WC_Form_Handler', 'process_registration'), 20);
|
944 |
+
wc_add_notice($message, 'error');
|
945 |
+
}
|
946 |
+
}
|
947 |
+
|
948 |
+
public function _handle_woocommerce_registration() {
|
949 |
+
if ($this->has_woocommerce() && isset($_POST['register'], $_POST['email']) && (isset($_POST['_wpnonce']) || isset($_POST['woocommerce-register-nonce']))) {
|
950 |
+
$captchaResult = $this->process_registration_captcha();
|
951 |
+
if ($captchaResult !== true) {
|
952 |
+
$this->disable_woocommerce_registration($captchaResult['message']);
|
953 |
+
}
|
954 |
+
}
|
955 |
+
}
|
956 |
+
|
957 |
+
public function _user_new_form() {
|
958 |
+
if (Controller_Settings::shared()->get_user_2fa_grace_period())
|
959 |
+
echo Model_View::create('user/grace-period-toggle', array())->render();
|
960 |
+
}
|
961 |
+
|
962 |
+
public function _user_register($newUserId) {
|
963 |
+
$creator = wp_get_current_user();
|
964 |
+
if (!Controller_Permissions::shared()->can_manage_settings($creator) || $creator->ID == $newUserId)
|
965 |
+
return;
|
966 |
+
if (isset($_POST['wfls-grace-period-toggle']))
|
967 |
+
Controller_Users::shared()->allow_grace_period($newUserId);
|
968 |
+
}
|
969 |
+
|
970 |
}
|
classes/model/view/title.php
CHANGED
@@ -16,7 +16,7 @@ class Model_Title {
|
|
16 |
private $_helpURL;
|
17 |
private $_helpLink;
|
18 |
|
19 |
-
public function __construct($id, $title, $helpURL, $helpLink) {
|
20 |
$this->_id = $id;
|
21 |
$this->_title = $title;
|
22 |
$this->_helpURL = $helpURL;
|
16 |
private $_helpURL;
|
17 |
private $_helpLink;
|
18 |
|
19 |
+
public function __construct($id, $title, $helpURL = null, $helpLink = null) {
|
20 |
$this->_id = $id;
|
21 |
$this->_title = $title;
|
22 |
$this->_helpURL = $helpURL;
|
css/{admin-global.1610634190.css → admin-global.1625749951.css}
RENAMED
@@ -1 +1 @@
|
|
1 |
-
.wfls-clearfix:before,.wfls-clearfix:after{content:" ";display:table}.wfls-clearfix:after{clear:both}.wfls-btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;text-transform:uppercase;padding:.4rem 1rem;font-size:.875rem;line-height:1.3125rem;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media (min-width: 768px){.wfls-btn{padding:.5rem 1.25rem;font-size:.875rem;line-height:1.3125rem;border-radius:4px}}.wfls-btn:focus,.wfls-btn.wfls-focus,.wfls-btn:active:focus,.wfls-btn:active.wfls-focus,.wfls-btn.wfls-active:focus,.wfls-btn.wfls-active.wfls-focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.wfls-btn:hover,.wfls-btn:focus,.wfls-btn.wfls-focus{color:#00709e;text-decoration:none !important}.wfls-btn:active,.wfls-btn.wfls-active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.wfls-btn.wfls-disabled,.wfls-btn[disabled],.wfls-btn[readonly],fieldset[disabled] .wfls-btn{cursor:not-allowed;-webkit-box-shadow:none;box-shadow:none}a.wfls-btn{text-decoration:none}a.wfls-btn.wfls-disabled,fieldset[disabled] a.wfls-btn{cursor:not-allowed;pointer-events:none}.wfls-btn-default{color:#00709e;background-color:#fff;border-color:#00709e}.wfls-btn-default:focus,.wfls-btn-default.focus{color:#00709e;background-color:#e6e6e6;border-color:#00161f}.wfls-btn-default:hover{color:#00709e;background-color:#e6e6e6;border-color:#004561}.wfls-btn-default:active,.wfls-btn-default.active,.wfls-open>.wfls-btn-default.wfls-dropdown-toggle{color:#00709e;background-color:#e6e6e6;border-color:#004561}.wfls-btn-default:active:hover,.wfls-btn-default:active:focus,.wfls-btn-default:active.focus,.wfls-btn-default.active:hover,.wfls-btn-default.active:focus,.wfls-btn-default.active.focus,.wfls-open>.wfls-btn-default.wfls-dropdown-toggle:hover,.wfls-open>.wfls-btn-default.wfls-dropdown-toggle:focus,.wfls-open>.wfls-btn-default.wfls-dropdown-toggle.focus{color:#00709e;background-color:#d4d4d4;border-color:#00161f}.wfls-btn-default:active,.wfls-btn-default.wfls-active,.wfls-open>.wfls-btn-default.wfls-dropdown-toggle{background-image:none}.wfls-btn-default.wfls-disabled,.wfls-btn-default[disabled],.wfls-btn-default[readonly],fieldset[disabled] .wfls-btn-default{color:#777;background-color:#fff;border-color:#e2e2e2;cursor:not-allowed;opacity:0.75}.wfls-btn-default.wfls-disabled:hover,.wfls-btn-default.wfls-disabled:focus,.wfls-btn-default.wfls-disabled.wfls-focus,.wfls-btn-default[disabled]:hover,.wfls-btn-default[disabled]:focus,.wfls-btn-default[disabled].wfls-focus,.wfls-btn-default[readonly]:hover,.wfls-btn-default[readonly]:focus,.wfls-btn-default[readonly].wfls-focus,fieldset[disabled] .wfls-btn-default:hover,fieldset[disabled] .wfls-btn-default:focus,fieldset[disabled] .wfls-btn-default.wfls-focus{background-color:#fff;border-color:#00709e}.wfls-btn-default .wfls-badge{color:#fff;background-color:#00709e}.wfls-btn-primary{color:#fff;background-color:#00709e;border-color:#005e85}.wfls-btn-primary:focus,.wfls-btn-primary.focus{color:#fff;background-color:#004c6b;border-color:#000405}.wfls-btn-primary:hover{color:#fff;background-color:#004c6b;border-color:#003347}.wfls-btn-primary:active,.wfls-btn-primary.active,.wfls-open>.wfls-btn-primary.wfls-dropdown-toggle{color:#fff;background-color:#004c6b;border-color:#003347}.wfls-btn-primary:active:hover,.wfls-btn-primary:active:focus,.wfls-btn-primary:active.focus,.wfls-btn-primary.active:hover,.wfls-btn-primary.active:focus,.wfls-btn-primary.active.focus,.wfls-open>.wfls-btn-primary.wfls-dropdown-toggle:hover,.wfls-open>.wfls-btn-primary.wfls-dropdown-toggle:focus,.wfls-open>.wfls-btn-primary.wfls-dropdown-toggle.focus{color:#fff;background-color:#003347;border-color:#000405}.wfls-btn-primary:active,.wfls-btn-primary.wfls-active,.wfls-open>.wfls-btn-primary.wfls-dropdown-toggle{background-image:none}.wfls-btn-primary.wfls-disabled,.wfls-btn-primary[disabled],.wfls-btn-primary[readonly],fieldset[disabled] .wfls-btn-primary{color:#fff;background-color:#59a2c0;border-color:#5996b0;cursor:not-allowed;opacity:0.75}.wfls-btn-primary.wfls-disabled:hover,.wfls-btn-primary.wfls-disabled:focus,.wfls-btn-primary.wfls-disabled.wfls-focus,.wfls-btn-primary[disabled]:hover,.wfls-btn-primary[disabled]:focus,.wfls-btn-primary[disabled].wfls-focus,.wfls-btn-primary[readonly]:hover,.wfls-btn-primary[readonly]:focus,.wfls-btn-primary[readonly].wfls-focus,fieldset[disabled] .wfls-btn-primary:hover,fieldset[disabled] .wfls-btn-primary:focus,fieldset[disabled] .wfls-btn-primary.wfls-focus{background-color:#00709e;border-color:#005e85}.wfls-btn-primary .wfls-badge{color:#00709e;background-color:#fff}.wfls-btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.wfls-btn-success:focus,.wfls-btn-success.focus{color:#fff;background-color:#449d44;border-color:#255625}.wfls-btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.wfls-btn-success:active,.wfls-btn-success.active,.wfls-open>.wfls-btn-success.wfls-dropdown-toggle{color:#fff;background-color:#449d44;border-color:#398439}.wfls-btn-success:active:hover,.wfls-btn-success:active:focus,.wfls-btn-success:active.focus,.wfls-btn-success.active:hover,.wfls-btn-success.active:focus,.wfls-btn-success.active.focus,.wfls-open>.wfls-btn-success.wfls-dropdown-toggle:hover,.wfls-open>.wfls-btn-success.wfls-dropdown-toggle:focus,.wfls-open>.wfls-btn-success.wfls-dropdown-toggle.focus{color:#fff;background-color:#398439;border-color:#255625}.wfls-btn-success:active,.wfls-btn-success.wfls-active,.wfls-open>.wfls-btn-success.wfls-dropdown-toggle{background-image:none}.wfls-btn-success.wfls-disabled,.wfls-btn-success[disabled],.wfls-btn-success[readonly],fieldset[disabled] .wfls-btn-success{color:#fff;background-color:#95d195;border-color:#8bca8b;cursor:not-allowed;opacity:0.75}.wfls-btn-success.wfls-disabled:hover,.wfls-btn-success.wfls-disabled:focus,.wfls-btn-success.wfls-disabled.wfls-focus,.wfls-btn-success[disabled]:hover,.wfls-btn-success[disabled]:focus,.wfls-btn-success[disabled].wfls-focus,.wfls-btn-success[readonly]:hover,.wfls-btn-success[readonly]:focus,.wfls-btn-success[readonly].wfls-focus,fieldset[disabled] .wfls-btn-success:hover,fieldset[disabled] .wfls-btn-success:focus,fieldset[disabled] .wfls-btn-success.wfls-focus{background-color:#5cb85c;border-color:#4cae4c}.wfls-btn-success .wfls-badge{color:#5cb85c;background-color:#fff}.wfls-btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.wfls-btn-info:focus,.wfls-btn-info.focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.wfls-btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.wfls-btn-info:active,.wfls-btn-info.active,.wfls-open>.wfls-btn-info.wfls-dropdown-toggle{color:#fff;background-color:#31b0d5;border-color:#269abc}.wfls-btn-info:active:hover,.wfls-btn-info:active:focus,.wfls-btn-info:active.focus,.wfls-btn-info.active:hover,.wfls-btn-info.active:focus,.wfls-btn-info.active.focus,.wfls-open>.wfls-btn-info.wfls-dropdown-toggle:hover,.wfls-open>.wfls-btn-info.wfls-dropdown-toggle:focus,.wfls-open>.wfls-btn-info.wfls-dropdown-toggle.focus{color:#fff;background-color:#269abc;border-color:#1b6d85}.wfls-btn-info:active,.wfls-btn-info.wfls-active,.wfls-open>.wfls-btn-info.wfls-dropdown-toggle{background-image:none}.wfls-btn-info.wfls-disabled,.wfls-btn-info[disabled],.wfls-btn-info[readonly],fieldset[disabled] .wfls-btn-info{color:#fff;background-color:#94d6ea;border-color:#87d1e7;cursor:not-allowed;opacity:0.75}.wfls-btn-info.wfls-disabled:hover,.wfls-btn-info.wfls-disabled:focus,.wfls-btn-info.wfls-disabled.wfls-focus,.wfls-btn-info[disabled]:hover,.wfls-btn-info[disabled]:focus,.wfls-btn-info[disabled].wfls-focus,.wfls-btn-info[readonly]:hover,.wfls-btn-info[readonly]:focus,.wfls-btn-info[readonly].wfls-focus,fieldset[disabled] .wfls-btn-info:hover,fieldset[disabled] .wfls-btn-info:focus,fieldset[disabled] .wfls-btn-info.wfls-focus{background-color:#5bc0de;border-color:#46b8da}.wfls-btn-info .wfls-badge{color:#5bc0de;background-color:#fff}.wfls-btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.wfls-btn-warning:focus,.wfls-btn-warning.focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.wfls-btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.wfls-btn-warning:active,.wfls-btn-warning.active,.wfls-open>.wfls-btn-warning.wfls-dropdown-toggle{color:#fff;background-color:#ec971f;border-color:#d58512}.wfls-btn-warning:active:hover,.wfls-btn-warning:active:focus,.wfls-btn-warning:active.focus,.wfls-btn-warning.active:hover,.wfls-btn-warning.active:focus,.wfls-btn-warning.active.focus,.wfls-open>.wfls-btn-warning.wfls-dropdown-toggle:hover,.wfls-open>.wfls-btn-warning.wfls-dropdown-toggle:focus,.wfls-open>.wfls-btn-warning.wfls-dropdown-toggle.focus{color:#fff;background-color:#d58512;border-color:#985f0d}.wfls-btn-warning:active,.wfls-btn-warning.wfls-active,.wfls-open>.wfls-btn-warning.wfls-dropdown-toggle{background-image:none}.wfls-btn-warning.wfls-disabled,.wfls-btn-warning[disabled],.wfls-btn-warning[readonly],fieldset[disabled] .wfls-btn-warning{color:#fff;background-color:#f5ca8c;border-color:#f4c37c;cursor:not-allowed;opacity:0.75}.wfls-btn-warning.wfls-disabled:hover,.wfls-btn-warning.wfls-disabled:focus,.wfls-btn-warning.wfls-disabled.wfls-focus,.wfls-btn-warning[disabled]:hover,.wfls-btn-warning[disabled]:focus,.wfls-btn-warning[disabled].wfls-focus,.wfls-btn-warning[readonly]:hover,.wfls-btn-warning[readonly]:focus,.wfls-btn-warning[readonly].wfls-focus,fieldset[disabled] .wfls-btn-warning:hover,fieldset[disabled] .wfls-btn-warning:focus,fieldset[disabled] .wfls-btn-warning.wfls-focus{background-color:#f0ad4e;border-color:#eea236}.wfls-btn-warning .wfls-badge{color:#f0ad4e;background-color:#fff}.wfls-btn-danger{color:#fff;background-color:#930000;border-color:#7a0000}.wfls-btn-danger:focus,.wfls-btn-danger.focus{color:#fff;background-color:#600000;border-color:#000}.wfls-btn-danger:hover{color:#fff;background-color:#600000;border-color:#3c0000}.wfls-btn-danger:active,.wfls-btn-danger.active,.wfls-open>.wfls-btn-danger.wfls-dropdown-toggle{color:#fff;background-color:#600000;border-color:#3c0000}.wfls-btn-danger:active:hover,.wfls-btn-danger:active:focus,.wfls-btn-danger:active.focus,.wfls-btn-danger.active:hover,.wfls-btn-danger.active:focus,.wfls-btn-danger.active.focus,.wfls-open>.wfls-btn-danger.wfls-dropdown-toggle:hover,.wfls-open>.wfls-btn-danger.wfls-dropdown-toggle:focus,.wfls-open>.wfls-btn-danger.wfls-dropdown-toggle.focus{color:#fff;background-color:#3c0000;border-color:#000}.wfls-btn-danger:active,.wfls-btn-danger.wfls-active,.wfls-open>.wfls-btn-danger.wfls-dropdown-toggle{background-image:none}.wfls-btn-danger.wfls-disabled,.wfls-btn-danger[disabled],.wfls-btn-danger[readonly],fieldset[disabled] .wfls-btn-danger{color:#fff;background-color:#b95959;border-color:#a95959;cursor:not-allowed;opacity:0.75}.wfls-btn-danger.wfls-disabled:hover,.wfls-btn-danger.wfls-disabled:focus,.wfls-btn-danger.wfls-disabled.wfls-focus,.wfls-btn-danger[disabled]:hover,.wfls-btn-danger[disabled]:focus,.wfls-btn-danger[disabled].wfls-focus,.wfls-btn-danger[readonly]:hover,.wfls-btn-danger[readonly]:focus,.wfls-btn-danger[readonly].wfls-focus,fieldset[disabled] .wfls-btn-danger:hover,fieldset[disabled] .wfls-btn-danger:focus,fieldset[disabled] .wfls-btn-danger.wfls-focus{background-color:#930000;border-color:#7a0000}.wfls-btn-danger .wfls-badge{color:#930000;background-color:#fff}.wfls-btn-callout{font-weight:600;text-transform:uppercase}.wfls-btn-callout-subtle{font-weight:400;text-transform:uppercase}.wfls-btn-link{color:#00709e;font-weight:normal;border-radius:0}.wfls-btn-link,.wfls-btn-link:active,.wfls-btn-link.wfls-active,.wfls-btn-link[disabled],fieldset[disabled] .wfls-btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.wfls-btn-link,.wfls-btn-link:hover,.wfls-btn-link:focus,.wfls-btn-link:active{border-color:transparent}.wfls-btn-link:hover,.wfls-btn-link:focus{color:#003a52;text-decoration:underline;background-color:transparent}.wfls-btn-link[disabled]:hover,.wfls-btn-link[disabled]:focus,fieldset[disabled] .wfls-btn-link:hover,fieldset[disabled] .wfls-btn-link:focus{color:#777;text-decoration:none}.wfls-btn-lg,.wfls-btn-group-lg>.wfls-btn{padding:10px 16px;font-size:18px;line-height:1.33333;border-radius:6px}.wfls-btn-sm,.wfls-btn-group-sm>.wfls-btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.wfls-btn-xs,.wfls-btn-group-xs>.wfls-btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.wfls-btn-block{display:block;width:100%}.wfls-btn-block+.wfls-btn-block{margin-top:5px}input[type="submit"].wfls-btn-block,input[type="reset"].wfls-btn-block,input[type="button"].wfls-btn-block{width:100%}.wfls-btn-group,.wfls-btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.wfls-btn-group>.wfls-btn,.wfls-btn-group-vertical>.wfls-btn{position:relative;float:left}.wfls-btn-group>.wfls-btn:hover,.wfls-btn-group>.wfls-btn:focus,.wfls-btn-group>.wfls-btn:active,.wfls-btn-group>.wfls-btn.wfls-active,.wfls-btn-group-vertical>.wfls-btn:hover,.wfls-btn-group-vertical>.wfls-btn:focus,.wfls-btn-group-vertical>.wfls-btn:active,.wfls-btn-group-vertical>.wfls-btn.wfls-active{z-index:2}.wfls-btn-group .wfls-btn+.wfls-btn,.wfls-btn-group .wfls-btn+.wfls-btn-group,.wfls-btn-group .wfls-btn-group+.wfls-btn,.wfls-btn-group .wfls-btn-group+.wfls-btn-group{margin-left:-1px}.wfls-btn-toolbar{margin-left:-5px}.wfls-btn-toolbar:before,.wfls-btn-toolbar:after{content:" ";display:table}.wfls-btn-toolbar:after{clear:both}.wfls-btn-toolbar .wfls-btn,.wfls-btn-toolbar .wfls-btn-group,.wfls-btn-toolbar .wfls-input-group{float:left}.wfls-btn-toolbar>.wfls-btn,.wfls-btn-toolbar>.wfls-btn-group,.wfls-btn-toolbar>.wfls-input-group{margin-left:5px}.wfls-btn-group>.wfls-btn:not(:first-child):not(:last-child):not(.wfls-dropdown-toggle){border-radius:0}.wfls-btn-group>.wfls-btn:first-child{margin-left:0}.wfls-btn-group>.wfls-btn:first-child:not(:last-child):not(.wfls-dropdown-toggle){-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0}.wfls-btn-group>.wfls-btn:last-child:not(:first-child),.wfls-btn-group>.wfls-dropdown-toggle:not(:first-child){-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0}.wfls-btn-group>.wfls-btn-group{float:left}.wfls-btn-group>.wfls-btn-group:not(:first-child):not(:last-child)>.wfls-btn{border-radius:0}.wfls-btn-group>.wfls-btn-group:first-child:not(:last-child)>.wfls-btn:last-child,.wfls-btn-group>.wfls-btn-group:first-child:not(:last-child)>.wfls-dropdown-toggle{-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0}.wfls-btn-group>.wfls-btn-group:last-child:not(:first-child)>.wfls-btn:first-child{-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0}.wfls-btn-group .wfls-dropdown-toggle:active,.wfls-btn-group.wfls-open .wfls-dropdown-toggle{outline:0}.wfls-btn-group>.wfls-btn+.wfls-dropdown-toggle{padding-left:8px;padding-right:8px}.wfls-btn-group>.wfls-btn-lg+.wfls-dropdown-toggle,.wfls-btn-group-lg.wfls-btn-group>.wfls-btn+.wfls-dropdown-toggle{padding-left:12px;padding-right:12px}.wfls-btn-group.open .wfls-dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.wfls-btn-group.open .wfls-dropdown-toggle.wfls-btn-link{-webkit-box-shadow:none;box-shadow:none}.wfls-btn .wfls-caret{margin-left:0}.wfls-btn-lg .wfls-caret,.wfls-btn-group-lg>.wfls-btn .wfls-caret{border-width:5px 5px 0;border-bottom-width:0}.wfls-dropup .wfls-btn-lg .wfls-caret,.wfls-dropup .wfls-btn-group-lg>.wfls-btn .wfls-caret{border-width:0 5px 5px}.wfls-btn-group-vertical>.wfls-btn,.wfls-btn-group-vertical>.wfls-btn-group,.wfls-btn-group-vertical>.wfls-btn-group>.wfls-btn{display:block;float:none;width:100%;max-width:100%}.wfls-btn-group-vertical>.wfls-btn-group:before,.wfls-btn-group-vertical>.wfls-btn-group:after{content:" ";display:table}.wfls-btn-group-vertical>.wfls-btn-group:after{clear:both}.wfls-btn-group-vertical>.wfls-btn-group>.wfls-btn{float:none}.wfls-btn-group-vertical>.wfls-btn+.wfls-btn,.wfls-btn-group-vertical>.wfls-btn+.wfls-btn-group,.wfls-btn-group-vertical>.wfls-btn-group+.wfls-btn,.wfls-btn-group-vertical>.wfls-btn-group+.wfls-btn-group{margin-top:-1px;margin-left:0}.wfls-btn-group-vertical>.wfls-btn:not(:first-child):not(:last-child){border-radius:0}.wfls-btn-group-vertical>.wfls-btn:first-child:not(:last-child){-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0}.wfls-btn-group-vertical>.wfls-btn:last-child:not(:first-child){-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px}.wfls-btn-group-vertical>.wfls-btn-group:not(:first-child):not(:last-child)>.wfls-btn{border-radius:0}.wfls-btn-group-vertical>.wfls-btn-group:first-child:not(:last-child)>.wfls-btn:last-child,.wfls-btn-group-vertical>.wfls-btn-group:first-child:not(:last-child)>.wfls-dropdown-toggle{-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0}.wfls-btn-group-vertical>.wfls-btn-group:last-child:not(:first-child)>.wfls-btn:first-child{-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0}.wfls-btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.wfls-btn-group-justified>.wfls-btn,.wfls-btn-group-justified>.wfls-btn-group{float:none;display:table-cell;width:1%}.wfls-btn-group-justified>.wfls-btn-group .wfls-btn{width:100%}.wfls-btn-group-justified>.wfls-btn-group .wfls-dropdown-menu{left:auto}[data-toggle="buttons"]>.wfls-btn input[type="radio"],[data-toggle="buttons"]>.wfls-btn input[type="checkbox"],[data-toggle="buttons"]>.wfls-btn-group>.wfls-btn input[type="radio"],[data-toggle="buttons"]>.wfls-btn-group>.wfls-btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.wfls-pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.wfls-pagination>li{display:inline}.wfls-pagination>li>a,.wfls-pagination>li>span{position:relative;float:left;padding:.5rem 1.25rem;line-height:1.42857;text-decoration:none;color:#00709e;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.wfls-pagination>li:first-child>a,.wfls-pagination>li:first-child>span{margin-left:0;-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px}.wfls-pagination>li:last-child>a,.wfls-pagination>li:last-child>span{-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px}.wfls-pagination>li>a:hover,.wfls-pagination>li>a:focus,.wfls-pagination>li>span:hover,.wfls-pagination>li>span:focus{z-index:2;color:#003a52;background-color:#e2e2e2;border-color:#ddd}.wfls-pagination>.wfls-active>a,.wfls-pagination>.wfls-active>a:hover,.wfls-pagination>.wfls-active>a:focus,.wfls-pagination>.wfls-active>span,.wfls-pagination>.wfls-active>span:hover,.wfls-pagination>.wfls-active>span:focus{z-index:3;color:#fff;background-color:#00709e;border-color:#00709e;cursor:default}.wfls-pagination>.wfls-disabled>span,.wfls-pagination>.wfls-disabled>span:hover,.wfls-pagination>.wfls-disabled>span:focus,.wfls-pagination>.wfls-disabled>a,.wfls-pagination>.wfls-disabled>a:hover,.wfls-pagination>.wfls-disabled>a:focus{color:#777;background-color:#fff;border-color:#ddd;cursor:not-allowed}.wfls-pagination-lg>li>a,.wfls-pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.33333}.wfls-pagination-lg>li:first-child>a,.wfls-pagination-lg>li:first-child>span{-moz-border-radius-topleft:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px}.wfls-pagination-lg>li:last-child>a,.wfls-pagination-lg>li:last-child>span{-moz-border-radius-topright:6px;-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-moz-border-radius-bottomright:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px}.wfls-pagination-sm>li>a,.wfls-pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.wfls-pagination-sm>li:first-child>a,.wfls-pagination-sm>li:first-child>span{-moz-border-radius-topleft:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px}.wfls-pagination-sm>li:last-child>a,.wfls-pagination-sm>li:last-child>span{-moz-border-radius-topright:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-moz-border-radius-bottomright:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px}#wfls-notices{margin-top:15px}#wfls-notices .wfls-admin-notice{margin-left:0px;margin-right:0px}.wfls-success-text,.wfls-notice-text{display:inline-block;vertical-align:middle;line-height:1.3;font-size:16px;font-weight:bold;font-style:italic}.wfls-notice{margin:12px 0;padding:8px;background-color:#ffffe0;border:1px solid #ffd975;border-width:1px 1px 1px 10px}.wfls-notice-text{color:#6d798c}.wfls-success{margin:12px 0;padding:8px;background-color:#ffffff;border:1px solid #16bc9b;border-width:1px 1px 1px 10px}.wfls-success-text{color:#11967a}.wfls-premium-callout{border:1px solid #dfdfdf;background-color:#ffffff;padding:16px;margin:20px 0 0;text-align:center}.wfls-premium-callout ul{margin:8px 0;padding:0 0 0 15px}.wfls-premium-callout ul li{list-style-type:disc;margin:0;padding:0}.wfls-premium-callout .center{text-align:center;margin:0}.wfls-premium-callout .button-primary{text-align:center;text-transform:uppercase;font-weight:bold;background-color:#00709e}#toplevel_page_WFLS .wp-menu-image img{max-width:16px;max-height:16px}
|
1 |
+
.wfls-clearfix:before,.wfls-clearfix:after{content:" ";display:table}.wfls-clearfix:after{clear:both}.wfls-btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;text-transform:uppercase;padding:.4rem 1rem;font-size:.875rem;line-height:1.3125rem;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media (min-width: 768px){.wfls-btn{padding:.5rem 1.25rem;font-size:.875rem;line-height:1.3125rem;border-radius:4px}}.wfls-btn:focus,.wfls-btn.wfls-focus,.wfls-btn:active:focus,.wfls-btn:active.wfls-focus,.wfls-btn.wfls-active:focus,.wfls-btn.wfls-active.wfls-focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.wfls-btn:hover,.wfls-btn:focus,.wfls-btn.wfls-focus{color:#00709e;text-decoration:none !important}.wfls-btn:active,.wfls-btn.wfls-active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.wfls-btn.wfls-disabled,.wfls-btn[disabled],.wfls-btn[readonly],fieldset[disabled] .wfls-btn{cursor:not-allowed;-webkit-box-shadow:none;box-shadow:none}a.wfls-btn{text-decoration:none}a.wfls-btn.wfls-disabled,fieldset[disabled] a.wfls-btn{cursor:not-allowed;pointer-events:none}.wfls-btn-default{color:#00709e;background-color:#fff;border-color:#00709e}.wfls-btn-default:focus,.wfls-btn-default.focus{color:#00709e;background-color:#e6e6e6;border-color:#00161f}.wfls-btn-default:hover{color:#00709e;background-color:#e6e6e6;border-color:#004561}.wfls-btn-default:active,.wfls-btn-default.active,.wfls-open>.wfls-btn-default.wfls-dropdown-toggle{color:#00709e;background-color:#e6e6e6;border-color:#004561}.wfls-btn-default:active:hover,.wfls-btn-default:active:focus,.wfls-btn-default:active.focus,.wfls-btn-default.active:hover,.wfls-btn-default.active:focus,.wfls-btn-default.active.focus,.wfls-open>.wfls-btn-default.wfls-dropdown-toggle:hover,.wfls-open>.wfls-btn-default.wfls-dropdown-toggle:focus,.wfls-open>.wfls-btn-default.wfls-dropdown-toggle.focus{color:#00709e;background-color:#d4d4d4;border-color:#00161f}.wfls-btn-default:active,.wfls-btn-default.wfls-active,.wfls-open>.wfls-btn-default.wfls-dropdown-toggle{background-image:none}.wfls-btn-default.wfls-disabled,.wfls-btn-default[disabled],.wfls-btn-default[readonly],fieldset[disabled] .wfls-btn-default{color:#777;background-color:#fff;border-color:#e2e2e2;cursor:not-allowed;opacity:0.75}.wfls-btn-default.wfls-disabled:hover,.wfls-btn-default.wfls-disabled:focus,.wfls-btn-default.wfls-disabled.wfls-focus,.wfls-btn-default[disabled]:hover,.wfls-btn-default[disabled]:focus,.wfls-btn-default[disabled].wfls-focus,.wfls-btn-default[readonly]:hover,.wfls-btn-default[readonly]:focus,.wfls-btn-default[readonly].wfls-focus,fieldset[disabled] .wfls-btn-default:hover,fieldset[disabled] .wfls-btn-default:focus,fieldset[disabled] .wfls-btn-default.wfls-focus{background-color:#fff;border-color:#00709e}.wfls-btn-default .wfls-badge{color:#fff;background-color:#00709e}.wfls-btn-primary{color:#fff;background-color:#00709e;border-color:#005e85}.wfls-btn-primary:focus,.wfls-btn-primary.focus{color:#fff;background-color:#004c6b;border-color:#000405}.wfls-btn-primary:hover{color:#fff;background-color:#004c6b;border-color:#003347}.wfls-btn-primary:active,.wfls-btn-primary.active,.wfls-open>.wfls-btn-primary.wfls-dropdown-toggle{color:#fff;background-color:#004c6b;border-color:#003347}.wfls-btn-primary:active:hover,.wfls-btn-primary:active:focus,.wfls-btn-primary:active.focus,.wfls-btn-primary.active:hover,.wfls-btn-primary.active:focus,.wfls-btn-primary.active.focus,.wfls-open>.wfls-btn-primary.wfls-dropdown-toggle:hover,.wfls-open>.wfls-btn-primary.wfls-dropdown-toggle:focus,.wfls-open>.wfls-btn-primary.wfls-dropdown-toggle.focus{color:#fff;background-color:#003347;border-color:#000405}.wfls-btn-primary:active,.wfls-btn-primary.wfls-active,.wfls-open>.wfls-btn-primary.wfls-dropdown-toggle{background-image:none}.wfls-btn-primary.wfls-disabled,.wfls-btn-primary[disabled],.wfls-btn-primary[readonly],fieldset[disabled] .wfls-btn-primary{color:#fff;background-color:#59a2c0;border-color:#5996b0;cursor:not-allowed;opacity:0.75}.wfls-btn-primary.wfls-disabled:hover,.wfls-btn-primary.wfls-disabled:focus,.wfls-btn-primary.wfls-disabled.wfls-focus,.wfls-btn-primary[disabled]:hover,.wfls-btn-primary[disabled]:focus,.wfls-btn-primary[disabled].wfls-focus,.wfls-btn-primary[readonly]:hover,.wfls-btn-primary[readonly]:focus,.wfls-btn-primary[readonly].wfls-focus,fieldset[disabled] .wfls-btn-primary:hover,fieldset[disabled] .wfls-btn-primary:focus,fieldset[disabled] .wfls-btn-primary.wfls-focus{background-color:#00709e;border-color:#005e85}.wfls-btn-primary .wfls-badge{color:#00709e;background-color:#fff}.wfls-btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.wfls-btn-success:focus,.wfls-btn-success.focus{color:#fff;background-color:#449d44;border-color:#255625}.wfls-btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.wfls-btn-success:active,.wfls-btn-success.active,.wfls-open>.wfls-btn-success.wfls-dropdown-toggle{color:#fff;background-color:#449d44;border-color:#398439}.wfls-btn-success:active:hover,.wfls-btn-success:active:focus,.wfls-btn-success:active.focus,.wfls-btn-success.active:hover,.wfls-btn-success.active:focus,.wfls-btn-success.active.focus,.wfls-open>.wfls-btn-success.wfls-dropdown-toggle:hover,.wfls-open>.wfls-btn-success.wfls-dropdown-toggle:focus,.wfls-open>.wfls-btn-success.wfls-dropdown-toggle.focus{color:#fff;background-color:#398439;border-color:#255625}.wfls-btn-success:active,.wfls-btn-success.wfls-active,.wfls-open>.wfls-btn-success.wfls-dropdown-toggle{background-image:none}.wfls-btn-success.wfls-disabled,.wfls-btn-success[disabled],.wfls-btn-success[readonly],fieldset[disabled] .wfls-btn-success{color:#fff;background-color:#95d195;border-color:#8bca8b;cursor:not-allowed;opacity:0.75}.wfls-btn-success.wfls-disabled:hover,.wfls-btn-success.wfls-disabled:focus,.wfls-btn-success.wfls-disabled.wfls-focus,.wfls-btn-success[disabled]:hover,.wfls-btn-success[disabled]:focus,.wfls-btn-success[disabled].wfls-focus,.wfls-btn-success[readonly]:hover,.wfls-btn-success[readonly]:focus,.wfls-btn-success[readonly].wfls-focus,fieldset[disabled] .wfls-btn-success:hover,fieldset[disabled] .wfls-btn-success:focus,fieldset[disabled] .wfls-btn-success.wfls-focus{background-color:#5cb85c;border-color:#4cae4c}.wfls-btn-success .wfls-badge{color:#5cb85c;background-color:#fff}.wfls-btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.wfls-btn-info:focus,.wfls-btn-info.focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.wfls-btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.wfls-btn-info:active,.wfls-btn-info.active,.wfls-open>.wfls-btn-info.wfls-dropdown-toggle{color:#fff;background-color:#31b0d5;border-color:#269abc}.wfls-btn-info:active:hover,.wfls-btn-info:active:focus,.wfls-btn-info:active.focus,.wfls-btn-info.active:hover,.wfls-btn-info.active:focus,.wfls-btn-info.active.focus,.wfls-open>.wfls-btn-info.wfls-dropdown-toggle:hover,.wfls-open>.wfls-btn-info.wfls-dropdown-toggle:focus,.wfls-open>.wfls-btn-info.wfls-dropdown-toggle.focus{color:#fff;background-color:#269abc;border-color:#1b6d85}.wfls-btn-info:active,.wfls-btn-info.wfls-active,.wfls-open>.wfls-btn-info.wfls-dropdown-toggle{background-image:none}.wfls-btn-info.wfls-disabled,.wfls-btn-info[disabled],.wfls-btn-info[readonly],fieldset[disabled] .wfls-btn-info{color:#fff;background-color:#94d6ea;border-color:#87d1e7;cursor:not-allowed;opacity:0.75}.wfls-btn-info.wfls-disabled:hover,.wfls-btn-info.wfls-disabled:focus,.wfls-btn-info.wfls-disabled.wfls-focus,.wfls-btn-info[disabled]:hover,.wfls-btn-info[disabled]:focus,.wfls-btn-info[disabled].wfls-focus,.wfls-btn-info[readonly]:hover,.wfls-btn-info[readonly]:focus,.wfls-btn-info[readonly].wfls-focus,fieldset[disabled] .wfls-btn-info:hover,fieldset[disabled] .wfls-btn-info:focus,fieldset[disabled] .wfls-btn-info.wfls-focus{background-color:#5bc0de;border-color:#46b8da}.wfls-btn-info .wfls-badge{color:#5bc0de;background-color:#fff}.wfls-btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.wfls-btn-warning:focus,.wfls-btn-warning.focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.wfls-btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.wfls-btn-warning:active,.wfls-btn-warning.active,.wfls-open>.wfls-btn-warning.wfls-dropdown-toggle{color:#fff;background-color:#ec971f;border-color:#d58512}.wfls-btn-warning:active:hover,.wfls-btn-warning:active:focus,.wfls-btn-warning:active.focus,.wfls-btn-warning.active:hover,.wfls-btn-warning.active:focus,.wfls-btn-warning.active.focus,.wfls-open>.wfls-btn-warning.wfls-dropdown-toggle:hover,.wfls-open>.wfls-btn-warning.wfls-dropdown-toggle:focus,.wfls-open>.wfls-btn-warning.wfls-dropdown-toggle.focus{color:#fff;background-color:#d58512;border-color:#985f0d}.wfls-btn-warning:active,.wfls-btn-warning.wfls-active,.wfls-open>.wfls-btn-warning.wfls-dropdown-toggle{background-image:none}.wfls-btn-warning.wfls-disabled,.wfls-btn-warning[disabled],.wfls-btn-warning[readonly],fieldset[disabled] .wfls-btn-warning{color:#fff;background-color:#f5ca8c;border-color:#f4c37c;cursor:not-allowed;opacity:0.75}.wfls-btn-warning.wfls-disabled:hover,.wfls-btn-warning.wfls-disabled:focus,.wfls-btn-warning.wfls-disabled.wfls-focus,.wfls-btn-warning[disabled]:hover,.wfls-btn-warning[disabled]:focus,.wfls-btn-warning[disabled].wfls-focus,.wfls-btn-warning[readonly]:hover,.wfls-btn-warning[readonly]:focus,.wfls-btn-warning[readonly].wfls-focus,fieldset[disabled] .wfls-btn-warning:hover,fieldset[disabled] .wfls-btn-warning:focus,fieldset[disabled] .wfls-btn-warning.wfls-focus{background-color:#f0ad4e;border-color:#eea236}.wfls-btn-warning .wfls-badge{color:#f0ad4e;background-color:#fff}.wfls-btn-danger{color:#fff;background-color:#930000;border-color:#7a0000}.wfls-btn-danger:focus,.wfls-btn-danger.focus{color:#fff;background-color:#600000;border-color:#000}.wfls-btn-danger:hover{color:#fff;background-color:#600000;border-color:#3c0000}.wfls-btn-danger:active,.wfls-btn-danger.active,.wfls-open>.wfls-btn-danger.wfls-dropdown-toggle{color:#fff;background-color:#600000;border-color:#3c0000}.wfls-btn-danger:active:hover,.wfls-btn-danger:active:focus,.wfls-btn-danger:active.focus,.wfls-btn-danger.active:hover,.wfls-btn-danger.active:focus,.wfls-btn-danger.active.focus,.wfls-open>.wfls-btn-danger.wfls-dropdown-toggle:hover,.wfls-open>.wfls-btn-danger.wfls-dropdown-toggle:focus,.wfls-open>.wfls-btn-danger.wfls-dropdown-toggle.focus{color:#fff;background-color:#3c0000;border-color:#000}.wfls-btn-danger:active,.wfls-btn-danger.wfls-active,.wfls-open>.wfls-btn-danger.wfls-dropdown-toggle{background-image:none}.wfls-btn-danger.wfls-disabled,.wfls-btn-danger[disabled],.wfls-btn-danger[readonly],fieldset[disabled] .wfls-btn-danger{color:#fff;background-color:#b95959;border-color:#a95959;cursor:not-allowed;opacity:0.75}.wfls-btn-danger.wfls-disabled:hover,.wfls-btn-danger.wfls-disabled:focus,.wfls-btn-danger.wfls-disabled.wfls-focus,.wfls-btn-danger[disabled]:hover,.wfls-btn-danger[disabled]:focus,.wfls-btn-danger[disabled].wfls-focus,.wfls-btn-danger[readonly]:hover,.wfls-btn-danger[readonly]:focus,.wfls-btn-danger[readonly].wfls-focus,fieldset[disabled] .wfls-btn-danger:hover,fieldset[disabled] .wfls-btn-danger:focus,fieldset[disabled] .wfls-btn-danger.wfls-focus{background-color:#930000;border-color:#7a0000}.wfls-btn-danger .wfls-badge{color:#930000;background-color:#fff}.wfls-btn-callout{font-weight:600;text-transform:uppercase}.wfls-btn-callout-subtle{font-weight:400;text-transform:uppercase}.wfls-btn-link{color:#00709e;font-weight:normal;border-radius:0}.wfls-btn-link,.wfls-btn-link:active,.wfls-btn-link.wfls-active,.wfls-btn-link[disabled],fieldset[disabled] .wfls-btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.wfls-btn-link,.wfls-btn-link:hover,.wfls-btn-link:focus,.wfls-btn-link:active{border-color:transparent}.wfls-btn-link:hover,.wfls-btn-link:focus{color:#003a52;text-decoration:underline;background-color:transparent}.wfls-btn-link[disabled]:hover,.wfls-btn-link[disabled]:focus,fieldset[disabled] .wfls-btn-link:hover,fieldset[disabled] .wfls-btn-link:focus{color:#777;text-decoration:none}.wfls-btn-lg,.wfls-btn-group-lg>.wfls-btn{padding:10px 16px;font-size:18px;line-height:1.33333;border-radius:6px}.wfls-btn-sm,.wfls-btn-group-sm>.wfls-btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.wfls-btn-xs,.wfls-btn-group-xs>.wfls-btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.wfls-btn-block{display:block;width:100%}.wfls-btn-block+.wfls-btn-block{margin-top:5px}input[type="submit"].wfls-btn-block,input[type="reset"].wfls-btn-block,input[type="button"].wfls-btn-block{width:100%}.wfls-btn-group,.wfls-btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.wfls-btn-group>.wfls-btn,.wfls-btn-group-vertical>.wfls-btn{position:relative;float:left}.wfls-btn-group>.wfls-btn:hover,.wfls-btn-group>.wfls-btn:focus,.wfls-btn-group>.wfls-btn:active,.wfls-btn-group>.wfls-btn.wfls-active,.wfls-btn-group-vertical>.wfls-btn:hover,.wfls-btn-group-vertical>.wfls-btn:focus,.wfls-btn-group-vertical>.wfls-btn:active,.wfls-btn-group-vertical>.wfls-btn.wfls-active{z-index:2}.wfls-btn-group .wfls-btn+.wfls-btn,.wfls-btn-group .wfls-btn+.wfls-btn-group,.wfls-btn-group .wfls-btn-group+.wfls-btn,.wfls-btn-group .wfls-btn-group+.wfls-btn-group{margin-left:-1px}.wfls-btn-toolbar{margin-left:-5px}.wfls-btn-toolbar:before,.wfls-btn-toolbar:after{content:" ";display:table}.wfls-btn-toolbar:after{clear:both}.wfls-btn-toolbar .wfls-btn,.wfls-btn-toolbar .wfls-btn-group,.wfls-btn-toolbar .wfls-input-group{float:left}.wfls-btn-toolbar>.wfls-btn,.wfls-btn-toolbar>.wfls-btn-group,.wfls-btn-toolbar>.wfls-input-group{margin-left:5px}.wfls-btn-group>.wfls-btn:not(:first-child):not(:last-child):not(.wfls-dropdown-toggle){border-radius:0}.wfls-btn-group>.wfls-btn:first-child{margin-left:0}.wfls-btn-group>.wfls-btn:first-child:not(:last-child):not(.wfls-dropdown-toggle){-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0}.wfls-btn-group>.wfls-btn:last-child:not(:first-child),.wfls-btn-group>.wfls-dropdown-toggle:not(:first-child){-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0}.wfls-btn-group>.wfls-btn-group{float:left}.wfls-btn-group>.wfls-btn-group:not(:first-child):not(:last-child)>.wfls-btn{border-radius:0}.wfls-btn-group>.wfls-btn-group:first-child:not(:last-child)>.wfls-btn:last-child,.wfls-btn-group>.wfls-btn-group:first-child:not(:last-child)>.wfls-dropdown-toggle{-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0}.wfls-btn-group>.wfls-btn-group:last-child:not(:first-child)>.wfls-btn:first-child{-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0}.wfls-btn-group .wfls-dropdown-toggle:active,.wfls-btn-group.wfls-open .wfls-dropdown-toggle{outline:0}.wfls-btn-group>.wfls-btn+.wfls-dropdown-toggle{padding-left:8px;padding-right:8px}.wfls-btn-group>.wfls-btn-lg+.wfls-dropdown-toggle,.wfls-btn-group-lg.wfls-btn-group>.wfls-btn+.wfls-dropdown-toggle{padding-left:12px;padding-right:12px}.wfls-btn-group.open .wfls-dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.wfls-btn-group.open .wfls-dropdown-toggle.wfls-btn-link{-webkit-box-shadow:none;box-shadow:none}.wfls-btn .wfls-caret{margin-left:0}.wfls-btn-lg .wfls-caret,.wfls-btn-group-lg>.wfls-btn .wfls-caret{border-width:5px 5px 0;border-bottom-width:0}.wfls-dropup .wfls-btn-lg .wfls-caret,.wfls-dropup .wfls-btn-group-lg>.wfls-btn .wfls-caret{border-width:0 5px 5px}.wfls-btn-group-vertical>.wfls-btn,.wfls-btn-group-vertical>.wfls-btn-group,.wfls-btn-group-vertical>.wfls-btn-group>.wfls-btn{display:block;float:none;width:100%;max-width:100%}.wfls-btn-group-vertical>.wfls-btn-group:before,.wfls-btn-group-vertical>.wfls-btn-group:after{content:" ";display:table}.wfls-btn-group-vertical>.wfls-btn-group:after{clear:both}.wfls-btn-group-vertical>.wfls-btn-group>.wfls-btn{float:none}.wfls-btn-group-vertical>.wfls-btn+.wfls-btn,.wfls-btn-group-vertical>.wfls-btn+.wfls-btn-group,.wfls-btn-group-vertical>.wfls-btn-group+.wfls-btn,.wfls-btn-group-vertical>.wfls-btn-group+.wfls-btn-group{margin-top:-1px;margin-left:0}.wfls-btn-group-vertical>.wfls-btn:not(:first-child):not(:last-child){border-radius:0}.wfls-btn-group-vertical>.wfls-btn:first-child:not(:last-child){-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0}.wfls-btn-group-vertical>.wfls-btn:last-child:not(:first-child){-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px}.wfls-btn-group-vertical>.wfls-btn-group:not(:first-child):not(:last-child)>.wfls-btn{border-radius:0}.wfls-btn-group-vertical>.wfls-btn-group:first-child:not(:last-child)>.wfls-btn:last-child,.wfls-btn-group-vertical>.wfls-btn-group:first-child:not(:last-child)>.wfls-dropdown-toggle{-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0}.wfls-btn-group-vertical>.wfls-btn-group:last-child:not(:first-child)>.wfls-btn:first-child{-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0}.wfls-btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.wfls-btn-group-justified>.wfls-btn,.wfls-btn-group-justified>.wfls-btn-group{float:none;display:table-cell;width:1%}.wfls-btn-group-justified>.wfls-btn-group .wfls-btn{width:100%}.wfls-btn-group-justified>.wfls-btn-group .wfls-dropdown-menu{left:auto}[data-toggle="buttons"]>.wfls-btn input[type="radio"],[data-toggle="buttons"]>.wfls-btn input[type="checkbox"],[data-toggle="buttons"]>.wfls-btn-group>.wfls-btn input[type="radio"],[data-toggle="buttons"]>.wfls-btn-group>.wfls-btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.wfls-pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.wfls-pagination>li{display:inline}.wfls-pagination>li>a,.wfls-pagination>li>span{position:relative;float:left;padding:.5rem 1.25rem;line-height:1.42857;text-decoration:none;color:#00709e;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.wfls-pagination>li:first-child>a,.wfls-pagination>li:first-child>span{margin-left:0;-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px}.wfls-pagination>li:last-child>a,.wfls-pagination>li:last-child>span{-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px}.wfls-pagination>li>a:hover,.wfls-pagination>li>a:focus,.wfls-pagination>li>span:hover,.wfls-pagination>li>span:focus{z-index:2;color:#003a52;background-color:#e2e2e2;border-color:#ddd}.wfls-pagination>.wfls-active>a,.wfls-pagination>.wfls-active>a:hover,.wfls-pagination>.wfls-active>a:focus,.wfls-pagination>.wfls-active>span,.wfls-pagination>.wfls-active>span:hover,.wfls-pagination>.wfls-active>span:focus{z-index:3;color:#fff;background-color:#00709e;border-color:#00709e;cursor:default}.wfls-pagination>.wfls-disabled>span,.wfls-pagination>.wfls-disabled>span:hover,.wfls-pagination>.wfls-disabled>span:focus,.wfls-pagination>.wfls-disabled>a,.wfls-pagination>.wfls-disabled>a:hover,.wfls-pagination>.wfls-disabled>a:focus{color:#777;background-color:#fff;border-color:#ddd;cursor:not-allowed}.wfls-pagination-lg>li>a,.wfls-pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.33333}.wfls-pagination-lg>li:first-child>a,.wfls-pagination-lg>li:first-child>span{-moz-border-radius-topleft:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px}.wfls-pagination-lg>li:last-child>a,.wfls-pagination-lg>li:last-child>span{-moz-border-radius-topright:6px;-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-moz-border-radius-bottomright:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px}.wfls-pagination-sm>li>a,.wfls-pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.wfls-pagination-sm>li:first-child>a,.wfls-pagination-sm>li:first-child>span{-moz-border-radius-topleft:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px}.wfls-pagination-sm>li:last-child>a,.wfls-pagination-sm>li:last-child>span{-moz-border-radius-topright:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-moz-border-radius-bottomright:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px}#wfls-notices{margin-top:15px}#wfls-notices .wfls-admin-notice{margin-left:0px;margin-right:0px}.wfls-success-text,.wfls-notice-text{display:inline-block;vertical-align:middle;line-height:1.3;font-size:16px;font-weight:bold;font-style:italic}.wfls-notice{margin:12px 0;padding:8px;background-color:#ffffe0;border:1px solid #ffd975;border-width:1px 1px 1px 10px}.wfls-notice-text{color:#6d798c}.wfls-success{margin:12px 0;padding:8px;background-color:#ffffff;border:1px solid #16bc9b;border-width:1px 1px 1px 10px}.wfls-success-text{color:#11967a}.wfls-premium-callout{border:1px solid #dfdfdf;background-color:#ffffff;padding:16px;margin:20px 0 0;text-align:center}.wfls-premium-callout ul{margin:8px 0;padding:0 0 0 15px}.wfls-premium-callout ul li{list-style-type:disc;margin:0;padding:0}.wfls-premium-callout .center{text-align:center;margin:0}.wfls-premium-callout .button-primary{text-align:center;text-transform:uppercase;font-weight:bold;background-color:#00709e}small.wfls-sub-status{display:block}.wfls-grace-period-container{display:flex;align-items:center;justify-content:left;margin-bottom:1rem;margin-top:1rem}.wfls-grace-period-container .wfls-grace-period-input-container{margin-right:1.5rem;text-align:center}.wfls-grace-period-container .wfls-grace-period-input-container label{display:block;font-weight:bold}.wfls-grace-period-container .wfls-grace-period-input-container input{width:3em;text-align:center}#wfls-reset-grace-period-failed{text-align:center}#toplevel_page_WFLS .wp-menu-image img{max-width:16px;max-height:16px}
|
css/admin.1610634190.css
DELETED
@@ -1 +0,0 @@
|
|
1 |
-
.wfls-clearfix:before,.wfls-clearfix:after{content:" ";display:table}.wfls-clearfix:after{clear:both}.wfls-btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;text-transform:uppercase;padding:.4rem 1rem;font-size:.875rem;line-height:1.3125rem;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media (min-width: 768px){.wfls-btn{padding:.5rem 1.25rem;font-size:.875rem;line-height:1.3125rem;border-radius:4px}}.wfls-btn:focus,.wfls-btn.wfls-focus,.wfls-btn:active:focus,.wfls-btn:active.wfls-focus,.wfls-btn.wfls-active:focus,.wfls-btn.wfls-active.wfls-focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.wfls-btn:hover,.wfls-btn:focus,.wfls-btn.wfls-focus{color:#00709e;text-decoration:none !important}.wfls-btn:active,.wfls-btn.wfls-active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.wfls-btn.wfls-disabled,.wfls-btn[disabled],.wfls-btn[readonly],fieldset[disabled] .wfls-btn{cursor:not-allowed;-webkit-box-shadow:none;box-shadow:none}a.wfls-btn{text-decoration:none}a.wfls-btn.wfls-disabled,fieldset[disabled] a.wfls-btn{cursor:not-allowed;pointer-events:none}.wfls-btn-default{color:#00709e;background-color:#fff;border-color:#00709e}.wfls-btn-default:focus,.wfls-btn-default.focus{color:#00709e;background-color:#e6e6e6;border-color:#00161f}.wfls-btn-default:hover{color:#00709e;background-color:#e6e6e6;border-color:#004561}.wfls-btn-default:active,.wfls-btn-default.active,.wfls-open>.wfls-btn-default.wfls-dropdown-toggle{color:#00709e;background-color:#e6e6e6;border-color:#004561}.wfls-btn-default:active:hover,.wfls-btn-default:active:focus,.wfls-btn-default:active.focus,.wfls-btn-default.active:hover,.wfls-btn-default.active:focus,.wfls-btn-default.active.focus,.wfls-open>.wfls-btn-default.wfls-dropdown-toggle:hover,.wfls-open>.wfls-btn-default.wfls-dropdown-toggle:focus,.wfls-open>.wfls-btn-default.wfls-dropdown-toggle.focus{color:#00709e;background-color:#d4d4d4;border-color:#00161f}.wfls-btn-default:active,.wfls-btn-default.wfls-active,.wfls-open>.wfls-btn-default.wfls-dropdown-toggle{background-image:none}.wfls-btn-default.wfls-disabled,.wfls-btn-default[disabled],.wfls-btn-default[readonly],fieldset[disabled] .wfls-btn-default{color:#777;background-color:#fff;border-color:#e2e2e2;cursor:not-allowed;opacity:0.75}.wfls-btn-default.wfls-disabled:hover,.wfls-btn-default.wfls-disabled:focus,.wfls-btn-default.wfls-disabled.wfls-focus,.wfls-btn-default[disabled]:hover,.wfls-btn-default[disabled]:focus,.wfls-btn-default[disabled].wfls-focus,.wfls-btn-default[readonly]:hover,.wfls-btn-default[readonly]:focus,.wfls-btn-default[readonly].wfls-focus,fieldset[disabled] .wfls-btn-default:hover,fieldset[disabled] .wfls-btn-default:focus,fieldset[disabled] .wfls-btn-default.wfls-focus{background-color:#fff;border-color:#00709e}.wfls-btn-default .wfls-badge{color:#fff;background-color:#00709e}.wfls-btn-primary{color:#fff;background-color:#00709e;border-color:#005e85}.wfls-btn-primary:focus,.wfls-btn-primary.focus{color:#fff;background-color:#004c6b;border-color:#000405}.wfls-btn-primary:hover{color:#fff;background-color:#004c6b;border-color:#003347}.wfls-btn-primary:active,.wfls-btn-primary.active,.wfls-open>.wfls-btn-primary.wfls-dropdown-toggle{color:#fff;background-color:#004c6b;border-color:#003347}.wfls-btn-primary:active:hover,.wfls-btn-primary:active:focus,.wfls-btn-primary:active.focus,.wfls-btn-primary.active:hover,.wfls-btn-primary.active:focus,.wfls-btn-primary.active.focus,.wfls-open>.wfls-btn-primary.wfls-dropdown-toggle:hover,.wfls-open>.wfls-btn-primary.wfls-dropdown-toggle:focus,.wfls-open>.wfls-btn-primary.wfls-dropdown-toggle.focus{color:#fff;background-color:#003347;border-color:#000405}.wfls-btn-primary:active,.wfls-btn-primary.wfls-active,.wfls-open>.wfls-btn-primary.wfls-dropdown-toggle{background-image:none}.wfls-btn-primary.wfls-disabled,.wfls-btn-primary[disabled],.wfls-btn-primary[readonly],fieldset[disabled] .wfls-btn-primary{color:#fff;background-color:#59a2c0;border-color:#5996b0;cursor:not-allowed;opacity:0.75}.wfls-btn-primary.wfls-disabled:hover,.wfls-btn-primary.wfls-disabled:focus,.wfls-btn-primary.wfls-disabled.wfls-focus,.wfls-btn-primary[disabled]:hover,.wfls-btn-primary[disabled]:focus,.wfls-btn-primary[disabled].wfls-focus,.wfls-btn-primary[readonly]:hover,.wfls-btn-primary[readonly]:focus,.wfls-btn-primary[readonly].wfls-focus,fieldset[disabled] .wfls-btn-primary:hover,fieldset[disabled] .wfls-btn-primary:focus,fieldset[disabled] .wfls-btn-primary.wfls-focus{background-color:#00709e;border-color:#005e85}.wfls-btn-primary .wfls-badge{color:#00709e;background-color:#fff}.wfls-btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.wfls-btn-success:focus,.wfls-btn-success.focus{color:#fff;background-color:#449d44;border-color:#255625}.wfls-btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.wfls-btn-success:active,.wfls-btn-success.active,.wfls-open>.wfls-btn-success.wfls-dropdown-toggle{color:#fff;background-color:#449d44;border-color:#398439}.wfls-btn-success:active:hover,.wfls-btn-success:active:focus,.wfls-btn-success:active.focus,.wfls-btn-success.active:hover,.wfls-btn-success.active:focus,.wfls-btn-success.active.focus,.wfls-open>.wfls-btn-success.wfls-dropdown-toggle:hover,.wfls-open>.wfls-btn-success.wfls-dropdown-toggle:focus,.wfls-open>.wfls-btn-success.wfls-dropdown-toggle.focus{color:#fff;background-color:#398439;border-color:#255625}.wfls-btn-success:active,.wfls-btn-success.wfls-active,.wfls-open>.wfls-btn-success.wfls-dropdown-toggle{background-image:none}.wfls-btn-success.wfls-disabled,.wfls-btn-success[disabled],.wfls-btn-success[readonly],fieldset[disabled] .wfls-btn-success{color:#fff;background-color:#95d195;border-color:#8bca8b;cursor:not-allowed;opacity:0.75}.wfls-btn-success.wfls-disabled:hover,.wfls-btn-success.wfls-disabled:focus,.wfls-btn-success.wfls-disabled.wfls-focus,.wfls-btn-success[disabled]:hover,.wfls-btn-success[disabled]:focus,.wfls-btn-success[disabled].wfls-focus,.wfls-btn-success[readonly]:hover,.wfls-btn-success[readonly]:focus,.wfls-btn-success[readonly].wfls-focus,fieldset[disabled] .wfls-btn-success:hover,fieldset[disabled] .wfls-btn-success:focus,fieldset[disabled] .wfls-btn-success.wfls-focus{background-color:#5cb85c;border-color:#4cae4c}.wfls-btn-success .wfls-badge{color:#5cb85c;background-color:#fff}.wfls-btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.wfls-btn-info:focus,.wfls-btn-info.focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.wfls-btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.wfls-btn-info:active,.wfls-btn-info.active,.wfls-open>.wfls-btn-info.wfls-dropdown-toggle{color:#fff;background-color:#31b0d5;border-color:#269abc}.wfls-btn-info:active:hover,.wfls-btn-info:active:focus,.wfls-btn-info:active.focus,.wfls-btn-info.active:hover,.wfls-btn-info.active:focus,.wfls-btn-info.active.focus,.wfls-open>.wfls-btn-info.wfls-dropdown-toggle:hover,.wfls-open>.wfls-btn-info.wfls-dropdown-toggle:focus,.wfls-open>.wfls-btn-info.wfls-dropdown-toggle.focus{color:#fff;background-color:#269abc;border-color:#1b6d85}.wfls-btn-info:active,.wfls-btn-info.wfls-active,.wfls-open>.wfls-btn-info.wfls-dropdown-toggle{background-image:none}.wfls-btn-info.wfls-disabled,.wfls-btn-info[disabled],.wfls-btn-info[readonly],fieldset[disabled] .wfls-btn-info{color:#fff;background-color:#94d6ea;border-color:#87d1e7;cursor:not-allowed;opacity:0.75}.wfls-btn-info.wfls-disabled:hover,.wfls-btn-info.wfls-disabled:focus,.wfls-btn-info.wfls-disabled.wfls-focus,.wfls-btn-info[disabled]:hover,.wfls-btn-info[disabled]:focus,.wfls-btn-info[disabled].wfls-focus,.wfls-btn-info[readonly]:hover,.wfls-btn-info[readonly]:focus,.wfls-btn-info[readonly].wfls-focus,fieldset[disabled] .wfls-btn-info:hover,fieldset[disabled] .wfls-btn-info:focus,fieldset[disabled] .wfls-btn-info.wfls-focus{background-color:#5bc0de;border-color:#46b8da}.wfls-btn-info .wfls-badge{color:#5bc0de;background-color:#fff}.wfls-btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.wfls-btn-warning:focus,.wfls-btn-warning.focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.wfls-btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.wfls-btn-warning:active,.wfls-btn-warning.active,.wfls-open>.wfls-btn-warning.wfls-dropdown-toggle{color:#fff;background-color:#ec971f;border-color:#d58512}.wfls-btn-warning:active:hover,.wfls-btn-warning:active:focus,.wfls-btn-warning:active.focus,.wfls-btn-warning.active:hover,.wfls-btn-warning.active:focus,.wfls-btn-warning.active.focus,.wfls-open>.wfls-btn-warning.wfls-dropdown-toggle:hover,.wfls-open>.wfls-btn-warning.wfls-dropdown-toggle:focus,.wfls-open>.wfls-btn-warning.wfls-dropdown-toggle.focus{color:#fff;background-color:#d58512;border-color:#985f0d}.wfls-btn-warning:active,.wfls-btn-warning.wfls-active,.wfls-open>.wfls-btn-warning.wfls-dropdown-toggle{background-image:none}.wfls-btn-warning.wfls-disabled,.wfls-btn-warning[disabled],.wfls-btn-warning[readonly],fieldset[disabled] .wfls-btn-warning{color:#fff;background-color:#f5ca8c;border-color:#f4c37c;cursor:not-allowed;opacity:0.75}.wfls-btn-warning.wfls-disabled:hover,.wfls-btn-warning.wfls-disabled:focus,.wfls-btn-warning.wfls-disabled.wfls-focus,.wfls-btn-warning[disabled]:hover,.wfls-btn-warning[disabled]:focus,.wfls-btn-warning[disabled].wfls-focus,.wfls-btn-warning[readonly]:hover,.wfls-btn-warning[readonly]:focus,.wfls-btn-warning[readonly].wfls-focus,fieldset[disabled] .wfls-btn-warning:hover,fieldset[disabled] .wfls-btn-warning:focus,fieldset[disabled] .wfls-btn-warning.wfls-focus{background-color:#f0ad4e;border-color:#eea236}.wfls-btn-warning .wfls-badge{color:#f0ad4e;background-color:#fff}.wfls-btn-danger{color:#fff;background-color:#930000;border-color:#7a0000}.wfls-btn-danger:focus,.wfls-btn-danger.focus{color:#fff;background-color:#600000;border-color:#000}.wfls-btn-danger:hover{color:#fff;background-color:#600000;border-color:#3c0000}.wfls-btn-danger:active,.wfls-btn-danger.active,.wfls-open>.wfls-btn-danger.wfls-dropdown-toggle{color:#fff;background-color:#600000;border-color:#3c0000}.wfls-btn-danger:active:hover,.wfls-btn-danger:active:focus,.wfls-btn-danger:active.focus,.wfls-btn-danger.active:hover,.wfls-btn-danger.active:focus,.wfls-btn-danger.active.focus,.wfls-open>.wfls-btn-danger.wfls-dropdown-toggle:hover,.wfls-open>.wfls-btn-danger.wfls-dropdown-toggle:focus,.wfls-open>.wfls-btn-danger.wfls-dropdown-toggle.focus{color:#fff;background-color:#3c0000;border-color:#000}.wfls-btn-danger:active,.wfls-btn-danger.wfls-active,.wfls-open>.wfls-btn-danger.wfls-dropdown-toggle{background-image:none}.wfls-btn-danger.wfls-disabled,.wfls-btn-danger[disabled],.wfls-btn-danger[readonly],fieldset[disabled] .wfls-btn-danger{color:#fff;background-color:#b95959;border-color:#a95959;cursor:not-allowed;opacity:0.75}.wfls-btn-danger.wfls-disabled:hover,.wfls-btn-danger.wfls-disabled:focus,.wfls-btn-danger.wfls-disabled.wfls-focus,.wfls-btn-danger[disabled]:hover,.wfls-btn-danger[disabled]:focus,.wfls-btn-danger[disabled].wfls-focus,.wfls-btn-danger[readonly]:hover,.wfls-btn-danger[readonly]:focus,.wfls-btn-danger[readonly].wfls-focus,fieldset[disabled] .wfls-btn-danger:hover,fieldset[disabled] .wfls-btn-danger:focus,fieldset[disabled] .wfls-btn-danger.wfls-focus{background-color:#930000;border-color:#7a0000}.wfls-btn-danger .wfls-badge{color:#930000;background-color:#fff}.wfls-btn-callout{font-weight:600;text-transform:uppercase}.wfls-btn-callout-subtle{font-weight:400;text-transform:uppercase}.wfls-btn-link{color:#00709e;font-weight:normal;border-radius:0}.wfls-btn-link,.wfls-btn-link:active,.wfls-btn-link.wfls-active,.wfls-btn-link[disabled],fieldset[disabled] .wfls-btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.wfls-btn-link,.wfls-btn-link:hover,.wfls-btn-link:focus,.wfls-btn-link:active{border-color:transparent}.wfls-btn-link:hover,.wfls-btn-link:focus{color:#003a52;text-decoration:underline;background-color:transparent}.wfls-btn-link[disabled]:hover,.wfls-btn-link[disabled]:focus,fieldset[disabled] .wfls-btn-link:hover,fieldset[disabled] .wfls-btn-link:focus{color:#777;text-decoration:none}.wfls-btn-lg,.wfls-btn-group-lg>.wfls-btn{padding:10px 16px;font-size:18px;line-height:1.33333;border-radius:6px}.wfls-btn-sm,.wfls-btn-group-sm>.wfls-btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.wfls-btn-xs,.wfls-btn-group-xs>.wfls-btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.wfls-btn-block{display:block;width:100%}.wfls-btn-block+.wfls-btn-block{margin-top:5px}input[type="submit"].wfls-btn-block,input[type="reset"].wfls-btn-block,input[type="button"].wfls-btn-block{width:100%}.wfls-btn-group,.wfls-btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.wfls-btn-group>.wfls-btn,.wfls-btn-group-vertical>.wfls-btn{position:relative;float:left}.wfls-btn-group>.wfls-btn:hover,.wfls-btn-group>.wfls-btn:focus,.wfls-btn-group>.wfls-btn:active,.wfls-btn-group>.wfls-btn.wfls-active,.wfls-btn-group-vertical>.wfls-btn:hover,.wfls-btn-group-vertical>.wfls-btn:focus,.wfls-btn-group-vertical>.wfls-btn:active,.wfls-btn-group-vertical>.wfls-btn.wfls-active{z-index:2}.wfls-btn-group .wfls-btn+.wfls-btn,.wfls-btn-group .wfls-btn+.wfls-btn-group,.wfls-btn-group .wfls-btn-group+.wfls-btn,.wfls-btn-group .wfls-btn-group+.wfls-btn-group{margin-left:-1px}.wfls-btn-toolbar{margin-left:-5px}.wfls-btn-toolbar:before,.wfls-btn-toolbar:after{content:" ";display:table}.wfls-btn-toolbar:after{clear:both}.wfls-btn-toolbar .wfls-btn,.wfls-btn-toolbar .wfls-btn-group,.wfls-btn-toolbar .wfls-input-group{float:left}.wfls-btn-toolbar>.wfls-btn,.wfls-btn-toolbar>.wfls-btn-group,.wfls-btn-toolbar>.wfls-input-group{margin-left:5px}.wfls-btn-group>.wfls-btn:not(:first-child):not(:last-child):not(.wfls-dropdown-toggle){border-radius:0}.wfls-btn-group>.wfls-btn:first-child{margin-left:0}.wfls-btn-group>.wfls-btn:first-child:not(:last-child):not(.wfls-dropdown-toggle){-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0}.wfls-btn-group>.wfls-btn:last-child:not(:first-child),.wfls-btn-group>.wfls-dropdown-toggle:not(:first-child){-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0}.wfls-btn-group>.wfls-btn-group{float:left}.wfls-btn-group>.wfls-btn-group:not(:first-child):not(:last-child)>.wfls-btn{border-radius:0}.wfls-btn-group>.wfls-btn-group:first-child:not(:last-child)>.wfls-btn:last-child,.wfls-btn-group>.wfls-btn-group:first-child:not(:last-child)>.wfls-dropdown-toggle{-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0}.wfls-btn-group>.wfls-btn-group:last-child:not(:first-child)>.wfls-btn:first-child{-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0}.wfls-btn-group .wfls-dropdown-toggle:active,.wfls-btn-group.wfls-open .wfls-dropdown-toggle{outline:0}.wfls-btn-group>.wfls-btn+.wfls-dropdown-toggle{padding-left:8px;padding-right:8px}.wfls-btn-group>.wfls-btn-lg+.wfls-dropdown-toggle,.wfls-btn-group-lg.wfls-btn-group>.wfls-btn+.wfls-dropdown-toggle{padding-left:12px;padding-right:12px}.wfls-btn-group.open .wfls-dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.wfls-btn-group.open .wfls-dropdown-toggle.wfls-btn-link{-webkit-box-shadow:none;box-shadow:none}.wfls-btn .wfls-caret{margin-left:0}.wfls-btn-lg .wfls-caret,.wfls-btn-group-lg>.wfls-btn .wfls-caret{border-width:5px 5px 0;border-bottom-width:0}.wfls-dropup .wfls-btn-lg .wfls-caret,.wfls-dropup .wfls-btn-group-lg>.wfls-btn .wfls-caret{border-width:0 5px 5px}.wfls-btn-group-vertical>.wfls-btn,.wfls-btn-group-vertical>.wfls-btn-group,.wfls-btn-group-vertical>.wfls-btn-group>.wfls-btn{display:block;float:none;width:100%;max-width:100%}.wfls-btn-group-vertical>.wfls-btn-group:before,.wfls-btn-group-vertical>.wfls-btn-group:after{content:" ";display:table}.wfls-btn-group-vertical>.wfls-btn-group:after{clear:both}.wfls-btn-group-vertical>.wfls-btn-group>.wfls-btn{float:none}.wfls-btn-group-vertical>.wfls-btn+.wfls-btn,.wfls-btn-group-vertical>.wfls-btn+.wfls-btn-group,.wfls-btn-group-vertical>.wfls-btn-group+.wfls-btn,.wfls-btn-group-vertical>.wfls-btn-group+.wfls-btn-group{margin-top:-1px;margin-left:0}.wfls-btn-group-vertical>.wfls-btn:not(:first-child):not(:last-child){border-radius:0}.wfls-btn-group-vertical>.wfls-btn:first-child:not(:last-child){-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0}.wfls-btn-group-vertical>.wfls-btn:last-child:not(:first-child){-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px}.wfls-btn-group-vertical>.wfls-btn-group:not(:first-child):not(:last-child)>.wfls-btn{border-radius:0}.wfls-btn-group-vertical>.wfls-btn-group:first-child:not(:last-child)>.wfls-btn:last-child,.wfls-btn-group-vertical>.wfls-btn-group:first-child:not(:last-child)>.wfls-dropdown-toggle{-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0}.wfls-btn-group-vertical>.wfls-btn-group:last-child:not(:first-child)>.wfls-btn:first-child{-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0}.wfls-btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.wfls-btn-group-justified>.wfls-btn,.wfls-btn-group-justified>.wfls-btn-group{float:none;display:table-cell;width:1%}.wfls-btn-group-justified>.wfls-btn-group .wfls-btn{width:100%}.wfls-btn-group-justified>.wfls-btn-group .wfls-dropdown-menu{left:auto}[data-toggle="buttons"]>.wfls-btn input[type="radio"],[data-toggle="buttons"]>.wfls-btn input[type="checkbox"],[data-toggle="buttons"]>.wfls-btn-group>.wfls-btn input[type="radio"],[data-toggle="buttons"]>.wfls-btn-group>.wfls-btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.wfls-pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.wfls-pagination>li{display:inline}.wfls-pagination>li>a,.wfls-pagination>li>span{position:relative;float:left;padding:.5rem 1.25rem;line-height:1.42857;text-decoration:none;color:#00709e;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.wfls-pagination>li:first-child>a,.wfls-pagination>li:first-child>span{margin-left:0;-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px}.wfls-pagination>li:last-child>a,.wfls-pagination>li:last-child>span{-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px}.wfls-pagination>li>a:hover,.wfls-pagination>li>a:focus,.wfls-pagination>li>span:hover,.wfls-pagination>li>span:focus{z-index:2;color:#003a52;background-color:#e2e2e2;border-color:#ddd}.wfls-pagination>.wfls-active>a,.wfls-pagination>.wfls-active>a:hover,.wfls-pagination>.wfls-active>a:focus,.wfls-pagination>.wfls-active>span,.wfls-pagination>.wfls-active>span:hover,.wfls-pagination>.wfls-active>span:focus{z-index:3;color:#fff;background-color:#00709e;border-color:#00709e;cursor:default}.wfls-pagination>.wfls-disabled>span,.wfls-pagination>.wfls-disabled>span:hover,.wfls-pagination>.wfls-disabled>span:focus,.wfls-pagination>.wfls-disabled>a,.wfls-pagination>.wfls-disabled>a:hover,.wfls-pagination>.wfls-disabled>a:focus{color:#777;background-color:#fff;border-color:#ddd;cursor:not-allowed}.wfls-pagination-lg>li>a,.wfls-pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.33333}.wfls-pagination-lg>li:first-child>a,.wfls-pagination-lg>li:first-child>span{-moz-border-radius-topleft:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px}.wfls-pagination-lg>li:last-child>a,.wfls-pagination-lg>li:last-child>span{-moz-border-radius-topright:6px;-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-moz-border-radius-bottomright:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px}.wfls-pagination-sm>li>a,.wfls-pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.wfls-pagination-sm>li:first-child>a,.wfls-pagination-sm>li:first-child>span{-moz-border-radius-topleft:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px}.wfls-pagination-sm>li:last-child>a,.wfls-pagination-sm>li:last-child>span{-moz-border-radius-topright:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-moz-border-radius-bottomright:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px}@-ms-viewport{width:device-width}.wfls-visible-xs{display:none !important}.wfls-visible-sm{display:none !important}.wfls-visible-md{display:none !important}.wfls-visible-lg{display:none !important}.wfls-visible-xs-block,.wfls-visible-xs-inline,.wfls-visible-xs-inline-block,.wfls-visible-sm-block,.wfls-visible-sm-inline,.wfls-visible-sm-inline-block,.wfls-visible-md-block,.wfls-visible-md-inline,.wfls-visible-md-inline-block,.wfls-visible-lg-block,.wfls-visible-lg-inline,.wfls-visible-lg-inline-block{display:none !important}@media (max-width: 767px){.wfls-visible-xs{display:block !important}table.wfls-visible-xs{display:table !important}tr.wfls-visible-xs{display:table-row !important}th.wfls-visible-xs,td.wfls-visible-xs{display:table-cell !important}}@media (max-width: 767px){.wfls-visible-xs-block{display:block !important}}@media (max-width: 767px){.wfls-visible-xs-inline{display:inline !important}}@media (max-width: 767px){.wfls-visible-xs-inline-block{display:inline-block !important}}@media (min-width: 768px) and (max-width: 991px){.wfls-visible-sm{display:block !important}table.wfls-visible-sm{display:table !important}tr.wfls-visible-sm{display:table-row !important}th.wfls-visible-sm,td.wfls-visible-sm{display:table-cell !important}}@media (min-width: 768px) and (max-width: 991px){.wfls-visible-sm-block{display:block !important}}@media (min-width: 768px) and (max-width: 991px){.wfls-visible-sm-inline{display:inline !important}}@media (min-width: 768px) and (max-width: 991px){.wfls-visible-sm-inline-block{display:inline-block !important}}@media (min-width: 992px) and (max-width: 1199px){.wfls-visible-md{display:block !important}table.wfls-visible-md{display:table !important}tr.wfls-visible-md{display:table-row !important}th.wfls-visible-md,td.wfls-visible-md{display:table-cell !important}}@media (min-width: 992px) and (max-width: 1199px){.wfls-visible-md-block{display:block !important}}@media (min-width: 992px) and (max-width: 1199px){.wfls-visible-md-inline{display:inline !important}}@media (min-width: 992px) and (max-width: 1199px){.wfls-visible-md-inline-block{display:inline-block !important}}@media (min-width: 1200px){.wfls-visible-lg{display:block !important}table.wfls-visible-lg{display:table !important}tr.wfls-visible-lg{display:table-row !important}th.wfls-visible-lg,td.wfls-visible-lg{display:table-cell !important}}@media (min-width: 1200px){.wfls-visible-lg-block{display:block !important}}@media (min-width: 1200px){.wfls-visible-lg-inline{display:inline !important}}@media (min-width: 1200px){.wfls-visible-lg-inline-block{display:inline-block !important}}@media (max-width: 767px){.wfls-hidden-xs{display:none !important}}@media (min-width: 768px) and (max-width: 991px){.wfls-hidden-sm{display:none !important}}@media (min-width: 992px) and (max-width: 1199px){.wfls-hidden-md{display:none !important}}@media (min-width: 1200px){.wfls-hidden-lg{display:none !important}}.wfls-visible-print{display:none !important}@media print{.wfls-visible-print{display:block !important}table.wfls-visible-print{display:table !important}tr.wfls-visible-print{display:table-row !important}th.wfls-visible-print,td.wfls-visible-print{display:table-cell !important}}.wfls-visible-print-block{display:none !important}@media print{.wfls-visible-print-block{display:block !important}}.wfls-visible-print-inline{display:none !important}@media print{.wfls-visible-print-inline{display:inline !important}}.wfls-visible-print-inline-block{display:none !important}@media print{.wfls-visible-print-inline-block{display:inline-block !important}}@media print{.wfls-hidden-print{display:none !important}}.wfls-container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.wfls-container:before,.wfls-container:after{content:" ";display:table}.wfls-container:after{clear:both}@media (min-width: 768px){.wfls-container{width:750px}}@media (min-width: 992px){.wfls-container{width:970px}}@media (min-width: 1200px){.wfls-container{width:1170px}}.wfls-container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.wfls-container-fluid:before,.wfls-container-fluid:after{content:" ";display:table}.wfls-container-fluid:after{clear:both}.wfls-row{margin-left:-15px;margin-right:-15px}.wfls-row:before,.wfls-row:after{content:" ";display:table}.wfls-row:after{clear:both}.wfls-col-xs-1,.wfls-col-sm-1,.wfls-col-md-1,.wfls-col-lg-1,.wfls-col-xs-2,.wfls-col-sm-2,.wfls-col-md-2,.wfls-col-lg-2,.wfls-col-xs-3,.wfls-col-sm-3,.wfls-col-md-3,.wfls-col-lg-3,.wfls-col-xs-4,.wfls-col-sm-4,.wfls-col-md-4,.wfls-col-lg-4,.wfls-col-xs-5,.wfls-col-sm-5,.wfls-col-md-5,.wfls-col-lg-5,.wfls-col-xs-6,.wfls-col-sm-6,.wfls-col-md-6,.wfls-col-lg-6,.wfls-col-xs-7,.wfls-col-sm-7,.wfls-col-md-7,.wfls-col-lg-7,.wfls-col-xs-8,.wfls-col-sm-8,.wfls-col-md-8,.wfls-col-lg-8,.wfls-col-xs-9,.wfls-col-sm-9,.wfls-col-md-9,.wfls-col-lg-9,.wfls-col-xs-10,.wfls-col-sm-10,.wfls-col-md-10,.wfls-col-lg-10,.wfls-col-xs-11,.wfls-col-sm-11,.wfls-col-md-11,.wfls-col-lg-11,.wfls-col-xs-12,.wfls-col-sm-12,.wfls-col-md-12,.wfls-col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px;box-sizing:border-box}.wfls-col-xs-1,.wfls-col-xs-2,.wfls-col-xs-3,.wfls-col-xs-4,.wfls-col-xs-5,.wfls-col-xs-6,.wfls-col-xs-7,.wfls-col-xs-8,.wfls-col-xs-9,.wfls-col-xs-10,.wfls-col-xs-11,.wfls-col-xs-12{float:left}.wfls-col-xs-1{width:8.33333%}.wfls-col-xs-2{width:16.66667%}.wfls-col-xs-3{width:25%}.wfls-col-xs-4{width:33.33333%}.wfls-col-xs-5{width:41.66667%}.wfls-col-xs-6{width:50%}.wfls-col-xs-7{width:58.33333%}.wfls-col-xs-8{width:66.66667%}.wfls-col-xs-9{width:75%}.wfls-col-xs-10{width:83.33333%}.wfls-col-xs-11{width:91.66667%}.wfls-col-xs-12{width:100%}.wfls-col-xs-pull-0{right:auto}.wfls-col-xs-pull-1{right:8.33333%}.wfls-col-xs-pull-2{right:16.66667%}.wfls-col-xs-pull-3{right:25%}.wfls-col-xs-pull-4{right:33.33333%}.wfls-col-xs-pull-5{right:41.66667%}.wfls-col-xs-pull-6{right:50%}.wfls-col-xs-pull-7{right:58.33333%}.wfls-col-xs-pull-8{right:66.66667%}.wfls-col-xs-pull-9{right:75%}.wfls-col-xs-pull-10{right:83.33333%}.wfls-col-xs-pull-11{right:91.66667%}.wfls-col-xs-pull-12{right:100%}.wfls-col-xs-push-0{left:auto}.wfls-col-xs-push-1{left:8.33333%}.wfls-col-xs-push-2{left:16.66667%}.wfls-col-xs-push-3{left:25%}.wfls-col-xs-push-4{left:33.33333%}.wfls-col-xs-push-5{left:41.66667%}.wfls-col-xs-push-6{left:50%}.wfls-col-xs-push-7{left:58.33333%}.wfls-col-xs-push-8{left:66.66667%}.wfls-col-xs-push-9{left:75%}.wfls-col-xs-push-10{left:83.33333%}.wfls-col-xs-push-11{left:91.66667%}.wfls-col-xs-push-12{left:100%}.wfls-col-xs-offset-0{margin-left:0%}.wfls-col-xs-offset-1{margin-left:8.33333%}.wfls-col-xs-offset-2{margin-left:16.66667%}.wfls-col-xs-offset-3{margin-left:25%}.wfls-col-xs-offset-4{margin-left:33.33333%}.wfls-col-xs-offset-5{margin-left:41.66667%}.wfls-col-xs-offset-6{margin-left:50%}.wfls-col-xs-offset-7{margin-left:58.33333%}.wfls-col-xs-offset-8{margin-left:66.66667%}.wfls-col-xs-offset-9{margin-left:75%}.wfls-col-xs-offset-10{margin-left:83.33333%}.wfls-col-xs-offset-11{margin-left:91.66667%}.wfls-col-xs-offset-12{margin-left:100%}.wfls-col-xs-half-padding-left{padding-left:8px}.wfls-col-xs-half-padding-right{padding-right:7px}@media (min-width: 768px){.wfls-col-sm-1,.wfls-col-sm-2,.wfls-col-sm-3,.wfls-col-sm-4,.wfls-col-sm-5,.wfls-col-sm-6,.wfls-col-sm-7,.wfls-col-sm-8,.wfls-col-sm-9,.wfls-col-sm-10,.wfls-col-sm-11,.wfls-col-sm-12{float:left}.wfls-col-sm-1{width:8.33333%}.wfls-col-sm-2{width:16.66667%}.wfls-col-sm-3{width:25%}.wfls-col-sm-4{width:33.33333%}.wfls-col-sm-5{width:41.66667%}.wfls-col-sm-6{width:50%}.wfls-col-sm-7{width:58.33333%}.wfls-col-sm-8{width:66.66667%}.wfls-col-sm-9{width:75%}.wfls-col-sm-10{width:83.33333%}.wfls-col-sm-11{width:91.66667%}.wfls-col-sm-12{width:100%}.wfls-col-sm-pull-0{right:auto}.wfls-col-sm-pull-1{right:8.33333%}.wfls-col-sm-pull-2{right:16.66667%}.wfls-col-sm-pull-3{right:25%}.wfls-col-sm-pull-4{right:33.33333%}.wfls-col-sm-pull-5{right:41.66667%}.wfls-col-sm-pull-6{right:50%}.wfls-col-sm-pull-7{right:58.33333%}.wfls-col-sm-pull-8{right:66.66667%}.wfls-col-sm-pull-9{right:75%}.wfls-col-sm-pull-10{right:83.33333%}.wfls-col-sm-pull-11{right:91.66667%}.wfls-col-sm-pull-12{right:100%}.wfls-col-sm-push-0{left:auto}.wfls-col-sm-push-1{left:8.33333%}.wfls-col-sm-push-2{left:16.66667%}.wfls-col-sm-push-3{left:25%}.wfls-col-sm-push-4{left:33.33333%}.wfls-col-sm-push-5{left:41.66667%}.wfls-col-sm-push-6{left:50%}.wfls-col-sm-push-7{left:58.33333%}.wfls-col-sm-push-8{left:66.66667%}.wfls-col-sm-push-9{left:75%}.wfls-col-sm-push-10{left:83.33333%}.wfls-col-sm-push-11{left:91.66667%}.wfls-col-sm-push-12{left:100%}.wfls-col-sm-offset-0{margin-left:0%}.wfls-col-sm-offset-1{margin-left:8.33333%}.wfls-col-sm-offset-2{margin-left:16.66667%}.wfls-col-sm-offset-3{margin-left:25%}.wfls-col-sm-offset-4{margin-left:33.33333%}.wfls-col-sm-offset-5{margin-left:41.66667%}.wfls-col-sm-offset-6{margin-left:50%}.wfls-col-sm-offset-7{margin-left:58.33333%}.wfls-col-sm-offset-8{margin-left:66.66667%}.wfls-col-sm-offset-9{margin-left:75%}.wfls-col-sm-offset-10{margin-left:83.33333%}.wfls-col-sm-offset-11{margin-left:91.66667%}.wfls-col-sm-offset-12{margin-left:100%}.wfls-col-sm-half-padding-left{padding-left:8px}.wfls-col-sm-half-padding-right{padding-right:7px}}@media (min-width: 992px){.wfls-col-md-1,.wfls-col-md-2,.wfls-col-md-3,.wfls-col-md-4,.wfls-col-md-5,.wfls-col-md-6,.wfls-col-md-7,.wfls-col-md-8,.wfls-col-md-9,.wfls-col-md-10,.wfls-col-md-11,.wfls-col-md-12{float:left}.wfls-col-md-1{width:8.33333%}.wfls-col-md-2{width:16.66667%}.wfls-col-md-3{width:25%}.wfls-col-md-4{width:33.33333%}.wfls-col-md-5{width:41.66667%}.wfls-col-md-6{width:50%}.wfls-col-md-7{width:58.33333%}.wfls-col-md-8{width:66.66667%}.wfls-col-md-9{width:75%}.wfls-col-md-10{width:83.33333%}.wfls-col-md-11{width:91.66667%}.wfls-col-md-12{width:100%}.wfls-col-md-pull-0{right:auto}.wfls-col-md-pull-1{right:8.33333%}.wfls-col-md-pull-2{right:16.66667%}.wfls-col-md-pull-3{right:25%}.wfls-col-md-pull-4{right:33.33333%}.wfls-col-md-pull-5{right:41.66667%}.wfls-col-md-pull-6{right:50%}.wfls-col-md-pull-7{right:58.33333%}.wfls-col-md-pull-8{right:66.66667%}.wfls-col-md-pull-9{right:75%}.wfls-col-md-pull-10{right:83.33333%}.wfls-col-md-pull-11{right:91.66667%}.wfls-col-md-pull-12{right:100%}.wfls-col-md-push-0{left:auto}.wfls-col-md-push-1{left:8.33333%}.wfls-col-md-push-2{left:16.66667%}.wfls-col-md-push-3{left:25%}.wfls-col-md-push-4{left:33.33333%}.wfls-col-md-push-5{left:41.66667%}.wfls-col-md-push-6{left:50%}.wfls-col-md-push-7{left:58.33333%}.wfls-col-md-push-8{left:66.66667%}.wfls-col-md-push-9{left:75%}.wfls-col-md-push-10{left:83.33333%}.wfls-col-md-push-11{left:91.66667%}.wfls-col-md-push-12{left:100%}.wfls-col-md-offset-0{margin-left:0%}.wfls-col-md-offset-1{margin-left:8.33333%}.wfls-col-md-offset-2{margin-left:16.66667%}.wfls-col-md-offset-3{margin-left:25%}.wfls-col-md-offset-4{margin-left:33.33333%}.wfls-col-md-offset-5{margin-left:41.66667%}.wfls-col-md-offset-6{margin-left:50%}.wfls-col-md-offset-7{margin-left:58.33333%}.wfls-col-md-offset-8{margin-left:66.66667%}.wfls-col-md-offset-9{margin-left:75%}.wfls-col-md-offset-10{margin-left:83.33333%}.wfls-col-md-offset-11{margin-left:91.66667%}.wfls-col-md-offset-12{margin-left:100%}.wfls-col-md-half-padding-left{padding-left:8px}.wfls-col-md-half-padding-right{padding-right:7px}}@media (min-width: 1200px){.wfls-col-lg-1,.wfls-col-lg-2,.wfls-col-lg-3,.wfls-col-lg-4,.wfls-col-lg-5,.wfls-col-lg-6,.wfls-col-lg-7,.wfls-col-lg-8,.wfls-col-lg-9,.wfls-col-lg-10,.wfls-col-lg-11,.wfls-col-lg-12{float:left}.wfls-col-lg-1{width:8.33333%}.wfls-col-lg-2{width:16.66667%}.wfls-col-lg-3{width:25%}.wfls-col-lg-4{width:33.33333%}.wfls-col-lg-5{width:41.66667%}.wfls-col-lg-6{width:50%}.wfls-col-lg-7{width:58.33333%}.wfls-col-lg-8{width:66.66667%}.wfls-col-lg-9{width:75%}.wfls-col-lg-10{width:83.33333%}.wfls-col-lg-11{width:91.66667%}.wfls-col-lg-12{width:100%}.wfls-col-lg-pull-0{right:auto}.wfls-col-lg-pull-1{right:8.33333%}.wfls-col-lg-pull-2{right:16.66667%}.wfls-col-lg-pull-3{right:25%}.wfls-col-lg-pull-4{right:33.33333%}.wfls-col-lg-pull-5{right:41.66667%}.wfls-col-lg-pull-6{right:50%}.wfls-col-lg-pull-7{right:58.33333%}.wfls-col-lg-pull-8{right:66.66667%}.wfls-col-lg-pull-9{right:75%}.wfls-col-lg-pull-10{right:83.33333%}.wfls-col-lg-pull-11{right:91.66667%}.wfls-col-lg-pull-12{right:100%}.wfls-col-lg-push-0{left:auto}.wfls-col-lg-push-1{left:8.33333%}.wfls-col-lg-push-2{left:16.66667%}.wfls-col-lg-push-3{left:25%}.wfls-col-lg-push-4{left:33.33333%}.wfls-col-lg-push-5{left:41.66667%}.wfls-col-lg-push-6{left:50%}.wfls-col-lg-push-7{left:58.33333%}.wfls-col-lg-push-8{left:66.66667%}.wfls-col-lg-push-9{left:75%}.wfls-col-lg-push-10{left:83.33333%}.wfls-col-lg-push-11{left:91.66667%}.wfls-col-lg-push-12{left:100%}.wfls-col-lg-offset-0{margin-left:0%}.wfls-col-lg-offset-1{margin-left:8.33333%}.wfls-col-lg-offset-2{margin-left:16.66667%}.wfls-col-lg-offset-3{margin-left:25%}.wfls-col-lg-offset-4{margin-left:33.33333%}.wfls-col-lg-offset-5{margin-left:41.66667%}.wfls-col-lg-offset-6{margin-left:50%}.wfls-col-lg-offset-7{margin-left:58.33333%}.wfls-col-lg-offset-8{margin-left:66.66667%}.wfls-col-lg-offset-9{margin-left:75%}.wfls-col-lg-offset-10{margin-left:83.33333%}.wfls-col-lg-offset-11{margin-left:91.66667%}.wfls-col-lg-offset-12{margin-left:100%}.wfls-col-lg-half-padding-left{padding-left:8px}.wfls-col-lg-half-padding-right{padding-right:7px}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}label.wfls-plain{font-weight:normal}label.wfls-control-label.wfls-disabled{pointer-events:none}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:1.5rem;font-size:14px;line-height:1.42857;color:#555}.wfls-form-control{display:block;width:100%;height:38px;padding:.5rem 1.25rem;font-size:14px;line-height:1.42857;color:#555;background-color:#fff;background-image:none;border:1px solid #ddd;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s;-o-transition:border-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s;transition:border-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s}.wfls-form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6)}.wfls-form-control::-moz-placeholder{color:#bfbfbf;opacity:1}.wfls-form-control:-ms-input-placeholder{color:#bfbfbf}.wfls-form-control::-webkit-input-placeholder{color:#bfbfbf}.wfls-form-control::-ms-expand{border:0;background-color:transparent}.wfls-form-control[disabled],.wfls-form-control[readonly],fieldset[disabled] .wfls-form-control{background-color:#e2e2e2;opacity:1}.wfls-form-control[disabled],.wfls-form-control[readonly],fieldset[disabled] .wfls-form-control{cursor:not-allowed;pointer-events:none}textarea.wfls-form-control{height:auto}input[type="search"]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio: 0){input[type="date"].wfls-form-control,input[type="time"].wfls-form-control,input[type="datetime-local"].wfls-form-control,input[type="month"].wfls-form-control{line-height:38px}input[type="date"].wfls-input-sm,.wfls-input-group-sm input[type="date"],input[type="time"].wfls-input-sm,.wfls-input-group-sm input[type="time"],input[type="datetime-local"].wfls-input-sm,.wfls-input-group-sm input[type="datetime-local"],input[type="month"].wfls-input-sm,.wfls-input-group-sm input[type="month"]{line-height:30px}input[type="date"].wfls-input-lg,.wfls-input-group-lg input[type="date"],input[type="time"].wfls-input-lg,.wfls-input-group-lg input[type="time"],input[type="datetime-local"].wfls-input-lg,.wfls-input-group-lg input[type="datetime-local"],input[type="month"].wfls-input-lg,.wfls-input-group-lg input[type="month"]{line-height:46px}}.wfls-form-group{margin-bottom:8px}.wfls-form-group.wfls-sub-group label{color:#666666;font-weight:normal;padding-left:20px}.wfls-form-group.wfls-focus{border-left:4px solid #11967a;padding-bottom:8px;background-color:#e5e5e5}.wfls-form-group.wfls-focus label{margin-left:-4px}.wfls-radio,.wfls-checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.wfls-radio label,.wfls-checkbox label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.wfls-radio input[type="radio"],.wfls-radio-inline input[type="radio"],.wfls-checkbox input[type="checkbox"],.wfls-checkbox-inline input[type="checkbox"]{margin-top:4px \9}.wfls-radio-offset{padding-left:29px}@media (min-width: 768px){.wfls-radio-offset{padding-left:20px}}.wfls-radio+.wfls-radio,.wfls-checkbox+.wfls-checkbox{margin-top:-5px}.wfls-radio-inline,.wfls-checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.wfls-radio-inline+.wfls-radio-inline,.wfls-checkbox-inline+.wfls-checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="radio"][readonly],input[type="radio"].wfls-disabled,fieldset[disabled] input[type="radio"],input[type="checkbox"][disabled],input[type="checkbox"][readonly],input[type="checkbox"].wfls-disabled,fieldset[disabled] input[type="checkbox"]{cursor:not-allowed;pointer-events:none}.wfls-radio-inline.wfls-disabled,fieldset[disabled] .wfls-radio-inline,.wfls-checkbox-inline.wfls-disabled,fieldset[disabled] .wfls-checkbox-inline{cursor:not-allowed}.wfls-radio.wfls-disabled label,fieldset[disabled] .wfls-radio label,.wfls-checkbox.wfls-disabled label,fieldset[disabled] .wfls-checkbox label{cursor:not-allowed;pointer-events:none}.wfls-form-control-static{padding-top:1.5rem;padding-bottom:1.5rem;margin:0;line-height:1}.wfls-form-control-static.wfls-input-lg,.wfls-form-control-static.wfls-input-sm{padding-left:0;padding-right:0}.wfls-input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.wfls-input-sm{height:30px;line-height:30px}textarea.wfls-input-sm,select[multiple].wfls-input-sm{height:auto}.wfls-form-group-sm .wfls-form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.wfls-form-group-sm select.wfls-form-control{height:30px;line-height:30px}.wfls-form-group-sm textarea.wfls-form-control,.wfls-form-group-sm select[multiple].wfls-form-control{height:auto}.wfls-form-group-sm .wfls-form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.wfls-input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.33333;border-radius:6px}select.wfls-input-lg{height:46px;line-height:46px}textarea.wfls-input-lg,select[multiple].wfls-input-lg{height:auto}.wfls-form-group-lg .wfls-form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.33333;border-radius:6px}.wfls-form-group-lg select.wfls-form-control{height:46px;line-height:46px}.wfls-form-group-lg textarea.wfls-form-control,.wfls-form-group-lg select[multiple].wfls-form-control{height:auto}.wfls-form-group-lg .wfls-form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.33333}.wfls-has-feedback{position:relative}.wfls-has-feedback .wfls-form-control{padding-right:47.5px}.wfls-form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:38px;height:38px;line-height:38px;text-align:center;pointer-events:none}.wfls-input-lg+.wfls-form-control-feedback,.wfls-input-group-lg+.wfls-form-control-feedback,.wfls-form-group-lg .wfls-form-control+.wfls-form-control-feedback{width:46px;height:46px;line-height:46px}.wfls-input-sm+.wfls-form-control-feedback,.wfls-input-group-sm+.wfls-form-control-feedback,.wfls-form-group-sm .wfls-form-control+.wfls-form-control-feedback{width:30px;height:30px;line-height:30px}.wfls-has-success .wfls-help-block,.wfls-has-success .wfls-control-label,.wfls-has-success .wfls-radio,.wfls-has-success .wfls-checkbox,.wfls-has-success .wfls-radio-inline,.wfls-has-success .wfls-checkbox-inline,.wfls-has-success.wfls-radio label,.wfls-has-success.wfls-checkbox label,.wfls-has-success.wfls-radio-inline label,.wfls-has-success.wfls-checkbox-inline label{color:#3c763d}.wfls-has-success .wfls-form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.wfls-has-success .wfls-form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168}.wfls-has-success .wfls-input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.wfls-has-success .wfls-form-control-feedback{color:#3c763d}.wfls-has-warning .wfls-help-block,.wfls-has-warning .wfls-control-label,.wfls-has-warning .wfls-radio,.wfls-has-warning .wfls-checkbox,.wfls-has-warning .wfls-radio-inline,.wfls-has-warning .wfls-checkbox-inline,.wfls-has-warning.wfls-radio label,.wfls-has-warning.wfls-checkbox label,.wfls-has-warning.wfls-radio-inline label,.wfls-has-warning.wfls-checkbox-inline label{color:#8a6d3b}.wfls-has-warning .wfls-form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.wfls-has-warning .wfls-form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b}.wfls-has-warning .wfls-input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.wfls-has-warning .wfls-form-control-feedback{color:#8a6d3b}.wfls-has-error .wfls-help-block,.wfls-has-error .wfls-control-label,.wfls-has-error .wfls-radio,.wfls-has-error .wfls-checkbox,.wfls-has-error .wfls-radio-inline,.wfls-has-error .wfls-checkbox-inline,.wfls-has-error.wfls-radio label,.wfls-has-error.wfls-checkbox label,.wfls-has-error.wfls-radio-inline label,.wfls-has-error.wfls-checkbox-inline label{color:#a94442}.wfls-has-error .wfls-form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.wfls-has-error .wfls-form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483}.wfls-has-error .wfls-input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.wfls-has-error .wfls-form-control-feedback{color:#a94442}.wfls-has-feedback label ~ .wfls-form-control-feedback{top:25px}.wfls-has-feedback label.wfls-sr-only ~ .wfls-form-control-feedback{top:0}.wfls-help-block{display:block;margin-top:5px;color:#737373}@media (min-width: 768px){.wfls-form-inline .wfls-form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.wfls-form-inline .wfls-form-control{display:inline-block;width:auto;vertical-align:middle}.wfls-form-inline .wfls-form-control-static{display:inline-block}.wfls-form-inline .wfls-input-group{display:inline-table;vertical-align:middle}.wfls-form-inline .wfls-input-group .wfls-input-group-addon,.wfls-form-inline .wfls-input-group .wfls-input-group-btn,.wfls-form-inline .wfls-input-group .wfls-form-control{width:auto}.wfls-form-inline .wfls-input-group>.wfls-form-control{width:100%}.wfls-form-inline .wfls-control-label{margin-bottom:0;vertical-align:middle}.wfls-form-inline .wfls-radio,.wfls-form-inline .wfls-checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.wfls-form-inline .wfls-radio label,.wfls-form-inline .wfls-checkbox label{padding-left:0}.wfls-form-inline .wfls-radio input[type="radio"],.wfls-form-inline .wfls-checkbox input[type="checkbox"]{position:relative;margin-left:0}.wfls-form-inline .wfls-has-feedback .wfls-form-control-feedback{top:0}}.wfls-form-horizontal .wfls-radio,.wfls-form-horizontal .wfls-checkbox,.wfls-form-horizontal .wfls-radio-inline,.wfls-form-horizontal .wfls-checkbox-inline{margin-top:0;margin-bottom:0;padding-top:1.5rem}.wfls-form-horizontal .wfls-radio,.wfls-form-horizontal .wfls-checkbox{min-height:29px}.wfls-form-horizontal .wfls-form-group{margin-left:-15px;margin-right:-15px}.wfls-form-horizontal .wfls-form-group:before,.wfls-form-horizontal .wfls-form-group:after{content:" ";display:table}.wfls-form-horizontal .wfls-form-group:after{clear:both}@media (min-width: 768px){.wfls-form-horizontal .wfls-control-label{text-align:right;margin-bottom:0;padding-top:1.5rem}}.wfls-form-horizontal .wfls-has-feedback .wfls-form-control-feedback{right:15px}@media (min-width: 768px){.wfls-form-horizontal .wfls-form-group-lg .wfls-control-label{padding-top:11px;font-size:18px}}@media (min-width: 768px){.wfls-form-horizontal .wfls-form-group-sm .wfls-control-label{padding-top:6px;font-size:12px}}@media (min-width: 768px){#input-recaptchaSiteKey,#input-recaptchaSecret{min-width:400px}}hr.wfls-half{border:0 !important;border-bottom:1px solid #e4e4e4 !important;width:50%;margin:1.25rem auto}.wrap.wordfence-ls{direction:ltr}@media (min-width: 768px){.wrap.wordfence-ls{max-width:750px}}@media (min-width: 992px){.wrap.wordfence-ls{max-width:970px}}@media (min-width: 1200px){.wrap.wordfence-ls{max-width:1170px}}.wrap.wordfence-ls>.wfls-container-fluid{padding-left:0px;padding-right:0px}.wrap.wordfence-ls .button-primary{text-align:center;text-transform:uppercase;font-weight:bold;background-color:#00709e}.wrap.wordfence-ls a{text-decoration:none}.wrap.wordfence-ls a:hover{text-decoration:underline}.wrap.wordfence-ls a.wfls-btn:hover{text-decoration:none}.wrap.wordfence-ls p,.wrap.wordfence-ls td,.wrap.wordfence-ls li{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:.875rem;color:#2d2d2d;line-height:1.3125;font-weight:normal}.wrap.wordfence-ls p strong,.wrap.wordfence-ls td strong,.wrap.wordfence-ls li strong{font-weight:600}.wrap.wordfence-ls p em,.wrap.wordfence-ls td em,.wrap.wordfence-ls li em{font-weight:normal}.wrap.wordfence-ls h1,.wrap.wordfence-ls h2,.wrap.wordfence-ls h3,.wrap.wordfence-ls h4,.wrap.wordfence-ls h5,.wrap.wordfence-ls h6{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;color:#2d2d2d;font-weight:700}.wrap.wordfence-ls h2{font-size:1.3125rem;line-height:1.5}.wrap.wordfence-ls h3{font-size:1.125rem}.wrap.wordfence-ls h4{font-size:1rem}a{color:#00709e}.wfls-inline-help{color:#9f9fa0}.wfls-inline-help:hover{color:#00709e}.wordfenceWrap{margin:20px 0 0 20px}#wfHeading:after{content:'.';visibility:hidden;display:block;clear:both;height:0px}.wfls-header-icon{background-image:url(../img/header.svg);width:32px;height:32px;background-position:0 0;background-repeat:no-repeat;padding:0;margin:0 5px 0 0;float:left}a.wfhelp{margin:0 3px 0 3px;text-decoration:none;display:inline-block;vertical-align:middle;font:normal normal normal 14px/1 FontAwesome;text-rendering:auto;-webkit-font-smoothing:antialiased}a.wfhelp:before{content:'\f29c'}.wordfence .resulticon{display:block;float:left;width:16px;height:16px;background-position:0 0;background-repeat:no-repeat;border-width:0;padding:0;margin:0 3px 0 0;background-image:url(../img/icons/bullet_yellow.png)}.wordfenceBoldTD{font-weight:bold}.wfAjax24{display:none;width:24px;height:24px;background-image:url(../img/icons/ajax24.gif);margin:0;padding:0}div.wfLoadingWhite32{width:32px;height:32px;background-image:url(../img/icons/ajaxWhite32x32.gif);margin:0;padding:0}.wfTabsContainer{background-color:#FFF;overflow:hidden;border:1px solid #CCC;padding:15px;min-height:200px;-webkit-font-smoothing:antialiased}#wfTabs::after{content:".";display:block;height:0;width:0;line-height:0;clear:both;visibility:hidden}#wfTabs a{float:left;z-index:10;height:18px;margin:0 5px -1px 0;padding:5px 8px;border:1px solid #CCC;text-decoration:none;background-color:#EFEFEF;color:#21759B;-moz-border-radius-topright:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-moz-border-radius-topleft:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px}#wfTabs a.selected{border-bottom:1px solid #FFF;background-color:#FFF;color:#777}.wordfenceTopTab{display:none;margin-top:15px}.wordfenceTopTab.active{display:block}.wordfenceHelpLink{margin-top:15px}.wfAjaxLight128{background-image:url(../img/icons/ajax3.gif)}.wfStrong{font-weight:bold}.wordfenceModeElem{width:1px;height:1px;opacity:0}.wfWarn{color:#F00}img.wfFlag{vertical-align:middle;margin:-3px 4px 0 0}.wfHitTime{font-style:italic}.wfAvatar img{vertical-align:middle;margin-right:0.5rem}.wfls-hex-sequence{color:#587ECB}.wfLoadMoreButton.disabled,.wfLoadMoreButton[disabled]{pointer-events:none;opacity:0.65}table.wfConfigForm th{font-weight:normal;text-align:left;padding:2px 3px 1px 0;vertical-align:middle}table.wfConfigForm td{vertical-align:middle}table.wfConfigForm td.align-top{vertical-align:top}table th.wfConfigEnable{font-weight:bold;min-width:25%}.wfSavedMsg{display:none;color:#A00}table th.wfSubheading{font-weight:bold;padding-top:10px}h3.wfConfigHeading{font-size:22px;color:#777;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-style:italic;font-weight:normal}.wfTipText{color:#777;font-family:Georgia,Times New Roman,Times,serif;font-style:italic}.wfBlackCursor{color:#FFF}.wfls-spinner{display:inline-block;width:4px}.wferror{color:#F00}#wordfenceWorking{padding:10px 40px 6px 16px;z-index:100000;position:fixed;right:16px;bottom:0px;background-color:#fcb214;border:5px solid #fcb214;border-width:6px 15px 6px 6px;color:#525355;font-size:12px;font-weight:bold;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;background-image:url("../img/icons/working-indicator.gif");background-position:100% 50%;background-repeat:no-repeat}@media (max-width: 960px){#wordfenceWorking{left:auto;right:0px}}#paidWrap{position:relative}.paidInnerMsg{width:500px;margin:150px auto 0 auto;color:#000;font-size:18px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;line-height:1.8em;text-align:center;-webkit-font-smoothing:antialiased}.wfMarker{height:1px;width:1px}.wfPaidOnlyNotice{width:500px;background-color:#FFFFE0;border:1px solid #000;padding:10px;margin:20px}.wfOnOffSwitch{display:inline-block;position:relative !important;width:69px !important;-webkit-user-select:none !important;-moz-user-select:none !important;-ms-user-select:none !important;user-select:none !important}.wfOnOffSwitch-checkbox{display:none !important}.wfOnOffSwitch-label{display:block !important;overflow:hidden !important;cursor:pointer !important;border:2px solid #999999 !important;border-radius:19px !important;margin:0}.wfOnOffSwitch-inner{width:200% !important;margin-left:-100% !important;-webkit-transition:margin 0.3s ease-in !important;-o-transition:margin 0.3s ease-in !important;transition:margin 0.3s ease-in !important;-webkit-transition-delay:0s !important;transition-delay:0s !important}.wfOnOffSwitch-inner:before,.wfOnOffSwitch-inner:after{float:left !important;width:50% !important;height:19px !important;padding:0 !important;line-height:19px !important;font-size:14px !important;color:white !important;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif !important;font-weight:bold !important;-webkit-box-sizing:border-box !important;-moz-box-sizing:border-box !important;box-sizing:border-box !important;-moz-border-radius:19px !important;-webkit-border-radius:19px;border-radius:19px !important;-webkit-box-shadow:0 9.5px 0 rgba(0,0,0,0.08) inset !important;box-shadow:0 9.5px 0 rgba(0,0,0,0.08) inset !important}.wfOnOffSwitch-inner:before{content:"ON" !important;padding-left:10px !important;background-color:#30D965 !important;color:#FFFFFF !important;-moz-border-radius:19px 0 0 19px !important;-webkit-border-radius:19px;border-radius:19px 0 0 19px !important}.wfOnOffSwitch-inner:after{content:"OFF" !important;padding-right:10px !important;background-color:#EEEEEE !important;color:#999999 !important;text-align:right !important;-moz-border-radius:0 19px 19px 0 !important;-webkit-border-radius:0;border-radius:0 19px 19px 0 !important}.wfOnOffSwitch-switch{width:19px !important;margin:0 !important;background:#FFFFFF !important;border:2px solid #999999 !important;-moz-border-radius:19px !important;-webkit-border-radius:19px;border-radius:19px !important;position:absolute !important;top:0 !important;bottom:0 !important;right:46px !important;-webkit-transition:all 0.3s ease-in !important;-o-transition:all 0.3s ease-in !important;transition:all 0.3s ease-in !important;-webkit-transition-delay:0s !important;transition-delay:0s !important;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzAwMDAwMCIgc3RvcC1vcGFjaXR5PSIwLjEiLz48c3RvcCBvZmZzZXQ9IjgwJSIgc3RvcC1jb2xvcj0iIzAwMDAwMCIgc3RvcC1vcGFjaXR5PSIwLjAiLz48L2xpbmVhckdyYWRpZW50PjwvZGVmcz48cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBmaWxsPSJ1cmwoI2dyYWQpIiAvPjwvc3ZnPiA=') !important;background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, rgba(0,0,0,0.1)),color-stop(80%, rgba(0,0,0,0))) !important;background-image:-moz-linear-gradient(center top, rgba(0,0,0,0.1) 0%,rgba(0,0,0,0) 80%) !important;background-image:-webkit-linear-gradient(center top, rgba(0,0,0,0.1) 0%,rgba(0,0,0,0) 80%) !important;background-image:linear-gradient(to center bottom, rgba(0,0,0,0.1) 0%,rgba(0,0,0,0) 80%) !important;box-shadow:0 1px 1px white inset !important}.wfOnOffSwitch-checkbox:checked+.wfOnOffSwitch-label .wfOnOffSwitch-inner{margin-left:0 !important}.wfOnOffSwitch-checkbox:checked+.wfOnOffSwitch-label .wfOnOffSwitch-switch{right:0 !important}#wordfenceConfigWarning,#wordfenceAdminEmailWarning{clear:left;margin-top:5px}.wfls-striped-table{width:100%;max-width:100%;border-collapse:collapse}.wfls-striped-table th{border-left:1px solid #bdbdbd}.wfls-striped-table th:first-of-type{border-left:0}.wfls-striped-table th,.wfls-striped-table td{padding:1rem}.wfls-striped-table thead th,.wfls-striped-table thead td,.wfls-striped-table tfoot th,.wfls-striped-table tfoot td,.wfls-striped-table tbody.thead th,.wfls-striped-table tbody.thead td{background-color:#ebebeb;color:#777;font-weight:bold;text-align:left}.wfls-striped-table tbody tr.even td,.wfls-striped-table tbody tr:nth-child(2n) td{background-color:#ffffff}.wfls-striped-table tbody tr td,.wfls-striped-table tbody tr.odd td{background-color:#fafafa}.wfls-striped-table tbody tr:hover>td{background-color:#fffbd8}.wfls-striped-table tbody.empty-row tr td{border-width:0;padding:8px 0;background-color:transparent}.wfls-striped-table .wfls-result-error,.wfls-block-list .wfls-result-error{color:#d0514c !important;font-weight:bold}.wfls-striped-table .wfls-result-error:before,.wfls-block-list .wfls-result-error:before{content:"\2718"}.wfls-striped-table .wfls-result-success{max-width:20%}.wfls-striped-table .wfls-result-success,.wfls-block-list .wfls-result-success{color:#008c10 !important;font-weight:bold}.wfls-striped-table .wfls-result-success:before,.wfls-block-list .wfls-result-success:before{content:"\2713"}.wfls-striped-table .wfls-result-success:before,.wfls-block-list .wfls-result-success:before,.wfls-striped-table .wfls-result-error:before,.wfls-block-list .wfls-result-error:before{font-size:16px;display:inline-block;margin:0px 8px 0px 0px}.wfls-striped-table .wfls-result-inactive,.wfls-block-list .wfls-result-inactive{font-weight:bold;color:#666666 !important}.wfls-fixed-table{table-layout:fixed}pre.wfls-pre{margin:8px 0 20px;padding:12px;background:#ffffff;border:1px solid #999999;overflow:auto}.wfls-center{text-align:center}#wfConfigForm,.wfls-diagnostics-wrapper{max-width:1035px}.wfls-hidden{display:none !important}.wfls-card{position:relative;margin:0 auto .625rem;padding:1rem;box-sizing:border-box;background:#fff;box-shadow:0 0 0 1px rgba(200,215,225,0.5),0 1px 2px #e9eff3}.wfls-card .wfls-card-inner{min-height:76px;width:100%;padding:8px;box-sizing:border-box;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;position:relative}.wfls-card .wfls-card-inner .wfls-card-content{max-width:75%}.wfls-card .wfls-card-inner .wfls-card-content .wfls-card-title{font-size:1.125rem;width:100%}.wfls-card .wfls-card-inner .wfls-card-content .wfls-card-subtitle{margin-top:.125rem;margin-bottom:.125rem;font-size:.875rem;color:#4f748e}.wfls-card .wfls-card-inner .wfls-card-action{position:absolute;top:0;right:0;height:100%;background:none;border:0;outline:0;width:48px;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;vertical-align:middle;transition:transform 0.15s cubic-bezier(0.175, 0.885, 0.32, 1.275),color 0.2s ease-in}.wfls-card .wfls-card-inner .wfls-card-action .wfls-card-action-chevron{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJjaGV2cm9uLW9iamVjdCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiCgkgd2lkdGg9IjI0cHgiIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAyNCAyNCIKCSB4bWw6c3BhY2U9InByZXNlcnZlIj4KPHBhdGggaWQ9ImNoZXZyb24iIGQ9Ik0yMCA5bC04IDgtOC04IDEuNDE0LTEuNDE0TDEyIDE0LjE3Mmw2LjU4Ni02LjU4NiIvPgo8L3N2Zz4K");background-repeat:no-repeat;background-position:center center;width:24px;height:24px;fill:#87a6bc}.wfls-card .wfls-card-inner .wfls-card-action .wfls-card-action-checkbox{background-image:url(../img/checkbox.png);background-repeat:no-repeat;background-position:left center;width:29px;height:29px}.wfls-card .wfls-card-inner .wfls-card-action .wfls-card-action-checkbox.checked{background-position:right center}.wfls-card .wfls-card-extra{display:none;padding:0.5rem;margin-top:1rem;border-top:1px solid #f3f6f8}@media (min-width: 768px){.wfls-card .wfls-card-extra{padding:1rem}}.wfls-card.active .wfls-card-extra{display:block}.wfls-card.wfls-card-left .wfls-card-content{margin-left:48px}.wfls-card.wfls-card-left .wfls-card-action{right:auto;left:0px}.wfls-card.disabled .wfls-card-content .wfls-card-title{color:#aaaaaa}.wfls-card.disabled .wfls-card-content .wfls-card-subtitle{color:#8ea6be}.wfls-inline-block{display:inline-block}@media (max-width: 767px){.wfls-inline-block-xs{display:inline-block}}.wfls-full-width{width:100%;max-width:100%}.wfls-no-top{margin-top:0 !important}.wfls-add-top{margin-top:1rem !important}.wfls-add-top-large{margin-top:1.5rem !important}.wfls-add-top-medium{margin-top:0.75rem !important}.wfls-add-top-small{margin-top:0.5rem !important}.wfls-add-top-smaller{margin-top:0.25rem !important}.wfls-no-bottom{margin-bottom:0 !important}.wfls-add-bottom{margin-bottom:1rem !important}.wfls-add-bottom-large{margin-bottom:1.5rem !important}.wfls-add-bottom-medium{margin-bottom:0.75rem !important}.wfls-add-bottom-small{margin-bottom:0.5rem !important}.wfls-add-bottom-smaller{margin-bottom:0.25rem !important}.wfls-padding-no-top{padding-top:0 !important}.wfls-no-right{margin-right:0 !important}.wfls-padding-no-bottom{padding-bottom:0 !important}.wfls-padding-no-left{padding-left:0 !important}.wfls-padding-no-right{padding-right:0 !important}.wfls-padding-add-top{padding-top:1rem !important}.wfls-padding-add-top-small{padding-top:0.5rem !important}.wfls-padding-add-top-medium{padding-top:0.75rem !important}.wfls-padding-add-top-large{padding-top:1.5rem !important}.wfls-padding-add-top-responsive{padding-top:1rem !important}@media (min-width: 768px){.wfls-padding-add-top-responsive{padding-top:1.5rem !important}}.wfls-padding-add-bottom{padding-bottom:1rem !important}.wfls-padding-add-bottom-small{padding-bottom:0.5rem !important}.wfls-padding-add-bottom-medium{padding-bottom:0.75rem !important}.wfls-padding-add-bottom-large{padding-bottom:1.5rem !important}.wfls-padding-add-bottom-responsive{padding-bottom:1rem !important}@media (min-width: 768px){.wfls-padding-add-bottom-responsive{padding-bottom:1.5rem !important}}.wfls-padding-no-bottom{padding-bottom:0 !important}.wfls-padding-add-left{padding-left:1rem !important}.wfls-padding-add-left-small{padding-left:0.5rem !important}.wfls-padding-add-left-medium{padding-left:0.75rem !important}.wfls-padding-add-left-large{padding-left:1.5rem !important}.wfls-padding-add-left-responsive{padding-left:1rem !important}@media (min-width: 768px){.wfls-padding-add-left-responsive{padding-left:1.5rem !important}}.wfls-padding-add-right{padding-right:1rem !important}.wfls-padding-add-right-small{padding-right:0.5rem !important}.wfls-padding-add-right-medium{padding-right:0.75rem !important}.wfls-padding-add-right-large{padding-right:1.5rem !important}.wfls-padding-add-right-responsive{padding-right:1rem !important}@media (min-width: 768px){.wfls-padding-add-right-responsive{padding-right:1.5rem !important}}.wfls-left{text-align:left !important}.wfls-center{text-align:center !important}.wfls-block-center{margin:0 auto}.wfls-right{text-align:right !important}.wfls-block-right{margin:0 0 0 auto}@media (max-width: 767px){.wfls-left-xs{text-align:left !important}.wfls-center-xs{text-align:center !important}.wfls-padding-add-top-xs{padding-top:1rem !important}.wfls-padding-add-top-xs-small{padding-top:0.5rem !important}.wfls-padding-add-top-xs-large{padding-top:1.5rem !important}.wfls-padding-add-bottom-xs{padding-bottom:1rem !important}.wfls-padding-add-bottom-xs-small{padding-bottom:0.5rem !important}.wfls-padding-add-bottom-xs-large{padding-bottom:1.5rem !important}}@media (min-width: 768px) and (max-width: 991px){.wfls-left-sm{text-align:left !important}.wfls-center-sm{text-align:center !important}}@media (min-width: 992px) and (max-width: 1199px){.wfls-left-md{text-align:left !important}.wfls-center-md{text-align:center !important}}@media (min-width: 1200px){.wfls-left-lg{text-align:left !important}.wfls-center-lg{text-align:center !important}}.wfls-border-no-top{border-top:none !important}.wfls-border-no-right{border-right:none !important}.wfls-border-no-bottom{border-bottom:none !important}.wfls-border-no-left{border-left:none !important}.wfls-overflow-x-auto{overflow-x:auto}.wfls-overflow-y-auto{overflow-y:auto}@media (max-width: 767px){.wfls-overflow-x-auto-xs{overflow-x:auto}.wfls-overflow-y-auto-xs{overflow-y:auto}}.wfls-blue{color:#00709e !important}.wfls-blue-light{color:#008cc1 !important}.wfls-gray-dark{color:#2d2d2d !important}.wfls-gray-blue{color:#3f596b !important}.wfls-green-dark{color:#11967a !important}.wfls-green-light{color:#16bc9b !important}.wfls-red-dark{color:#930000 !important}.wfls-red-light{color:#c10000 !important}.wfls-yellow-dark{color:#fcb214 !important}.wfls-yellow-light{color:#ffd10a !important}.wfls-gray{color:#525355 !important}.wfls-gray-light{color:#9f9fa0 !important}.wfls-nowrap{white-space:nowrap}.wfls-tip{color:#fcb214;font-size:1.1rem;margin-right:0.25rem}.wfls-text-small{font-size:85% !important}.wfls-text-plain{font-weight:400 !important}.wfls-scroll-x::-webkit-scrollbar,.wfls-scroll-y::-webkit-scrollbar{-webkit-appearance:none;width:7px;height:7px}.wfls-scroll-x::-webkit-scrollbar-thumb,.wfls-scroll-y::-webkit-scrollbar-thumb{border-radius:4px;background-color:rgba(0,0,0,0.194);-webkit-box-shadow:0 0 1px rgba(255,255,255,0.5)}.wfls-split-word{word-wrap:break-word;word-break:break-all}@media (max-width: 767px){.wfls-split-word-xs{word-wrap:break-word;word-break:break-all;white-space:normal !important}}.wfselect2-container{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;min-width:200px}@media (min-width: 768px){.wfselect2-container{min-width:280px}}@media (min-width: 992px){.wfselect2-container{min-width:320px}}@media (max-width: 767px){.wfselect2-container .wfselect2-search.wfselect2-search--inline{margin:0 !important}}.wfls-select2-placeholder-fix .wfselect2-search__field{width:auto !important}.wfls-page-title{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-start;justify-content:flex-start;margin-top:0.5rem}.wfls-page-title>*{-webkit-flex-grow:0;flex-grow:0;min-width:0}.wfls-page-title>*:first-child{-webkit-flex-grow:0;flex-grow:0;min-width:32px;-webkit-flex-basis:32px;flex-basis:32px;padding-right:0.25rem}.wfls-page-title .wordfence-icon32{margin:0;margin-right:0.5rem}.wfls-page-title h2{padding:0 !important}.wfls-page-title .wfOnOffSwitch{-webkit-flex-basis:69px;flex-basis:69px;-webkit-flex-shrink:0;flex-shrink:0;margin-left:0.5rem}.wfls-tab-container{background-color:#fff}@media (min-width: 768px){.wfls-tab-container{background-color:unset}}.wfls-page-tabs,.wfls-page-fixed-tabs{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-start;justify-content:flex-start;border-bottom:1px solid #d0d0d0;margin:0;margin-top:0.5rem;margin-left:-10px;margin-right:-10px}@media (min-width: 768px){.wfls-page-tabs,.wfls-page-fixed-tabs{margin-left:0;margin-right:0}}.wfls-page-tabs>*,.wfls-page-fixed-tabs>*{-webkit-flex-grow:0;flex-grow:0;min-width:0}.wfls-page-tabs>*:first-child,.wfls-page-fixed-tabs>*:first-child{-webkit-flex-grow:0;flex-grow:0;min-width:32px;-webkit-flex-basis:32px;flex-basis:32px}.wfls-page-tabs .wordfence-icon32,.wfls-page-fixed-tabs .wordfence-icon32{margin:0;margin-right:0.5rem;margin-left:0.5rem}@media (min-width: 768px){.wfls-page-tabs .wordfence-icon32,.wfls-page-fixed-tabs .wordfence-icon32{margin-left:0}}.wfls-page-tabs .wfls-text-tab,.wfls-page-fixed-tabs .wfls-text-tab{margin:0;margin-left:0.5rem;color:#333}.wfls-page-tabs .wfls-tab,.wfls-page-fixed-tabs .wfls-tab{border:1px solid #fff;border-top-right-radius:0.5rem;border-top-left-radius:0.5rem;border-bottom:none;margin-bottom:-1px;margin-right:0.5rem;color:#333}@media (min-width: 768px){.wfls-page-tabs .wfls-tab,.wfls-page-fixed-tabs .wfls-tab{border:1px solid #d0d0d0;background:#e6e6e6}}.wfls-page-tabs .wfls-tab a,.wfls-page-fixed-tabs .wfls-tab a{display:block;padding:0.5rem 1rem;font-size:14px;line-height:24px;text-decoration:none;font-weight:bold;color:#333}.wfls-page-tabs .wfls-tab.wfls-active,.wfls-page-tabs .wfls-tab:hover,.wfls-page-fixed-tabs .wfls-tab.wfls-active,.wfls-page-fixed-tabs .wfls-tab:hover{border-bottom:1px solid #f1f1f1;background:#f1f1f1;color:#00709e;-webkit-box-shadow:none;box-shadow:none}.wfls-page-tabs .wfls-tab.wfls-active a,.wfls-page-tabs .wfls-tab:hover a,.wfls-page-fixed-tabs .wfls-tab.wfls-active a,.wfls-page-fixed-tabs .wfls-tab:hover a{color:#00709e}.wfls-tab-content{display:none;margin-top:15px}.wfls-tab-content.wfls-active{display:block}.wfls-fixed-tab-content{margin-top:15px}.wfls-section-title{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-start;justify-content:flex-start}.wfls-section-title>*{-webkit-flex-grow:0;flex-grow:0;min-width:0}.wfls-section-title>h1,.wfls-section-title>h2,.wfls-section-title>h3,.wfls-section-title>h4,.wfls-section-title>h5,.wfls-section-title>h6{-webkit-flex-grow:1;flex-grow:1;color:#2d2d2d !important;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif !important;line-height:1.5rem !important;font-weight:700 !important;padding:0 !important;margin:0 !important}@media (min-width: 768px){.wfls-section-title>h1,.wfls-section-title>h2,.wfls-section-title>h3,.wfls-section-title>h4,.wfls-section-title>h5,.wfls-section-title>h6{padding-right:0.25rem !important}}.wfls-section-title h2{font-size:1.3125rem;line-height:1.5}.wfls-section-title h3{font-size:1.125rem}.wfls-section-title h4{font-size:1rem}.wfls-section-title .wordfence-icon32{margin:0;margin-right:0.5rem}.wfls-status-circular{position:relative}.wfls-status-circular-text{position:absolute;left:50%;top:50%;padding:0;margin:0;transform:translate(-50%, -50%);color:#aaa;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:1.3125rem;font-weight:300;line-height:1.5}.wfls-status-circular .wfls-status-overlay-text{position:absolute;left:50%;top:50%;padding:0;margin:0;width:200%;text-align:center;transform:translate(-50%, -50%);font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:.875rem;font-weight:normal;line-height:1.3125;opacity:0.0;color:#777}.wfls-status-warning,.wfls-status-critical,.wfls-status-payment-expiring,.wfls-status-renewing{width:100px;height:100px;margin-bottom:1rem}.wfls-status-warning svg path{fill:#fcb214}.wfls-status-critical svg path{fill:#930000}.wfls-status-payment-expiring svg rect,.wfls-status-payment-expiring svg path{fill:#930000}.wfls-status-renewing svg rect,.wfls-status-renewing svg path{fill:#11967a}#howGetIPs-preview{color:#8c8c8c}#howGetIPs-preview strong{color:#666}.wfls-scrollTop{background:#424242;bottom:30px;right:15px;position:fixed;z-index:999;display:none}.wfls-scrollTop a{background:#959595;display:block;padding:4px 5px;line-height:32px;width:32px;color:#ffffff;text-align:center}.wfls-back-icon{color:#00709e;margin-right:0.75rem;font-size:1.5rem !important}.wfls-back-link-chevron{margin-left:1rem}.wfls-back-link-chevron:first-of-type{margin-left:0}.wfls-back-link{font-weight:bold;text-decoration:none}.wfls-premium-link{font-weight:bold}.wfls-boolean-switch{border:1px solid #aaa;display:block;cursor:pointer;width:54px;height:30px;min-width:54px;min-height:30px;-moz-border-radius:15px;-webkit-border-radius:15px;border-radius:15px;line-height:30px !important;background-color:#ffffff;position:relative;box-sizing:border-box;transition:background-color 0.2s ease-in-out, border-color 0.2s ease-in-out}@media (min-width: 768px){.wfls-boolean-switch{width:34px;height:20px;min-width:34px;min-height:20px;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;line-height:20px !important}}.wfls-boolean-switch .wfls-boolean-switch-handle{position:relative;display:block;border:1px solid #aaa;background-color:#fff;width:30px;height:30px;min-width:30px;min-height:30px;-moz-border-radius:15px;-webkit-border-radius:15px;border-radius:15px;margin-top:-1px;box-sizing:border-box;left:-1px;transition:border-color 0.2s ease-in-out, left 0.2s ease-in-out}@media (min-width: 768px){.wfls-boolean-switch .wfls-boolean-switch-handle{width:20px;height:20px;min-width:20px;min-height:20px;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px}}.wfls-boolean-switch.wfls-active{border:1px solid #00709e;background-color:#00709e}.wfls-boolean-switch.wfls-active .wfls-boolean-switch-handle{border:1px solid #00709e;left:25px}@media (min-width: 768px){.wfls-boolean-switch.wfls-active .wfls-boolean-switch-handle{left:15px}}.wfls-boolean-switch.wfls-disabled{pointer-events:none;border-color:#e2e2e2}.wfls-boolean-switch.wfls-disabled .wfls-boolean-switch-handle{border-color:#e2e2e2}.wfls-boolean-switch.wfls-disabled.wfls-active{border-color:#e2e2e2;background-color:#e2e2e2}.wfls-boolean-switch.wfls-disabled.wfls-active .wfls-boolean-switch-handle{border-color:#e2e2e2}.wfls-option-checkbox,[type=checkbox].wfls-option-checkbox+label:before{content:"";font-family:"Ionicons" !important;display:block;cursor:pointer;width:30px;height:30px;min-width:30px;min-height:30px;-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;line-height:30px !important;text-align:center !important;background-color:#ffffff !important;box-shadow:0px 0px 0px 1px #aaa;color:#ffffff !important;font-size:30px !important;font-weight:normal !important}@media (min-width: 768px){.wfls-option-checkbox,[type=checkbox].wfls-option-checkbox+label:before{width:20px;height:20px;min-width:20px;min-height:20px;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;line-height:21px !important;font-size:25px !important}}@media (min-width: 768px){.wfls-option-checkbox{position:relative}.wfls-option-checkbox>*{position:absolute;top:9px;left:50%;transform:translateX(-50%) translateY(-50%)}}.wfls-option-radio,[type=radio].wfls-option-radio+label:before{content:"\f401";font-family:"Ionicons" !important;display:block;cursor:pointer;width:30px;height:30px;min-width:30px;min-height:30px;line-height:30px !important;text-align:center !important;color:#ccc !important;font-size:30px !important;font-weight:normal !important}@media (min-width: 768px){.wfls-option-radio,[type=radio].wfls-option-radio+label:before{width:20px;height:20px;min-width:20px;min-height:20px;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;line-height:20px !important}}[type=checkbox].wfls-option-checkbox.wfls-small+label:before{width:20px;height:20px;min-width:20px;min-height:20px;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;line-height:21px !important;font-size:20px !important}[type=radio].wfls-option-radio.wfls-small+label:before{width:20px;height:20px;min-width:20px;min-height:20px;line-height:21px !important;font-size:20px !important}[type=checkbox].wfls-option-checkbox+label:before,[type=radio].wfls-option-radio+label:before{text-align:center !important;text-indent:0px;display:inline-block;vertical-align:-6px;margin:0px 5px 0px 0px;font-weight:normal;font-style:normal}[type=checkbox].wfls-option-checkbox.wfls-small+label:before,[type=radio].wfls-option-radio.wfls-small+label:before{text-indent:0px;vertical-align:-3px}.wfls-option-checkbox.wfls-checked,[type=checkbox].wfls-option-checkbox:checked+label:before{color:#ffffff !important;box-shadow:0px 0px 0px 1px #00709e !important;background-color:#00709e !important}.wfls-option-checkbox.wfls-disabled,[type=checkbox].wfls-option-checkbox:disabled+label:before{color:#f1f1f1 !important;box-shadow:0px 0px 0px 1px #e2e2e2 !important;background-color:#f1f1f1 !important}.wfls-option-checkbox.wfls-checked.wfls-disabled,[type=checkbox].wfls-option-checkbox:disabled:checked+label:before{color:#777 !important;box-shadow:0px 0px 0px 1px #e2e2e2 !important;background-color:#f1f1f1 !important}.wfls-option-radio.wfls-checked,[type=radio].wfls-option-radio:checked+label:before{content:"\f3a7";color:#00709e !important}.wfls-option-checkbox[type=checkbox],.wfls-option-checkbox[type=radio],.wfls-option-radio[type=checkbox],.wfls-option-radio[type=radio]{position:absolute;left:-9999px}.wfls-option-text input[type="text"],input.wfls-input-text{text-align:left;width:100%;height:40px;border-radius:0;border:0;background-color:#ffffff;box-shadow:1px 1px 1px 2px rgba(215,215,215,0.65)}.wfls-option-text input[type="text"]:placeholder-shown,input.wfls-input-text:placeholder-shown{font-style:italic;color:#bfbfbf}::-webkit-input-placeholder{color:#bfbfbf}:-moz-placeholder{color:#bfbfbf;opacity:1}::-moz-placeholder{color:#bfbfbf;opacity:1}:-ms-input-placeholder{color:#bfbfbf}::-ms-input-placeholder{color:#bfbfbf}::placeholder{color:#bfbfbf}.wfls-option-premium .wfls-option-title,.wfls-option-premium .wfls-option-title>ul>li,.wfls-option.wfls-disabled .wfls-option-title,.wfls-option.wfls-disabled .wfls-option-title>ul>li{color:#aaa !important}.wfls-option-premium .wfls-option-checkbox,.wfls-option-premium .wfls-option-radio,.wfls-option.wfls-disabled .wfls-option-checkbox,.wfls-option.wfls-disabled .wfls-option-radio{opacity:0.5}.wfls-block .wfls-block-content .wfls-block-labeled-value.wfls-protection-status .wfls-block-labeled-value-value{padding-top:0}.wfls-block .wfls-block-content .wfls-block-labeled-value.wfls-protection-status .wfls-block-labeled-value-value .wfls-fa{font-size:8rem}.wfls-block .wfls-block-content .wfls-block-labeled-value.wfls-protection-status .wfls-block-labeled-value-value svg{width:160px}.wfls-block .wfls-block-content .wfls-block-labeled-value.wfls-protection-status .wfls-block-labeled-value-label{font-size:1.35rem;font-weight:300;padding-bottom:0}.wfls-block .wfls-block-content .wfls-block-labeled-value.wfls-protection-status-premium .wfls-block-labeled-value-value{color:#9f9fa0}.wfls-block .wfls-block-content .wfls-block-labeled-value.wfls-protection-status-premium .wfls-block-labeled-value-value svg{fill:#9f9fa0}.wfls-block .wfls-block-content .wfls-block-labeled-value.wfls-protection-status-premium .wfls-block-labeled-value-label{color:#9f9fa0}.wfls-indeterminate-progress{-webkit-animation:wfls-indeterminate-progress-keyframes 1s steps(8, end) infinite;-o-animation:wfls-indeterminate-progress-keyframes 1s steps(8, end) infinite;animation:wfls-indeterminate-progress-keyframes 1s steps(8, end) infinite}.wfls-indeterminate-progress path{fill:#00709e}@-moz-keyframes wfls-indeterminate-progress-keyframes{to{-moz-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes wfls-indeterminate-progress-keyframes{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes wfls-indeterminate-progress-keyframes{to{-moz-transform:rotate(360deg);-ms-transform:rotate(360deg);-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.wfls-flex-row{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;flex-wrap:nowrap}.wfls-flex-row .wfls-flex-row-1{-webkit-flex-grow:1;flex-grow:1}.wfls-flex-row .wfls-flex-row-0{-webkit-flex-grow:0;flex-grow:0}.wfls-flex-row.wfls-flex-row-wrappable,.wfls-flex-row.wfls-flex-row-xs-wrappable{-webkit-flex-wrap:wrap;flex-wrap:wrap}.wfls-flex-row.wfls-flex-row-equal-heights{-webkit-align-items:stretch;align-items:stretch}.wfls-flex-row .wfls-flex-item-full-width{width:100%}.wfls-flex-row .wfls-flex-item-xs-100{-webkit-flex-basis:100%;flex-basis:100%}@media (min-width: 768px){.wfls-flex-row.wfls-flex-row-xs-wrappable{-webkit-flex-wrap:nowrap;flex-wrap:nowrap}.wfls-flex-row .wfls-flex-item-sm-50{-webkit-flex-basis:50%;flex-basis:50%}}.wfls-switch{display:-webkit-flex !important;display:flex !important;-webkit-align-items:stretch !important;align-items:stretch !important;-webkit-justify-content:flex-start !important;justify-content:flex-start !important;-webkit-flex-direction:row !important;flex-direction:row !important;margin:0;padding:0}.wfls-switch>li{margin:0 !important;padding:0.5rem 0.7rem !important;text-transform:uppercase;cursor:pointer;color:#aaa;font-weight:400;border-top:1px solid #bfbfbf;border-bottom:1px solid #bfbfbf;border-right:1px solid #bfbfbf}.wfls-switch>li:first-of-type{border-left:1px solid #bfbfbf;-moz-border-radius-topleft:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px}.wfls-switch>li:last-of-type{-moz-border-radius-topright:6px;-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-moz-border-radius-bottomright:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px}.wfls-switch>li.wfls-active{color:#ffffff;background-color:#00709e}.wfls-tooltip,.ui-widget.wfls-tooltip{max-width:600px;font-size:0.75rem;overflow-wrap:break-word}.wfls-widget-learning-mode{border-top:1px solid #eee;margin:0 -1rem;padding:1rem;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;-webkit-flex-direction:row;flex-direction:row}@media (min-width: 768px){.wfls-widget-learning-mode{padding:1.5rem}}.wfls-widget-learning-mode svg{width:18px}.wfls-widget-learning-mode svg path{fill:#aaa}.wfls-widget-learning-mode span{padding-left:0.5rem;font-size:.875rem;line-height:1.3125;font-weight:600}.wfls-drawer-overlay{position:fixed;top:0px;right:0px;bottom:0px;left:160px;background-color:rgba(0,0,0,0.5);z-index:9980;padding:5rem 0}.folded .wfls-drawer-overlay{left:36px}@media only screen and (max-width: 960px){.auto-fold .wfls-drawer-overlay{left:36px}}.rtl .wfls-drawer-overlay{right:160px;left:0px}.rtl .folded .wfls-drawer-overlay{right:36px}@media only screen and (max-width: 960px){.rtl .auto-fold .wfls-drawer-overlay{right:36px}}@media screen and (max-width: 782px){.wfls-drawer-overlay,.folded .wfls-drawer-overlay,.auto-fold .wfls-drawer-overlay,.rtl .wfls-drawer-overlay,.rtl .folded .wfls-drawer-overlay,.rtl .auto-fold .wfls-drawer-overlay{left:0px;right:0px}}.wfls-drawer{background-color:#ffffff;position:fixed;top:32px;bottom:0px;right:0px;z-index:9981}.wfls-drawer .wfls-modal{display:-webkit-flex;display:flex;-webkit-align-items:stretch;align-items:stretch;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:column;flex-direction:column;height:100%}.wfls-drawer .wfls-modal ul,.wfls-drawer .wfls-modal li{padding:0;margin:0}.wfls-drawer .wfls-modal .wfls-modal-header{-webkit-flex-shrink:0;flex-shrink:0;min-height:44px;padding:1rem;width:100%;box-sizing:border-box;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between;position:relative;background-color:#00709e;color:#ffffff}.wfls-drawer .wfls-modal .wfls-modal-header .wfls-modal-header-content{max-width:75%}.wfls-drawer .wfls-modal .wfls-modal-header .wfls-modal-header-content .wfls-modal-title{font-size:1.3125rem;line-height:1.5;font-weight:300;width:100%;transition:color 0.2s ease-in}.wfls-drawer .wfls-modal .wfls-modal-header .wfls-modal-header-content .wfls-modal-subtitle{margin-top:.125rem;margin-bottom:.125rem;font-size:.575rem;color:#4f748e}.wfls-drawer .wfls-modal .wfls-modal-content{-webkit-flex-grow:1;flex-grow:1;display:-webkit-flex;display:flex;-webkit-align-items:stretch;align-items:stretch;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:column;flex-direction:column;padding:1rem}.wfls-drawer .wfls-modal .wfls-modal-content>*:first-child{margin-top:0}.wfls-drawer .wfls-modal .wfls-modal-content select,.wfls-drawer .wfls-modal .wfls-modal-content select option,.wfls-drawer .wfls-modal .wfls-modal-content .wfselect2-container--default{font-size:0.7rem;font-weight:bold}@media (min-width: 768px){.wfls-drawer .wfls-modal .wfls-modal-content select,.wfls-drawer .wfls-modal .wfls-modal-content select option,.wfls-drawer .wfls-modal .wfls-modal-content .wfselect2-container--default{font-size:0.8rem}}@media (min-width: 992px){.wfls-drawer .wfls-modal .wfls-modal-content select,.wfls-drawer .wfls-modal .wfls-modal-content select option,.wfls-drawer .wfls-modal .wfls-modal-content .wfselect2-container--default{font-size:0.9rem}}.wfls-drawer .wfls-modal .wfls-modal-content .wfls-option-select-option,.wfls-drawer .wfls-modal .wfls-modal-content .wfselect2-container--default,.wfls-drawer .wfls-modal .wfls-modal-content .wfselect2-container--default .wfselect2-selection--single{text-align:left;height:40px;border-radius:0;border:0;background-color:#ffffff;box-shadow:1px 1px 1px 2px rgba(215,215,215,0.35)}.wfls-drawer .wfls-modal .wfls-modal-content .wfls-option-select-option .wfselect2-selection__rendered,.wfls-drawer .wfls-modal .wfls-modal-content .wfselect2-container--default .wfselect2-selection__rendered,.wfls-drawer .wfls-modal .wfls-modal-content .wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__rendered{color:#333;line-height:40px}.wfls-drawer .wfls-modal .wfls-modal-content .wfls-option-select-option .wfselect2-selection__arrow,.wfls-drawer .wfls-modal .wfls-modal-content .wfselect2-container--default .wfselect2-selection__arrow,.wfls-drawer .wfls-modal .wfls-modal-content .wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__arrow{height:38px}.wfls-drawer .wfls-modal .wfls-modal-content .wfls-option-select-option.wfselect2-container--disabled .wfselect2-selection__rendered,.wfls-drawer .wfls-modal .wfls-modal-content .wfselect2-container--default.wfselect2-container--disabled .wfselect2-selection__rendered,.wfls-drawer .wfls-modal .wfls-modal-content .wfselect2-container--default .wfselect2-selection--single.wfselect2-container--disabled .wfselect2-selection__rendered{color:#aaa}.wfls-drawer .wfls-modal .wfls-modal-content .wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__arrow b{border-color:#333 transparent transparent}.wfls-drawer .wfls-modal .wfls-modal-content .wfselect2-container--default.wfselect2-container--open .wfselect2-selection--single .wfselect2-selection__arrow b{border-color:transparent transparent #333}.wfls-drawer .wfls-modal .wfls-modal-footer{-webkit-flex-shrink:0;flex-shrink:0;min-height:44px;padding:1rem;width:100%;box-sizing:border-box;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between;position:relative;background-color:#f1f1f1;border-top:1px solid #d9d9d9}.wfls-mobile-menu-overlay{position:fixed;top:0px;right:0px;bottom:0px;left:0px;background-color:rgba(0,0,0,0.5);z-index:100000}.wfls-mobile-menu-overlay>.wfls-mobile-menu-tap-hint{position:absolute;top:25%;left:50%;transform:translateX(-50%);color:#ffffff;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:1.3125rem;font-weight:300;line-height:1.5}.wfls-mobile-menu{position:fixed;left:50%;transform:translateX(-50%);z-index:100001}.wfls-mobile-menu>.wfls-mobile-menu-items{margin:0;padding:0 0 0.25rem 0;list-style:none}.wfls-mobile-menu>.wfls-mobile-menu-items>li{margin:0;padding:0.25rem 0}.wfls-mobile-menu>.wfls-mobile-menu-items>li>a{box-sizing:border-box}.wfls-callout-warning{background-color:#feecc4;padding:0.8rem 1.25rem}.wfls-tip-light-bulb{color:#fcb214;font-size:1.5rem;font-weight:bold}.wfls-tip-info-message{padding-left:0.5rem !important;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:.875rem;color:#2d2d2d;line-height:1.3125;font-weight:normal}#wfls-qr-code{width:175px;height:175px;margin:0 auto}@media (min-width: 500px){#wfls-qr-code{width:256px;height:256px}}#wfls-activate-field{margin:0 auto;font-size:1.5rem;display:block;text-align:center}.wfls-recovery-codes{list-style-type:none}.wfls-recovery-codes li{font-family:monospace !important;text-align:center}#wfls-recovery-download .dashicons,#wfls-recovery-new-download .dashicons{line-height:26px}#wfls-ip-source-trusted-proxies{display:none}ul.wfls-option.wfls-option-howgetips .wfls-option-ip-source-details{display:-webkit-flex;display:flex;-webkit-align-items:flex-start;align-items:flex-start;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:column;flex-direction:column;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:0.8rem;margin-top:0.5rem}#wfls-ip-source-preview{color:#8c8c8c}#wfls-ip-source-preview strong{color:#666}.wfls-inline-notice{background:#fff;border:1px solid #ccd0d4;border-left-color:#ffb900;border-left-width:4px;box-shadow:0 1px 1px rgba(0,0,0,0.04);padding:4px 12px;display:flex;justify-content:flex-start;align-items:center}.wfls-inline-notice>*{flex-grow:1}.wfls-inline-notice:first-child{flex-grow:0;flex-shrink:0}.wfls-inline-notice span{padding-left:0.5rem}.wfls-block{display:-webkit-flex;display:flex;-webkit-align-items:stretch;align-items:stretch;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:column;flex-direction:column;position:relative;margin:0 auto 0.5rem;box-sizing:border-box;background-color:#fff;box-shadow:0 0 0 1px rgba(200,215,225,0.25),0 1px 2px #e9eff3}.wfls-block.wfls-block-transparent{background-color:transparent;box-shadow:none}.wfls-block .wfls-block-banner{min-height:44px;margin:0 -1rem;padding:0;box-sizing:border-box;position:relative;background-color:#fcb214;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between;-webkit-flex-direction:row;flex-direction:row}.wfls-block .wfls-block-banner>li{margin:0;padding:0.75rem 1rem}@media (min-width: 768px){.wfls-block .wfls-block-banner{margin:0 -1.5rem}.wfls-block .wfls-block-banner>li{padding:0.75rem 1.5rem}}.wfls-block .wfls-block-header{-webkit-flex-basis:44px;flex-basis:44px;-webkit-flex-shrink:0;flex-shrink:0;-webkit-flex-grow:0;flex-grow:0;min-height:44px;padding:1rem 0;width:100%;box-sizing:border-box;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between;position:relative}.wfls-block .wfls-block-header.wfls-block-header-border-bottom{padding:0 1rem;border-bottom:1px solid #e2e2e2}@media (min-width: 768px){.wfls-block .wfls-block-header.wfls-block-header-border-bottom{padding:0 1.5rem}}.wfls-block .wfls-block-header .wfls-block-header-content{max-width:75%}.wfls-block .wfls-block-header .wfls-block-header-content .wfls-block-title{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:0.9rem;width:100%;transition:color 0.2s ease-in}.wfls-block .wfls-block-header .wfls-block-header-content .wfls-block-subtitle{margin-top:.125rem;margin-bottom:.125rem;font-size:0.775rem}.wfls-block .wfls-block-header .wfls-block-header-action{position:absolute;top:0;right:0;height:100%;background:none;border:0;outline:0;width:48px;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-end;justify-content:flex-end;vertical-align:middle;transition:transform 0.15s cubic-bezier(0.175, 0.885, 0.32, 1.275),color 0.2s ease-in}.wfls-block .wfls-block-header .wfls-block-header-action.wfls-block-header-action-text{width:auto}.wfls-block .wfls-block-header .wfls-block-header-action.wfls-block-header-action-text.wfls-block-header-action-text-success{color:#11967a}.wfls-block .wfls-block-header .wfls-block-header-action.wfls-block-header-action-text.wfls-block-header-action-text-warning{color:#930000}.wfls-block .wfls-block-header .wfls-block-header-action.wfls-block-header-action-text.wfls-block-header-action-text-warning a{color:#930000}.wfls-block .wfls-block-header .wfls-block-header-action .wfls-block-header-action-chevron{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJjaGV2cm9uLW9iamVjdCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiCgkgd2lkdGg9IjI0cHgiIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAyNCAyNCIKCSB4bWw6c3BhY2U9InByZXNlcnZlIj4KPHBhdGggaWQ9ImNoZXZyb24iIGQ9Ik0yMCA5bC04IDgtOC04IDEuNDE0LTEuNDE0TDEyIDE0LjE3Mmw2LjU4Ni02LjU4NiIvPgo8L3N2Zz4K");background-repeat:no-repeat;background-position:center center;width:24px;height:24px}.wfls-block .wfls-block-header .wfls-block-header-action .wfls-block-header-action-disclosure{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJkaXNjbG9zdXJlLWNsb3NlZC1vYmplY3QiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHdpZHRoPSIxMnB4IiBoZWlnaHQ9IjEycHgiIHZpZXdCb3g9IjAgMCAxMiAxMiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgMTIgMTIiCgkgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxwYXRoIGlkPSJkaXNjbG9zdXJlLWNsb3NlZCIgZD0iTSA2IDAgbCA2IDYgLTYgNiAwIC0xMiIgZmlsbD0iIzc3NyIvPgo8L3N2Zz4=");background-repeat:no-repeat;background-position:center center;width:12px;height:12px;transition:transform 0.15s cubic-bezier(0.175, 0.885, 0.32, 1.275),background 0.2s ease-in}.wfls-block .wfls-block-header .wfls-block-header-action .wfls-block-header-action-checkbox{background-image:url(../img/checkbox.png);background-repeat:no-repeat;background-position:left center;width:29px;height:29px}.wfls-block .wfls-block-header .wfls-block-header-action .wfls-block-header-action-checkbox.wfls-checked{background-position:right center}.wfls-block .wfls-block-content{-webkit-flex-grow:1;flex-grow:1;display:none;padding:0 1rem}@media (min-width: 768px){.wfls-block .wfls-block-content{padding:0 1.5rem}}.wfls-block .wfls-block-content .wfls-block-list{margin:0 -1rem;padding:0;list-style:none}@media (min-width: 768px){.wfls-block .wfls-block-content .wfls-block-list{margin:0 -1.5rem}}.wfls-block .wfls-block-content .wfls-block-list.wfls-block-list-striped>li:nth-of-type(odd){background-color:#f9f9f9}.wfls-block .wfls-block-content .wfls-block-list.wfls-block-list-striped>li:nth-of-type(even){background-color:#ffffff}.wfls-block .wfls-block-content .wfls-block-list>li{display:block;min-height:44px;padding:0 1rem;margin:0;border-top:1px solid #e2e2e2;box-sizing:border-box;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between}@media (min-width: 768px){.wfls-block .wfls-block-content .wfls-block-list>li{padding:0 1.5rem}}.wfls-block .wfls-block-content .wfls-block-list>li>*:first-child{-webkit-flex-grow:1;flex-grow:1;min-width:0}.wfls-block .wfls-block-content .wfls-block-list.wfls-block-list-horizontal{box-sizing:border-box;margin-top:-1px;display:-webkit-flex;display:flex;-webkit-align-items:stretch;align-items:stretch;-webkit-align-content:flex-start;align-content:flex-start;-webkit-justify-content:space-between;justify-content:space-between;-webkit-flex-wrap:wrap;flex-wrap:wrap}.wfls-block .wfls-block-content .wfls-block-list.wfls-block-list-horizontal>li{-webkit-flex-grow:1;flex-grow:1;-webkit-flex-basis:100%;flex-basis:100%;border-left:1px solid #e2e2e2}@media (min-width: 768px){.wfls-block .wfls-block-content .wfls-block-list.wfls-block-list-horizontal>li{-webkit-flex-basis:50%;flex-basis:50%}}@media (min-width: 992px){.wfls-block .wfls-block-content .wfls-block-list.wfls-block-list-horizontal>li{-webkit-flex-basis:25%;flex-basis:25%}}.wfls-block .wfls-block-content .wfls-block-list.wfls-block-list-horizontal.wfls-block-list-nowrap{overflow-y:auto;-webkit-flex-wrap:nowrap;flex-wrap:nowrap}.wfls-block .wfls-block-content .wfls-block-list.wfls-block-list-horizontal.wfls-block-list-nowrap>li{-webkit-flex-shrink:0;flex-shrink:0}.wfls-block .wfls-block-content .wfls-block-list.wfls-block-list-horizontal.wfls-block-list-horizontal-5>li{-webkit-flex-grow:1;flex-grow:1;-webkit-flex-basis:20%;flex-basis:20%}.wfls-block .wfls-block-content .wfls-block-list.wfls-block-list-horizontal>*:first-child{border-left:0}@media (min-width: 768px){.wfls-block .wfls-block-content .wfls-block-list.wfls-block-list-horizontal.wfls-block-list-equal>li{max-width:50%}}@media (min-width: 992px){.wfls-block .wfls-block-content .wfls-block-list.wfls-block-list-horizontal.wfls-block-list-equal>li{max-width:25%}}.wfls-block .wfls-block-content .wfls-block-list.wfls-block-list-horizontal.wfls-block-list-horizontal-5.wfls-block-list-equal>li{max-width:20%}.wfls-block .wfls-block-content .wfls-block-list .wfls-block-list-state{text-align:center}@media (min-width: 1200px){.wfls-block .wfls-block-content .wfls-block-list .wfls-block-list-state{text-align:left}}.wfls-block .wfls-block-content .wfls-block-list .wfls-block-list-state-enabled .wfls-fa{color:#11967a}.wfls-block .wfls-block-content .wfls-block-list .wfls-block-list-state-disabled .wfls-fa{color:#525355}.wfls-block .wfls-block-content .wfls-block-list .wfls-block-list-state-premium{color:#9f9fa0}.wfls-block .wfls-block-content .wfls-block-list .wfls-block-list-dismiss{padding-left:2rem;font-size:1.25rem}.wfls-block .wfls-block-content .wfls-block-list .wfls-block-list-dismiss a{color:#525355}.wfls-block .wfls-block-content:first-child>.wfls-block-list>li:first-child{border-top:none}.wfls-block .wfls-block-content .wfls-block-left-right{margin:0 -1rem;padding:0;list-style:none;display:-webkit-flex;display:flex;-webkit-align-items:stretch;align-items:stretch;-webkit-align-content:flex-start;align-content:flex-start;-webkit-justify-content:space-between;justify-content:space-between;-webkit-flex-wrap:wrap;flex-wrap:wrap}@media (min-width: 768px){.wfls-block .wfls-block-content .wfls-block-left-right{margin:0 -1.5rem}}.wfls-block .wfls-block-content .wfls-block-left-right.wfls-block-left-right-nowrap{-webkit-flex-wrap:nowrap;flex-wrap:nowrap}.wfls-block .wfls-block-content .wfls-block-left-right>li{display:block;min-height:44px;padding:0;margin:0;box-sizing:border-box;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between}.wfls-block .wfls-block-content .wfls-block-left-right>li>*:first-child{-webkit-flex-grow:1;flex-grow:1;min-width:0}.wfls-block .wfls-block-content .wfls-block-left-right>li.wfls-left{text-align:left}.wfls-block .wfls-block-content .wfls-block-left-right>li.wfls-right{text-align:right}.wfls-block .wfls-block-content .wfls-block-left-center-right{margin:0 -1rem;padding:0;list-style:none;display:-webkit-flex;display:flex;-webkit-align-items:stretch;align-items:stretch;-webkit-align-content:center;align-content:center;-webkit-justify-content:space-between;justify-content:space-between;-webkit-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;flex-wrap:nowrap}.wfls-block .wfls-block-content .wfls-block-left-center-right>li{display:block;min-height:44px;padding:0;margin:0;box-sizing:border-box;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-basis:33.3333%;flex-basis:33.3333%;max-width:33.3333%}.wfls-block .wfls-block-content .wfls-block-left-center-right>li a{text-decoration:none;font-size:.875rem}.wfls-block .wfls-block-content .wfls-block-left-center-right>li.wfls-left{text-align:left}.wfls-block .wfls-block-content .wfls-block-left-center-right>li.wfls-center{text-align:center;-webkit-justify-content:center;justify-content:center}.wfls-block .wfls-block-content .wfls-block-left-center-right>li.wfls-center .wordfence-icon32{margin:0}.wfls-block .wfls-block-content .wfls-block-left-center-right>li.wfls-right{text-align:right;-webkit-justify-content:flex-end;justify-content:flex-end}.wfls-block .wfls-block-content .wfls-block-labeled-value{box-sizing:border-box;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between;-webkit-flex-direction:column;flex-direction:column;margin:0 -1rem;padding:1rem}@media (min-width: 768px){.wfls-block .wfls-block-content .wfls-block-labeled-value{margin:0 -1.5rem;padding:1.5rem}}.wfls-block .wfls-block-content .wfls-block-labeled-value-value{font-size:3rem;line-height:3rem;color:#9f9fa0;padding:1rem}.wfls-block .wfls-block-content .wfls-block-labeled-value-label{font-size:0.75rem;color:#9f9fa0;padding:0 1rem 1rem 1rem}.wfls-block .wfls-block-footer{-webkit-flex-shrink:0;flex-shrink:0;-webkit-flex-grow:0;flex-grow:0;min-height:44px;padding:1rem;width:100%;box-sizing:border-box;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between;position:relative;background-color:#e4e4e4}.wfls-block .wfls-block-footer .wfls-block-footer-content{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between;width:100%}.wfls-block .wfls-block-footer .wfls-block-footer-content>*{-webkit-flex-grow:1;flex-grow:1}.wfls-block .wfls-block-footer .wfls-block-footer-content .wfls-block-title{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:0.9rem;width:100%;transition:color 0.2s ease-in}.wfls-block .wfls-block-footer .wfls-block-footer-content .wfls-block-subtitle{margin-top:.125rem;margin-bottom:.125rem;font-size:0.775rem}.wfls-block .wfls-block-footer .wfls-block-footer-action{-webkit-flex-grow:0;flex-grow:0;background:none;border:0;outline:0;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-end;justify-content:flex-end;vertical-align:middle}.wfls-block.wfls-block-no-header .wfls-block-content .wfls-block-list>li{border-top:none}.wfls-block.wfls-active .wfls-block-content,.wfls-block.wfls-always-active .wfls-block-content{display:block}.wfls-block.wfls-active>.wfls-block-header>.wfls-block-header-content>.wfls-block-title{color:#00709e}.wfls-block.wfls-active>.wfls-block-header>.wfls-block-header-content>.wfls-block-header-action>.wfls-block-header-action-disclosure{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJkaXNjbG9zdXJlLWNsb3NlZC1vYmplY3QiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHdpZHRoPSIxMnB4IiBoZWlnaHQ9IjEycHgiIHZpZXdCb3g9IjAgMCAxMiAxMiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgMTIgMTIiCgkgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxwYXRoIGlkPSJkaXNjbG9zdXJlLWNsb3NlZCIgZD0iTSA2IDAgbCA2IDYgLTYgNiAwIC0xMiIgZmlsbD0iIzAwNzA5ZSIvPgo8L3N2Zz4=") !important;transform:rotate(90deg)}.wfls-block.wfls-disabled>.wfls-block-header>.wfls-block-header-content>.wfls-block-title,.wfls-block.wfls-disabled>.wfls-block-header>.wfls-block-header-content>.wfls-block-subtitle{color:#bfbfbf !important}.wfls-block.wfls-disabled>.wfls-block-header>.wfls-block-header-content>.wfls-block-header-action>.wfls-block-header-action-disclosure{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJkaXNjbG9zdXJlLWNsb3NlZC1vYmplY3QiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHdpZHRoPSIxMnB4IiBoZWlnaHQ9IjEycHgiIHZpZXdCb3g9IjAgMCAxMiAxMiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgMTIgMTIiCgkgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxwYXRoIGlkPSJkaXNjbG9zdXJlLWNsb3NlZCIgZD0iTSA2IDAgbCA2IDYgLTYgNiAwIC0xMiIgZmlsbD0iI2JkYmRiZCIvPgo8L3N2Zz4=") !important;transform:rotate(0deg)}.wfls-block.wfls-disabled>.wfls-block-content{display:none !important}.wfls-block.wfls-block-header-left .wfls-block-header-content{margin-left:48px}.wfls-block.wfls-block-header-left .wfls-block-header-action{right:auto;left:0px}.wfls-block.wfls-disabled .wfls-dashboard-item-content .wfls-block-title{color:#aaaaaa}.wfls-block.wfls-disabled .wfls-dashboard-item-content .wfls-block-subtitle{color:#8ea6be}.wfls-section-title{margin-bottom:1rem}.wfls-status-detail{box-sizing:border-box;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between;-webkit-flex-direction:column;flex-direction:column;margin:0 -1rem;padding:1rem}.wfls-status-detail p{margin:0 0 0.45rem 0}.wfls-status-detail .wfls-status-circular{margin-bottom:1rem}.wfls-status-detail .wfls-status-detail-title{font-weight:700 !important;font-size:1rem !important;line-height:1.3125 !important}.wfls-status-detail .wfls-status-detail-subtitle{font-size:.875rem !important;line-height:1.3125 !important;font-weight:normal !important;text-align:center}.wfls-status-detail .wfls-status-detail-link>a{font-weight:600 !important;font-size:0.85rem !important}.wfls-block-navigation-option{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-align-content:flex-start;align-content:flex-start;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-wrap:nowrap;flex-wrap:nowrap}.wfls-block-navigation-option svg.wfls-block-navigation-option-icon{width:50px;min-width:50px;fill:#9f9fa0}.wfls-block-navigation-option:hover{cursor:pointer}.wfls-block-navigation-option:hover a{text-decoration:underline}.wfls-block-navigation-option:hover svg.wfls-block-navigation-option-icon{fill:#00709e}.wfls-select-group{display:-webkit-flex !important;display:flex !important;-webkit-align-items:center !important;align-items:center !important;-webkit-justify-content:flex-start !important;justify-content:flex-start !important;-webkit-flex-direction:row !important;flex-direction:row !important;-webkit-flex-grow:0 !important;flex-grow:0 !important}.wfls-select-group .wfselect2-container{min-width:200px}@media (max-width: 767px){.wfls-select-group .wfselect2-container{max-width:100px}}.wfls-select-group .wfselect2-container--default .wfselect2-selection--single{display:block;width:100%;height:38px;padding:.5rem 1.25rem;font-size:14px;line-height:1.42857;color:#2b2b2b;background-color:#fff;background-image:none;border:1px solid #ddd;border-radius:4px;border-top-right-radius:0;border-bottom-right-radius:0;border-right:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s;-o-transition:border-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s;transition:border-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s}.wfls-select-group .wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__rendered{color:#2b2b2b;line-height:inherit}.wfls-select-group .wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__arrow{height:38px}.wfls-select-group .wfls-form-control{display:inline-block;width:auto;border-top-left-radius:0;border-bottom-left-radius:0;margin-left:0}.wfls-flex-horizontal{display:-webkit-flex !important;display:flex !important;-webkit-align-items:center !important;align-items:center !important;-webkit-justify-content:flex-start !important;justify-content:flex-start !important;-webkit-flex-direction:row !important;flex-direction:row !important}.wfls-flex-horizontal>*:first-child{-webkit-flex-grow:0 !important;flex-grow:0 !important}.wfls-flex-horizontal.wfls-flex-align-left{-webkit-align-items:flex-start !important;align-items:flex-start !important}.wfls-flex-horizontal.wfls-flex-align-right{-webkit-justify-content:flex-end !important;justify-content:flex-end !important}.wfls-flex-horizontal.wfls-flex-full-width{width:100%}.wfls-flex-horizontal.wfls-flex-full-width>*:last-child{-webkit-flex-grow:1 !important;flex-grow:1 !important}.wfls-flex-horizontal.wfls-flex-full-width.wfls-flex-grow-first>*:first-child{-webkit-flex-grow:1 !important;flex-grow:1 !important}.wfls-flex-horizontal.wfls-flex-full-width.wfls-flex-grow-first>*:last-child{-webkit-flex-grow:0 !important;flex-grow:0 !important}.wfls-flex-horizontal.wfls-flex-full-width.wfls-flex-grow-all>*:first-child,.wfls-flex-horizontal.wfls-flex-full-width.wfls-flex-grow-all>*{-webkit-flex-grow:1 !important;flex-grow:1 !important}.wfls-flex-horizontal>li{padding:0;margin:0}.wfls-flex-vertical{display:-webkit-flex !important;display:flex !important;-webkit-align-items:center !important;align-items:center !important;-webkit-justify-content:flex-start !important;justify-content:flex-start !important;-webkit-flex-direction:column !important;flex-direction:column !important}.wfls-flex-vertical>*:first-child{-webkit-flex-grow:0 !important;flex-grow:0 !important}.wfls-flex-vertical.wfls-flex-align-left{-webkit-align-items:flex-start !important;align-items:flex-start !important}.wfls-flex-vertical.wfls-flex-align-right{-webkit-align-items:flex-end !important;align-items:flex-end !important}.wfls-flex-vertical.wfls-flex-full-width{-webkit-align-items:stretch !important;align-items:stretch !important}@media (max-width: 767px){.wfls-flex-vertical.wfls-flex-align-left-xs{-webkit-align-items:flex-start !important;align-items:flex-start !important}}@media (min-width: 768px) and (max-width: 991px){.wfls-flex-vertical.wfls-flex-align-left-sm{-webkit-align-items:flex-start !important;align-items:flex-start !important}}@media (min-width: 992px) and (max-width: 1199px){.wfls-flex-vertical.wfls-flex-align-left-md{-webkit-align-items:flex-start !important;align-items:flex-start !important}}@media (min-width: 1200px){.wfls-flex-vertical.wfls-flex-align-left-lg{-webkit-align-items:flex-start !important;align-items:flex-start !important}}.wfls-flex-vertical>li{padding:0;margin:0}@media (max-width: 767px){.wfls-flex-vertical-xs{display:-webkit-flex !important;display:flex !important;-webkit-align-items:center !important;align-items:center !important;-webkit-justify-content:flex-start !important;justify-content:flex-start !important;-webkit-flex-direction:column !important;flex-direction:column !important}.wfls-flex-vertical-xs>*:first-child{-webkit-flex-grow:0 !important;flex-grow:0 !important}.wfls-flex-vertical-xs.wfls-flex-align-left{-webkit-align-items:flex-start !important;align-items:flex-start !important}.wfls-flex-vertical-xs.wfls-flex-align-right{-webkit-align-items:flex-end !important;align-items:flex-end !important}.wfls-flex-vertical-xs.wfls-flex-full-width{-webkit-align-items:stretch !important;align-items:stretch !important}}ul.wfls-option,.wfls-form-field{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;padding:1rem 0;position:relative}ul.wfls-option li,.wfls-form-field li{margin:0;padding:0}ul.wfls-option.wfls-option-no-spacing,.wfls-form-field.wfls-option-no-spacing{padding:0;margin:0}ul.wfls-option.wfls-option-toggled>*:last-child,ul.wfls-option.wfls-option-toggled-boolean-switch>*:last-child,ul.wfls-option.wfls-option-toggled-select>*:last-child,ul.wfls-option.wfls-option-select>*:last-child,ul.wfls-option.wfls-option-text>*:last-child,ul.wfls-option.wfls-option-textarea>*:last-child,ul.wfls-option.wfls-option-switch>*:last-child,ul.wfls-option.wfls-option-footer>*:last-child,.wfls-form-field.wfls-option-toggled>*:last-child,.wfls-form-field.wfls-option-toggled-boolean-switch>*:last-child,.wfls-form-field.wfls-option-toggled-select>*:last-child,.wfls-form-field.wfls-option-select>*:last-child,.wfls-form-field.wfls-option-text>*:last-child,.wfls-form-field.wfls-option-textarea>*:last-child,.wfls-form-field.wfls-option-switch>*:last-child,.wfls-form-field.wfls-option-footer>*:last-child{margin-right:1rem}@media (max-width: 768px){ul.wfls-option.wfls-option-footer,.wfls-form-field.wfls-option-footer{-webkit-flex-direction:column;flex-direction:column}}ul.wfls-option>.wfls-option-content,.wfls-form-field>.wfls-option-content{-webkit-flex-grow:1;flex-grow:1}ul.wfls-option>.wfls-option-content>ul,.wfls-form-field>.wfls-option-content>ul{display:-webkit-flex;display:flex;-webkit-align-items:flex-start;align-items:flex-start;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;width:100%}ul.wfls-option>.wfls-option-content>ul>*:first-child,.wfls-form-field>.wfls-option-content>ul>*:first-child{-webkit-flex-grow:1;flex-grow:1}@media (min-width: 768px){ul.wfls-option>.wfls-option-content>ul,.wfls-form-field>.wfls-option-content>ul{-webkit-flex-direction:row;flex-direction:row;-webkit-align-items:center;align-items:center}}ul.wfls-option.wfls-option-toggled-segmented *,.wfls-form-field.wfls-option-toggled-segmented *{-webkit-flex-grow:0;flex-grow:0}ul.wfls-option.wfls-option-toggled-segmented *:first-child,.wfls-form-field.wfls-option-toggled-segmented *:first-child{-webkit-flex-grow:1;flex-grow:1}ul.wfls-option.wfls-option-toggled-segmented>*:last-child,.wfls-form-field.wfls-option-toggled-segmented>*:last-child{margin-left:1rem}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-title,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-title{font-size:.8rem}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:stretch;align-content:stretch;-webkit-flex-wrap:nowrap;flex-wrap:nowrap}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label{-webkit-flex-grow:1;flex-grow:1;-webkit-flex-basis:50%;flex-basis:50%;display:block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;text-transform:uppercase;padding:.5rem 1.25rem;font-size:14px;line-height:1.42857;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;color:#00709e;background-color:#fff;border-color:#00709e;border-radius:0}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label:focus,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label.focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label:focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label.focus{color:#00709e;background-color:#e6e6e6;border-color:#00161f}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label:hover,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label:hover{color:#00709e;background-color:#e6e6e6;border-color:#004561}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label:active,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label.active,.wfls-open>ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label.wfls-dropdown-toggle,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label:active,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label.active,.wfls-open>.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label.wfls-dropdown-toggle{color:#00709e;background-color:#e6e6e6;border-color:#004561}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label:active:hover,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label:active:focus,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label:active.focus,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label.active:hover,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label.active:focus,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label.active.focus,.wfls-open>ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label.wfls-dropdown-toggle:hover,.wfls-open>ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label.wfls-dropdown-toggle:focus,.wfls-open>ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label.wfls-dropdown-toggle.focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label:active:hover,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label:active:focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label:active.focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label.active:hover,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label.active:focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label.active.focus,.wfls-open>.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label.wfls-dropdown-toggle:hover,.wfls-open>.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label.wfls-dropdown-toggle:focus,.wfls-open>.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label.wfls-dropdown-toggle.focus{color:#00709e;background-color:#d4d4d4;border-color:#00161f}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label:active,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label.wfls-active,.wfls-open>ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label.wfls-dropdown-toggle,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label:active,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label.wfls-active,.wfls-open>.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label.wfls-dropdown-toggle{background-image:none}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label.wfls-disabled,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label[disabled],ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label[readonly],fieldset[disabled] ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label.wfls-disabled,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label[disabled],.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label[readonly],fieldset[disabled] .wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label{color:#777;background-color:#fff;border-color:#e2e2e2;cursor:not-allowed;opacity:0.75}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label.wfls-disabled:hover,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label.wfls-disabled:focus,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label.wfls-disabled.wfls-focus,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label[disabled]:hover,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label[disabled]:focus,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label[disabled].wfls-focus,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label[readonly]:hover,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label[readonly]:focus,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label[readonly].wfls-focus,fieldset[disabled] ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label:hover,fieldset[disabled] ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label:focus,fieldset[disabled] ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label.wfls-focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label.wfls-disabled:hover,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label.wfls-disabled:focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label.wfls-disabled.wfls-focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label[disabled]:hover,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label[disabled]:focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label[disabled].wfls-focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label[readonly]:hover,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label[readonly]:focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label[readonly].wfls-focus,fieldset[disabled] .wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label:hover,fieldset[disabled] .wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label:focus,fieldset[disabled] .wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label.wfls-focus{background-color:#fff;border-color:#00709e}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label .wfls-badge,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label .wfls-badge{color:#fff;background-color:#00709e}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label.wfls-segment-first,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label.wfls-segment-first{border-radius:4px 0 0 4px}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label.wfls-segment-last,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label.wfls-segment-last{border-radius:0 4px 4px 0}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio],.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]{position:absolute;left:-9999px}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label{color:#fff;background-color:#00709e;border-color:#005e85}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label:focus,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label:focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.focus{color:#fff;background-color:#004c6b;border-color:#000405}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label:hover,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label:hover{color:#fff;background-color:#004c6b;border-color:#003347}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label:active,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.active,.wfls-open>ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-dropdown-toggle,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label:active,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.active,.wfls-open>.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-dropdown-toggle{color:#fff;background-color:#004c6b;border-color:#003347}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label:active:hover,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label:active:focus,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label:active.focus,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.active:hover,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.active:focus,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.active.focus,.wfls-open>ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-dropdown-toggle:hover,.wfls-open>ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-dropdown-toggle:focus,.wfls-open>ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-dropdown-toggle.focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label:active:hover,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label:active:focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label:active.focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.active:hover,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.active:focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.active.focus,.wfls-open>.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-dropdown-toggle:hover,.wfls-open>.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-dropdown-toggle:focus,.wfls-open>.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-dropdown-toggle.focus{color:#fff;background-color:#003347;border-color:#000405}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label:active,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-active,.wfls-open>ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-dropdown-toggle,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label:active,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-active,.wfls-open>.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-dropdown-toggle{background-image:none}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-disabled,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label[disabled],ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label[readonly],fieldset[disabled] ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-disabled,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label[disabled],.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label[readonly],fieldset[disabled] .wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label{color:#fff;background-color:#59a2c0;border-color:#5996b0;cursor:not-allowed;opacity:0.75}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-disabled:hover,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-disabled:focus,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-disabled.wfls-focus,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label[disabled]:hover,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label[disabled]:focus,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label[disabled].wfls-focus,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label[readonly]:hover,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label[readonly]:focus,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label[readonly].wfls-focus,fieldset[disabled] ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label:hover,fieldset[disabled] ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label:focus,fieldset[disabled] ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-disabled:hover,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-disabled:focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-disabled.wfls-focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label[disabled]:hover,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label[disabled]:focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label[disabled].wfls-focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label[readonly]:hover,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label[readonly]:focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label[readonly].wfls-focus,fieldset[disabled] .wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label:hover,fieldset[disabled] .wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label:focus,fieldset[disabled] .wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-focus{background-color:#00709e;border-color:#005e85}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label .wfls-badge,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label .wfls-badge{color:#00709e;background-color:#fff}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:disabled+label,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:disabled+label{cursor:not-allowed;filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=65);opacity:.65}ul.wfls-option.wfls-option-toggled-multiple,.wfls-form-field.wfls-option-toggled-multiple{-webkit-flex-direction:column;flex-direction:column;-webkit-align-items:flex-start;align-items:flex-start}ul.wfls-option.wfls-option-toggled-multiple>.wfls-option-title,.wfls-form-field.wfls-option-toggled-multiple>.wfls-option-title{font-weight:600}ul.wfls-option>.wfls-option-spacer,.wfls-form-field>.wfls-option-spacer{-webkit-flex-grow:0;flex-grow:0;-webkit-flex-shrink:0;flex-shrink:0;margin:0 1rem 0 0;width:30px;height:30px}@media (min-width: 768px){ul.wfls-option>.wfls-option-spacer,.wfls-form-field>.wfls-option-spacer{width:20px;height:20px}}ul.wfls-option>.wfls-option-premium-lock,.wfls-form-field>.wfls-option-premium-lock{-webkit-flex-grow:0;flex-grow:0;-webkit-flex-shrink:0;flex-shrink:0;background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB3aWR0aD0iMjRweCIgaGVpZ2h0PSIzMHB4IiB2aWV3Qm94PSIwIDAgMjQgMzAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KCTxwYXRoIGQ9Ik0yMy45NDksMTQuMjMzYy0wLjM3OSwtMC4zOSAtMC45MDQsLTAuNjA2IC0xLjQ0OCwtMC41OTVsLTAuNjgzLDBsMCwtNC4wOTJjMC4wMzIsLTIuNTM1IC0wLjk4NiwtNC45NzMgLTIuODEyLC02LjczMWMtMS43NTksLTEuODI4IC00LjE5OCwtMi44NDcgLTYuNzM0LC0yLjgxNWMtMi41MzYsLTAuMDMyIC00Ljk3NiwwLjk4NyAtNi43MzQsMi44MTVjLTEuODI2LDEuNzU4IC0yLjg0NCw0LjE5NiAtMi44MTIsNi43MzFsMCw0LjA4OWwtMC42OCwwYy0wLjU0NCwtMC4wMTEgLTEuMDY5LDAuMjA1IC0xLjQ0OCwwLjU5NWMtMC4zOTUsMC4zODIgLTAuNjEyLDAuOTEyIC0wLjU5OCwxLjQ2MWwwLDEyLjI2NmMtMC4wMTEsMC41NDQgMC4yMDQsMS4wNjkgMC41OTUsMS40NDhjMC4zNzksMC4zOTEgMC45MDQsMC42MDYgMS40NDgsMC41OTVsMjAuNDU4LDBjMC4wMDMsMCAwLjAwNiwwIDAuMDEsMGMxLjExNywwIDIuMDM2LC0wLjkxOSAyLjAzNiwtMi4wMzdjMCwtMC4wMDMgMCwtMC4wMDYgMCwtMC4wMDlsMCwtMTIuMjYzYzAuMDExLC0wLjU0NCAtMC4yMDYsLTEuMDY5IC0wLjU5OCwtMS40NDhsMCwtMC4wMVptLTYuMjExLC0wLjU5NWwtMTAuOTE5LDBsMCwtNC4wOTJjLTAuMDIyLC0xLjQ1MSAwLjU1NywtMi44NDggMS41OTksLTMuODU4YzEuMDA5LC0xLjA0MiAyLjQwNywtMS42MjEgMy44NTcsLTEuNTk4YzEuNDUxLC0wLjAyMyAyLjg0OCwwLjU1NiAzLjg1OCwxLjU5OGMxLjA0MiwxLjAwOSAxLjYyMSwyLjQwNyAxLjU5OCwzLjg1OGwwLjAwNyw0LjA5MloiIGZpbGw9IiNkMWQxZDEiLz4KPC9zdmc+");background-repeat:no-repeat;background-position:center center;background-size:contain;margin:0 1rem 0 0;width:30px;height:30px}@media (min-width: 768px){ul.wfls-option>.wfls-option-premium-lock,.wfls-form-field>.wfls-option-premium-lock{margin:0 2rem 0 1rem;width:20px;height:20px}}ul.wfls-option>.wfls-option-checkbox,.wfls-form-field>.wfls-option-checkbox{-webkit-flex-grow:0;flex-grow:0;-webkit-flex-shrink:0;flex-shrink:0;margin:0 1rem 0 0}ul.wfls-option>.wfls-boolean-switch,.wfls-form-field>.wfls-boolean-switch{-webkit-flex-grow:0;flex-grow:0;-webkit-flex-shrink:0;flex-shrink:0;margin:0 1rem 0 0}@media (min-width: 768px){ul.wfls-option>.wfls-boolean-switch,.wfls-form-field>.wfls-boolean-switch{margin:0 1rem 0 1rem}}ul.wfls-option.wfls-option-no-spacing>.wfls-boolean-switch,.wfls-form-field.wfls-option-no-spacing>.wfls-boolean-switch{margin:0}ul.wfls-option>.wfls-option-radio-container,.wfls-form-field>.wfls-option-radio-container{-webkit-flex-grow:0;flex-grow:0;-webkit-flex-shrink:0;flex-shrink:0;margin:0 1rem 0 0}@media (min-width: 768px){ul.wfls-option>.wfls-option-radio-container,.wfls-form-field>.wfls-option-radio-container{margin:0 2rem 0 1rem}}ul.wfls-option>.wfls-option-radio-container [type=radio].wfls-option-radio+label:before,.wfls-form-field>.wfls-option-radio-container [type=radio].wfls-option-radio+label:before{margin:0}ul.wfls-option>li>.wfls-option-title,ul.wfls-option>.wfls-option-title,ul.wfls-option>.wfls-option-content>ul>.wfls-option-title,.wfls-form-field>li>.wfls-option-title,.wfls-form-field>.wfls-option-title,.wfls-form-field>.wfls-option-content>ul>.wfls-option-title{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:0.9rem;color:#2b2b2b;padding-right:0.5rem}ul.wfls-option>li>.wfls-option-title.wfls-option-title-top,ul.wfls-option>.wfls-option-title.wfls-option-title-top,ul.wfls-option>.wfls-option-content>ul>.wfls-option-title.wfls-option-title-top,.wfls-form-field>li>.wfls-option-title.wfls-option-title-top,.wfls-form-field>.wfls-option-title.wfls-option-title-top,.wfls-form-field>.wfls-option-content>ul>.wfls-option-title.wfls-option-title-top{-webkit-align-self:flex-start;align-self:flex-start}ul.wfls-option>li>.wfls-option-title.wfls-option-title-bottom,ul.wfls-option>.wfls-option-title.wfls-option-title-bottom,ul.wfls-option>.wfls-option-content>ul>.wfls-option-title.wfls-option-title-bottom,.wfls-form-field>li>.wfls-option-title.wfls-option-title-bottom,.wfls-form-field>.wfls-option-title.wfls-option-title-bottom,.wfls-form-field>.wfls-option-content>ul>.wfls-option-title.wfls-option-title-bottom{-webkit-align-self:flex-end;align-self:flex-end}ul.wfls-option .wfls-option-subtitle,.wfls-form-field .wfls-option-subtitle{padding-top:0.25rem;font-size:0.75rem}ul.wfls-option .wfls-flex-vertical .wfls-option-title,.wfls-form-field .wfls-flex-vertical .wfls-option-title{padding-bottom:0.75rem}ul.wfls-option.wfls-flex-vertical>.wfls-option-subtitle,.wfls-form-field.wfls-flex-vertical>.wfls-option-subtitle{padding-top:0.25rem !important;font-size:0.75rem !important}ul.wfls-option .wfls-option-checkboxes,ul.wfls-option .wfls-option-checkboxes>ul,.wfls-form-field .wfls-option-checkboxes,.wfls-form-field .wfls-option-checkboxes>ul{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;flex-wrap:nowrap}ul.wfls-option .wfls-option-checkboxes.wfls-option-checkboxes-wrap,ul.wfls-option .wfls-option-checkboxes>ul.wfls-option-checkboxes-wrap,.wfls-form-field .wfls-option-checkboxes.wfls-option-checkboxes-wrap,.wfls-form-field .wfls-option-checkboxes>ul.wfls-option-checkboxes-wrap{-webkit-flex-wrap:wrap;flex-wrap:wrap}ul.wfls-option .wfls-option-checkboxes,.wfls-form-field .wfls-option-checkboxes{margin-top:0.5rem}ul.wfls-option .wfls-option-checkboxes>ul,.wfls-form-field .wfls-option-checkboxes>ul{margin-top:0.5rem;margin-right:1rem}@media (min-width: 768px){ul.wfls-option .wfls-option-checkboxes>ul,.wfls-form-field .wfls-option-checkboxes>ul{margin-right:1.5rem}}ul.wfls-option .wfls-option-checkboxes>ul:last-of-type,.wfls-form-field .wfls-option-checkboxes>ul:last-of-type{margin-right:0}ul.wfls-option .wfls-option-checkboxes>ul>.wfls-option-checkbox,.wfls-form-field .wfls-option-checkboxes>ul>.wfls-option-checkbox{margin:0 1rem 0 0}ul.wfls-option li.wfls-option-text,ul.wfls-option li.wfls-option-textarea,ul.wfls-option td.wfls-option-text,.wfls-form-field li.wfls-option-text,.wfls-form-field li.wfls-option-textarea,.wfls-form-field td.wfls-option-text{padding-top:0.5rem}@media (min-width: 768px){ul.wfls-option li.wfls-option-text,ul.wfls-option li.wfls-option-textarea,ul.wfls-option td.wfls-option-text,.wfls-form-field li.wfls-option-text,.wfls-form-field li.wfls-option-textarea,.wfls-form-field td.wfls-option-text{-webkit-flex-grow:1;flex-grow:1;text-align:right;padding-left:1rem;padding-top:0}}ul.wfls-option li.wfls-option-text>input[type="text"],.wfls-form-field li.wfls-option-text>input[type="text"]{max-width:240px}@media (min-width: 768px){ul.wfls-option li.wfls-option-text>input[type="text"],.wfls-form-field li.wfls-option-text>input[type="text"]{max-width:280px}}@media (min-width: 992px){ul.wfls-option li.wfls-option-text>input[type="text"],.wfls-form-field li.wfls-option-text>input[type="text"]{max-width:340px}}ul.wfls-option li.wfls-option-text.wfls-option-full-width>input[type="text"],.wfls-form-field li.wfls-option-text.wfls-option-full-width>input[type="text"]{max-width:100%;width:100%}ul.wfls-option li.wfls-option-textarea,.wfls-form-field li.wfls-option-textarea{min-width:150px;max-width:240px}@media (min-width: 768px){ul.wfls-option li.wfls-option-textarea,.wfls-form-field li.wfls-option-textarea{min-width:200px;max-width:400px}}@media (min-width: 992px){ul.wfls-option li.wfls-option-textarea,.wfls-form-field li.wfls-option-textarea{min-width:250px;max-width:500px}}ul.wfls-option li.wfls-option-textarea>textarea,.wfls-form-field li.wfls-option-textarea>textarea{width:100%;height:80px;min-width:150px;max-width:240px}@media (min-width: 768px){ul.wfls-option li.wfls-option-textarea>textarea,.wfls-form-field li.wfls-option-textarea>textarea{min-width:200px;max-width:280px}}@media (min-width: 992px){ul.wfls-option li.wfls-option-textarea>textarea,.wfls-form-field li.wfls-option-textarea>textarea{min-width:250px;max-width:340px}}ul.wfls-option li.wfls-option-textarea>.wfls-flex-vertical>li>textarea,.wfls-form-field li.wfls-option-textarea>.wfls-flex-vertical>li>textarea{width:100%;height:80px;box-sizing:border-box}ul.wfls-option li.wfls-option-textarea>.wfls-flex-vertical>li.wfls-option-subtitle,.wfls-form-field li.wfls-option-textarea>.wfls-flex-vertical>li.wfls-option-subtitle{width:100%;text-align:left}ul.wfls-option li.wfls-option-switch,.wfls-form-field li.wfls-option-switch{-webkit-flex-grow:1;flex-grow:1}ul.wfls-option li.wfls-option-switch.wfls-right .wfls-switch,.wfls-form-field li.wfls-option-switch.wfls-right .wfls-switch{justify-content:flex-end !important}ul.wfls-option li.wfls-option-select,.wfls-form-field li.wfls-option-select{-webkit-flex-grow:1;flex-grow:1;text-align:right}ul.wfls-option li.wfls-option-select select,ul.wfls-option li.wfls-option-select select option,ul.wfls-option li.wfls-option-select .wfselect2-container--default,.wfls-form-field li.wfls-option-select select,.wfls-form-field li.wfls-option-select select option,.wfls-form-field li.wfls-option-select .wfselect2-container--default{font-size:0.7rem;font-weight:bold}@media (min-width: 768px){ul.wfls-option li.wfls-option-select select,ul.wfls-option li.wfls-option-select select option,ul.wfls-option li.wfls-option-select .wfselect2-container--default,.wfls-form-field li.wfls-option-select select,.wfls-form-field li.wfls-option-select select option,.wfls-form-field li.wfls-option-select .wfselect2-container--default{font-size:0.8rem}}@media (min-width: 992px){ul.wfls-option li.wfls-option-select select,ul.wfls-option li.wfls-option-select select option,ul.wfls-option li.wfls-option-select .wfselect2-container--default,.wfls-form-field li.wfls-option-select select,.wfls-form-field li.wfls-option-select select option,.wfls-form-field li.wfls-option-select .wfselect2-container--default{font-size:0.9rem}}ul.wfls-option li.wfls-option-select .wfls-option-select-option,ul.wfls-option li.wfls-option-select .wfselect2-container--default,ul.wfls-option li.wfls-option-select .wfselect2-container--default .wfselect2-selection--single,.wfls-form-field li.wfls-option-select .wfls-option-select-option,.wfls-form-field li.wfls-option-select .wfselect2-container--default,.wfls-form-field li.wfls-option-select .wfselect2-container--default .wfselect2-selection--single{text-align:left;height:40px;border-radius:0;border:0;background-color:#fff;box-shadow:1px 1px 1px 2px rgba(215,215,215,0.35)}ul.wfls-option li.wfls-option-select .wfls-option-select-option .wfselect2-selection__rendered,ul.wfls-option li.wfls-option-select .wfselect2-container--default .wfselect2-selection__rendered,ul.wfls-option li.wfls-option-select .wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__rendered,.wfls-form-field li.wfls-option-select .wfls-option-select-option .wfselect2-selection__rendered,.wfls-form-field li.wfls-option-select .wfselect2-container--default .wfselect2-selection__rendered,.wfls-form-field li.wfls-option-select .wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__rendered{color:#333;line-height:40px}ul.wfls-option li.wfls-option-select .wfls-option-select-option .wfselect2-selection__arrow,ul.wfls-option li.wfls-option-select .wfselect2-container--default .wfselect2-selection__arrow,ul.wfls-option li.wfls-option-select .wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__arrow,.wfls-form-field li.wfls-option-select .wfls-option-select-option .wfselect2-selection__arrow,.wfls-form-field li.wfls-option-select .wfselect2-container--default .wfselect2-selection__arrow,.wfls-form-field li.wfls-option-select .wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__arrow{height:38px}ul.wfls-option li.wfls-option-select .wfls-option-select-option.wfselect2-container--disabled .wfselect2-selection__rendered,ul.wfls-option li.wfls-option-select .wfselect2-container--default.wfselect2-container--disabled .wfselect2-selection__rendered,ul.wfls-option li.wfls-option-select .wfselect2-container--default .wfselect2-selection--single.wfselect2-container--disabled .wfselect2-selection__rendered,.wfls-form-field li.wfls-option-select .wfls-option-select-option.wfselect2-container--disabled .wfselect2-selection__rendered,.wfls-form-field li.wfls-option-select .wfselect2-container--default.wfselect2-container--disabled .wfselect2-selection__rendered,.wfls-form-field li.wfls-option-select .wfselect2-container--default .wfselect2-selection--single.wfselect2-container--disabled .wfselect2-selection__rendered{color:#aaa}ul.wfls-option li.wfls-option-select .wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__arrow b,.wfls-form-field li.wfls-option-select .wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__arrow b{border-color:#333 transparent transparent}ul.wfls-option li.wfls-option-select .wfselect2-container--default.wfselect2-container--open .wfselect2-selection--single .wfselect2-selection__arrow b,.wfls-form-field li.wfls-option-select .wfselect2-container--default.wfselect2-container--open .wfselect2-selection--single .wfselect2-selection__arrow b{border-color:transparent transparent #333}ul.wfls-option.wfls-option-token select,.wfls-form-field.wfls-option-token select{width:240px}@media (min-width: 768px){ul.wfls-option.wfls-option-token select,.wfls-form-field.wfls-option-token select{width:280px}}@media (min-width: 992px){ul.wfls-option.wfls-option-token select,.wfls-form-field.wfls-option-token select{width:320px}}ul.wfls-option.wfls-option-token .wfselect2-container--default,ul.wfls-option.wfls-option-token .wfselect2-container--default .wfselect2-selection--multiple,.wfls-form-field.wfls-option-token .wfselect2-container--default,.wfls-form-field.wfls-option-token .wfselect2-container--default .wfselect2-selection--multiple{border-color:#e2e2e2}ul.wfls-option.wfls-option-token .wfselect2-container--default .wfselect2-selection__choice,ul.wfls-option.wfls-option-token .wfselect2-container--default .wfselect2-selection--multiple .wfselect2-selection__choice,.wfls-form-field.wfls-option-token .wfselect2-container--default .wfselect2-selection__choice,.wfls-form-field.wfls-option-token .wfselect2-container--default .wfselect2-selection--multiple .wfselect2-selection__choice{background-color:#fff;border-color:#e2e2e2;padding:0.5rem}ul.wfls-option.wfls-option-token .wfselect2-container--default .wfselect2-search__field,ul.wfls-option.wfls-option-token .wfselect2-container--default .wfselect2-selection--multiple .wfselect2-search__field,.wfls-form-field.wfls-option-token .wfselect2-container--default .wfselect2-search__field,.wfls-form-field.wfls-option-token .wfselect2-container--default .wfselect2-selection--multiple .wfselect2-search__field{margin-right:5px;margin-top:5px;padding:0.5rem 0}#wfls-option-require-2fa{margin-top:1rem}#wfls-option-require-2fa>li>ul{margin-left:1rem}@media (min-width: 768px){#wfls-option-require-2fa>li>ul{margin-left:1.5rem}}#wfls-option-require-2fa>li>ul:first-of-type{margin-left:0}#wfls-option-require-2fa>li>ul>.wfls-option-checkbox{margin:0 1rem 0 0}.wfls-option-sub{padding-left:2rem !important;margin-left:30px !important}.wfls-select2-suppress-dropdown .wfselect2-results,.wfls-select2-suppress-dropdown .wfselect2-dropdown{display:none}.wfls-options-controls{direction:ltr;background:#ffffff;border-bottom:1px solid #e2e2e2;position:absolute;left:160px;right:0px;top:46px;z-index:900;padding-left:15px;padding-right:15px}@media (min-width: 616px){.wfls-options-controls{position:fixed}}.wfls-options-controls .wfls-block{margin:0}@media (min-width: 782px){.wfls-options-controls .wfls-block{margin:0.5rem 0}}.wfls-options-controls,.sticky-menu .wfls-options-controls{top:32px}.folded .wfls-options-controls{left:36px}@media only screen and (max-width: 960px){.auto-fold .wfls-options-controls{left:36px}}.rtl .wfls-options-controls{right:160px;left:0px}.rtl .folded .wfls-options-controls{right:36px}@media only screen and (max-width: 960px){.rtl .auto-fold .wfls-options-controls{right:36px}}@media screen and (max-width: 782px){.wfls-options-controls,.folded .wfls-options-controls,.auto-fold .wfls-options-controls,.rtl .wfls-options-controls,.rtl .folded .wfls-options-controls,.rtl .auto-fold .wfls-options-controls{left:-10px;right:0px}}.wfls-options-controls-spacer{height:45px}@media (min-width: 782px){.wfls-options-controls-spacer{height:75px}}.wfls-options-controls-spacer,.sticky-menu .wfls-options-controls-spacer{top:61px}.wordfence .wfselect2-container .wfselect2-selection--single{border:1px solid #dadada;font-weight:normal;font-size:0.8rem}#wfls-notices{margin-top:15px}#wfls-notices .wfls-admin-notice{margin-left:0px;margin-right:0px}.wfls-success-text,.wfls-notice-text{display:inline-block;vertical-align:middle;line-height:1.3;font-size:16px;font-weight:bold;font-style:italic}.wfls-notice{margin:12px 0;padding:8px;background-color:#ffffe0;border:1px solid #ffd975;border-width:1px 1px 1px 10px}.wfls-notice-text{color:#6d798c}.wfls-success{margin:12px 0;padding:8px;background-color:#ffffff;border:1px solid #16bc9b;border-width:1px 1px 1px 10px}.wfls-success-text{color:#11967a}.wfls-premium-callout{border:1px solid #dfdfdf;background-color:#ffffff;padding:16px;margin:20px 0 0;text-align:center}.wfls-premium-callout ul{margin:8px 0;padding:0 0 0 15px}.wfls-premium-callout ul li{list-style-type:disc;margin:0;padding:0}.wfls-premium-callout .center{text-align:center;margin:0}.wfls-premium-callout .button-primary{text-align:center;text-transform:uppercase;font-weight:bold;background-color:#00709e}table.wfls-table{background-color:transparent;border-collapse:collapse;border-spacing:0}table.wfls-table td,table.wfls-table th{padding:0}.wfls-table caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}.wfls-table th{text-align:left}.wfls-table{width:100%;max-width:100%;margin-bottom:20px}.wfls-table>thead>tr>th,.wfls-table>thead>tr>td,.wfls-table>tbody>tr>th,.wfls-table>tbody>tr>td,.wfls-table>tfoot>tr>th,.wfls-table>tfoot>tr>td{padding:8px;line-height:1.42857;vertical-align:top;border-top:1px solid #ddd}.wfls-table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.wfls-table>caption+thead>tr:first-child>th,.wfls-table>caption+thead>tr:first-child>td,.wfls-table>colgroup+thead>tr:first-child>th,.wfls-table>colgroup+thead>tr:first-child>td,.wfls-table>thead:first-child>tr:first-child>th,.wfls-table>thead:first-child>tr:first-child>td{border-top:0}.wfls-table>tbody+tbody{border-top:2px solid #ddd}.wfls-table .wfls-table{background-color:#fff}.wfls-table-header-separators>thead>tr>th{border-left:2px solid #ddd}.wfls-table-header-separators>thead>tr>th:first-child{border-left:0}.wfls-table-condensed>thead>tr>th,.wfls-table-condensed>thead>tr>td,.wfls-table-condensed>tbody>tr>th,.wfls-table-condensed>tbody>tr>td,.wfls-table-condensed>tfoot>tr>th,.wfls-table-condensed>tfoot>tr>td{padding:5px}.wfls-table-expanded>thead>tr>th,.wfls-table-expanded>thead>tr>td,.wfls-table-expanded>tbody>tr>th,.wfls-table-expanded>tbody>tr>td,.wfls-table-expanded>tfoot>tr>th,.wfls-table-expanded>tfoot>tr>td{padding:0.5rem 1rem}@media (min-width: 768px){.wfls-table-expanded>thead>tr>th,.wfls-table-expanded>thead>tr>td,.wfls-table-expanded>tbody>tr>th,.wfls-table-expanded>tbody>tr>td,.wfls-table-expanded>tfoot>tr>th,.wfls-table-expanded>tfoot>tr>td{padding:1rem 1.5rem}}.wfls-table-bordered{border:1px solid #ddd}.wfls-table-bordered>thead>tr>th,.wfls-table-bordered>thead>tr>td,.wfls-table-bordered>tbody>tr>th,.wfls-table-bordered>tbody>tr>td,.wfls-table-bordered>tfoot>tr>th,.wfls-table-bordered>tfoot>tr>td{border:1px solid #ddd}.wfls-table-bordered>thead>tr>th,.wfls-table-bordered>thead>tr>td{border-bottom-width:2px}.wfls-table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.wfls-table-hover>tbody>tr:hover{background-color:#f5f5f5}table.wfls-table col[class*="col-"]{position:static;float:none;display:table-column}table.wfls-table td[class*="col-"],table.wfls-table th[class*="col-"]{position:static;float:none;display:table-cell}.wfls-table>thead>tr>td.active,.wfls-table>thead>tr>th.active,.wfls-table>thead>tr.active>td,.wfls-table>thead>tr.active>th,.wfls-table>tbody>tr>td.active,.wfls-table>tbody>tr>th.active,.wfls-table>tbody>tr.active>td,.wfls-table>tbody>tr.active>th,.wfls-table>tfoot>tr>td.active,.wfls-table>tfoot>tr>th.active,.wfls-table>tfoot>tr.active>td,.wfls-table>tfoot>tr.active>th{background-color:#f5f5f5}.wfls-table-hover>tbody>tr>td.active:hover,.wfls-table-hover>tbody>tr>th.active:hover,.wfls-table-hover>tbody>tr.active:hover>td,.wfls-table-hover>tbody>tr:hover>.active,.wfls-table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.wfls-table>thead>tr>td.success,.wfls-table>thead>tr>th.success,.wfls-table>thead>tr.success>td,.wfls-table>thead>tr.success>th,.wfls-table>tbody>tr>td.success,.wfls-table>tbody>tr>th.success,.wfls-table>tbody>tr.success>td,.wfls-table>tbody>tr.success>th,.wfls-table>tfoot>tr>td.success,.wfls-table>tfoot>tr>th.success,.wfls-table>tfoot>tr.success>td,.wfls-table>tfoot>tr.success>th{background-color:#dff0d8}.wfls-table-hover>tbody>tr>td.success:hover,.wfls-table-hover>tbody>tr>th.success:hover,.wfls-table-hover>tbody>tr.success:hover>td,.wfls-table-hover>tbody>tr:hover>.success,.wfls-table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.wfls-table>thead>tr>td.info,.wfls-table>thead>tr>th.info,.wfls-table>thead>tr.info>td,.wfls-table>thead>tr.info>th,.wfls-table>tbody>tr>td.info,.wfls-table>tbody>tr>th.info,.wfls-table>tbody>tr.info>td,.wfls-table>tbody>tr.info>th,.wfls-table>tfoot>tr>td.info,.wfls-table>tfoot>tr>th.info,.wfls-table>tfoot>tr.info>td,.wfls-table>tfoot>tr.info>th{background-color:#d9edf7}.wfls-table-hover>tbody>tr>td.info:hover,.wfls-table-hover>tbody>tr>th.info:hover,.wfls-table-hover>tbody>tr.info:hover>td,.wfls-table-hover>tbody>tr:hover>.info,.wfls-table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.wfls-table>thead>tr>td.warning,.wfls-table>thead>tr>th.warning,.wfls-table>thead>tr.warning>td,.wfls-table>thead>tr.warning>th,.wfls-table>tbody>tr>td.warning,.wfls-table>tbody>tr>th.warning,.wfls-table>tbody>tr.warning>td,.wfls-table>tbody>tr.warning>th,.wfls-table>tfoot>tr>td.warning,.wfls-table>tfoot>tr>th.warning,.wfls-table>tfoot>tr.warning>td,.wfls-table>tfoot>tr.warning>th{background-color:#fcf8e3}.wfls-table-hover>tbody>tr>td.warning:hover,.wfls-table-hover>tbody>tr>th.warning:hover,.wfls-table-hover>tbody>tr.warning:hover>td,.wfls-table-hover>tbody>tr:hover>.warning,.wfls-table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.wfls-table>thead>tr>td.danger,.wfls-table>thead>tr>th.danger,.wfls-table>thead>tr.danger>td,.wfls-table>thead>tr.danger>th,.wfls-table>tbody>tr>td.danger,.wfls-table>tbody>tr>th.danger,.wfls-table>tbody>tr.danger>td,.wfls-table>tbody>tr.danger>th,.wfls-table>tfoot>tr>td.danger,.wfls-table>tfoot>tr>th.danger,.wfls-table>tfoot>tr.danger>td,.wfls-table>tfoot>tr.danger>th{background-color:#f2dede}.wfls-table-hover>tbody>tr>td.danger:hover,.wfls-table-hover>tbody>tr>th.danger:hover,.wfls-table-hover>tbody>tr.danger:hover>td,.wfls-table-hover>tbody>tr:hover>.danger,.wfls-table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}.wfls-table-responsive{overflow-x:auto;min-height:0.01%}@media screen and (max-width: 767px){.wfls-table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.wfls-table-responsive>.wfls-table{margin-bottom:0}.wfls-table-responsive>.wfls-table>thead>tr>th,.wfls-table-responsive>.wfls-table>thead>tr>td,.wfls-table-responsive>.wfls-table>tbody>tr>th,.wfls-table-responsive>.wfls-table>tbody>tr>td,.wfls-table-responsive>.wfls-table>tfoot>tr>th,.wfls-table-responsive>.wfls-table>tfoot>tr>td{white-space:nowrap}.wfls-table-responsive>.wfls-table-bordered{border:0}.wfls-table-responsive>.wfls-table-bordered>thead>tr>th:first-child,.wfls-table-responsive>.wfls-table-bordered>thead>tr>td:first-child,.wfls-table-responsive>.wfls-table-bordered>tbody>tr>th:first-child,.wfls-table-responsive>.wfls-table-bordered>tbody>tr>td:first-child,.wfls-table-responsive>.wfls-table-bordered>tfoot>tr>th:first-child,.wfls-table-responsive>.wfls-table-bordered>tfoot>tr>td:first-child{border-left:0}.wfls-table-responsive>.wfls-table-bordered>thead>tr>th:last-child,.wfls-table-responsive>.wfls-table-bordered>thead>tr>td:last-child,.wfls-table-responsive>.wfls-table-bordered>tbody>tr>th:last-child,.wfls-table-responsive>.wfls-table-bordered>tbody>tr>td:last-child,.wfls-table-responsive>.wfls-table-bordered>tfoot>tr>th:last-child,.wfls-table-responsive>.wfls-table-bordered>tfoot>tr>td:last-child{border-right:0}.wfls-table-responsive>.wfls-table-bordered>tbody>tr:last-child>th,.wfls-table-responsive>.wfls-table-bordered>tbody>tr:last-child>td,.wfls-table-responsive>.wfls-table-bordered>tfoot>tr:last-child>th,.wfls-table-responsive>.wfls-table-bordered>tfoot>tr:last-child>td{border-bottom:0}}.wfls-sortable{position:relative;padding-right:2rem !important}.wfls-sortable .wfls-sorted-ascending,.wfls-sortable .wfls-sorted-descending{display:none;position:absolute;right:1rem;top:50%;transform:translateY(-50%)}.wfls-sortable.wfls-unsorted:hover .wfls-sorted-ascending{display:block}.wfls-sortable.wfls-unsorted,.wfls-sortable.wfls-sorted-ascending,.wfls-sortable.wfls-sorted-descending{cursor:pointer}.wfls-sortable.wfls-unsorted:hover,.wfls-sortable.wfls-sorted-ascending:hover,.wfls-sortable.wfls-sorted-descending:hover{background-color:#e0e0e0}.wfls-sortable.wfls-sorted-ascending,.wfls-sortable.wfls-sorted-descending{background-color:#e0e0e0}.wfls-sortable.wfls-sorted-ascending .wfls-sorted-ascending{display:block}.wfls-sortable.wfls-sorted-descending .wfls-sorted-descending{display:block}.wfls-nav{margin-bottom:0;padding-left:0;list-style:none}.wfls-nav:before,.wfls-nav:after{content:" ";display:table}.wfls-nav:after{clear:both}.wfls-nav>li{position:relative;display:block}.wfls-nav>li>a{position:relative;display:block;padding:8px 12px}.wfls-nav>li>a:hover,.wfls-nav>li>a:focus{text-decoration:none;background-color:#e2e2e2}.wfls-nav>li.wfls-disabled>a{color:#777}.wfls-nav>li.wfls-disabled>a:hover,.wfls-nav>li.wfls-disabled>a:focus{color:#777;text-decoration:none;background-color:transparent;cursor:not-allowed}.wfls-nav .wfls-open>a,.wfls-nav .wfls-open>a:hover,.wfls-nav .wfls-open>a:focus{background-color:#e2e2e2;border-color:#00709e}.wfls-nav>li>a>img{max-width:none}.wfls-nav-tabs{border-bottom:1px solid #d0d0d0}.wfls-nav-tabs>li{float:left;margin-bottom:-1px}.wfls-nav-tabs>li>a{margin-right:2px;line-height:1.42857;border:1px solid transparent;border-radius:4px 4px 0 0}.wfls-nav-tabs>li>a:hover{border-color:#e2e2e2 #e2e2e2 #d0d0d0}.wfls-nav-tabs>li.wfls-active>a,.wfls-nav-tabs>li.wfls-active>a:hover,.wfls-nav-tabs>li.wfls-active>a:focus{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.wfls-nav-pills>li{float:left}.wfls-nav-pills>li>a{border-radius:4px;text-decoration:none;position:relative;display:block;padding:8px 12px}.wfls-nav-pills>li>a:hover,.wfls-nav-pills>li>a:focus{text-decoration:none !important;background-color:#e2e2e2}.wfls-nav-pills>li+li{margin-left:2px}.wfls-nav-pills>li.wfls-active>a,.wfls-nav-pills>li.wfls-active>a:hover,.wfls-nav-pills>li.wfls-active>a:focus{color:#fff;background-color:#00709e}.wfls-nav-pills.wfls-nav-pills-bordered>li>a{border:1px solid #e2e2e2}.wfls-nav-pills.wfls-nav-pills-connected>li>a{border-radius:0;border-right-width:0px}.wfls-nav-pills.wfls-nav-pills-connected>li+li{margin-left:0}.wfls-nav-pills.wfls-nav-pills-connected>li.active+li>a{border-left-width:0px}.wfls-nav-pills.wfls-nav-pills-connected>li:first-of-type>a{-moz-border-radius:4px 0 0 4px;-webkit-border-radius:4px;border-radius:4px 0 0 4px}.wfls-nav-pills.wfls-nav-pills-connected>li:last-of-type>a{-moz-border-radius:0 4px 4px 0;-webkit-border-radius:0;border-radius:0 4px 4px 0;border-right-width:1px}.wfls-nav-stacked>li{float:none}.wfls-nav-stacked>li+li{margin-top:2px;margin-left:0}.wfls-nav-justified,.wfls-nav-tabs.wfls-nav-justified{width:100%}.wfls-nav-justified>li,.wfls-nav-tabs.wfls-nav-justified>li{float:none}.wfls-nav-justified>li>a,.wfls-nav-tabs.wfls-nav-justified>li>a{text-align:center;margin-bottom:5px}.wfls-nav-justified>.wfls-dropdown .wfls-dropdown-menu{top:auto;left:auto}@media (min-width: 768px){.wfls-nav-justified>li,.wfls-nav-tabs.wfls-nav-justified>li{display:table-cell;width:1%}.wfls-nav-justified>li>a,.wfls-nav-tabs.wfls-nav-justified>li>a{margin-bottom:0}}.wfls-nav-tabs-justified,.wfls-nav-tabs.wfls-nav-justified{border-bottom:0}.wfls-nav-tabs-justified>li>a,.wfls-nav-tabs.wfls-nav-justified>li>a{margin-right:0;border-radius:4px}.wfls-nav-tabs-justified>.wfls-active>a,.wfls-nav-tabs.wfls-nav-justified>.wfls-active>a,.wfls-nav-tabs-justified>.wfls-active>a:hover,.wfls-nav-tabs.wfls-nav-justified>.wfls-active>a:hover,.wfls-nav-tabs-justified>.wfls-active>a:focus,.wfls-nav-tabs.wfls-nav-justified>.wfls-active>a:focus{border:1px solid #ddd}@media (min-width: 768px){.wfls-nav-tabs-justified>li>a,.wfls-nav-tabs.wfls-nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.wfls-nav-tabs-justified>.wfls-active>a,.wfls-nav-tabs.wfls-nav-justified>.wfls-active>a,.wfls-nav-tabs-justified>.wfls-active>a:hover,.wfls-nav-tabs.wfls-nav-justified>.wfls-active>a:hover,.wfls-nav-tabs-justified>.wfls-active>a:focus,.wfls-nav-tabs.wfls-nav-justified>.wfls-active>a:focus{border-bottom-color:#fff}}.wfls-tab-content>.wfls-tab-pane{display:none}.wfls-tab-content>.wfls-active{display:block}.wfls-nav-tabs .wfls-dropdown-menu{margin-top:-1px;-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0}.wfls-navbar-brand{float:left;padding:12px 8px;font-size:18px;line-height:20px;margin:10px 0 0 0}.wfls-navbar-brand:hover,.wfls-navbar-brand:focus{text-decoration:none}.wfls-navbar-brand>img{display:block}@media (min-width: 768px){.navbar>.container .wfls-navbar-brand,.navbar>.container-fluid .wfls-navbar-brand{margin-left:-8px}}.wfls-caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid \9;border-right:4px solid transparent;border-left:4px solid transparent}.wfls-dropup,.wfls-dropdown{position:relative}.wfls-dropdown-toggle:focus{outline:0}.wfls-dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;text-align:left;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);background-clip:padding-box}.wfls-dropdown-menu .wfls-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.wfls-dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.42857;color:#333;text-decoration:none;white-space:nowrap}.wfls-dropdown-menu>li>a:hover,.wfls-dropdown-menu>li>a:focus{text-decoration:none;color:#262626;background-color:#f5f5f5}.wfls-dropdown-menu>.wfls-active>a,.wfls-dropdown-menu>.wfls-active>a:hover,.wfls-dropdown-menu>.wfls-active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#00709e}.wfls-dropdown-menu>.wfls-disabled>a,.wfls-dropdown-menu>.wfls-disabled>a:hover,.wfls-dropdown-menu>.wfls-disabled>a:focus{color:#777}.wfls-dropdown-menu>.wfls-disabled>a:hover,.wfls-dropdown-menu>.wfls-disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);cursor:not-allowed}.wfls-open>.wfls-dropdown-menu{display:block}.wfls-open>a{outline:0}.wfls-dropdown-menu-right{left:auto;right:0}.wfls-dropdown-menu-left{left:0;right:auto}.wfls-dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857;color:#777;white-space:nowrap}.wfls-dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.wfls-pull-right>.wfls-dropdown-menu{right:0;left:auto}.wfls-dropup .wfls-caret,.wfls-navbar-fixed-bottom .wfls-dropdown .wfls-caret{border-top:0;border-bottom:4px dashed;border-bottom:4px solid \9;content:""}.wfls-dropup .wfls-dropdown-menu,.wfls-navbar-fixed-bottom .wfls-dropdown .wfls-dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width: 768px){.wfls-navbar-right .wfls-dropdown-menu{right:0;left:auto}.wfls-navbar-right .wfls-dropdown-menu-left{left:0;right:auto}}.wfls-mobile-dropdown{border:1px solid #ccc;margin-left:.5em;padding:5px 10px;font-size:14px;line-height:24px;margin:10px 10px 0 0;background:#f1f1f1;color:#000;font-weight:600;text-decoration:none}table.wfls-dataTable{width:auto;max-width:800px;clear:both;border-collapse:collapse;border-spacing:0}table.wfls-dataTable>thead th,table.wfls-dataTable>tfoot th{font-weight:bold}table.wfls-dataTable>thead th,table.wfls-dataTable>thead td{cursor:pointer;text-align:left;font-size:11px;border:1px solid #ccc;padding:8px 4px 5px 9px;text-transform:uppercase}table.wfls-dataTable>thead th:active,table.wfls-dataTable>thead td:active{outline:none}table.wfls-dataTable>tfoot th,table.wfls-dataTable>tfoot td{padding:10px 18px 6px 18px;border-top:1px solid #111}table.wfls-dataTable>thead .sorting,table.wfls-dataTable>thead .sorting_asc,table.wfls-dataTable>thead .sorting_desc{cursor:pointer;*cursor:hand}table.wfls-dataTable>thead .sorting,table.wfls-dataTable>thead .sorting_asc,table.wfls-dataTable>thead .sorting_desc,table.wfls-dataTable>thead .sorting_asc_disabled,table.wfls-dataTable>thead .sorting_desc_disabled{background-repeat:no-repeat;background-position:center right}table.wfls-dataTable>thead .sorting{background-image:url(../img/sort_both.png)}table.wfls-dataTable>thead .sorting_asc{background-image:url(../img/sort_asc.png)}table.wfls-dataTable>thead .sorting_desc{background-image:url(../img/sort_desc.png)}table.wfls-dataTable>thead .sorting_asc_disabled{background-image:url(../img/sort_asc_disabled.png)}table.wfls-dataTable>thead .sorting_desc_disabled{background-image:url(../img/sort_desc_disabled.png)}table.wfls-dataTable>tbody>tr{background-color:#ffffff}table.wfls-dataTable>tbody>tr.selected{background-color:#B0BED9}table.wfls-dataTable>tbody>tr>th,table.wfls-dataTable>tbody>tr>td{padding:5px 8px}table.wfls-dataTable.row-border>tbody>tr>th,table.wfls-dataTable.row-border>tbody>tr>td,table.wfls-dataTable.display>tbody>tr>th,table.wfls-dataTable.display>tbody>tr>td{border:1px solid #cccccc}table.wfls-dataTable.row-border>tbody>tr:first-child>th,table.wfls-dataTable.row-border>tbody>tr:first-child>td,table.wfls-dataTable.display>tbody>tr:first-child>th,table.wfls-dataTable.display>tbody>tr:first-child>td{border-top:none}table.wfls-dataTable.cell-border>tbody>tr>th,table.wfls-dataTable.cell-border>tbody>tr>td{border-top:1px solid #ddd;border-right:1px solid #ddd}table.wfls-dataTable.cell-border>tbody>tr>th:first-child,table.wfls-dataTable.cell-border>tbody>tr>td:first-child{border-left:1px solid #ddd}table.wfls-dataTable.cell-border>tbody>tr:first-child>th,table.wfls-dataTable.cell-border>tbody>tr:first-child>td{border-top:none}table.wfls-dataTable.stripe>tbody>tr.odd,table.wfls-dataTable.display>tbody>tr.odd{background-color:#f9f9f9}table.wfls-dataTable.stripe>tbody>tr.odd.selected,table.wfls-dataTable.display>tbody>tr.odd.selected{background-color:#acbad4}table.wfls-dataTable.hover>tbody>tr:hover,table.wfls-dataTable.display>tbody>tr:hover{background-color:#f6f6f6}table.wfls-dataTable.hover>tbody>tr:hover.selected,table.wfls-dataTable.display>tbody>tr:hover.selected{background-color:#aab7d1}table.wfls-dataTable.order-column>tbody>tr>.sorting_1,table.wfls-dataTable.order-column>tbody>tr>.sorting_2,table.wfls-dataTable.order-column>tbody>tr>.sorting_3,table.wfls-dataTable.display tbody>tr>.sorting_1,table.wfls-dataTable.display>tbody>tr>.sorting_2,table.wfls-dataTable.display>tbody>tr>.sorting_3{background-color:#fafafa}table.wfls-dataTable.order-column>tbody>tr.selected>.sorting_1,table.wfls-dataTable.order-column>tbody>tr.selected>.sorting_2,table.wfls-dataTable.order-column>tbody>tr.selected>.sorting_3,table.wfls-dataTable.display>tbody>tr.selected>.sorting_1,table.wfls-dataTable.display>tbody>tr.selected>.sorting_2,table.wfls-dataTable.display>tbody>tr.selected>.sorting_3{background-color:#acbad5}table.wfls-dataTable.display>tbody>tr.odd>.sorting_1,table.wfls-dataTable.order-column.stripe>tbody>tr.odd>.sorting_1{background-color:#f1f1f1}table.wfls-dataTable.display>tbody>tr.odd>.sorting_2,table.wfls-dataTable.order-column.stripe>tbody>tr.odd>.sorting_2{background-color:#f3f3f3}table.wfls-dataTable.display>tbody>tr.odd>.sorting_3,table.wfls-dataTable.order-column.stripe>tbody>tr.odd>.sorting_3{background-color:whitesmoke}table.wfls-dataTable.display>tbody>tr.odd.selected>.sorting_1,table.wfls-dataTable.order-column.stripe>tbody>tr.odd.selected>.sorting_1{background-color:#a6b4cd}table.wfls-dataTable.display>tbody>tr.odd.selected>.sorting_2,table.wfls-dataTable.order-column.stripe>tbody>tr.odd.selected>.sorting_2{background-color:#a8b5cf}table.wfls-dataTable.display>tbody>tr.odd.selected>.sorting_3,table.wfls-dataTable.order-column.stripe>tbody>tr.odd.selected>.sorting_3{background-color:#a9b7d1}table.wfls-dataTable.display>tbody>tr.even>.sorting_1,table.wfls-dataTable.order-column.stripe>tbody>tr.even>.sorting_1{background-color:#fafafa}table.wfls-dataTable.display>tbody>tr.even>.sorting_2,table.wfls-dataTable.order-column.stripe>tbody>tr.even>.sorting_2{background-color:#fcfcfc}table.wfls-dataTable.display>tbody>tr.even>.sorting_3,table.wfls-dataTable.order-column.stripe>tbody>tr.even>.sorting_3{background-color:#fefefe}table.wfls-dataTable.display>tbody>tr.even.selected>.sorting_1,table.wfls-dataTable.order-column.stripe>tbody>tr.even.selected>.sorting_1{background-color:#acbad5}table.wfls-dataTable.display>tbody>tr.even.selected>.sorting_2,table.wfls-dataTable.order-column.stripe>tbody>tr.even.selected>.sorting_2{background-color:#aebcd6}table.wfls-dataTable.display>tbody>tr.even.selected>.sorting_3,table.wfls-dataTable.order-column.stripe>tbody>tr.even.selected>.sorting_3{background-color:#afbdd8}table.wfls-dataTable.display>tbody>tr:hover>.sorting_1,table.wfls-dataTable.order-column.hover>tbody>tr:hover>.sorting_1{background-color:#eaeaea}table.wfls-dataTable.display>tbody>tr:hover>.sorting_2,table.wfls-dataTable.order-column.hover>tbody>tr:hover>.sorting_2{background-color:#ececec}table.wfls-dataTable.display>tbody>tr:hover>.sorting_3,table.wfls-dataTable.order-column.hover>tbody>tr:hover>.sorting_3{background-color:#efefef}table.wfls-dataTable.display>tbody>tr:hover.selected>.sorting_1,table.wfls-dataTable.order-column.hover>tbody>tr:hover.selected>.sorting_1{background-color:#a2aec7}table.wfls-dataTable.display>tbody>tr:hover.selected>.sorting_2,table.wfls-dataTable.order-column.hover>tbody>tr:hover.selected>.sorting_2{background-color:#a3b0c9}table.wfls-dataTable.display>tbody>tr:hover.selected>.sorting_3,table.wfls-dataTable.order-column.hover>tbody>tr:hover.selected>.sorting_3{background-color:#a5b2cb}table.wfls-dataTable.no-footer{border-bottom:1px solid #111}table.wfls-dataTable.nowrap th,table.wfls-dataTable.nowrap td{white-space:nowrap}table.wfls-dataTable.compact thead th,table.wfls-dataTable.compact thead td{padding:4px 17px 4px 4px}table.wfls-dataTable.compact tfoot th,table.wfls-dataTable.compact tfoot td{padding:4px}table.wfls-dataTable.compact>tbody>tr>th,table.wfls-dataTable.compact>tbody>tr>td{padding:4px}table.wfls-dataTable th.dt-left,table.wfls-dataTable td.dt-left{text-align:left}table.wfls-dataTable th.dt-center,table.wfls-dataTable td.dt-center,table.wfls-dataTable td.dataTables_empty{text-align:center}table.wfls-dataTable th.dt-right,table.wfls-dataTable td.dt-right{text-align:right}table.wfls-dataTable th.dt-justify,table.wfls-dataTable td.dt-justify{text-align:justify}table.wfls-dataTable th.dt-nowrap,table.wfls-dataTable td.dt-nowrap{white-space:nowrap}table.wfls-dataTable thead th.dt-head-left,table.wfls-dataTable thead td.dt-head-left,table.wfls-dataTable tfoot th.dt-head-left,table.wfls-dataTable tfoot td.dt-head-left{text-align:left}table.wfls-dataTable thead th.dt-head-center,table.wfls-dataTable thead td.dt-head-center,table.wfls-dataTable tfoot th.dt-head-center,table.wfls-dataTable tfoot td.dt-head-center{text-align:center}table.wfls-dataTable thead th.dt-head-right,table.wfls-dataTable thead td.dt-head-right,table.wfls-dataTable tfoot th.dt-head-right,table.wfls-dataTable tfoot td.dt-head-right{text-align:right}table.wfls-dataTable thead th.dt-head-justify,table.wfls-dataTable thead td.dt-head-justify,table.wfls-dataTable tfoot th.dt-head-justify,table.wfls-dataTable tfoot td.dt-head-justify{text-align:justify}table.wfls-dataTable thead th.dt-head-nowrap,table.wfls-dataTable thead td.dt-head-nowrap,table.wfls-dataTable tfoot th.dt-head-nowrap,table.wfls-dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.wfls-dataTable>tbody>tr>th.dt-body-left,table.wfls-dataTable>tbody>tr>td.dt-body-left{text-align:left}table.wfls-dataTable>tbody>tr>th.dt-body-center,table.wfls-dataTable>tbody>tr>td.dt-body-center{text-align:center}table.wfls-dataTable>tbody>tr>th.dt-body-right,table.wfls-dataTable>tbody>tr>td.dt-body-right{text-align:right}table.wfls-dataTable>tbody>tr>th.dt-body-justify,table.wfls-dataTable>tbody>tr>td.dt-body-justify{text-align:justify}table.wfls-dataTable>tbody>tr>th.dt-body-nowrap,table.wfls-dataTable>tbody>tr>td.dt-body-nowrap{white-space:nowrap}table.wfls-dataTable table.dataTable,table.wfls-dataTable th,table.wfls-dataTable td{-webkit-box-sizing:content-box;box-sizing:content-box}.wfls-dataTables_wrapper{position:relative;clear:both;*zoom:1;zoom:1}.wfls-dataTables_wrapper .dataTables_length{float:left}.wfls-dataTables_wrapper .dataTables_filter{float:right;text-align:right}.wfls-dataTables_wrapper .dataTables_filter input{margin-left:0.5em}.wfls-dataTables_wrapper .dataTables_info{clear:both;float:left;padding-top:0.755em}.wfls-dataTables_wrapper .dataTables_paginate{float:right;text-align:right;padding-top:0.25em}.wfls-dataTables_wrapper .dataTables_paginate .paginate_button{box-sizing:border-box;display:inline-block;min-width:1.5em;padding:0.5em 1em;margin-left:2px;text-align:center;text-decoration:none !important;cursor:pointer;*cursor:hand;color:#333 !important;border:1px solid transparent;border-radius:2px}.wfls-dataTables_wrapper .dataTables_paginate .paginate_button.current,.wfls-dataTables_wrapper .dataTables_paginate .paginate_button.current:hover{color:#333 !important;border:1px solid #979797;background-color:white;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #fff), color-stop(100%, #dcdcdc));background:-webkit-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-moz-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-ms-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-o-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:linear-gradient(to bottom, #ffffff 0%,#dcdcdc 100%)}.wfls-dataTables_wrapper .dataTables_paginate .paginate_button.disabled,.wfls-dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover,.wfls-dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active{cursor:default;color:#666 !important;border:1px solid transparent;background:transparent;box-shadow:none}.wfls-dataTables_wrapper .dataTables_paginate .paginate_button:hover{color:white !important;border:1px solid #111;background-color:#585858;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111));background:-webkit-linear-gradient(top, #585858 0%, #111 100%);background:-moz-linear-gradient(top, #585858 0%, #111 100%);background:-ms-linear-gradient(top, #585858 0%, #111 100%);background:-o-linear-gradient(top, #585858 0%, #111 100%);background:linear-gradient(to bottom, #585858 0%,#111111 100%)}.wfls-dataTables_wrapper .dataTables_paginate .paginate_button:active{outline:none;background-color:#2b2b2b;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));background:-webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:linear-gradient(to bottom, #2b2b2b 0%,#0c0c0c 100%);box-shadow:inset 0 0 3px #111}.wfls-dataTables_wrapper .dataTables_paginate .ellipsis{padding:0 1em}.wfls-dataTables_wrapper .dataTables_processing{position:absolute;top:50%;left:50%;width:100%;height:40px;margin-left:-50%;margin-top:-25px;padding-top:20px;text-align:center;font-size:1.2em;background-color:white;background:-webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255,255,255,0)), color-stop(25%, rgba(255,255,255,0.9)), color-stop(75%, rgba(255,255,255,0.9)), color-stop(100%, rgba(255,255,255,0)));background:-webkit-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-moz-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-ms-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-o-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:linear-gradient(to right, rgba(255,255,255,0) 0%,rgba(255,255,255,0.9) 25%,rgba(255,255,255,0.9) 75%,rgba(255,255,255,0) 100%)}.wfls-dataTables_wrapper .dataTables_length,.wfls-dataTables_wrapper .dataTables_filter,.wfls-dataTables_wrapper .dataTables_info,.wfls-dataTables_wrapper .dataTables_processing,.wfls-dataTables_wrapper .dataTables_paginate{color:#333}.wfls-dataTables_wrapper .dataTables_scroll{clear:both}.wfls-dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody{*margin-top:-1px;-webkit-overflow-scrolling:touch}.wfls-dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody th,.wfls-dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody td{vertical-align:middle}.wfls-dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody th>div.dataTables_sizing,.wfls-dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody td>div.dataTables_sizing{height:0;overflow:hidden;margin:0 !important;padding:0 !important}.wfls-dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:1px solid #111}.wfls-dataTables_wrapper.no-footer div.dataTables_scrollHead table,.wfls-dataTables_wrapper.no-footer div.dataTables_scrollBody table{border-bottom:none}.wfls-dataTables_wrapper:after{visibility:hidden;display:block;content:"";clear:both;height:0}@media screen and (max-width: 767px){.wfls-dataTables_wrapper .dataTables_info,.wfls-dataTables_wrapper .dataTables_paginate{float:none;text-align:center}.wfls-dataTables_wrapper .dataTables_paginate{margin-top:0.5em}}@media screen and (max-width: 640px){.wfls-dataTables_wrapper .dataTables_length,.wfls-dataTables_wrapper .dataTables_filter{float:none;text-align:center}.wfls-dataTables_wrapper .dataTables_filter{margin-top:0.5em}}.wfls-alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.wfls-alert h4{margin-top:0;color:inherit}.wfls-alert .wfls-alert-link{font-weight:bold}.wfls-alert>p,.wfls-alert>ul{margin-bottom:0}.wfls-alert>p+p{margin-top:5px}.wfls-alert-dismissable,.wfls-alert-dismissible{padding-right:35px}.wfls-alert-dismissable .close,.wfls-alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.wfls-alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}.wfls-alert-success hr{border-top-color:#c9e2b3}.wfls-alert-success .alert-link{color:#2b542c}.wfls-alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.wfls-alert-info hr{border-top-color:#a6e1ec}.wfls-alert-info .alert-link{color:#245269}.wfls-alert-warning{background-color:#fcf8e3;border-color:#faebcc;color:#8a6d3b}.wfls-alert-warning hr{border-top-color:#f7e1b5}.wfls-alert-warning .alert-link{color:#66512c}.wfls-alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442}.wfls-alert-danger hr{border-top-color:#e4b9c0}.wfls-alert-danger .alert-link{color:#843534}#wfls-onboarding-standalone-modal{margin-bottom:1rem}#wfls-onboarding-standalone-modal #wfls-onboarding-standalone-modal-header{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:row;flex-direction:row;background-color:#00709e;color:#ffffff;padding:1rem 2rem}#wfls-onboarding-standalone-modal #wfls-onboarding-standalone-modal-header #wfls-onboarding-standalone-modal-dismiss{font-size:1.35rem;color:#ffffff;text-decoration:none}#wfls-onboarding-standalone-modal #wfls-onboarding-standalone-modal-header #wfls-onboarding-standalone-modal-dismiss:hover{color:#f1f1f1}#wfls-onboarding-standalone-modal #wfls-onboarding-standalone-modal-header>*:last-child{-webkit-flex-grow:1;flex-grow:1;text-align:right}#wfls-onboarding-standalone-modal #wfls-onboarding-standalone-modal-content{background-color:#ffffff;padding:1rem 2rem}#wfls-onboarding-standalone-modal #wfls-onboarding-standalone-modal-content>p{margin-bottom:0}#wfls-onboarding-standalone-modal #wfls-onboarding-standalone-modal-content>p:first-child{margin-top:0}#wfls-onboarding-standalone-modal #wfls-onboarding-standalone-modal-footer{background-color:#525355;color:#ffffff;padding:0.5rem 2rem}#wfls-onboarding-standalone-modal #wfls-onboarding-standalone-modal-footer>ul{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-end;justify-content:flex-end;-webkit-flex-direction:row;flex-direction:row;margin:0;padding:0}#wfls-onboarding-standalone-modal #wfls-onboarding-standalone-modal-footer>ul>li{margin:0;padding:0 0 0 1rem}#toplevel_page_WFLS .wp-menu-image img{max-width:16px;max-height:16px}
|
|
css/admin.1625749951.css
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
.wfls-clearfix:before,.wfls-clearfix:after{content:" ";display:table}.wfls-clearfix:after{clear:both}.wfls-btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;text-transform:uppercase;padding:.4rem 1rem;font-size:.875rem;line-height:1.3125rem;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media (min-width: 768px){.wfls-btn{padding:.5rem 1.25rem;font-size:.875rem;line-height:1.3125rem;border-radius:4px}}.wfls-btn:focus,.wfls-btn.wfls-focus,.wfls-btn:active:focus,.wfls-btn:active.wfls-focus,.wfls-btn.wfls-active:focus,.wfls-btn.wfls-active.wfls-focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.wfls-btn:hover,.wfls-btn:focus,.wfls-btn.wfls-focus{color:#00709e;text-decoration:none !important}.wfls-btn:active,.wfls-btn.wfls-active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.wfls-btn.wfls-disabled,.wfls-btn[disabled],.wfls-btn[readonly],fieldset[disabled] .wfls-btn{cursor:not-allowed;-webkit-box-shadow:none;box-shadow:none}a.wfls-btn{text-decoration:none}a.wfls-btn.wfls-disabled,fieldset[disabled] a.wfls-btn{cursor:not-allowed;pointer-events:none}.wfls-btn-default{color:#00709e;background-color:#fff;border-color:#00709e}.wfls-btn-default:focus,.wfls-btn-default.focus{color:#00709e;background-color:#e6e6e6;border-color:#00161f}.wfls-btn-default:hover{color:#00709e;background-color:#e6e6e6;border-color:#004561}.wfls-btn-default:active,.wfls-btn-default.active,.wfls-open>.wfls-btn-default.wfls-dropdown-toggle{color:#00709e;background-color:#e6e6e6;border-color:#004561}.wfls-btn-default:active:hover,.wfls-btn-default:active:focus,.wfls-btn-default:active.focus,.wfls-btn-default.active:hover,.wfls-btn-default.active:focus,.wfls-btn-default.active.focus,.wfls-open>.wfls-btn-default.wfls-dropdown-toggle:hover,.wfls-open>.wfls-btn-default.wfls-dropdown-toggle:focus,.wfls-open>.wfls-btn-default.wfls-dropdown-toggle.focus{color:#00709e;background-color:#d4d4d4;border-color:#00161f}.wfls-btn-default:active,.wfls-btn-default.wfls-active,.wfls-open>.wfls-btn-default.wfls-dropdown-toggle{background-image:none}.wfls-btn-default.wfls-disabled,.wfls-btn-default[disabled],.wfls-btn-default[readonly],fieldset[disabled] .wfls-btn-default{color:#777;background-color:#fff;border-color:#e2e2e2;cursor:not-allowed;opacity:0.75}.wfls-btn-default.wfls-disabled:hover,.wfls-btn-default.wfls-disabled:focus,.wfls-btn-default.wfls-disabled.wfls-focus,.wfls-btn-default[disabled]:hover,.wfls-btn-default[disabled]:focus,.wfls-btn-default[disabled].wfls-focus,.wfls-btn-default[readonly]:hover,.wfls-btn-default[readonly]:focus,.wfls-btn-default[readonly].wfls-focus,fieldset[disabled] .wfls-btn-default:hover,fieldset[disabled] .wfls-btn-default:focus,fieldset[disabled] .wfls-btn-default.wfls-focus{background-color:#fff;border-color:#00709e}.wfls-btn-default .wfls-badge{color:#fff;background-color:#00709e}.wfls-btn-primary{color:#fff;background-color:#00709e;border-color:#005e85}.wfls-btn-primary:focus,.wfls-btn-primary.focus{color:#fff;background-color:#004c6b;border-color:#000405}.wfls-btn-primary:hover{color:#fff;background-color:#004c6b;border-color:#003347}.wfls-btn-primary:active,.wfls-btn-primary.active,.wfls-open>.wfls-btn-primary.wfls-dropdown-toggle{color:#fff;background-color:#004c6b;border-color:#003347}.wfls-btn-primary:active:hover,.wfls-btn-primary:active:focus,.wfls-btn-primary:active.focus,.wfls-btn-primary.active:hover,.wfls-btn-primary.active:focus,.wfls-btn-primary.active.focus,.wfls-open>.wfls-btn-primary.wfls-dropdown-toggle:hover,.wfls-open>.wfls-btn-primary.wfls-dropdown-toggle:focus,.wfls-open>.wfls-btn-primary.wfls-dropdown-toggle.focus{color:#fff;background-color:#003347;border-color:#000405}.wfls-btn-primary:active,.wfls-btn-primary.wfls-active,.wfls-open>.wfls-btn-primary.wfls-dropdown-toggle{background-image:none}.wfls-btn-primary.wfls-disabled,.wfls-btn-primary[disabled],.wfls-btn-primary[readonly],fieldset[disabled] .wfls-btn-primary{color:#fff;background-color:#59a2c0;border-color:#5996b0;cursor:not-allowed;opacity:0.75}.wfls-btn-primary.wfls-disabled:hover,.wfls-btn-primary.wfls-disabled:focus,.wfls-btn-primary.wfls-disabled.wfls-focus,.wfls-btn-primary[disabled]:hover,.wfls-btn-primary[disabled]:focus,.wfls-btn-primary[disabled].wfls-focus,.wfls-btn-primary[readonly]:hover,.wfls-btn-primary[readonly]:focus,.wfls-btn-primary[readonly].wfls-focus,fieldset[disabled] .wfls-btn-primary:hover,fieldset[disabled] .wfls-btn-primary:focus,fieldset[disabled] .wfls-btn-primary.wfls-focus{background-color:#00709e;border-color:#005e85}.wfls-btn-primary .wfls-badge{color:#00709e;background-color:#fff}.wfls-btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.wfls-btn-success:focus,.wfls-btn-success.focus{color:#fff;background-color:#449d44;border-color:#255625}.wfls-btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.wfls-btn-success:active,.wfls-btn-success.active,.wfls-open>.wfls-btn-success.wfls-dropdown-toggle{color:#fff;background-color:#449d44;border-color:#398439}.wfls-btn-success:active:hover,.wfls-btn-success:active:focus,.wfls-btn-success:active.focus,.wfls-btn-success.active:hover,.wfls-btn-success.active:focus,.wfls-btn-success.active.focus,.wfls-open>.wfls-btn-success.wfls-dropdown-toggle:hover,.wfls-open>.wfls-btn-success.wfls-dropdown-toggle:focus,.wfls-open>.wfls-btn-success.wfls-dropdown-toggle.focus{color:#fff;background-color:#398439;border-color:#255625}.wfls-btn-success:active,.wfls-btn-success.wfls-active,.wfls-open>.wfls-btn-success.wfls-dropdown-toggle{background-image:none}.wfls-btn-success.wfls-disabled,.wfls-btn-success[disabled],.wfls-btn-success[readonly],fieldset[disabled] .wfls-btn-success{color:#fff;background-color:#95d195;border-color:#8bca8b;cursor:not-allowed;opacity:0.75}.wfls-btn-success.wfls-disabled:hover,.wfls-btn-success.wfls-disabled:focus,.wfls-btn-success.wfls-disabled.wfls-focus,.wfls-btn-success[disabled]:hover,.wfls-btn-success[disabled]:focus,.wfls-btn-success[disabled].wfls-focus,.wfls-btn-success[readonly]:hover,.wfls-btn-success[readonly]:focus,.wfls-btn-success[readonly].wfls-focus,fieldset[disabled] .wfls-btn-success:hover,fieldset[disabled] .wfls-btn-success:focus,fieldset[disabled] .wfls-btn-success.wfls-focus{background-color:#5cb85c;border-color:#4cae4c}.wfls-btn-success .wfls-badge{color:#5cb85c;background-color:#fff}.wfls-btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.wfls-btn-info:focus,.wfls-btn-info.focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.wfls-btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.wfls-btn-info:active,.wfls-btn-info.active,.wfls-open>.wfls-btn-info.wfls-dropdown-toggle{color:#fff;background-color:#31b0d5;border-color:#269abc}.wfls-btn-info:active:hover,.wfls-btn-info:active:focus,.wfls-btn-info:active.focus,.wfls-btn-info.active:hover,.wfls-btn-info.active:focus,.wfls-btn-info.active.focus,.wfls-open>.wfls-btn-info.wfls-dropdown-toggle:hover,.wfls-open>.wfls-btn-info.wfls-dropdown-toggle:focus,.wfls-open>.wfls-btn-info.wfls-dropdown-toggle.focus{color:#fff;background-color:#269abc;border-color:#1b6d85}.wfls-btn-info:active,.wfls-btn-info.wfls-active,.wfls-open>.wfls-btn-info.wfls-dropdown-toggle{background-image:none}.wfls-btn-info.wfls-disabled,.wfls-btn-info[disabled],.wfls-btn-info[readonly],fieldset[disabled] .wfls-btn-info{color:#fff;background-color:#94d6ea;border-color:#87d1e7;cursor:not-allowed;opacity:0.75}.wfls-btn-info.wfls-disabled:hover,.wfls-btn-info.wfls-disabled:focus,.wfls-btn-info.wfls-disabled.wfls-focus,.wfls-btn-info[disabled]:hover,.wfls-btn-info[disabled]:focus,.wfls-btn-info[disabled].wfls-focus,.wfls-btn-info[readonly]:hover,.wfls-btn-info[readonly]:focus,.wfls-btn-info[readonly].wfls-focus,fieldset[disabled] .wfls-btn-info:hover,fieldset[disabled] .wfls-btn-info:focus,fieldset[disabled] .wfls-btn-info.wfls-focus{background-color:#5bc0de;border-color:#46b8da}.wfls-btn-info .wfls-badge{color:#5bc0de;background-color:#fff}.wfls-btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.wfls-btn-warning:focus,.wfls-btn-warning.focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.wfls-btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.wfls-btn-warning:active,.wfls-btn-warning.active,.wfls-open>.wfls-btn-warning.wfls-dropdown-toggle{color:#fff;background-color:#ec971f;border-color:#d58512}.wfls-btn-warning:active:hover,.wfls-btn-warning:active:focus,.wfls-btn-warning:active.focus,.wfls-btn-warning.active:hover,.wfls-btn-warning.active:focus,.wfls-btn-warning.active.focus,.wfls-open>.wfls-btn-warning.wfls-dropdown-toggle:hover,.wfls-open>.wfls-btn-warning.wfls-dropdown-toggle:focus,.wfls-open>.wfls-btn-warning.wfls-dropdown-toggle.focus{color:#fff;background-color:#d58512;border-color:#985f0d}.wfls-btn-warning:active,.wfls-btn-warning.wfls-active,.wfls-open>.wfls-btn-warning.wfls-dropdown-toggle{background-image:none}.wfls-btn-warning.wfls-disabled,.wfls-btn-warning[disabled],.wfls-btn-warning[readonly],fieldset[disabled] .wfls-btn-warning{color:#fff;background-color:#f5ca8c;border-color:#f4c37c;cursor:not-allowed;opacity:0.75}.wfls-btn-warning.wfls-disabled:hover,.wfls-btn-warning.wfls-disabled:focus,.wfls-btn-warning.wfls-disabled.wfls-focus,.wfls-btn-warning[disabled]:hover,.wfls-btn-warning[disabled]:focus,.wfls-btn-warning[disabled].wfls-focus,.wfls-btn-warning[readonly]:hover,.wfls-btn-warning[readonly]:focus,.wfls-btn-warning[readonly].wfls-focus,fieldset[disabled] .wfls-btn-warning:hover,fieldset[disabled] .wfls-btn-warning:focus,fieldset[disabled] .wfls-btn-warning.wfls-focus{background-color:#f0ad4e;border-color:#eea236}.wfls-btn-warning .wfls-badge{color:#f0ad4e;background-color:#fff}.wfls-btn-danger{color:#fff;background-color:#930000;border-color:#7a0000}.wfls-btn-danger:focus,.wfls-btn-danger.focus{color:#fff;background-color:#600000;border-color:#000}.wfls-btn-danger:hover{color:#fff;background-color:#600000;border-color:#3c0000}.wfls-btn-danger:active,.wfls-btn-danger.active,.wfls-open>.wfls-btn-danger.wfls-dropdown-toggle{color:#fff;background-color:#600000;border-color:#3c0000}.wfls-btn-danger:active:hover,.wfls-btn-danger:active:focus,.wfls-btn-danger:active.focus,.wfls-btn-danger.active:hover,.wfls-btn-danger.active:focus,.wfls-btn-danger.active.focus,.wfls-open>.wfls-btn-danger.wfls-dropdown-toggle:hover,.wfls-open>.wfls-btn-danger.wfls-dropdown-toggle:focus,.wfls-open>.wfls-btn-danger.wfls-dropdown-toggle.focus{color:#fff;background-color:#3c0000;border-color:#000}.wfls-btn-danger:active,.wfls-btn-danger.wfls-active,.wfls-open>.wfls-btn-danger.wfls-dropdown-toggle{background-image:none}.wfls-btn-danger.wfls-disabled,.wfls-btn-danger[disabled],.wfls-btn-danger[readonly],fieldset[disabled] .wfls-btn-danger{color:#fff;background-color:#b95959;border-color:#a95959;cursor:not-allowed;opacity:0.75}.wfls-btn-danger.wfls-disabled:hover,.wfls-btn-danger.wfls-disabled:focus,.wfls-btn-danger.wfls-disabled.wfls-focus,.wfls-btn-danger[disabled]:hover,.wfls-btn-danger[disabled]:focus,.wfls-btn-danger[disabled].wfls-focus,.wfls-btn-danger[readonly]:hover,.wfls-btn-danger[readonly]:focus,.wfls-btn-danger[readonly].wfls-focus,fieldset[disabled] .wfls-btn-danger:hover,fieldset[disabled] .wfls-btn-danger:focus,fieldset[disabled] .wfls-btn-danger.wfls-focus{background-color:#930000;border-color:#7a0000}.wfls-btn-danger .wfls-badge{color:#930000;background-color:#fff}.wfls-btn-callout{font-weight:600;text-transform:uppercase}.wfls-btn-callout-subtle{font-weight:400;text-transform:uppercase}.wfls-btn-link{color:#00709e;font-weight:normal;border-radius:0}.wfls-btn-link,.wfls-btn-link:active,.wfls-btn-link.wfls-active,.wfls-btn-link[disabled],fieldset[disabled] .wfls-btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.wfls-btn-link,.wfls-btn-link:hover,.wfls-btn-link:focus,.wfls-btn-link:active{border-color:transparent}.wfls-btn-link:hover,.wfls-btn-link:focus{color:#003a52;text-decoration:underline;background-color:transparent}.wfls-btn-link[disabled]:hover,.wfls-btn-link[disabled]:focus,fieldset[disabled] .wfls-btn-link:hover,fieldset[disabled] .wfls-btn-link:focus{color:#777;text-decoration:none}.wfls-btn-lg,.wfls-btn-group-lg>.wfls-btn{padding:10px 16px;font-size:18px;line-height:1.33333;border-radius:6px}.wfls-btn-sm,.wfls-btn-group-sm>.wfls-btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.wfls-btn-xs,.wfls-btn-group-xs>.wfls-btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.wfls-btn-block{display:block;width:100%}.wfls-btn-block+.wfls-btn-block{margin-top:5px}input[type="submit"].wfls-btn-block,input[type="reset"].wfls-btn-block,input[type="button"].wfls-btn-block{width:100%}.wfls-btn-group,.wfls-btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.wfls-btn-group>.wfls-btn,.wfls-btn-group-vertical>.wfls-btn{position:relative;float:left}.wfls-btn-group>.wfls-btn:hover,.wfls-btn-group>.wfls-btn:focus,.wfls-btn-group>.wfls-btn:active,.wfls-btn-group>.wfls-btn.wfls-active,.wfls-btn-group-vertical>.wfls-btn:hover,.wfls-btn-group-vertical>.wfls-btn:focus,.wfls-btn-group-vertical>.wfls-btn:active,.wfls-btn-group-vertical>.wfls-btn.wfls-active{z-index:2}.wfls-btn-group .wfls-btn+.wfls-btn,.wfls-btn-group .wfls-btn+.wfls-btn-group,.wfls-btn-group .wfls-btn-group+.wfls-btn,.wfls-btn-group .wfls-btn-group+.wfls-btn-group{margin-left:-1px}.wfls-btn-toolbar{margin-left:-5px}.wfls-btn-toolbar:before,.wfls-btn-toolbar:after{content:" ";display:table}.wfls-btn-toolbar:after{clear:both}.wfls-btn-toolbar .wfls-btn,.wfls-btn-toolbar .wfls-btn-group,.wfls-btn-toolbar .wfls-input-group{float:left}.wfls-btn-toolbar>.wfls-btn,.wfls-btn-toolbar>.wfls-btn-group,.wfls-btn-toolbar>.wfls-input-group{margin-left:5px}.wfls-btn-group>.wfls-btn:not(:first-child):not(:last-child):not(.wfls-dropdown-toggle){border-radius:0}.wfls-btn-group>.wfls-btn:first-child{margin-left:0}.wfls-btn-group>.wfls-btn:first-child:not(:last-child):not(.wfls-dropdown-toggle){-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0}.wfls-btn-group>.wfls-btn:last-child:not(:first-child),.wfls-btn-group>.wfls-dropdown-toggle:not(:first-child){-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0}.wfls-btn-group>.wfls-btn-group{float:left}.wfls-btn-group>.wfls-btn-group:not(:first-child):not(:last-child)>.wfls-btn{border-radius:0}.wfls-btn-group>.wfls-btn-group:first-child:not(:last-child)>.wfls-btn:last-child,.wfls-btn-group>.wfls-btn-group:first-child:not(:last-child)>.wfls-dropdown-toggle{-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0}.wfls-btn-group>.wfls-btn-group:last-child:not(:first-child)>.wfls-btn:first-child{-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0}.wfls-btn-group .wfls-dropdown-toggle:active,.wfls-btn-group.wfls-open .wfls-dropdown-toggle{outline:0}.wfls-btn-group>.wfls-btn+.wfls-dropdown-toggle{padding-left:8px;padding-right:8px}.wfls-btn-group>.wfls-btn-lg+.wfls-dropdown-toggle,.wfls-btn-group-lg.wfls-btn-group>.wfls-btn+.wfls-dropdown-toggle{padding-left:12px;padding-right:12px}.wfls-btn-group.open .wfls-dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.wfls-btn-group.open .wfls-dropdown-toggle.wfls-btn-link{-webkit-box-shadow:none;box-shadow:none}.wfls-btn .wfls-caret{margin-left:0}.wfls-btn-lg .wfls-caret,.wfls-btn-group-lg>.wfls-btn .wfls-caret{border-width:5px 5px 0;border-bottom-width:0}.wfls-dropup .wfls-btn-lg .wfls-caret,.wfls-dropup .wfls-btn-group-lg>.wfls-btn .wfls-caret{border-width:0 5px 5px}.wfls-btn-group-vertical>.wfls-btn,.wfls-btn-group-vertical>.wfls-btn-group,.wfls-btn-group-vertical>.wfls-btn-group>.wfls-btn{display:block;float:none;width:100%;max-width:100%}.wfls-btn-group-vertical>.wfls-btn-group:before,.wfls-btn-group-vertical>.wfls-btn-group:after{content:" ";display:table}.wfls-btn-group-vertical>.wfls-btn-group:after{clear:both}.wfls-btn-group-vertical>.wfls-btn-group>.wfls-btn{float:none}.wfls-btn-group-vertical>.wfls-btn+.wfls-btn,.wfls-btn-group-vertical>.wfls-btn+.wfls-btn-group,.wfls-btn-group-vertical>.wfls-btn-group+.wfls-btn,.wfls-btn-group-vertical>.wfls-btn-group+.wfls-btn-group{margin-top:-1px;margin-left:0}.wfls-btn-group-vertical>.wfls-btn:not(:first-child):not(:last-child){border-radius:0}.wfls-btn-group-vertical>.wfls-btn:first-child:not(:last-child){-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0}.wfls-btn-group-vertical>.wfls-btn:last-child:not(:first-child){-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px}.wfls-btn-group-vertical>.wfls-btn-group:not(:first-child):not(:last-child)>.wfls-btn{border-radius:0}.wfls-btn-group-vertical>.wfls-btn-group:first-child:not(:last-child)>.wfls-btn:last-child,.wfls-btn-group-vertical>.wfls-btn-group:first-child:not(:last-child)>.wfls-dropdown-toggle{-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0}.wfls-btn-group-vertical>.wfls-btn-group:last-child:not(:first-child)>.wfls-btn:first-child{-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0}.wfls-btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.wfls-btn-group-justified>.wfls-btn,.wfls-btn-group-justified>.wfls-btn-group{float:none;display:table-cell;width:1%}.wfls-btn-group-justified>.wfls-btn-group .wfls-btn{width:100%}.wfls-btn-group-justified>.wfls-btn-group .wfls-dropdown-menu{left:auto}[data-toggle="buttons"]>.wfls-btn input[type="radio"],[data-toggle="buttons"]>.wfls-btn input[type="checkbox"],[data-toggle="buttons"]>.wfls-btn-group>.wfls-btn input[type="radio"],[data-toggle="buttons"]>.wfls-btn-group>.wfls-btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.wfls-pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.wfls-pagination>li{display:inline}.wfls-pagination>li>a,.wfls-pagination>li>span{position:relative;float:left;padding:.5rem 1.25rem;line-height:1.42857;text-decoration:none;color:#00709e;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.wfls-pagination>li:first-child>a,.wfls-pagination>li:first-child>span{margin-left:0;-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px}.wfls-pagination>li:last-child>a,.wfls-pagination>li:last-child>span{-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px}.wfls-pagination>li>a:hover,.wfls-pagination>li>a:focus,.wfls-pagination>li>span:hover,.wfls-pagination>li>span:focus{z-index:2;color:#003a52;background-color:#e2e2e2;border-color:#ddd}.wfls-pagination>.wfls-active>a,.wfls-pagination>.wfls-active>a:hover,.wfls-pagination>.wfls-active>a:focus,.wfls-pagination>.wfls-active>span,.wfls-pagination>.wfls-active>span:hover,.wfls-pagination>.wfls-active>span:focus{z-index:3;color:#fff;background-color:#00709e;border-color:#00709e;cursor:default}.wfls-pagination>.wfls-disabled>span,.wfls-pagination>.wfls-disabled>span:hover,.wfls-pagination>.wfls-disabled>span:focus,.wfls-pagination>.wfls-disabled>a,.wfls-pagination>.wfls-disabled>a:hover,.wfls-pagination>.wfls-disabled>a:focus{color:#777;background-color:#fff;border-color:#ddd;cursor:not-allowed}.wfls-pagination-lg>li>a,.wfls-pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.33333}.wfls-pagination-lg>li:first-child>a,.wfls-pagination-lg>li:first-child>span{-moz-border-radius-topleft:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px}.wfls-pagination-lg>li:last-child>a,.wfls-pagination-lg>li:last-child>span{-moz-border-radius-topright:6px;-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-moz-border-radius-bottomright:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px}.wfls-pagination-sm>li>a,.wfls-pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.wfls-pagination-sm>li:first-child>a,.wfls-pagination-sm>li:first-child>span{-moz-border-radius-topleft:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px}.wfls-pagination-sm>li:last-child>a,.wfls-pagination-sm>li:last-child>span{-moz-border-radius-topright:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-moz-border-radius-bottomright:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px}@-ms-viewport{width:device-width}.wfls-visible-xs{display:none !important}.wfls-visible-sm{display:none !important}.wfls-visible-md{display:none !important}.wfls-visible-lg{display:none !important}.wfls-visible-xs-block,.wfls-visible-xs-inline,.wfls-visible-xs-inline-block,.wfls-visible-sm-block,.wfls-visible-sm-inline,.wfls-visible-sm-inline-block,.wfls-visible-md-block,.wfls-visible-md-inline,.wfls-visible-md-inline-block,.wfls-visible-lg-block,.wfls-visible-lg-inline,.wfls-visible-lg-inline-block{display:none !important}@media (max-width: 767px){.wfls-visible-xs{display:block !important}table.wfls-visible-xs{display:table !important}tr.wfls-visible-xs{display:table-row !important}th.wfls-visible-xs,td.wfls-visible-xs{display:table-cell !important}}@media (max-width: 767px){.wfls-visible-xs-block{display:block !important}}@media (max-width: 767px){.wfls-visible-xs-inline{display:inline !important}}@media (max-width: 767px){.wfls-visible-xs-inline-block{display:inline-block !important}}@media (min-width: 768px) and (max-width: 991px){.wfls-visible-sm{display:block !important}table.wfls-visible-sm{display:table !important}tr.wfls-visible-sm{display:table-row !important}th.wfls-visible-sm,td.wfls-visible-sm{display:table-cell !important}}@media (min-width: 768px) and (max-width: 991px){.wfls-visible-sm-block{display:block !important}}@media (min-width: 768px) and (max-width: 991px){.wfls-visible-sm-inline{display:inline !important}}@media (min-width: 768px) and (max-width: 991px){.wfls-visible-sm-inline-block{display:inline-block !important}}@media (min-width: 992px) and (max-width: 1199px){.wfls-visible-md{display:block !important}table.wfls-visible-md{display:table !important}tr.wfls-visible-md{display:table-row !important}th.wfls-visible-md,td.wfls-visible-md{display:table-cell !important}}@media (min-width: 992px) and (max-width: 1199px){.wfls-visible-md-block{display:block !important}}@media (min-width: 992px) and (max-width: 1199px){.wfls-visible-md-inline{display:inline !important}}@media (min-width: 992px) and (max-width: 1199px){.wfls-visible-md-inline-block{display:inline-block !important}}@media (min-width: 1200px){.wfls-visible-lg{display:block !important}table.wfls-visible-lg{display:table !important}tr.wfls-visible-lg{display:table-row !important}th.wfls-visible-lg,td.wfls-visible-lg{display:table-cell !important}}@media (min-width: 1200px){.wfls-visible-lg-block{display:block !important}}@media (min-width: 1200px){.wfls-visible-lg-inline{display:inline !important}}@media (min-width: 1200px){.wfls-visible-lg-inline-block{display:inline-block !important}}@media (max-width: 767px){.wfls-hidden-xs{display:none !important}}@media (min-width: 768px) and (max-width: 991px){.wfls-hidden-sm{display:none !important}}@media (min-width: 992px) and (max-width: 1199px){.wfls-hidden-md{display:none !important}}@media (min-width: 1200px){.wfls-hidden-lg{display:none !important}}.wfls-visible-print{display:none !important}@media print{.wfls-visible-print{display:block !important}table.wfls-visible-print{display:table !important}tr.wfls-visible-print{display:table-row !important}th.wfls-visible-print,td.wfls-visible-print{display:table-cell !important}}.wfls-visible-print-block{display:none !important}@media print{.wfls-visible-print-block{display:block !important}}.wfls-visible-print-inline{display:none !important}@media print{.wfls-visible-print-inline{display:inline !important}}.wfls-visible-print-inline-block{display:none !important}@media print{.wfls-visible-print-inline-block{display:inline-block !important}}@media print{.wfls-hidden-print{display:none !important}}.wfls-container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.wfls-container:before,.wfls-container:after{content:" ";display:table}.wfls-container:after{clear:both}@media (min-width: 768px){.wfls-container{width:750px}}@media (min-width: 992px){.wfls-container{width:970px}}@media (min-width: 1200px){.wfls-container{width:1170px}}.wfls-container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.wfls-container-fluid:before,.wfls-container-fluid:after{content:" ";display:table}.wfls-container-fluid:after{clear:both}.wfls-row{margin-left:-15px;margin-right:-15px}.wfls-row:before,.wfls-row:after{content:" ";display:table}.wfls-row:after{clear:both}.wfls-col-xs-1,.wfls-col-sm-1,.wfls-col-md-1,.wfls-col-lg-1,.wfls-col-xs-2,.wfls-col-sm-2,.wfls-col-md-2,.wfls-col-lg-2,.wfls-col-xs-3,.wfls-col-sm-3,.wfls-col-md-3,.wfls-col-lg-3,.wfls-col-xs-4,.wfls-col-sm-4,.wfls-col-md-4,.wfls-col-lg-4,.wfls-col-xs-5,.wfls-col-sm-5,.wfls-col-md-5,.wfls-col-lg-5,.wfls-col-xs-6,.wfls-col-sm-6,.wfls-col-md-6,.wfls-col-lg-6,.wfls-col-xs-7,.wfls-col-sm-7,.wfls-col-md-7,.wfls-col-lg-7,.wfls-col-xs-8,.wfls-col-sm-8,.wfls-col-md-8,.wfls-col-lg-8,.wfls-col-xs-9,.wfls-col-sm-9,.wfls-col-md-9,.wfls-col-lg-9,.wfls-col-xs-10,.wfls-col-sm-10,.wfls-col-md-10,.wfls-col-lg-10,.wfls-col-xs-11,.wfls-col-sm-11,.wfls-col-md-11,.wfls-col-lg-11,.wfls-col-xs-12,.wfls-col-sm-12,.wfls-col-md-12,.wfls-col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px;box-sizing:border-box}.wfls-col-xs-1,.wfls-col-xs-2,.wfls-col-xs-3,.wfls-col-xs-4,.wfls-col-xs-5,.wfls-col-xs-6,.wfls-col-xs-7,.wfls-col-xs-8,.wfls-col-xs-9,.wfls-col-xs-10,.wfls-col-xs-11,.wfls-col-xs-12{float:left}.wfls-col-xs-1{width:8.33333%}.wfls-col-xs-2{width:16.66667%}.wfls-col-xs-3{width:25%}.wfls-col-xs-4{width:33.33333%}.wfls-col-xs-5{width:41.66667%}.wfls-col-xs-6{width:50%}.wfls-col-xs-7{width:58.33333%}.wfls-col-xs-8{width:66.66667%}.wfls-col-xs-9{width:75%}.wfls-col-xs-10{width:83.33333%}.wfls-col-xs-11{width:91.66667%}.wfls-col-xs-12{width:100%}.wfls-col-xs-pull-0{right:auto}.wfls-col-xs-pull-1{right:8.33333%}.wfls-col-xs-pull-2{right:16.66667%}.wfls-col-xs-pull-3{right:25%}.wfls-col-xs-pull-4{right:33.33333%}.wfls-col-xs-pull-5{right:41.66667%}.wfls-col-xs-pull-6{right:50%}.wfls-col-xs-pull-7{right:58.33333%}.wfls-col-xs-pull-8{right:66.66667%}.wfls-col-xs-pull-9{right:75%}.wfls-col-xs-pull-10{right:83.33333%}.wfls-col-xs-pull-11{right:91.66667%}.wfls-col-xs-pull-12{right:100%}.wfls-col-xs-push-0{left:auto}.wfls-col-xs-push-1{left:8.33333%}.wfls-col-xs-push-2{left:16.66667%}.wfls-col-xs-push-3{left:25%}.wfls-col-xs-push-4{left:33.33333%}.wfls-col-xs-push-5{left:41.66667%}.wfls-col-xs-push-6{left:50%}.wfls-col-xs-push-7{left:58.33333%}.wfls-col-xs-push-8{left:66.66667%}.wfls-col-xs-push-9{left:75%}.wfls-col-xs-push-10{left:83.33333%}.wfls-col-xs-push-11{left:91.66667%}.wfls-col-xs-push-12{left:100%}.wfls-col-xs-offset-0{margin-left:0%}.wfls-col-xs-offset-1{margin-left:8.33333%}.wfls-col-xs-offset-2{margin-left:16.66667%}.wfls-col-xs-offset-3{margin-left:25%}.wfls-col-xs-offset-4{margin-left:33.33333%}.wfls-col-xs-offset-5{margin-left:41.66667%}.wfls-col-xs-offset-6{margin-left:50%}.wfls-col-xs-offset-7{margin-left:58.33333%}.wfls-col-xs-offset-8{margin-left:66.66667%}.wfls-col-xs-offset-9{margin-left:75%}.wfls-col-xs-offset-10{margin-left:83.33333%}.wfls-col-xs-offset-11{margin-left:91.66667%}.wfls-col-xs-offset-12{margin-left:100%}.wfls-col-xs-half-padding-left{padding-left:8px}.wfls-col-xs-half-padding-right{padding-right:7px}@media (min-width: 768px){.wfls-col-sm-1,.wfls-col-sm-2,.wfls-col-sm-3,.wfls-col-sm-4,.wfls-col-sm-5,.wfls-col-sm-6,.wfls-col-sm-7,.wfls-col-sm-8,.wfls-col-sm-9,.wfls-col-sm-10,.wfls-col-sm-11,.wfls-col-sm-12{float:left}.wfls-col-sm-1{width:8.33333%}.wfls-col-sm-2{width:16.66667%}.wfls-col-sm-3{width:25%}.wfls-col-sm-4{width:33.33333%}.wfls-col-sm-5{width:41.66667%}.wfls-col-sm-6{width:50%}.wfls-col-sm-7{width:58.33333%}.wfls-col-sm-8{width:66.66667%}.wfls-col-sm-9{width:75%}.wfls-col-sm-10{width:83.33333%}.wfls-col-sm-11{width:91.66667%}.wfls-col-sm-12{width:100%}.wfls-col-sm-pull-0{right:auto}.wfls-col-sm-pull-1{right:8.33333%}.wfls-col-sm-pull-2{right:16.66667%}.wfls-col-sm-pull-3{right:25%}.wfls-col-sm-pull-4{right:33.33333%}.wfls-col-sm-pull-5{right:41.66667%}.wfls-col-sm-pull-6{right:50%}.wfls-col-sm-pull-7{right:58.33333%}.wfls-col-sm-pull-8{right:66.66667%}.wfls-col-sm-pull-9{right:75%}.wfls-col-sm-pull-10{right:83.33333%}.wfls-col-sm-pull-11{right:91.66667%}.wfls-col-sm-pull-12{right:100%}.wfls-col-sm-push-0{left:auto}.wfls-col-sm-push-1{left:8.33333%}.wfls-col-sm-push-2{left:16.66667%}.wfls-col-sm-push-3{left:25%}.wfls-col-sm-push-4{left:33.33333%}.wfls-col-sm-push-5{left:41.66667%}.wfls-col-sm-push-6{left:50%}.wfls-col-sm-push-7{left:58.33333%}.wfls-col-sm-push-8{left:66.66667%}.wfls-col-sm-push-9{left:75%}.wfls-col-sm-push-10{left:83.33333%}.wfls-col-sm-push-11{left:91.66667%}.wfls-col-sm-push-12{left:100%}.wfls-col-sm-offset-0{margin-left:0%}.wfls-col-sm-offset-1{margin-left:8.33333%}.wfls-col-sm-offset-2{margin-left:16.66667%}.wfls-col-sm-offset-3{margin-left:25%}.wfls-col-sm-offset-4{margin-left:33.33333%}.wfls-col-sm-offset-5{margin-left:41.66667%}.wfls-col-sm-offset-6{margin-left:50%}.wfls-col-sm-offset-7{margin-left:58.33333%}.wfls-col-sm-offset-8{margin-left:66.66667%}.wfls-col-sm-offset-9{margin-left:75%}.wfls-col-sm-offset-10{margin-left:83.33333%}.wfls-col-sm-offset-11{margin-left:91.66667%}.wfls-col-sm-offset-12{margin-left:100%}.wfls-col-sm-half-padding-left{padding-left:8px}.wfls-col-sm-half-padding-right{padding-right:7px}}@media (min-width: 992px){.wfls-col-md-1,.wfls-col-md-2,.wfls-col-md-3,.wfls-col-md-4,.wfls-col-md-5,.wfls-col-md-6,.wfls-col-md-7,.wfls-col-md-8,.wfls-col-md-9,.wfls-col-md-10,.wfls-col-md-11,.wfls-col-md-12{float:left}.wfls-col-md-1{width:8.33333%}.wfls-col-md-2{width:16.66667%}.wfls-col-md-3{width:25%}.wfls-col-md-4{width:33.33333%}.wfls-col-md-5{width:41.66667%}.wfls-col-md-6{width:50%}.wfls-col-md-7{width:58.33333%}.wfls-col-md-8{width:66.66667%}.wfls-col-md-9{width:75%}.wfls-col-md-10{width:83.33333%}.wfls-col-md-11{width:91.66667%}.wfls-col-md-12{width:100%}.wfls-col-md-pull-0{right:auto}.wfls-col-md-pull-1{right:8.33333%}.wfls-col-md-pull-2{right:16.66667%}.wfls-col-md-pull-3{right:25%}.wfls-col-md-pull-4{right:33.33333%}.wfls-col-md-pull-5{right:41.66667%}.wfls-col-md-pull-6{right:50%}.wfls-col-md-pull-7{right:58.33333%}.wfls-col-md-pull-8{right:66.66667%}.wfls-col-md-pull-9{right:75%}.wfls-col-md-pull-10{right:83.33333%}.wfls-col-md-pull-11{right:91.66667%}.wfls-col-md-pull-12{right:100%}.wfls-col-md-push-0{left:auto}.wfls-col-md-push-1{left:8.33333%}.wfls-col-md-push-2{left:16.66667%}.wfls-col-md-push-3{left:25%}.wfls-col-md-push-4{left:33.33333%}.wfls-col-md-push-5{left:41.66667%}.wfls-col-md-push-6{left:50%}.wfls-col-md-push-7{left:58.33333%}.wfls-col-md-push-8{left:66.66667%}.wfls-col-md-push-9{left:75%}.wfls-col-md-push-10{left:83.33333%}.wfls-col-md-push-11{left:91.66667%}.wfls-col-md-push-12{left:100%}.wfls-col-md-offset-0{margin-left:0%}.wfls-col-md-offset-1{margin-left:8.33333%}.wfls-col-md-offset-2{margin-left:16.66667%}.wfls-col-md-offset-3{margin-left:25%}.wfls-col-md-offset-4{margin-left:33.33333%}.wfls-col-md-offset-5{margin-left:41.66667%}.wfls-col-md-offset-6{margin-left:50%}.wfls-col-md-offset-7{margin-left:58.33333%}.wfls-col-md-offset-8{margin-left:66.66667%}.wfls-col-md-offset-9{margin-left:75%}.wfls-col-md-offset-10{margin-left:83.33333%}.wfls-col-md-offset-11{margin-left:91.66667%}.wfls-col-md-offset-12{margin-left:100%}.wfls-col-md-half-padding-left{padding-left:8px}.wfls-col-md-half-padding-right{padding-right:7px}}@media (min-width: 1200px){.wfls-col-lg-1,.wfls-col-lg-2,.wfls-col-lg-3,.wfls-col-lg-4,.wfls-col-lg-5,.wfls-col-lg-6,.wfls-col-lg-7,.wfls-col-lg-8,.wfls-col-lg-9,.wfls-col-lg-10,.wfls-col-lg-11,.wfls-col-lg-12{float:left}.wfls-col-lg-1{width:8.33333%}.wfls-col-lg-2{width:16.66667%}.wfls-col-lg-3{width:25%}.wfls-col-lg-4{width:33.33333%}.wfls-col-lg-5{width:41.66667%}.wfls-col-lg-6{width:50%}.wfls-col-lg-7{width:58.33333%}.wfls-col-lg-8{width:66.66667%}.wfls-col-lg-9{width:75%}.wfls-col-lg-10{width:83.33333%}.wfls-col-lg-11{width:91.66667%}.wfls-col-lg-12{width:100%}.wfls-col-lg-pull-0{right:auto}.wfls-col-lg-pull-1{right:8.33333%}.wfls-col-lg-pull-2{right:16.66667%}.wfls-col-lg-pull-3{right:25%}.wfls-col-lg-pull-4{right:33.33333%}.wfls-col-lg-pull-5{right:41.66667%}.wfls-col-lg-pull-6{right:50%}.wfls-col-lg-pull-7{right:58.33333%}.wfls-col-lg-pull-8{right:66.66667%}.wfls-col-lg-pull-9{right:75%}.wfls-col-lg-pull-10{right:83.33333%}.wfls-col-lg-pull-11{right:91.66667%}.wfls-col-lg-pull-12{right:100%}.wfls-col-lg-push-0{left:auto}.wfls-col-lg-push-1{left:8.33333%}.wfls-col-lg-push-2{left:16.66667%}.wfls-col-lg-push-3{left:25%}.wfls-col-lg-push-4{left:33.33333%}.wfls-col-lg-push-5{left:41.66667%}.wfls-col-lg-push-6{left:50%}.wfls-col-lg-push-7{left:58.33333%}.wfls-col-lg-push-8{left:66.66667%}.wfls-col-lg-push-9{left:75%}.wfls-col-lg-push-10{left:83.33333%}.wfls-col-lg-push-11{left:91.66667%}.wfls-col-lg-push-12{left:100%}.wfls-col-lg-offset-0{margin-left:0%}.wfls-col-lg-offset-1{margin-left:8.33333%}.wfls-col-lg-offset-2{margin-left:16.66667%}.wfls-col-lg-offset-3{margin-left:25%}.wfls-col-lg-offset-4{margin-left:33.33333%}.wfls-col-lg-offset-5{margin-left:41.66667%}.wfls-col-lg-offset-6{margin-left:50%}.wfls-col-lg-offset-7{margin-left:58.33333%}.wfls-col-lg-offset-8{margin-left:66.66667%}.wfls-col-lg-offset-9{margin-left:75%}.wfls-col-lg-offset-10{margin-left:83.33333%}.wfls-col-lg-offset-11{margin-left:91.66667%}.wfls-col-lg-offset-12{margin-left:100%}.wfls-col-lg-half-padding-left{padding-left:8px}.wfls-col-lg-half-padding-right{padding-right:7px}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}label.wfls-plain{font-weight:normal}label.wfls-control-label.wfls-disabled{pointer-events:none}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:1.5rem;font-size:14px;line-height:1.42857;color:#555}.wfls-form-control{display:block;width:100%;height:38px;padding:.5rem 1.25rem;font-size:14px;line-height:1.42857;color:#555;background-color:#fff;background-image:none;border:1px solid #ddd;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s;-o-transition:border-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s;transition:border-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s}.wfls-form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6)}.wfls-form-control::-moz-placeholder{color:#bfbfbf;opacity:1}.wfls-form-control:-ms-input-placeholder{color:#bfbfbf}.wfls-form-control::-webkit-input-placeholder{color:#bfbfbf}.wfls-form-control::-ms-expand{border:0;background-color:transparent}.wfls-form-control[disabled],.wfls-form-control[readonly],fieldset[disabled] .wfls-form-control{background-color:#e2e2e2;opacity:1}.wfls-form-control[disabled],.wfls-form-control[readonly],fieldset[disabled] .wfls-form-control{cursor:not-allowed;pointer-events:none}textarea.wfls-form-control{height:auto}input[type="search"]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio: 0){input[type="date"].wfls-form-control,input[type="time"].wfls-form-control,input[type="datetime-local"].wfls-form-control,input[type="month"].wfls-form-control{line-height:38px}input[type="date"].wfls-input-sm,.wfls-input-group-sm input[type="date"],input[type="time"].wfls-input-sm,.wfls-input-group-sm input[type="time"],input[type="datetime-local"].wfls-input-sm,.wfls-input-group-sm input[type="datetime-local"],input[type="month"].wfls-input-sm,.wfls-input-group-sm input[type="month"]{line-height:30px}input[type="date"].wfls-input-lg,.wfls-input-group-lg input[type="date"],input[type="time"].wfls-input-lg,.wfls-input-group-lg input[type="time"],input[type="datetime-local"].wfls-input-lg,.wfls-input-group-lg input[type="datetime-local"],input[type="month"].wfls-input-lg,.wfls-input-group-lg input[type="month"]{line-height:46px}}.wfls-form-group{margin-bottom:8px}.wfls-form-group.wfls-sub-group label{color:#666666;font-weight:normal;padding-left:20px}.wfls-form-group.wfls-focus{border-left:4px solid #11967a;padding-bottom:8px;background-color:#e5e5e5}.wfls-form-group.wfls-focus label{margin-left:-4px}.wfls-radio,.wfls-checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.wfls-radio label,.wfls-checkbox label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.wfls-radio input[type="radio"],.wfls-radio-inline input[type="radio"],.wfls-checkbox input[type="checkbox"],.wfls-checkbox-inline input[type="checkbox"]{margin-top:4px \9}.wfls-radio-offset{padding-left:29px}@media (min-width: 768px){.wfls-radio-offset{padding-left:20px}}.wfls-radio+.wfls-radio,.wfls-checkbox+.wfls-checkbox{margin-top:-5px}.wfls-radio-inline,.wfls-checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.wfls-radio-inline+.wfls-radio-inline,.wfls-checkbox-inline+.wfls-checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="radio"][readonly],input[type="radio"].wfls-disabled,fieldset[disabled] input[type="radio"],input[type="checkbox"][disabled],input[type="checkbox"][readonly],input[type="checkbox"].wfls-disabled,fieldset[disabled] input[type="checkbox"]{cursor:not-allowed;pointer-events:none}.wfls-radio-inline.wfls-disabled,fieldset[disabled] .wfls-radio-inline,.wfls-checkbox-inline.wfls-disabled,fieldset[disabled] .wfls-checkbox-inline{cursor:not-allowed}.wfls-radio.wfls-disabled label,fieldset[disabled] .wfls-radio label,.wfls-checkbox.wfls-disabled label,fieldset[disabled] .wfls-checkbox label{cursor:not-allowed;pointer-events:none}.wfls-form-control-static{padding-top:1.5rem;padding-bottom:1.5rem;margin:0;line-height:1}.wfls-form-control-static.wfls-input-lg,.wfls-form-control-static.wfls-input-sm{padding-left:0;padding-right:0}.wfls-input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.wfls-input-sm{height:30px;line-height:30px}textarea.wfls-input-sm,select[multiple].wfls-input-sm{height:auto}.wfls-form-group-sm .wfls-form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.wfls-form-group-sm select.wfls-form-control{height:30px;line-height:30px}.wfls-form-group-sm textarea.wfls-form-control,.wfls-form-group-sm select[multiple].wfls-form-control{height:auto}.wfls-form-group-sm .wfls-form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.wfls-input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.33333;border-radius:6px}select.wfls-input-lg{height:46px;line-height:46px}textarea.wfls-input-lg,select[multiple].wfls-input-lg{height:auto}.wfls-form-group-lg .wfls-form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.33333;border-radius:6px}.wfls-form-group-lg select.wfls-form-control{height:46px;line-height:46px}.wfls-form-group-lg textarea.wfls-form-control,.wfls-form-group-lg select[multiple].wfls-form-control{height:auto}.wfls-form-group-lg .wfls-form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.33333}.wfls-has-feedback{position:relative}.wfls-has-feedback .wfls-form-control{padding-right:47.5px}.wfls-form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:38px;height:38px;line-height:38px;text-align:center;pointer-events:none}.wfls-input-lg+.wfls-form-control-feedback,.wfls-input-group-lg+.wfls-form-control-feedback,.wfls-form-group-lg .wfls-form-control+.wfls-form-control-feedback{width:46px;height:46px;line-height:46px}.wfls-input-sm+.wfls-form-control-feedback,.wfls-input-group-sm+.wfls-form-control-feedback,.wfls-form-group-sm .wfls-form-control+.wfls-form-control-feedback{width:30px;height:30px;line-height:30px}.wfls-has-success .wfls-help-block,.wfls-has-success .wfls-control-label,.wfls-has-success .wfls-radio,.wfls-has-success .wfls-checkbox,.wfls-has-success .wfls-radio-inline,.wfls-has-success .wfls-checkbox-inline,.wfls-has-success.wfls-radio label,.wfls-has-success.wfls-checkbox label,.wfls-has-success.wfls-radio-inline label,.wfls-has-success.wfls-checkbox-inline label{color:#3c763d}.wfls-has-success .wfls-form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.wfls-has-success .wfls-form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168}.wfls-has-success .wfls-input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.wfls-has-success .wfls-form-control-feedback{color:#3c763d}.wfls-has-warning .wfls-help-block,.wfls-has-warning .wfls-control-label,.wfls-has-warning .wfls-radio,.wfls-has-warning .wfls-checkbox,.wfls-has-warning .wfls-radio-inline,.wfls-has-warning .wfls-checkbox-inline,.wfls-has-warning.wfls-radio label,.wfls-has-warning.wfls-checkbox label,.wfls-has-warning.wfls-radio-inline label,.wfls-has-warning.wfls-checkbox-inline label{color:#8a6d3b}.wfls-has-warning .wfls-form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.wfls-has-warning .wfls-form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b}.wfls-has-warning .wfls-input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.wfls-has-warning .wfls-form-control-feedback{color:#8a6d3b}.wfls-has-error .wfls-help-block,.wfls-has-error .wfls-control-label,.wfls-has-error .wfls-radio,.wfls-has-error .wfls-checkbox,.wfls-has-error .wfls-radio-inline,.wfls-has-error .wfls-checkbox-inline,.wfls-has-error.wfls-radio label,.wfls-has-error.wfls-checkbox label,.wfls-has-error.wfls-radio-inline label,.wfls-has-error.wfls-checkbox-inline label{color:#a94442}.wfls-has-error .wfls-form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.wfls-has-error .wfls-form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483}.wfls-has-error .wfls-input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.wfls-has-error .wfls-form-control-feedback{color:#a94442}.wfls-has-feedback label ~ .wfls-form-control-feedback{top:25px}.wfls-has-feedback label.wfls-sr-only ~ .wfls-form-control-feedback{top:0}.wfls-help-block{display:block;margin-top:5px;color:#737373}@media (min-width: 768px){.wfls-form-inline .wfls-form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.wfls-form-inline .wfls-form-control{display:inline-block;width:auto;vertical-align:middle}.wfls-form-inline .wfls-form-control-static{display:inline-block}.wfls-form-inline .wfls-input-group{display:inline-table;vertical-align:middle}.wfls-form-inline .wfls-input-group .wfls-input-group-addon,.wfls-form-inline .wfls-input-group .wfls-input-group-btn,.wfls-form-inline .wfls-input-group .wfls-form-control{width:auto}.wfls-form-inline .wfls-input-group>.wfls-form-control{width:100%}.wfls-form-inline .wfls-control-label{margin-bottom:0;vertical-align:middle}.wfls-form-inline .wfls-radio,.wfls-form-inline .wfls-checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.wfls-form-inline .wfls-radio label,.wfls-form-inline .wfls-checkbox label{padding-left:0}.wfls-form-inline .wfls-radio input[type="radio"],.wfls-form-inline .wfls-checkbox input[type="checkbox"]{position:relative;margin-left:0}.wfls-form-inline .wfls-has-feedback .wfls-form-control-feedback{top:0}}.wfls-form-horizontal .wfls-radio,.wfls-form-horizontal .wfls-checkbox,.wfls-form-horizontal .wfls-radio-inline,.wfls-form-horizontal .wfls-checkbox-inline{margin-top:0;margin-bottom:0;padding-top:1.5rem}.wfls-form-horizontal .wfls-radio,.wfls-form-horizontal .wfls-checkbox{min-height:29px}.wfls-form-horizontal .wfls-form-group{margin-left:-15px;margin-right:-15px}.wfls-form-horizontal .wfls-form-group:before,.wfls-form-horizontal .wfls-form-group:after{content:" ";display:table}.wfls-form-horizontal .wfls-form-group:after{clear:both}@media (min-width: 768px){.wfls-form-horizontal .wfls-control-label{text-align:right;margin-bottom:0;padding-top:1.5rem}}.wfls-form-horizontal .wfls-has-feedback .wfls-form-control-feedback{right:15px}@media (min-width: 768px){.wfls-form-horizontal .wfls-form-group-lg .wfls-control-label{padding-top:11px;font-size:18px}}@media (min-width: 768px){.wfls-form-horizontal .wfls-form-group-sm .wfls-control-label{padding-top:6px;font-size:12px}}@media (min-width: 768px){#input-recaptchaSiteKey,#input-recaptchaSecret{min-width:400px}}hr.wfls-half{border:0 !important;border-bottom:1px solid #e4e4e4 !important;width:50%;margin:1.25rem auto}.wrap.wordfence-ls{direction:ltr}@media (min-width: 768px){.wrap.wordfence-ls{max-width:750px}}@media (min-width: 992px){.wrap.wordfence-ls{max-width:970px}}@media (min-width: 1200px){.wrap.wordfence-ls{max-width:1170px}}.wrap.wordfence-ls>.wfls-container-fluid{padding-left:0px;padding-right:0px}.wrap.wordfence-ls .button-primary{text-align:center;text-transform:uppercase;font-weight:bold;background-color:#00709e}.wrap.wordfence-ls a{text-decoration:none}.wrap.wordfence-ls a:hover{text-decoration:underline}.wrap.wordfence-ls a.wfls-btn:hover{text-decoration:none}.wrap.wordfence-ls p,.wrap.wordfence-ls td,.wrap.wordfence-ls li{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:.875rem;color:#2d2d2d;line-height:1.3125;font-weight:normal}.wrap.wordfence-ls p strong,.wrap.wordfence-ls td strong,.wrap.wordfence-ls li strong{font-weight:600}.wrap.wordfence-ls p em,.wrap.wordfence-ls td em,.wrap.wordfence-ls li em{font-weight:normal}.wrap.wordfence-ls h1,.wrap.wordfence-ls h2,.wrap.wordfence-ls h3,.wrap.wordfence-ls h4,.wrap.wordfence-ls h5,.wrap.wordfence-ls h6{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;color:#2d2d2d;font-weight:700}.wrap.wordfence-ls h2{font-size:1.3125rem;line-height:1.5}.wrap.wordfence-ls h3{font-size:1.125rem}.wrap.wordfence-ls h4{font-size:1rem}a{color:#00709e}.wfls-inline-help{color:#9f9fa0}.wfls-inline-help:hover{color:#00709e}.wordfenceWrap{margin:20px 0 0 20px}#wfHeading:after{content:'.';visibility:hidden;display:block;clear:both;height:0px}.wfls-header-icon{background-image:url(../img/header.svg);width:32px;height:32px;background-position:0 0;background-repeat:no-repeat;padding:0;margin:0 5px 0 0;float:left}a.wfhelp{margin:0 3px 0 3px;text-decoration:none;display:inline-block;vertical-align:middle;font:normal normal normal 14px/1 FontAwesome;text-rendering:auto;-webkit-font-smoothing:antialiased}a.wfhelp:before{content:'\f29c'}.wordfence .resulticon{display:block;float:left;width:16px;height:16px;background-position:0 0;background-repeat:no-repeat;border-width:0;padding:0;margin:0 3px 0 0;background-image:url(../img/icons/bullet_yellow.png)}.wordfenceBoldTD{font-weight:bold}.wfAjax24{display:none;width:24px;height:24px;background-image:url(../img/icons/ajax24.gif);margin:0;padding:0}div.wfLoadingWhite32{width:32px;height:32px;background-image:url(../img/icons/ajaxWhite32x32.gif);margin:0;padding:0}.wfTabsContainer{background-color:#FFF;overflow:hidden;border:1px solid #CCC;padding:15px;min-height:200px;-webkit-font-smoothing:antialiased}#wfTabs::after{content:".";display:block;height:0;width:0;line-height:0;clear:both;visibility:hidden}#wfTabs a{float:left;z-index:10;height:18px;margin:0 5px -1px 0;padding:5px 8px;border:1px solid #CCC;text-decoration:none;background-color:#EFEFEF;color:#21759B;-moz-border-radius-topright:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-moz-border-radius-topleft:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px}#wfTabs a.selected{border-bottom:1px solid #FFF;background-color:#FFF;color:#777}.wordfenceTopTab{display:none;margin-top:15px}.wordfenceTopTab.active{display:block}.wordfenceHelpLink{margin-top:15px}.wfAjaxLight128{background-image:url(../img/icons/ajax3.gif)}.wfStrong{font-weight:bold}.wordfenceModeElem{width:1px;height:1px;opacity:0}.wfWarn{color:#F00}img.wfFlag{vertical-align:middle;margin:-3px 4px 0 0}.wfHitTime{font-style:italic}.wfAvatar img{vertical-align:middle;margin-right:0.5rem}.wfls-hex-sequence{color:#587ECB}.wfLoadMoreButton.disabled,.wfLoadMoreButton[disabled]{pointer-events:none;opacity:0.65}table.wfConfigForm th{font-weight:normal;text-align:left;padding:2px 3px 1px 0;vertical-align:middle}table.wfConfigForm td{vertical-align:middle}table.wfConfigForm td.align-top{vertical-align:top}table th.wfConfigEnable{font-weight:bold;min-width:25%}.wfSavedMsg{display:none;color:#A00}table th.wfSubheading{font-weight:bold;padding-top:10px}h3.wfConfigHeading{font-size:22px;color:#777;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-style:italic;font-weight:normal}.wfTipText{color:#777;font-family:Georgia,Times New Roman,Times,serif;font-style:italic}.wfBlackCursor{color:#FFF}.wfls-spinner{display:inline-block;width:4px}.wferror{color:#F00}#wordfenceWorking{padding:10px 40px 6px 16px;z-index:100000;position:fixed;right:16px;bottom:0px;background-color:#fcb214;border:5px solid #fcb214;border-width:6px 15px 6px 6px;color:#525355;font-size:12px;font-weight:bold;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;background-image:url("../img/icons/working-indicator.gif");background-position:100% 50%;background-repeat:no-repeat}@media (max-width: 960px){#wordfenceWorking{left:auto;right:0px}}#paidWrap{position:relative}.paidInnerMsg{width:500px;margin:150px auto 0 auto;color:#000;font-size:18px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;line-height:1.8em;text-align:center;-webkit-font-smoothing:antialiased}.wfMarker{height:1px;width:1px}.wfPaidOnlyNotice{width:500px;background-color:#FFFFE0;border:1px solid #000;padding:10px;margin:20px}.wfOnOffSwitch{display:inline-block;position:relative !important;width:69px !important;-webkit-user-select:none !important;-moz-user-select:none !important;-ms-user-select:none !important;user-select:none !important}.wfOnOffSwitch-checkbox{display:none !important}.wfOnOffSwitch-label{display:block !important;overflow:hidden !important;cursor:pointer !important;border:2px solid #999999 !important;border-radius:19px !important;margin:0}.wfOnOffSwitch-inner{width:200% !important;margin-left:-100% !important;-webkit-transition:margin 0.3s ease-in !important;-o-transition:margin 0.3s ease-in !important;transition:margin 0.3s ease-in !important;-webkit-transition-delay:0s !important;transition-delay:0s !important}.wfOnOffSwitch-inner:before,.wfOnOffSwitch-inner:after{float:left !important;width:50% !important;height:19px !important;padding:0 !important;line-height:19px !important;font-size:14px !important;color:white !important;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif !important;font-weight:bold !important;-webkit-box-sizing:border-box !important;-moz-box-sizing:border-box !important;box-sizing:border-box !important;-moz-border-radius:19px !important;-webkit-border-radius:19px;border-radius:19px !important;-webkit-box-shadow:0 9.5px 0 rgba(0,0,0,0.08) inset !important;box-shadow:0 9.5px 0 rgba(0,0,0,0.08) inset !important}.wfOnOffSwitch-inner:before{content:"ON" !important;padding-left:10px !important;background-color:#30D965 !important;color:#FFFFFF !important;-moz-border-radius:19px 0 0 19px !important;-webkit-border-radius:19px;border-radius:19px 0 0 19px !important}.wfOnOffSwitch-inner:after{content:"OFF" !important;padding-right:10px !important;background-color:#EEEEEE !important;color:#999999 !important;text-align:right !important;-moz-border-radius:0 19px 19px 0 !important;-webkit-border-radius:0;border-radius:0 19px 19px 0 !important}.wfOnOffSwitch-switch{width:19px !important;margin:0 !important;background:#FFFFFF !important;border:2px solid #999999 !important;-moz-border-radius:19px !important;-webkit-border-radius:19px;border-radius:19px !important;position:absolute !important;top:0 !important;bottom:0 !important;right:46px !important;-webkit-transition:all 0.3s ease-in !important;-o-transition:all 0.3s ease-in !important;transition:all 0.3s ease-in !important;-webkit-transition-delay:0s !important;transition-delay:0s !important;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzAwMDAwMCIgc3RvcC1vcGFjaXR5PSIwLjEiLz48c3RvcCBvZmZzZXQ9IjgwJSIgc3RvcC1jb2xvcj0iIzAwMDAwMCIgc3RvcC1vcGFjaXR5PSIwLjAiLz48L2xpbmVhckdyYWRpZW50PjwvZGVmcz48cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBmaWxsPSJ1cmwoI2dyYWQpIiAvPjwvc3ZnPiA=') !important;background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, rgba(0,0,0,0.1)),color-stop(80%, rgba(0,0,0,0))) !important;background-image:-moz-linear-gradient(center top, rgba(0,0,0,0.1) 0%,rgba(0,0,0,0) 80%) !important;background-image:-webkit-linear-gradient(center top, rgba(0,0,0,0.1) 0%,rgba(0,0,0,0) 80%) !important;background-image:linear-gradient(to center bottom, rgba(0,0,0,0.1) 0%,rgba(0,0,0,0) 80%) !important;box-shadow:0 1px 1px white inset !important}.wfOnOffSwitch-checkbox:checked+.wfOnOffSwitch-label .wfOnOffSwitch-inner{margin-left:0 !important}.wfOnOffSwitch-checkbox:checked+.wfOnOffSwitch-label .wfOnOffSwitch-switch{right:0 !important}#wordfenceConfigWarning,#wordfenceAdminEmailWarning{clear:left;margin-top:5px}.wfls-striped-table{width:100%;max-width:100%;border-collapse:collapse}.wfls-striped-table th{border-left:1px solid #bdbdbd}.wfls-striped-table th:first-of-type{border-left:0}.wfls-striped-table th,.wfls-striped-table td{padding:1rem}.wfls-striped-table thead th,.wfls-striped-table thead td,.wfls-striped-table tfoot th,.wfls-striped-table tfoot td,.wfls-striped-table tbody.thead th,.wfls-striped-table tbody.thead td{background-color:#ebebeb;color:#777;font-weight:bold;text-align:left}.wfls-striped-table tbody tr.even td,.wfls-striped-table tbody tr:nth-child(2n) td{background-color:#ffffff}.wfls-striped-table tbody tr td,.wfls-striped-table tbody tr.odd td{background-color:#fafafa}.wfls-striped-table tbody tr:hover>td{background-color:#fffbd8}.wfls-striped-table tbody.empty-row tr td{border-width:0;padding:8px 0;background-color:transparent}.wfls-striped-table .wfls-result-error,.wfls-block-list .wfls-result-error{color:#d0514c !important;font-weight:bold}.wfls-striped-table .wfls-result-error:before,.wfls-block-list .wfls-result-error:before{content:"\2718"}.wfls-striped-table .wfls-result-success{max-width:20%}.wfls-striped-table .wfls-result-success,.wfls-block-list .wfls-result-success{color:#008c10 !important;font-weight:bold}.wfls-striped-table .wfls-result-success:before,.wfls-block-list .wfls-result-success:before{content:"\2713"}.wfls-striped-table .wfls-result-success:before,.wfls-block-list .wfls-result-success:before,.wfls-striped-table .wfls-result-error:before,.wfls-block-list .wfls-result-error:before{font-size:16px;display:inline-block;margin:0px 8px 0px 0px}.wfls-striped-table .wfls-result-inactive,.wfls-block-list .wfls-result-inactive{font-weight:bold;color:#666666 !important}.wfls-fixed-table{table-layout:fixed}pre.wfls-pre{margin:8px 0 20px;padding:12px;background:#ffffff;border:1px solid #999999;overflow:auto}.wfls-center{text-align:center}#wfConfigForm,.wfls-diagnostics-wrapper{max-width:1035px}.wfls-hidden{display:none !important}.wfls-card{position:relative;margin:0 auto .625rem;padding:1rem;box-sizing:border-box;background:#fff;box-shadow:0 0 0 1px rgba(200,215,225,0.5),0 1px 2px #e9eff3}.wfls-card .wfls-card-inner{min-height:76px;width:100%;padding:8px;box-sizing:border-box;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;position:relative}.wfls-card .wfls-card-inner .wfls-card-content{max-width:75%}.wfls-card .wfls-card-inner .wfls-card-content .wfls-card-title{font-size:1.125rem;width:100%}.wfls-card .wfls-card-inner .wfls-card-content .wfls-card-subtitle{margin-top:.125rem;margin-bottom:.125rem;font-size:.875rem;color:#4f748e}.wfls-card .wfls-card-inner .wfls-card-action{position:absolute;top:0;right:0;height:100%;background:none;border:0;outline:0;width:48px;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;vertical-align:middle;transition:transform 0.15s cubic-bezier(0.175, 0.885, 0.32, 1.275),color 0.2s ease-in}.wfls-card .wfls-card-inner .wfls-card-action .wfls-card-action-chevron{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJjaGV2cm9uLW9iamVjdCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiCgkgd2lkdGg9IjI0cHgiIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAyNCAyNCIKCSB4bWw6c3BhY2U9InByZXNlcnZlIj4KPHBhdGggaWQ9ImNoZXZyb24iIGQ9Ik0yMCA5bC04IDgtOC04IDEuNDE0LTEuNDE0TDEyIDE0LjE3Mmw2LjU4Ni02LjU4NiIvPgo8L3N2Zz4K");background-repeat:no-repeat;background-position:center center;width:24px;height:24px;fill:#87a6bc}.wfls-card .wfls-card-inner .wfls-card-action .wfls-card-action-checkbox{background-image:url(../img/checkbox.png);background-repeat:no-repeat;background-position:left center;width:29px;height:29px}.wfls-card .wfls-card-inner .wfls-card-action .wfls-card-action-checkbox.checked{background-position:right center}.wfls-card .wfls-card-extra{display:none;padding:0.5rem;margin-top:1rem;border-top:1px solid #f3f6f8}@media (min-width: 768px){.wfls-card .wfls-card-extra{padding:1rem}}.wfls-card.active .wfls-card-extra{display:block}.wfls-card.wfls-card-left .wfls-card-content{margin-left:48px}.wfls-card.wfls-card-left .wfls-card-action{right:auto;left:0px}.wfls-card.disabled .wfls-card-content .wfls-card-title{color:#aaaaaa}.wfls-card.disabled .wfls-card-content .wfls-card-subtitle{color:#8ea6be}.wfls-inline-block{display:inline-block}@media (max-width: 767px){.wfls-inline-block-xs{display:inline-block}}.wfls-full-width{width:100%;max-width:100%}.wfls-no-top{margin-top:0 !important}.wfls-add-top{margin-top:1rem !important}.wfls-add-top-large{margin-top:1.5rem !important}.wfls-add-top-medium{margin-top:0.75rem !important}.wfls-add-top-small{margin-top:0.5rem !important}.wfls-add-top-smaller{margin-top:0.25rem !important}.wfls-no-bottom{margin-bottom:0 !important}.wfls-add-bottom{margin-bottom:1rem !important}.wfls-add-bottom-large{margin-bottom:1.5rem !important}.wfls-add-bottom-medium{margin-bottom:0.75rem !important}.wfls-add-bottom-small{margin-bottom:0.5rem !important}.wfls-add-bottom-smaller{margin-bottom:0.25rem !important}.wfls-padding-no-top{padding-top:0 !important}.wfls-no-right{margin-right:0 !important}.wfls-padding-no-bottom{padding-bottom:0 !important}.wfls-padding-no-left{padding-left:0 !important}.wfls-padding-no-right{padding-right:0 !important}.wfls-padding-add-top{padding-top:1rem !important}.wfls-padding-add-top-small{padding-top:0.5rem !important}.wfls-padding-add-top-medium{padding-top:0.75rem !important}.wfls-padding-add-top-large{padding-top:1.5rem !important}.wfls-padding-add-top-responsive{padding-top:1rem !important}@media (min-width: 768px){.wfls-padding-add-top-responsive{padding-top:1.5rem !important}}.wfls-padding-add-bottom{padding-bottom:1rem !important}.wfls-padding-add-bottom-small{padding-bottom:0.5rem !important}.wfls-padding-add-bottom-medium{padding-bottom:0.75rem !important}.wfls-padding-add-bottom-large{padding-bottom:1.5rem !important}.wfls-padding-add-bottom-responsive{padding-bottom:1rem !important}@media (min-width: 768px){.wfls-padding-add-bottom-responsive{padding-bottom:1.5rem !important}}.wfls-padding-no-bottom{padding-bottom:0 !important}.wfls-padding-add-left{padding-left:1rem !important}.wfls-padding-add-left-small{padding-left:0.5rem !important}.wfls-padding-add-left-medium{padding-left:0.75rem !important}.wfls-padding-add-left-large{padding-left:1.5rem !important}.wfls-padding-add-left-responsive{padding-left:1rem !important}@media (min-width: 768px){.wfls-padding-add-left-responsive{padding-left:1.5rem !important}}.wfls-padding-add-right{padding-right:1rem !important}.wfls-padding-add-right-small{padding-right:0.5rem !important}.wfls-padding-add-right-medium{padding-right:0.75rem !important}.wfls-padding-add-right-large{padding-right:1.5rem !important}.wfls-padding-add-right-responsive{padding-right:1rem !important}@media (min-width: 768px){.wfls-padding-add-right-responsive{padding-right:1.5rem !important}}.wfls-left{text-align:left !important}.wfls-center{text-align:center !important}.wfls-block-center{margin:0 auto}.wfls-right{text-align:right !important}.wfls-block-right{margin:0 0 0 auto}@media (max-width: 767px){.wfls-left-xs{text-align:left !important}.wfls-center-xs{text-align:center !important}.wfls-padding-add-top-xs{padding-top:1rem !important}.wfls-padding-add-top-xs-small{padding-top:0.5rem !important}.wfls-padding-add-top-xs-large{padding-top:1.5rem !important}.wfls-padding-add-bottom-xs{padding-bottom:1rem !important}.wfls-padding-add-bottom-xs-small{padding-bottom:0.5rem !important}.wfls-padding-add-bottom-xs-large{padding-bottom:1.5rem !important}}@media (min-width: 768px) and (max-width: 991px){.wfls-left-sm{text-align:left !important}.wfls-center-sm{text-align:center !important}}@media (min-width: 992px) and (max-width: 1199px){.wfls-left-md{text-align:left !important}.wfls-center-md{text-align:center !important}}@media (min-width: 1200px){.wfls-left-lg{text-align:left !important}.wfls-center-lg{text-align:center !important}}.wfls-border-no-top{border-top:none !important}.wfls-border-no-right{border-right:none !important}.wfls-border-no-bottom{border-bottom:none !important}.wfls-border-no-left{border-left:none !important}.wfls-overflow-x-auto{overflow-x:auto}.wfls-overflow-y-auto{overflow-y:auto}@media (max-width: 767px){.wfls-overflow-x-auto-xs{overflow-x:auto}.wfls-overflow-y-auto-xs{overflow-y:auto}}.wfls-blue{color:#00709e !important}.wfls-blue-light{color:#008cc1 !important}.wfls-gray-dark{color:#2d2d2d !important}.wfls-gray-blue{color:#3f596b !important}.wfls-green-dark{color:#11967a !important}.wfls-green-light{color:#16bc9b !important}.wfls-red-dark{color:#930000 !important}.wfls-red-light{color:#c10000 !important}.wfls-yellow-dark{color:#fcb214 !important}.wfls-yellow-light{color:#ffd10a !important}.wfls-gray{color:#525355 !important}.wfls-gray-light{color:#9f9fa0 !important}.wfls-nowrap{white-space:nowrap}.wfls-tip{color:#fcb214;font-size:1.1rem;margin-right:0.25rem}.wfls-text-small{font-size:85% !important}.wfls-text-plain{font-weight:400 !important}.wfls-scroll-x::-webkit-scrollbar,.wfls-scroll-y::-webkit-scrollbar{-webkit-appearance:none;width:7px;height:7px}.wfls-scroll-x::-webkit-scrollbar-thumb,.wfls-scroll-y::-webkit-scrollbar-thumb{border-radius:4px;background-color:rgba(0,0,0,0.194);-webkit-box-shadow:0 0 1px rgba(255,255,255,0.5)}.wfls-split-word{word-wrap:break-word;word-break:break-all}@media (max-width: 767px){.wfls-split-word-xs{word-wrap:break-word;word-break:break-all;white-space:normal !important}}.wfselect2-container{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;min-width:200px}@media (min-width: 768px){.wfselect2-container{min-width:280px}}@media (min-width: 992px){.wfselect2-container{min-width:320px}}@media (max-width: 767px){.wfselect2-container .wfselect2-search.wfselect2-search--inline{margin:0 !important}}.wfls-select2-placeholder-fix .wfselect2-search__field{width:auto !important}.wfls-page-title{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-start;justify-content:flex-start;margin-top:0.5rem}.wfls-page-title>*{-webkit-flex-grow:0;flex-grow:0;min-width:0}.wfls-page-title>*:first-child{-webkit-flex-grow:0;flex-grow:0;min-width:32px;-webkit-flex-basis:32px;flex-basis:32px;padding-right:0.25rem}.wfls-page-title .wordfence-icon32{margin:0;margin-right:0.5rem}.wfls-page-title h2{padding:0 !important}.wfls-page-title .wfOnOffSwitch{-webkit-flex-basis:69px;flex-basis:69px;-webkit-flex-shrink:0;flex-shrink:0;margin-left:0.5rem}.wfls-tab-container{background-color:#fff}@media (min-width: 768px){.wfls-tab-container{background-color:unset}}.wfls-page-tabs,.wfls-page-fixed-tabs{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-start;justify-content:flex-start;border-bottom:1px solid #d0d0d0;margin:0;margin-top:0.5rem;margin-left:-10px;margin-right:-10px}@media (min-width: 768px){.wfls-page-tabs,.wfls-page-fixed-tabs{margin-left:0;margin-right:0}}.wfls-page-tabs>*,.wfls-page-fixed-tabs>*{-webkit-flex-grow:0;flex-grow:0;min-width:0}.wfls-page-tabs>*:first-child,.wfls-page-fixed-tabs>*:first-child{-webkit-flex-grow:0;flex-grow:0;min-width:32px;-webkit-flex-basis:32px;flex-basis:32px}.wfls-page-tabs .wordfence-icon32,.wfls-page-fixed-tabs .wordfence-icon32{margin:0;margin-right:0.5rem;margin-left:0.5rem}@media (min-width: 768px){.wfls-page-tabs .wordfence-icon32,.wfls-page-fixed-tabs .wordfence-icon32{margin-left:0}}.wfls-page-tabs .wfls-text-tab,.wfls-page-fixed-tabs .wfls-text-tab{margin:0;margin-left:0.5rem;color:#333}.wfls-page-tabs .wfls-tab,.wfls-page-fixed-tabs .wfls-tab{border:1px solid #fff;border-top-right-radius:0.5rem;border-top-left-radius:0.5rem;border-bottom:none;margin-bottom:-1px;margin-right:0.5rem;color:#333}@media (min-width: 768px){.wfls-page-tabs .wfls-tab,.wfls-page-fixed-tabs .wfls-tab{border:1px solid #d0d0d0;background:#e6e6e6}}.wfls-page-tabs .wfls-tab a,.wfls-page-fixed-tabs .wfls-tab a{display:block;padding:0.5rem 1rem;font-size:14px;line-height:24px;text-decoration:none;font-weight:bold;color:#333}.wfls-page-tabs .wfls-tab.wfls-active,.wfls-page-tabs .wfls-tab:hover,.wfls-page-fixed-tabs .wfls-tab.wfls-active,.wfls-page-fixed-tabs .wfls-tab:hover{border-bottom:1px solid #f1f1f1;background:#f1f1f1;color:#00709e;-webkit-box-shadow:none;box-shadow:none}.wfls-page-tabs .wfls-tab.wfls-active a,.wfls-page-tabs .wfls-tab:hover a,.wfls-page-fixed-tabs .wfls-tab.wfls-active a,.wfls-page-fixed-tabs .wfls-tab:hover a{color:#00709e}.wfls-tab-content{display:none;margin-top:15px}.wfls-tab-content.wfls-active{display:block}.wfls-fixed-tab-content{margin-top:15px}.wfls-section-title{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-start;justify-content:flex-start}.wfls-section-title>*{-webkit-flex-grow:0;flex-grow:0;min-width:0}.wfls-section-title>h1,.wfls-section-title>h2,.wfls-section-title>h3,.wfls-section-title>h4,.wfls-section-title>h5,.wfls-section-title>h6{-webkit-flex-grow:1;flex-grow:1;color:#2d2d2d !important;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif !important;line-height:1.5rem !important;font-weight:700 !important;padding:0 !important;margin:0 !important}@media (min-width: 768px){.wfls-section-title>h1,.wfls-section-title>h2,.wfls-section-title>h3,.wfls-section-title>h4,.wfls-section-title>h5,.wfls-section-title>h6{padding-right:0.25rem !important}}.wfls-section-title h2{font-size:1.3125rem;line-height:1.5}.wfls-section-title h3{font-size:1.125rem}.wfls-section-title h4{font-size:1rem}.wfls-section-title .wordfence-icon32{margin:0;margin-right:0.5rem}.wfls-status-circular{position:relative}.wfls-status-circular-text{position:absolute;left:50%;top:50%;padding:0;margin:0;transform:translate(-50%, -50%);color:#aaa;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:1.3125rem;font-weight:300;line-height:1.5}.wfls-status-circular .wfls-status-overlay-text{position:absolute;left:50%;top:50%;padding:0;margin:0;width:200%;text-align:center;transform:translate(-50%, -50%);font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:.875rem;font-weight:normal;line-height:1.3125;opacity:0.0;color:#777}.wfls-status-warning,.wfls-status-critical,.wfls-status-payment-expiring,.wfls-status-renewing{width:100px;height:100px;margin-bottom:1rem}.wfls-status-warning svg path{fill:#fcb214}.wfls-status-critical svg path{fill:#930000}.wfls-status-payment-expiring svg rect,.wfls-status-payment-expiring svg path{fill:#930000}.wfls-status-renewing svg rect,.wfls-status-renewing svg path{fill:#11967a}#howGetIPs-preview{color:#8c8c8c}#howGetIPs-preview strong{color:#666}.wfls-scrollTop{background:#424242;bottom:30px;right:15px;position:fixed;z-index:999;display:none}.wfls-scrollTop a{background:#959595;display:block;padding:4px 5px;line-height:32px;width:32px;color:#ffffff;text-align:center}.wfls-back-icon{color:#00709e;margin-right:0.75rem;font-size:1.5rem !important}.wfls-back-link-chevron{margin-left:1rem}.wfls-back-link-chevron:first-of-type{margin-left:0}.wfls-back-link{font-weight:bold;text-decoration:none}.wfls-premium-link{font-weight:bold}.wfls-boolean-switch{border:1px solid #aaa;display:block;cursor:pointer;width:54px;height:30px;min-width:54px;min-height:30px;-moz-border-radius:15px;-webkit-border-radius:15px;border-radius:15px;line-height:30px !important;background-color:#ffffff;position:relative;box-sizing:border-box;transition:background-color 0.2s ease-in-out, border-color 0.2s ease-in-out}@media (min-width: 768px){.wfls-boolean-switch{width:34px;height:20px;min-width:34px;min-height:20px;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;line-height:20px !important}}.wfls-boolean-switch .wfls-boolean-switch-handle{position:relative;display:block;border:1px solid #aaa;background-color:#fff;width:30px;height:30px;min-width:30px;min-height:30px;-moz-border-radius:15px;-webkit-border-radius:15px;border-radius:15px;margin-top:-1px;box-sizing:border-box;left:-1px;transition:border-color 0.2s ease-in-out, left 0.2s ease-in-out}@media (min-width: 768px){.wfls-boolean-switch .wfls-boolean-switch-handle{width:20px;height:20px;min-width:20px;min-height:20px;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px}}.wfls-boolean-switch.wfls-active{border:1px solid #00709e;background-color:#00709e}.wfls-boolean-switch.wfls-active .wfls-boolean-switch-handle{border:1px solid #00709e;left:25px}@media (min-width: 768px){.wfls-boolean-switch.wfls-active .wfls-boolean-switch-handle{left:15px}}.wfls-boolean-switch.wfls-disabled{pointer-events:none;border-color:#e2e2e2}.wfls-boolean-switch.wfls-disabled .wfls-boolean-switch-handle{border-color:#e2e2e2}.wfls-boolean-switch.wfls-disabled.wfls-active{border-color:#e2e2e2;background-color:#e2e2e2}.wfls-boolean-switch.wfls-disabled.wfls-active .wfls-boolean-switch-handle{border-color:#e2e2e2}.wfls-option-checkbox,[type=checkbox].wfls-option-checkbox+label:before{content:"";font-family:"Ionicons" !important;display:block;cursor:pointer;width:30px;height:30px;min-width:30px;min-height:30px;-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;line-height:30px !important;text-align:center !important;background-color:#ffffff !important;box-shadow:0px 0px 0px 1px #aaa;color:#ffffff !important;font-size:30px !important;font-weight:normal !important}@media (min-width: 768px){.wfls-option-checkbox,[type=checkbox].wfls-option-checkbox+label:before{width:20px;height:20px;min-width:20px;min-height:20px;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;line-height:21px !important;font-size:25px !important}}@media (min-width: 768px){.wfls-option-checkbox{position:relative}.wfls-option-checkbox>*{position:absolute;top:9px;left:50%;transform:translateX(-50%) translateY(-50%)}}.wfls-option-radio,[type=radio].wfls-option-radio+label:before{content:"\f401";font-family:"Ionicons" !important;display:block;cursor:pointer;width:30px;height:30px;min-width:30px;min-height:30px;line-height:30px !important;text-align:center !important;color:#ccc !important;font-size:30px !important;font-weight:normal !important}@media (min-width: 768px){.wfls-option-radio,[type=radio].wfls-option-radio+label:before{width:20px;height:20px;min-width:20px;min-height:20px;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;line-height:20px !important}}[type=checkbox].wfls-option-checkbox.wfls-small+label:before{width:20px;height:20px;min-width:20px;min-height:20px;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;line-height:21px !important;font-size:20px !important}[type=radio].wfls-option-radio.wfls-small+label:before{width:20px;height:20px;min-width:20px;min-height:20px;line-height:21px !important;font-size:20px !important}[type=checkbox].wfls-option-checkbox+label:before,[type=radio].wfls-option-radio+label:before{text-align:center !important;text-indent:0px;display:inline-block;vertical-align:-6px;margin:0px 5px 0px 0px;font-weight:normal;font-style:normal}[type=checkbox].wfls-option-checkbox.wfls-small+label:before,[type=radio].wfls-option-radio.wfls-small+label:before{text-indent:0px;vertical-align:-3px}.wfls-option-checkbox.wfls-checked,[type=checkbox].wfls-option-checkbox:checked+label:before{color:#ffffff !important;box-shadow:0px 0px 0px 1px #00709e !important;background-color:#00709e !important}.wfls-option-checkbox.wfls-disabled,[type=checkbox].wfls-option-checkbox:disabled+label:before{color:#f1f1f1 !important;box-shadow:0px 0px 0px 1px #e2e2e2 !important;background-color:#f1f1f1 !important}.wfls-option-checkbox.wfls-checked.wfls-disabled,[type=checkbox].wfls-option-checkbox:disabled:checked+label:before{color:#777 !important;box-shadow:0px 0px 0px 1px #e2e2e2 !important;background-color:#f1f1f1 !important}.wfls-option-radio.wfls-checked,[type=radio].wfls-option-radio:checked+label:before{content:"\f3a7";color:#00709e !important}.wfls-option-checkbox[type=checkbox],.wfls-option-checkbox[type=radio],.wfls-option-radio[type=checkbox],.wfls-option-radio[type=radio]{position:absolute;left:-9999px}.wfls-option-text input[type="text"],input.wfls-input-text{text-align:left;width:100%;height:40px;border-radius:0;border:0;background-color:#ffffff;box-shadow:1px 1px 1px 2px rgba(215,215,215,0.65)}.wfls-option-text input[type="text"]:placeholder-shown,input.wfls-input-text:placeholder-shown{font-style:italic;color:#bfbfbf}::-webkit-input-placeholder{color:#bfbfbf}:-moz-placeholder{color:#bfbfbf;opacity:1}::-moz-placeholder{color:#bfbfbf;opacity:1}:-ms-input-placeholder{color:#bfbfbf}::-ms-input-placeholder{color:#bfbfbf}::placeholder{color:#bfbfbf}.wfls-option-premium .wfls-option-title,.wfls-option-premium .wfls-option-title>ul>li,.wfls-option.wfls-disabled .wfls-option-title,.wfls-option.wfls-disabled .wfls-option-title>ul>li{color:#aaa !important}.wfls-option-premium .wfls-option-checkbox,.wfls-option-premium .wfls-option-radio,.wfls-option.wfls-disabled .wfls-option-checkbox,.wfls-option.wfls-disabled .wfls-option-radio{opacity:0.5}.wfls-block .wfls-block-content .wfls-block-labeled-value.wfls-protection-status .wfls-block-labeled-value-value{padding-top:0}.wfls-block .wfls-block-content .wfls-block-labeled-value.wfls-protection-status .wfls-block-labeled-value-value .wfls-fa{font-size:8rem}.wfls-block .wfls-block-content .wfls-block-labeled-value.wfls-protection-status .wfls-block-labeled-value-value svg{width:160px}.wfls-block .wfls-block-content .wfls-block-labeled-value.wfls-protection-status .wfls-block-labeled-value-label{font-size:1.35rem;font-weight:300;padding-bottom:0}.wfls-block .wfls-block-content .wfls-block-labeled-value.wfls-protection-status-premium .wfls-block-labeled-value-value{color:#9f9fa0}.wfls-block .wfls-block-content .wfls-block-labeled-value.wfls-protection-status-premium .wfls-block-labeled-value-value svg{fill:#9f9fa0}.wfls-block .wfls-block-content .wfls-block-labeled-value.wfls-protection-status-premium .wfls-block-labeled-value-label{color:#9f9fa0}.wfls-indeterminate-progress{-webkit-animation:wfls-indeterminate-progress-keyframes 1s steps(8, end) infinite;-o-animation:wfls-indeterminate-progress-keyframes 1s steps(8, end) infinite;animation:wfls-indeterminate-progress-keyframes 1s steps(8, end) infinite}.wfls-indeterminate-progress path{fill:#00709e}@-moz-keyframes wfls-indeterminate-progress-keyframes{to{-moz-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes wfls-indeterminate-progress-keyframes{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes wfls-indeterminate-progress-keyframes{to{-moz-transform:rotate(360deg);-ms-transform:rotate(360deg);-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.wfls-flex-row{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;flex-wrap:nowrap}.wfls-flex-row .wfls-flex-row-1{-webkit-flex-grow:1;flex-grow:1}.wfls-flex-row .wfls-flex-row-0{-webkit-flex-grow:0;flex-grow:0}.wfls-flex-row.wfls-flex-row-wrappable,.wfls-flex-row.wfls-flex-row-xs-wrappable{-webkit-flex-wrap:wrap;flex-wrap:wrap}.wfls-flex-row.wfls-flex-row-equal-heights{-webkit-align-items:stretch;align-items:stretch}.wfls-flex-row .wfls-flex-item-full-width{width:100%}.wfls-flex-row .wfls-flex-item-xs-100{-webkit-flex-basis:100%;flex-basis:100%;max-width:100%}@media (min-width: 768px){.wfls-flex-row.wfls-flex-row-xs-wrappable{-webkit-flex-wrap:nowrap;flex-wrap:nowrap}.wfls-flex-row .wfls-flex-item-sm-50{-webkit-flex-basis:50%;flex-basis:50%}}.wfls-switch{display:-webkit-flex !important;display:flex !important;-webkit-align-items:stretch !important;align-items:stretch !important;-webkit-justify-content:flex-start !important;justify-content:flex-start !important;-webkit-flex-direction:row !important;flex-direction:row !important;margin:0;padding:0}.wfls-switch>li{margin:0 !important;padding:0.5rem 0.7rem !important;text-transform:uppercase;cursor:pointer;color:#aaa;font-weight:400;border-top:1px solid #bfbfbf;border-bottom:1px solid #bfbfbf;border-right:1px solid #bfbfbf}.wfls-switch>li:first-of-type{border-left:1px solid #bfbfbf;-moz-border-radius-topleft:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px}.wfls-switch>li:last-of-type{-moz-border-radius-topright:6px;-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-moz-border-radius-bottomright:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px}.wfls-switch>li.wfls-active{color:#ffffff;background-color:#00709e}.wfls-tooltip,.ui-widget.wfls-tooltip{max-width:600px;font-size:0.75rem;overflow-wrap:break-word}.wfls-widget-learning-mode{border-top:1px solid #eee;margin:0 -1rem;padding:1rem;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;-webkit-flex-direction:row;flex-direction:row}@media (min-width: 768px){.wfls-widget-learning-mode{padding:1.5rem}}.wfls-widget-learning-mode svg{width:18px}.wfls-widget-learning-mode svg path{fill:#aaa}.wfls-widget-learning-mode span{padding-left:0.5rem;font-size:.875rem;line-height:1.3125;font-weight:600}.wfls-drawer-overlay{position:fixed;top:0px;right:0px;bottom:0px;left:160px;background-color:rgba(0,0,0,0.5);z-index:9980;padding:5rem 0}.folded .wfls-drawer-overlay{left:36px}@media only screen and (max-width: 960px){.auto-fold .wfls-drawer-overlay{left:36px}}.rtl .wfls-drawer-overlay{right:160px;left:0px}.rtl .folded .wfls-drawer-overlay{right:36px}@media only screen and (max-width: 960px){.rtl .auto-fold .wfls-drawer-overlay{right:36px}}@media screen and (max-width: 782px){.wfls-drawer-overlay,.folded .wfls-drawer-overlay,.auto-fold .wfls-drawer-overlay,.rtl .wfls-drawer-overlay,.rtl .folded .wfls-drawer-overlay,.rtl .auto-fold .wfls-drawer-overlay{left:0px;right:0px}}.wfls-drawer{background-color:#ffffff;position:fixed;top:32px;bottom:0px;right:0px;z-index:9981}.wfls-drawer .wfls-modal{display:-webkit-flex;display:flex;-webkit-align-items:stretch;align-items:stretch;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:column;flex-direction:column;height:100%}.wfls-drawer .wfls-modal ul,.wfls-drawer .wfls-modal li{padding:0;margin:0}.wfls-drawer .wfls-modal .wfls-modal-header{-webkit-flex-shrink:0;flex-shrink:0;min-height:44px;padding:1rem;width:100%;box-sizing:border-box;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between;position:relative;background-color:#00709e;color:#ffffff}.wfls-drawer .wfls-modal .wfls-modal-header .wfls-modal-header-content{max-width:75%}.wfls-drawer .wfls-modal .wfls-modal-header .wfls-modal-header-content .wfls-modal-title{font-size:1.3125rem;line-height:1.5;font-weight:300;width:100%;transition:color 0.2s ease-in}.wfls-drawer .wfls-modal .wfls-modal-header .wfls-modal-header-content .wfls-modal-subtitle{margin-top:.125rem;margin-bottom:.125rem;font-size:.575rem;color:#4f748e}.wfls-drawer .wfls-modal .wfls-modal-content{-webkit-flex-grow:1;flex-grow:1;display:-webkit-flex;display:flex;-webkit-align-items:stretch;align-items:stretch;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:column;flex-direction:column;padding:1rem}.wfls-drawer .wfls-modal .wfls-modal-content>*:first-child{margin-top:0}.wfls-drawer .wfls-modal .wfls-modal-content select,.wfls-drawer .wfls-modal .wfls-modal-content select option,.wfls-drawer .wfls-modal .wfls-modal-content .wfselect2-container--default{font-size:0.7rem;font-weight:bold}@media (min-width: 768px){.wfls-drawer .wfls-modal .wfls-modal-content select,.wfls-drawer .wfls-modal .wfls-modal-content select option,.wfls-drawer .wfls-modal .wfls-modal-content .wfselect2-container--default{font-size:0.8rem}}@media (min-width: 992px){.wfls-drawer .wfls-modal .wfls-modal-content select,.wfls-drawer .wfls-modal .wfls-modal-content select option,.wfls-drawer .wfls-modal .wfls-modal-content .wfselect2-container--default{font-size:0.9rem}}.wfls-drawer .wfls-modal .wfls-modal-content .wfls-option-select-option,.wfls-drawer .wfls-modal .wfls-modal-content .wfselect2-container--default,.wfls-drawer .wfls-modal .wfls-modal-content .wfselect2-container--default .wfselect2-selection--single{text-align:left;height:40px;border-radius:0;border:0;background-color:#ffffff;box-shadow:1px 1px 1px 2px rgba(215,215,215,0.35)}.wfls-drawer .wfls-modal .wfls-modal-content .wfls-option-select-option .wfselect2-selection__rendered,.wfls-drawer .wfls-modal .wfls-modal-content .wfselect2-container--default .wfselect2-selection__rendered,.wfls-drawer .wfls-modal .wfls-modal-content .wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__rendered{color:#333;line-height:40px}.wfls-drawer .wfls-modal .wfls-modal-content .wfls-option-select-option .wfselect2-selection__arrow,.wfls-drawer .wfls-modal .wfls-modal-content .wfselect2-container--default .wfselect2-selection__arrow,.wfls-drawer .wfls-modal .wfls-modal-content .wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__arrow{height:38px}.wfls-drawer .wfls-modal .wfls-modal-content .wfls-option-select-option.wfselect2-container--disabled .wfselect2-selection__rendered,.wfls-drawer .wfls-modal .wfls-modal-content .wfselect2-container--default.wfselect2-container--disabled .wfselect2-selection__rendered,.wfls-drawer .wfls-modal .wfls-modal-content .wfselect2-container--default .wfselect2-selection--single.wfselect2-container--disabled .wfselect2-selection__rendered{color:#aaa}.wfls-drawer .wfls-modal .wfls-modal-content .wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__arrow b{border-color:#333 transparent transparent}.wfls-drawer .wfls-modal .wfls-modal-content .wfselect2-container--default.wfselect2-container--open .wfselect2-selection--single .wfselect2-selection__arrow b{border-color:transparent transparent #333}.wfls-drawer .wfls-modal .wfls-modal-footer{-webkit-flex-shrink:0;flex-shrink:0;min-height:44px;padding:1rem;width:100%;box-sizing:border-box;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between;position:relative;background-color:#f1f1f1;border-top:1px solid #d9d9d9}.wfls-mobile-menu-overlay{position:fixed;top:0px;right:0px;bottom:0px;left:0px;background-color:rgba(0,0,0,0.5);z-index:100000}.wfls-mobile-menu-overlay>.wfls-mobile-menu-tap-hint{position:absolute;top:25%;left:50%;transform:translateX(-50%);color:#ffffff;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:1.3125rem;font-weight:300;line-height:1.5}.wfls-mobile-menu{position:fixed;left:50%;transform:translateX(-50%);z-index:100001}.wfls-mobile-menu>.wfls-mobile-menu-items{margin:0;padding:0 0 0.25rem 0;list-style:none}.wfls-mobile-menu>.wfls-mobile-menu-items>li{margin:0;padding:0.25rem 0}.wfls-mobile-menu>.wfls-mobile-menu-items>li>a{box-sizing:border-box}.wfls-callout-warning{background-color:#feecc4;padding:0.8rem 1.25rem}.wfls-tip-light-bulb{color:#fcb214;font-size:1.5rem;font-weight:bold}.wfls-tip-info-message{padding-left:0.5rem !important;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:.875rem;color:#2d2d2d;line-height:1.3125;font-weight:normal}#wfls-qr-code{width:175px;height:175px;margin:0 auto}@media (min-width: 500px){#wfls-qr-code{width:256px;height:256px}}#wfls-activate-field{margin:0 auto;font-size:1.5rem;display:block;text-align:center}.wfls-recovery-codes{list-style-type:none}.wfls-recovery-codes li{font-family:monospace !important;text-align:center}#wfls-recovery-download .dashicons,#wfls-recovery-new-download .dashicons{line-height:26px}#wfls-ip-source-trusted-proxies{display:none}ul.wfls-option.wfls-option-howgetips .wfls-option-ip-source-details{display:-webkit-flex;display:flex;-webkit-align-items:flex-start;align-items:flex-start;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:column;flex-direction:column;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:0.8rem;margin-top:0.5rem}#wfls-ip-source-preview{color:#8c8c8c}#wfls-ip-source-preview strong{color:#666}.wfls-inline-notice{background:#fff;border:1px solid #ccd0d4;border-left-color:#ffb900;border-left-width:4px;box-shadow:0 1px 1px rgba(0,0,0,0.04);padding:4px 12px;display:flex;justify-content:flex-start;align-items:center}.wfls-inline-notice>*{flex-grow:1}.wfls-inline-notice:first-child{flex-grow:0;flex-shrink:0}.wfls-inline-notice span{padding-left:0.5rem}.wfls-page-indicator{vertical-align:bottom}.wfls-block{display:-webkit-flex;display:flex;-webkit-align-items:stretch;align-items:stretch;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:column;flex-direction:column;position:relative;margin:0 auto 0.5rem;box-sizing:border-box;background-color:#fff;box-shadow:0 0 0 1px rgba(200,215,225,0.25),0 1px 2px #e9eff3}.wfls-block.wfls-block-transparent{background-color:transparent;box-shadow:none}.wfls-block .wfls-block-banner{min-height:44px;margin:0 -1rem;padding:0;box-sizing:border-box;position:relative;background-color:#fcb214;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between;-webkit-flex-direction:row;flex-direction:row}.wfls-block .wfls-block-banner>li{margin:0;padding:0.75rem 1rem}@media (min-width: 768px){.wfls-block .wfls-block-banner{margin:0 -1.5rem}.wfls-block .wfls-block-banner>li{padding:0.75rem 1.5rem}}.wfls-block .wfls-block-header{-webkit-flex-basis:44px;flex-basis:44px;-webkit-flex-shrink:0;flex-shrink:0;-webkit-flex-grow:0;flex-grow:0;min-height:44px;padding:1rem 0;width:100%;box-sizing:border-box;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between;position:relative}.wfls-block .wfls-block-header.wfls-block-header-border-bottom{padding:0 1rem;border-bottom:1px solid #e2e2e2}@media (min-width: 768px){.wfls-block .wfls-block-header.wfls-block-header-border-bottom{padding:0 1.5rem}}.wfls-block .wfls-block-header .wfls-block-header-content{max-width:75%}.wfls-block .wfls-block-header .wfls-block-header-content .wfls-block-title{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:0.9rem;width:100%;transition:color 0.2s ease-in}.wfls-block .wfls-block-header .wfls-block-header-content .wfls-block-subtitle{margin-top:.125rem;margin-bottom:.125rem;font-size:0.775rem}.wfls-block .wfls-block-header .wfls-block-header-action{position:absolute;top:0;right:0;height:100%;background:none;border:0;outline:0;width:48px;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-end;justify-content:flex-end;vertical-align:middle;transition:transform 0.15s cubic-bezier(0.175, 0.885, 0.32, 1.275),color 0.2s ease-in}.wfls-block .wfls-block-header .wfls-block-header-action.wfls-block-header-action-text{width:auto}.wfls-block .wfls-block-header .wfls-block-header-action.wfls-block-header-action-text.wfls-block-header-action-text-success{color:#11967a}.wfls-block .wfls-block-header .wfls-block-header-action.wfls-block-header-action-text.wfls-block-header-action-text-warning{color:#930000}.wfls-block .wfls-block-header .wfls-block-header-action.wfls-block-header-action-text.wfls-block-header-action-text-warning a{color:#930000}.wfls-block .wfls-block-header .wfls-block-header-action .wfls-block-header-action-chevron{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJjaGV2cm9uLW9iamVjdCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiCgkgd2lkdGg9IjI0cHgiIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAyNCAyNCIKCSB4bWw6c3BhY2U9InByZXNlcnZlIj4KPHBhdGggaWQ9ImNoZXZyb24iIGQ9Ik0yMCA5bC04IDgtOC04IDEuNDE0LTEuNDE0TDEyIDE0LjE3Mmw2LjU4Ni02LjU4NiIvPgo8L3N2Zz4K");background-repeat:no-repeat;background-position:center center;width:24px;height:24px}.wfls-block .wfls-block-header .wfls-block-header-action .wfls-block-header-action-disclosure{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJkaXNjbG9zdXJlLWNsb3NlZC1vYmplY3QiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHdpZHRoPSIxMnB4IiBoZWlnaHQ9IjEycHgiIHZpZXdCb3g9IjAgMCAxMiAxMiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgMTIgMTIiCgkgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxwYXRoIGlkPSJkaXNjbG9zdXJlLWNsb3NlZCIgZD0iTSA2IDAgbCA2IDYgLTYgNiAwIC0xMiIgZmlsbD0iIzc3NyIvPgo8L3N2Zz4=");background-repeat:no-repeat;background-position:center center;width:12px;height:12px;transition:transform 0.15s cubic-bezier(0.175, 0.885, 0.32, 1.275),background 0.2s ease-in}.wfls-block .wfls-block-header .wfls-block-header-action .wfls-block-header-action-checkbox{background-image:url(../img/checkbox.png);background-repeat:no-repeat;background-position:left center;width:29px;height:29px}.wfls-block .wfls-block-header .wfls-block-header-action .wfls-block-header-action-checkbox.wfls-checked{background-position:right center}.wfls-block .wfls-block-content{-webkit-flex-grow:1;flex-grow:1;display:none;padding:0 1rem}@media (min-width: 768px){.wfls-block .wfls-block-content{padding:0 1.5rem}}.wfls-block .wfls-block-content .wfls-block-list{margin:0 -1rem;padding:0;list-style:none}@media (min-width: 768px){.wfls-block .wfls-block-content .wfls-block-list{margin:0 -1.5rem}}.wfls-block .wfls-block-content .wfls-block-list.wfls-block-list-striped>li:nth-of-type(odd){background-color:#f9f9f9}.wfls-block .wfls-block-content .wfls-block-list.wfls-block-list-striped>li:nth-of-type(even){background-color:#ffffff}.wfls-block .wfls-block-content .wfls-block-list>li{display:block;min-height:44px;padding:0 1rem;margin:0;border-top:1px solid #e2e2e2;box-sizing:border-box;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between}@media (min-width: 768px){.wfls-block .wfls-block-content .wfls-block-list>li{padding:0 1.5rem}}.wfls-block .wfls-block-content .wfls-block-list>li>*:first-child{-webkit-flex-grow:1;flex-grow:1;min-width:0}.wfls-block .wfls-block-content .wfls-block-list.wfls-block-list-horizontal{box-sizing:border-box;margin-top:-1px;display:-webkit-flex;display:flex;-webkit-align-items:stretch;align-items:stretch;-webkit-align-content:flex-start;align-content:flex-start;-webkit-justify-content:space-between;justify-content:space-between;-webkit-flex-wrap:wrap;flex-wrap:wrap}.wfls-block .wfls-block-content .wfls-block-list.wfls-block-list-horizontal>li{-webkit-flex-grow:1;flex-grow:1;-webkit-flex-basis:100%;flex-basis:100%;border-left:1px solid #e2e2e2}@media (min-width: 768px){.wfls-block .wfls-block-content .wfls-block-list.wfls-block-list-horizontal>li{-webkit-flex-basis:50%;flex-basis:50%}}@media (min-width: 992px){.wfls-block .wfls-block-content .wfls-block-list.wfls-block-list-horizontal>li{-webkit-flex-basis:25%;flex-basis:25%}}.wfls-block .wfls-block-content .wfls-block-list.wfls-block-list-horizontal.wfls-block-list-nowrap{overflow-y:auto;-webkit-flex-wrap:nowrap;flex-wrap:nowrap}.wfls-block .wfls-block-content .wfls-block-list.wfls-block-list-horizontal.wfls-block-list-nowrap>li{-webkit-flex-shrink:0;flex-shrink:0}.wfls-block .wfls-block-content .wfls-block-list.wfls-block-list-horizontal.wfls-block-list-horizontal-5>li{-webkit-flex-grow:1;flex-grow:1;-webkit-flex-basis:20%;flex-basis:20%}.wfls-block .wfls-block-content .wfls-block-list.wfls-block-list-horizontal>*:first-child{border-left:0}@media (min-width: 768px){.wfls-block .wfls-block-content .wfls-block-list.wfls-block-list-horizontal.wfls-block-list-equal>li{max-width:50%}}@media (min-width: 992px){.wfls-block .wfls-block-content .wfls-block-list.wfls-block-list-horizontal.wfls-block-list-equal>li{max-width:25%}}.wfls-block .wfls-block-content .wfls-block-list.wfls-block-list-horizontal.wfls-block-list-horizontal-5.wfls-block-list-equal>li{max-width:20%}.wfls-block .wfls-block-content .wfls-block-list .wfls-block-list-state{text-align:center}@media (min-width: 1200px){.wfls-block .wfls-block-content .wfls-block-list .wfls-block-list-state{text-align:left}}.wfls-block .wfls-block-content .wfls-block-list .wfls-block-list-state-enabled .wfls-fa{color:#11967a}.wfls-block .wfls-block-content .wfls-block-list .wfls-block-list-state-disabled .wfls-fa{color:#525355}.wfls-block .wfls-block-content .wfls-block-list .wfls-block-list-state-premium{color:#9f9fa0}.wfls-block .wfls-block-content .wfls-block-list .wfls-block-list-dismiss{padding-left:2rem;font-size:1.25rem}.wfls-block .wfls-block-content .wfls-block-list .wfls-block-list-dismiss a{color:#525355}.wfls-block .wfls-block-content:first-child>.wfls-block-list>li:first-child{border-top:none}.wfls-block .wfls-block-content .wfls-block-left-right{margin:0 -1rem;padding:0;list-style:none;display:-webkit-flex;display:flex;-webkit-align-items:stretch;align-items:stretch;-webkit-align-content:flex-start;align-content:flex-start;-webkit-justify-content:space-between;justify-content:space-between;-webkit-flex-wrap:wrap;flex-wrap:wrap}@media (min-width: 768px){.wfls-block .wfls-block-content .wfls-block-left-right{margin:0 -1.5rem}}.wfls-block .wfls-block-content .wfls-block-left-right.wfls-block-left-right-nowrap{-webkit-flex-wrap:nowrap;flex-wrap:nowrap}.wfls-block .wfls-block-content .wfls-block-left-right>li{display:block;min-height:44px;padding:0;margin:0;box-sizing:border-box;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between}.wfls-block .wfls-block-content .wfls-block-left-right>li>*:first-child{-webkit-flex-grow:1;flex-grow:1;min-width:0}.wfls-block .wfls-block-content .wfls-block-left-right>li.wfls-left{text-align:left}.wfls-block .wfls-block-content .wfls-block-left-right>li.wfls-right{text-align:right}.wfls-block .wfls-block-content .wfls-block-left-center-right{margin:0 -1rem;padding:0;list-style:none;display:-webkit-flex;display:flex;-webkit-align-items:stretch;align-items:stretch;-webkit-align-content:center;align-content:center;-webkit-justify-content:space-between;justify-content:space-between;-webkit-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;flex-wrap:nowrap}.wfls-block .wfls-block-content .wfls-block-left-center-right>li{display:block;min-height:44px;padding:0;margin:0;box-sizing:border-box;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-basis:33.3333%;flex-basis:33.3333%;max-width:33.3333%}.wfls-block .wfls-block-content .wfls-block-left-center-right>li a{text-decoration:none;font-size:.875rem}.wfls-block .wfls-block-content .wfls-block-left-center-right>li.wfls-left{text-align:left}.wfls-block .wfls-block-content .wfls-block-left-center-right>li.wfls-center{text-align:center;-webkit-justify-content:center;justify-content:center}.wfls-block .wfls-block-content .wfls-block-left-center-right>li.wfls-center .wordfence-icon32{margin:0}.wfls-block .wfls-block-content .wfls-block-left-center-right>li.wfls-right{text-align:right;-webkit-justify-content:flex-end;justify-content:flex-end}.wfls-block .wfls-block-content .wfls-block-labeled-value{box-sizing:border-box;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between;-webkit-flex-direction:column;flex-direction:column;margin:0 -1rem;padding:1rem}@media (min-width: 768px){.wfls-block .wfls-block-content .wfls-block-labeled-value{margin:0 -1.5rem;padding:1.5rem}}.wfls-block .wfls-block-content .wfls-block-labeled-value-value{font-size:3rem;line-height:3rem;color:#9f9fa0;padding:1rem}.wfls-block .wfls-block-content .wfls-block-labeled-value-label{font-size:0.75rem;color:#9f9fa0;padding:0 1rem 1rem 1rem}.wfls-block .wfls-block-footer{-webkit-flex-shrink:0;flex-shrink:0;-webkit-flex-grow:0;flex-grow:0;min-height:44px;padding:1rem;width:100%;box-sizing:border-box;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between;position:relative;background-color:#e4e4e4}.wfls-block .wfls-block-footer .wfls-block-footer-content{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between;width:100%}.wfls-block .wfls-block-footer .wfls-block-footer-content>*{-webkit-flex-grow:1;flex-grow:1}.wfls-block .wfls-block-footer .wfls-block-footer-content .wfls-block-title{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:0.9rem;width:100%;transition:color 0.2s ease-in}.wfls-block .wfls-block-footer .wfls-block-footer-content .wfls-block-subtitle{margin-top:.125rem;margin-bottom:.125rem;font-size:0.775rem}.wfls-block .wfls-block-footer .wfls-block-footer-action{-webkit-flex-grow:0;flex-grow:0;background:none;border:0;outline:0;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-end;justify-content:flex-end;vertical-align:middle}.wfls-block.wfls-block-no-header .wfls-block-content .wfls-block-list>li{border-top:none}.wfls-block.wfls-active .wfls-block-content,.wfls-block.wfls-always-active .wfls-block-content{display:block}.wfls-block.wfls-active>.wfls-block-header>.wfls-block-header-content>.wfls-block-title{color:#00709e}.wfls-block.wfls-active>.wfls-block-header>.wfls-block-header-content>.wfls-block-header-action>.wfls-block-header-action-disclosure{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJkaXNjbG9zdXJlLWNsb3NlZC1vYmplY3QiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHdpZHRoPSIxMnB4IiBoZWlnaHQ9IjEycHgiIHZpZXdCb3g9IjAgMCAxMiAxMiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgMTIgMTIiCgkgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxwYXRoIGlkPSJkaXNjbG9zdXJlLWNsb3NlZCIgZD0iTSA2IDAgbCA2IDYgLTYgNiAwIC0xMiIgZmlsbD0iIzAwNzA5ZSIvPgo8L3N2Zz4=") !important;transform:rotate(90deg)}.wfls-block.wfls-disabled>.wfls-block-header>.wfls-block-header-content>.wfls-block-title,.wfls-block.wfls-disabled>.wfls-block-header>.wfls-block-header-content>.wfls-block-subtitle{color:#bfbfbf !important}.wfls-block.wfls-disabled>.wfls-block-header>.wfls-block-header-content>.wfls-block-header-action>.wfls-block-header-action-disclosure{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJkaXNjbG9zdXJlLWNsb3NlZC1vYmplY3QiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHdpZHRoPSIxMnB4IiBoZWlnaHQ9IjEycHgiIHZpZXdCb3g9IjAgMCAxMiAxMiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgMTIgMTIiCgkgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxwYXRoIGlkPSJkaXNjbG9zdXJlLWNsb3NlZCIgZD0iTSA2IDAgbCA2IDYgLTYgNiAwIC0xMiIgZmlsbD0iI2JkYmRiZCIvPgo8L3N2Zz4=") !important;transform:rotate(0deg)}.wfls-block.wfls-disabled>.wfls-block-content{display:none !important}.wfls-block.wfls-block-header-left .wfls-block-header-content{margin-left:48px}.wfls-block.wfls-block-header-left .wfls-block-header-action{right:auto;left:0px}.wfls-block.wfls-disabled .wfls-dashboard-item-content .wfls-block-title{color:#aaaaaa}.wfls-block.wfls-disabled .wfls-dashboard-item-content .wfls-block-subtitle{color:#8ea6be}.wfls-section-title{margin-bottom:1rem}.wfls-status-detail{box-sizing:border-box;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between;-webkit-flex-direction:column;flex-direction:column;margin:0 -1rem;padding:1rem}.wfls-status-detail p{margin:0 0 0.45rem 0}.wfls-status-detail .wfls-status-circular{margin-bottom:1rem}.wfls-status-detail .wfls-status-detail-title{font-weight:700 !important;font-size:1rem !important;line-height:1.3125 !important}.wfls-status-detail .wfls-status-detail-subtitle{font-size:.875rem !important;line-height:1.3125 !important;font-weight:normal !important;text-align:center}.wfls-status-detail .wfls-status-detail-link>a{font-weight:600 !important;font-size:0.85rem !important}.wfls-block-navigation-option{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-align-content:flex-start;align-content:flex-start;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-wrap:nowrap;flex-wrap:nowrap}.wfls-block-navigation-option svg.wfls-block-navigation-option-icon{width:50px;min-width:50px;fill:#9f9fa0}.wfls-block-navigation-option:hover{cursor:pointer}.wfls-block-navigation-option:hover a{text-decoration:underline}.wfls-block-navigation-option:hover svg.wfls-block-navigation-option-icon{fill:#00709e}.wfls-select-group{display:-webkit-flex !important;display:flex !important;-webkit-align-items:center !important;align-items:center !important;-webkit-justify-content:flex-start !important;justify-content:flex-start !important;-webkit-flex-direction:row !important;flex-direction:row !important;-webkit-flex-grow:0 !important;flex-grow:0 !important}.wfls-select-group .wfselect2-container{min-width:200px}@media (max-width: 767px){.wfls-select-group .wfselect2-container{max-width:100px}}.wfls-select-group .wfselect2-container--default .wfselect2-selection--single{display:block;width:100%;height:38px;padding:.5rem 1.25rem;font-size:14px;line-height:1.42857;color:#2b2b2b;background-color:#fff;background-image:none;border:1px solid #ddd;border-radius:4px;border-top-right-radius:0;border-bottom-right-radius:0;border-right:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s;-o-transition:border-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s;transition:border-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s}.wfls-select-group .wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__rendered{color:#2b2b2b;line-height:inherit}.wfls-select-group .wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__arrow{height:38px}.wfls-select-group .wfls-form-control{display:inline-block;width:auto;border-top-left-radius:0;border-bottom-left-radius:0;margin-left:0}.wfls-flex-horizontal{display:-webkit-flex !important;display:flex !important;-webkit-align-items:center !important;align-items:center !important;-webkit-justify-content:flex-start !important;justify-content:flex-start !important;-webkit-flex-direction:row !important;flex-direction:row !important}.wfls-flex-horizontal>*:first-child{-webkit-flex-grow:0 !important;flex-grow:0 !important}.wfls-flex-horizontal.wfls-flex-align-left{-webkit-align-items:flex-start !important;align-items:flex-start !important}.wfls-flex-horizontal.wfls-flex-align-right{-webkit-justify-content:flex-end !important;justify-content:flex-end !important}.wfls-flex-horizontal.wfls-flex-full-width{width:100%}.wfls-flex-horizontal.wfls-flex-full-width>*:last-child{-webkit-flex-grow:1 !important;flex-grow:1 !important}.wfls-flex-horizontal.wfls-flex-full-width.wfls-flex-grow-first>*:first-child{-webkit-flex-grow:1 !important;flex-grow:1 !important}.wfls-flex-horizontal.wfls-flex-full-width.wfls-flex-grow-first>*:last-child{-webkit-flex-grow:0 !important;flex-grow:0 !important}.wfls-flex-horizontal.wfls-flex-full-width.wfls-flex-grow-all>*:first-child,.wfls-flex-horizontal.wfls-flex-full-width.wfls-flex-grow-all>*{-webkit-flex-grow:1 !important;flex-grow:1 !important}.wfls-flex-horizontal>li{padding:0;margin:0}.wfls-flex-vertical{display:-webkit-flex !important;display:flex !important;-webkit-align-items:center !important;align-items:center !important;-webkit-justify-content:flex-start !important;justify-content:flex-start !important;-webkit-flex-direction:column !important;flex-direction:column !important}.wfls-flex-vertical>*:first-child{-webkit-flex-grow:0 !important;flex-grow:0 !important}.wfls-flex-vertical.wfls-flex-align-left{-webkit-align-items:flex-start !important;align-items:flex-start !important}.wfls-flex-vertical.wfls-flex-align-right{-webkit-align-items:flex-end !important;align-items:flex-end !important}.wfls-flex-vertical.wfls-flex-full-width{-webkit-align-items:stretch !important;align-items:stretch !important}@media (max-width: 767px){.wfls-flex-vertical.wfls-flex-align-left-xs{-webkit-align-items:flex-start !important;align-items:flex-start !important}}@media (min-width: 768px) and (max-width: 991px){.wfls-flex-vertical.wfls-flex-align-left-sm{-webkit-align-items:flex-start !important;align-items:flex-start !important}}@media (min-width: 992px) and (max-width: 1199px){.wfls-flex-vertical.wfls-flex-align-left-md{-webkit-align-items:flex-start !important;align-items:flex-start !important}}@media (min-width: 1200px){.wfls-flex-vertical.wfls-flex-align-left-lg{-webkit-align-items:flex-start !important;align-items:flex-start !important}}.wfls-flex-vertical>li{padding:0;margin:0}@media (max-width: 767px){.wfls-flex-vertical-xs{display:-webkit-flex !important;display:flex !important;-webkit-align-items:center !important;align-items:center !important;-webkit-justify-content:flex-start !important;justify-content:flex-start !important;-webkit-flex-direction:column !important;flex-direction:column !important}.wfls-flex-vertical-xs>*:first-child{-webkit-flex-grow:0 !important;flex-grow:0 !important}.wfls-flex-vertical-xs.wfls-flex-align-left{-webkit-align-items:flex-start !important;align-items:flex-start !important}.wfls-flex-vertical-xs.wfls-flex-align-right{-webkit-align-items:flex-end !important;align-items:flex-end !important}.wfls-flex-vertical-xs.wfls-flex-full-width{-webkit-align-items:stretch !important;align-items:stretch !important}}ul.wfls-option,.wfls-form-field{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;padding:1rem 0;position:relative}ul.wfls-option li,.wfls-form-field li{margin:0;padding:0}ul.wfls-option.wfls-option-no-spacing,.wfls-form-field.wfls-option-no-spacing{padding:0;margin:0}ul.wfls-option.wfls-option-toggled>*:last-child,ul.wfls-option.wfls-option-toggled-boolean-switch>*:last-child,ul.wfls-option.wfls-option-toggled-select>*:last-child,ul.wfls-option.wfls-option-select>*:last-child,ul.wfls-option.wfls-option-text>*:last-child,ul.wfls-option.wfls-option-textarea>*:last-child,ul.wfls-option.wfls-option-switch>*:last-child,ul.wfls-option.wfls-option-footer>*:last-child,.wfls-form-field.wfls-option-toggled>*:last-child,.wfls-form-field.wfls-option-toggled-boolean-switch>*:last-child,.wfls-form-field.wfls-option-toggled-select>*:last-child,.wfls-form-field.wfls-option-select>*:last-child,.wfls-form-field.wfls-option-text>*:last-child,.wfls-form-field.wfls-option-textarea>*:last-child,.wfls-form-field.wfls-option-switch>*:last-child,.wfls-form-field.wfls-option-footer>*:last-child{margin-right:1rem}@media (max-width: 768px){ul.wfls-option.wfls-option-footer,.wfls-form-field.wfls-option-footer{-webkit-flex-direction:column;flex-direction:column}}ul.wfls-option>.wfls-option-content,.wfls-form-field>.wfls-option-content{-webkit-flex-grow:1;flex-grow:1}ul.wfls-option>.wfls-option-content>ul,.wfls-form-field>.wfls-option-content>ul{display:-webkit-flex;display:flex;-webkit-align-items:flex-start;align-items:flex-start;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;width:100%}ul.wfls-option>.wfls-option-content>ul>*:first-child,.wfls-form-field>.wfls-option-content>ul>*:first-child{-webkit-flex-grow:1;flex-grow:1}@media (min-width: 768px){ul.wfls-option>.wfls-option-content>ul,.wfls-form-field>.wfls-option-content>ul{-webkit-flex-direction:row;flex-direction:row;-webkit-align-items:center;align-items:center}}ul.wfls-option.wfls-option-toggled-segmented *,.wfls-form-field.wfls-option-toggled-segmented *{-webkit-flex-grow:0;flex-grow:0}ul.wfls-option.wfls-option-toggled-segmented *:first-child,.wfls-form-field.wfls-option-toggled-segmented *:first-child{-webkit-flex-grow:1;flex-grow:1}ul.wfls-option.wfls-option-toggled-segmented>*:last-child,.wfls-form-field.wfls-option-toggled-segmented>*:last-child{margin-left:1rem}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-title,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-title{font-size:.8rem}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:stretch;align-content:stretch;-webkit-flex-wrap:nowrap;flex-wrap:nowrap}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label{-webkit-flex-grow:1;flex-grow:1;-webkit-flex-basis:50%;flex-basis:50%;display:block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;text-transform:uppercase;padding:.5rem 1.25rem;font-size:14px;line-height:1.42857;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;color:#00709e;background-color:#fff;border-color:#00709e;border-radius:0}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label:focus,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label.focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label:focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label.focus{color:#00709e;background-color:#e6e6e6;border-color:#00161f}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label:hover,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label:hover{color:#00709e;background-color:#e6e6e6;border-color:#004561}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label:active,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label.active,.wfls-open>ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label.wfls-dropdown-toggle,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label:active,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label.active,.wfls-open>.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label.wfls-dropdown-toggle{color:#00709e;background-color:#e6e6e6;border-color:#004561}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label:active:hover,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label:active:focus,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label:active.focus,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label.active:hover,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label.active:focus,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label.active.focus,.wfls-open>ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label.wfls-dropdown-toggle:hover,.wfls-open>ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label.wfls-dropdown-toggle:focus,.wfls-open>ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label.wfls-dropdown-toggle.focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label:active:hover,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label:active:focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label:active.focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label.active:hover,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label.active:focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label.active.focus,.wfls-open>.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label.wfls-dropdown-toggle:hover,.wfls-open>.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label.wfls-dropdown-toggle:focus,.wfls-open>.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label.wfls-dropdown-toggle.focus{color:#00709e;background-color:#d4d4d4;border-color:#00161f}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label:active,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label.wfls-active,.wfls-open>ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label.wfls-dropdown-toggle,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label:active,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label.wfls-active,.wfls-open>.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label.wfls-dropdown-toggle{background-image:none}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label.wfls-disabled,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label[disabled],ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label[readonly],fieldset[disabled] ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label.wfls-disabled,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label[disabled],.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label[readonly],fieldset[disabled] .wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label{color:#777;background-color:#fff;border-color:#e2e2e2;cursor:not-allowed;opacity:0.75}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label.wfls-disabled:hover,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label.wfls-disabled:focus,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label.wfls-disabled.wfls-focus,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label[disabled]:hover,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label[disabled]:focus,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label[disabled].wfls-focus,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label[readonly]:hover,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label[readonly]:focus,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label[readonly].wfls-focus,fieldset[disabled] ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label:hover,fieldset[disabled] ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label:focus,fieldset[disabled] ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label.wfls-focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label.wfls-disabled:hover,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label.wfls-disabled:focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label.wfls-disabled.wfls-focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label[disabled]:hover,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label[disabled]:focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label[disabled].wfls-focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label[readonly]:hover,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label[readonly]:focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label[readonly].wfls-focus,fieldset[disabled] .wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label:hover,fieldset[disabled] .wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label:focus,fieldset[disabled] .wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label.wfls-focus{background-color:#fff;border-color:#00709e}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label .wfls-badge,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label .wfls-badge{color:#fff;background-color:#00709e}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label.wfls-segment-first,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label.wfls-segment-first{border-radius:4px 0 0 4px}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label.wfls-segment-last,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label.wfls-segment-last{border-radius:0 4px 4px 0}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio],.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]{position:absolute;left:-9999px}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label{color:#fff;background-color:#00709e;border-color:#005e85}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label:focus,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label:focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.focus{color:#fff;background-color:#004c6b;border-color:#000405}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label:hover,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label:hover{color:#fff;background-color:#004c6b;border-color:#003347}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label:active,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.active,.wfls-open>ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-dropdown-toggle,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label:active,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.active,.wfls-open>.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-dropdown-toggle{color:#fff;background-color:#004c6b;border-color:#003347}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label:active:hover,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label:active:focus,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label:active.focus,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.active:hover,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.active:focus,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.active.focus,.wfls-open>ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-dropdown-toggle:hover,.wfls-open>ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-dropdown-toggle:focus,.wfls-open>ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-dropdown-toggle.focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label:active:hover,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label:active:focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label:active.focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.active:hover,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.active:focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.active.focus,.wfls-open>.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-dropdown-toggle:hover,.wfls-open>.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-dropdown-toggle:focus,.wfls-open>.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-dropdown-toggle.focus{color:#fff;background-color:#003347;border-color:#000405}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label:active,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-active,.wfls-open>ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-dropdown-toggle,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label:active,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-active,.wfls-open>.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-dropdown-toggle{background-image:none}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-disabled,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label[disabled],ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label[readonly],fieldset[disabled] ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-disabled,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label[disabled],.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label[readonly],fieldset[disabled] .wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label{color:#fff;background-color:#59a2c0;border-color:#5996b0;cursor:not-allowed;opacity:0.75}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-disabled:hover,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-disabled:focus,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-disabled.wfls-focus,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label[disabled]:hover,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label[disabled]:focus,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label[disabled].wfls-focus,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label[readonly]:hover,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label[readonly]:focus,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label[readonly].wfls-focus,fieldset[disabled] ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label:hover,fieldset[disabled] ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label:focus,fieldset[disabled] ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-disabled:hover,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-disabled:focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-disabled.wfls-focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label[disabled]:hover,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label[disabled]:focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label[disabled].wfls-focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label[readonly]:hover,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label[readonly]:focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label[readonly].wfls-focus,fieldset[disabled] .wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label:hover,fieldset[disabled] .wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label:focus,fieldset[disabled] .wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-focus{background-color:#00709e;border-color:#005e85}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label .wfls-badge,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label .wfls-badge{color:#00709e;background-color:#fff}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:disabled+label,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:disabled+label{cursor:not-allowed;filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=65);opacity:.65}ul.wfls-option.wfls-option-toggled-multiple,ul.wfls-option.wfls-option-2fa-roles,.wfls-form-field.wfls-option-toggled-multiple,.wfls-form-field.wfls-option-2fa-roles{-webkit-flex-direction:column;flex-direction:column;-webkit-align-items:flex-start;align-items:flex-start}ul.wfls-option.wfls-option-toggled-multiple>.wfls-option-title,ul.wfls-option.wfls-option-2fa-roles>.wfls-option-title,.wfls-form-field.wfls-option-toggled-multiple>.wfls-option-title,.wfls-form-field.wfls-option-2fa-roles>.wfls-option-title{font-weight:600}ul.wfls-option.wfls-option-2fa-roles .wfls-option-content ul,.wfls-form-field.wfls-option-2fa-roles .wfls-option-content ul{flex-wrap:wrap}ul.wfls-option.wfls-option-2fa-roles .wfls-option-content ul li,.wfls-form-field.wfls-option-2fa-roles .wfls-option-content ul li{flex-grow:0;display:inline;margin:0 0.75rem 0.75rem 0}ul.wfls-option.wfls-option-2fa-roles .wfls-option-content ul li label,.wfls-form-field.wfls-option-2fa-roles .wfls-option-content ul li label{display:block;font-weight:bold}ul.wfls-option.wfls-option-2fa-roles .wfls-option-content ul li select,.wfls-form-field.wfls-option-2fa-roles .wfls-option-content ul li select{display:block}ul.wfls-option.wfls-option-2fa-roles .wfls-2fa-grace-period-container label,ul.wfls-option.wfls-option-2fa-roles .wfls-2fa-grace-period-container input,.wfls-form-field.wfls-option-2fa-roles .wfls-2fa-grace-period-container label,.wfls-form-field.wfls-option-2fa-roles .wfls-2fa-grace-period-container input{vertical-align:middle}ul.wfls-option.wfls-option-2fa-roles .wfls-2fa-grace-period-container label,.wfls-form-field.wfls-option-2fa-roles .wfls-2fa-grace-period-container label{margin-bottom:0}ul.wfls-option.wfls-option-2fa-roles .wfls-2fa-grace-period-container .wfls-primary-label,.wfls-form-field.wfls-option-2fa-roles .wfls-2fa-grace-period-container .wfls-primary-label{display:block;margin-bottom:0.25rem}ul.wfls-option.wfls-option-2fa-roles .wfls-2fa-grace-period-container #wfls-grace-period-zero-warning,.wfls-form-field.wfls-option-2fa-roles .wfls-2fa-grace-period-container #wfls-grace-period-zero-warning{margin-top:0.5rem}ul.wfls-option.wfls-option-2fa-roles .wfls-2fa-notification-action,.wfls-form-field.wfls-option-2fa-roles .wfls-2fa-notification-action{margin-top:0.5rem}ul.wfls-option.wfls-option-2fa-roles small,.wfls-form-field.wfls-option-2fa-roles small{margin-top:0.5rem;display:block}ul.wfls-option>.wfls-option-spacer,.wfls-form-field>.wfls-option-spacer{-webkit-flex-grow:0;flex-grow:0;-webkit-flex-shrink:0;flex-shrink:0;margin:0 1rem 0 0;width:30px;height:30px}@media (min-width: 768px){ul.wfls-option>.wfls-option-spacer,.wfls-form-field>.wfls-option-spacer{width:20px;height:20px}}ul.wfls-option>.wfls-option-premium-lock,.wfls-form-field>.wfls-option-premium-lock{-webkit-flex-grow:0;flex-grow:0;-webkit-flex-shrink:0;flex-shrink:0;background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB3aWR0aD0iMjRweCIgaGVpZ2h0PSIzMHB4IiB2aWV3Qm94PSIwIDAgMjQgMzAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KCTxwYXRoIGQ9Ik0yMy45NDksMTQuMjMzYy0wLjM3OSwtMC4zOSAtMC45MDQsLTAuNjA2IC0xLjQ0OCwtMC41OTVsLTAuNjgzLDBsMCwtNC4wOTJjMC4wMzIsLTIuNTM1IC0wLjk4NiwtNC45NzMgLTIuODEyLC02LjczMWMtMS43NTksLTEuODI4IC00LjE5OCwtMi44NDcgLTYuNzM0LC0yLjgxNWMtMi41MzYsLTAuMDMyIC00Ljk3NiwwLjk4NyAtNi43MzQsMi44MTVjLTEuODI2LDEuNzU4IC0yLjg0NCw0LjE5NiAtMi44MTIsNi43MzFsMCw0LjA4OWwtMC42OCwwYy0wLjU0NCwtMC4wMTEgLTEuMDY5LDAuMjA1IC0xLjQ0OCwwLjU5NWMtMC4zOTUsMC4zODIgLTAuNjEyLDAuOTEyIC0wLjU5OCwxLjQ2MWwwLDEyLjI2NmMtMC4wMTEsMC41NDQgMC4yMDQsMS4wNjkgMC41OTUsMS40NDhjMC4zNzksMC4zOTEgMC45MDQsMC42MDYgMS40NDgsMC41OTVsMjAuNDU4LDBjMC4wMDMsMCAwLjAwNiwwIDAuMDEsMGMxLjExNywwIDIuMDM2LC0wLjkxOSAyLjAzNiwtMi4wMzdjMCwtMC4wMDMgMCwtMC4wMDYgMCwtMC4wMDlsMCwtMTIuMjYzYzAuMDExLC0wLjU0NCAtMC4yMDYsLTEuMDY5IC0wLjU5OCwtMS40NDhsMCwtMC4wMVptLTYuMjExLC0wLjU5NWwtMTAuOTE5LDBsMCwtNC4wOTJjLTAuMDIyLC0xLjQ1MSAwLjU1NywtMi44NDggMS41OTksLTMuODU4YzEuMDA5LC0xLjA0MiAyLjQwNywtMS42MjEgMy44NTcsLTEuNTk4YzEuNDUxLC0wLjAyMyAyLjg0OCwwLjU1NiAzLjg1OCwxLjU5OGMxLjA0MiwxLjAwOSAxLjYyMSwyLjQwNyAxLjU5OCwzLjg1OGwwLjAwNyw0LjA5MloiIGZpbGw9IiNkMWQxZDEiLz4KPC9zdmc+");background-repeat:no-repeat;background-position:center center;background-size:contain;margin:0 1rem 0 0;width:30px;height:30px}@media (min-width: 768px){ul.wfls-option>.wfls-option-premium-lock,.wfls-form-field>.wfls-option-premium-lock{margin:0 2rem 0 1rem;width:20px;height:20px}}ul.wfls-option>.wfls-option-checkbox,.wfls-form-field>.wfls-option-checkbox{-webkit-flex-grow:0;flex-grow:0;-webkit-flex-shrink:0;flex-shrink:0;margin:0 1rem 0 0}ul.wfls-option>.wfls-boolean-switch,.wfls-form-field>.wfls-boolean-switch{-webkit-flex-grow:0;flex-grow:0;-webkit-flex-shrink:0;flex-shrink:0;margin:0 1rem 0 0}@media (min-width: 768px){ul.wfls-option>.wfls-boolean-switch,.wfls-form-field>.wfls-boolean-switch{margin:0 1rem 0 1rem}}ul.wfls-option.wfls-option-no-spacing>.wfls-boolean-switch,.wfls-form-field.wfls-option-no-spacing>.wfls-boolean-switch{margin:0}ul.wfls-option>.wfls-option-radio-container,.wfls-form-field>.wfls-option-radio-container{-webkit-flex-grow:0;flex-grow:0;-webkit-flex-shrink:0;flex-shrink:0;margin:0 1rem 0 0}@media (min-width: 768px){ul.wfls-option>.wfls-option-radio-container,.wfls-form-field>.wfls-option-radio-container{margin:0 2rem 0 1rem}}ul.wfls-option>.wfls-option-radio-container [type=radio].wfls-option-radio+label:before,.wfls-form-field>.wfls-option-radio-container [type=radio].wfls-option-radio+label:before{margin:0}ul.wfls-option>li>.wfls-option-title,ul.wfls-option>.wfls-option-title,ul.wfls-option>.wfls-option-content>ul>.wfls-option-title,.wfls-form-field>li>.wfls-option-title,.wfls-form-field>.wfls-option-title,.wfls-form-field>.wfls-option-content>ul>.wfls-option-title{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:0.9rem;color:#2b2b2b;padding-right:0.5rem}ul.wfls-option>li>.wfls-option-title.wfls-option-title-top,ul.wfls-option>.wfls-option-title.wfls-option-title-top,ul.wfls-option>.wfls-option-content>ul>.wfls-option-title.wfls-option-title-top,.wfls-form-field>li>.wfls-option-title.wfls-option-title-top,.wfls-form-field>.wfls-option-title.wfls-option-title-top,.wfls-form-field>.wfls-option-content>ul>.wfls-option-title.wfls-option-title-top{-webkit-align-self:flex-start;align-self:flex-start}ul.wfls-option>li>.wfls-option-title.wfls-option-title-bottom,ul.wfls-option>.wfls-option-title.wfls-option-title-bottom,ul.wfls-option>.wfls-option-content>ul>.wfls-option-title.wfls-option-title-bottom,.wfls-form-field>li>.wfls-option-title.wfls-option-title-bottom,.wfls-form-field>.wfls-option-title.wfls-option-title-bottom,.wfls-form-field>.wfls-option-content>ul>.wfls-option-title.wfls-option-title-bottom{-webkit-align-self:flex-end;align-self:flex-end}ul.wfls-option .wfls-option-subtitle,.wfls-form-field .wfls-option-subtitle{padding-top:0.25rem;font-size:0.75rem}ul.wfls-option .wfls-flex-vertical .wfls-option-title,.wfls-form-field .wfls-flex-vertical .wfls-option-title{padding-bottom:0.75rem}ul.wfls-option.wfls-flex-vertical>.wfls-option-subtitle,.wfls-form-field.wfls-flex-vertical>.wfls-option-subtitle{padding-top:0.25rem !important;font-size:0.75rem !important}ul.wfls-option .wfls-option-checkboxes,ul.wfls-option .wfls-option-checkboxes>ul,.wfls-form-field .wfls-option-checkboxes,.wfls-form-field .wfls-option-checkboxes>ul{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;flex-wrap:nowrap}ul.wfls-option .wfls-option-checkboxes.wfls-option-checkboxes-wrap,ul.wfls-option .wfls-option-checkboxes>ul.wfls-option-checkboxes-wrap,.wfls-form-field .wfls-option-checkboxes.wfls-option-checkboxes-wrap,.wfls-form-field .wfls-option-checkboxes>ul.wfls-option-checkboxes-wrap{-webkit-flex-wrap:wrap;flex-wrap:wrap}ul.wfls-option .wfls-option-checkboxes,.wfls-form-field .wfls-option-checkboxes{margin-top:0.5rem}ul.wfls-option .wfls-option-checkboxes>ul,.wfls-form-field .wfls-option-checkboxes>ul{margin-top:0.5rem;margin-right:1rem}@media (min-width: 768px){ul.wfls-option .wfls-option-checkboxes>ul,.wfls-form-field .wfls-option-checkboxes>ul{margin-right:1.5rem}}ul.wfls-option .wfls-option-checkboxes>ul:last-of-type,.wfls-form-field .wfls-option-checkboxes>ul:last-of-type{margin-right:0}ul.wfls-option .wfls-option-checkboxes>ul>.wfls-option-checkbox,.wfls-form-field .wfls-option-checkboxes>ul>.wfls-option-checkbox{margin:0 1rem 0 0}ul.wfls-option li.wfls-option-text,ul.wfls-option li.wfls-option-textarea,ul.wfls-option td.wfls-option-text,.wfls-form-field li.wfls-option-text,.wfls-form-field li.wfls-option-textarea,.wfls-form-field td.wfls-option-text{padding-top:0.5rem}@media (min-width: 768px){ul.wfls-option li.wfls-option-text,ul.wfls-option li.wfls-option-textarea,ul.wfls-option td.wfls-option-text,.wfls-form-field li.wfls-option-text,.wfls-form-field li.wfls-option-textarea,.wfls-form-field td.wfls-option-text{-webkit-flex-grow:1;flex-grow:1;text-align:right;padding-left:1rem;padding-top:0}}ul.wfls-option li.wfls-option-text>input[type="text"],.wfls-form-field li.wfls-option-text>input[type="text"]{max-width:240px}@media (min-width: 768px){ul.wfls-option li.wfls-option-text>input[type="text"],.wfls-form-field li.wfls-option-text>input[type="text"]{max-width:280px}}@media (min-width: 992px){ul.wfls-option li.wfls-option-text>input[type="text"],.wfls-form-field li.wfls-option-text>input[type="text"]{max-width:340px}}ul.wfls-option li.wfls-option-text.wfls-option-full-width>input[type="text"],.wfls-form-field li.wfls-option-text.wfls-option-full-width>input[type="text"]{max-width:100%;width:100%}ul.wfls-option li.wfls-option-textarea,.wfls-form-field li.wfls-option-textarea{min-width:150px;max-width:240px}@media (min-width: 768px){ul.wfls-option li.wfls-option-textarea,.wfls-form-field li.wfls-option-textarea{min-width:200px;max-width:400px}}@media (min-width: 992px){ul.wfls-option li.wfls-option-textarea,.wfls-form-field li.wfls-option-textarea{min-width:250px;max-width:500px}}ul.wfls-option li.wfls-option-textarea>textarea,.wfls-form-field li.wfls-option-textarea>textarea{width:100%;height:80px;min-width:150px;max-width:240px}@media (min-width: 768px){ul.wfls-option li.wfls-option-textarea>textarea,.wfls-form-field li.wfls-option-textarea>textarea{min-width:200px;max-width:280px}}@media (min-width: 992px){ul.wfls-option li.wfls-option-textarea>textarea,.wfls-form-field li.wfls-option-textarea>textarea{min-width:250px;max-width:340px}}ul.wfls-option li.wfls-option-textarea>.wfls-flex-vertical>li>textarea,.wfls-form-field li.wfls-option-textarea>.wfls-flex-vertical>li>textarea{width:100%;height:80px;box-sizing:border-box}ul.wfls-option li.wfls-option-textarea>.wfls-flex-vertical>li.wfls-option-subtitle,.wfls-form-field li.wfls-option-textarea>.wfls-flex-vertical>li.wfls-option-subtitle{width:100%;text-align:left}ul.wfls-option li.wfls-option-switch,.wfls-form-field li.wfls-option-switch{-webkit-flex-grow:1;flex-grow:1}ul.wfls-option li.wfls-option-switch.wfls-right .wfls-switch,.wfls-form-field li.wfls-option-switch.wfls-right .wfls-switch{justify-content:flex-end !important}ul.wfls-option li.wfls-option-select,.wfls-form-field li.wfls-option-select{-webkit-flex-grow:1;flex-grow:1;text-align:right}ul.wfls-option li.wfls-option-select select,ul.wfls-option li.wfls-option-select select option,ul.wfls-option li.wfls-option-select .wfselect2-container--default,.wfls-form-field li.wfls-option-select select,.wfls-form-field li.wfls-option-select select option,.wfls-form-field li.wfls-option-select .wfselect2-container--default{font-size:0.7rem;font-weight:bold}@media (min-width: 768px){ul.wfls-option li.wfls-option-select select,ul.wfls-option li.wfls-option-select select option,ul.wfls-option li.wfls-option-select .wfselect2-container--default,.wfls-form-field li.wfls-option-select select,.wfls-form-field li.wfls-option-select select option,.wfls-form-field li.wfls-option-select .wfselect2-container--default{font-size:0.8rem}}@media (min-width: 992px){ul.wfls-option li.wfls-option-select select,ul.wfls-option li.wfls-option-select select option,ul.wfls-option li.wfls-option-select .wfselect2-container--default,.wfls-form-field li.wfls-option-select select,.wfls-form-field li.wfls-option-select select option,.wfls-form-field li.wfls-option-select .wfselect2-container--default{font-size:0.9rem}}ul.wfls-option li.wfls-option-select .wfls-option-select-option,ul.wfls-option li.wfls-option-select .wfselect2-container--default,ul.wfls-option li.wfls-option-select .wfselect2-container--default .wfselect2-selection--single,.wfls-form-field li.wfls-option-select .wfls-option-select-option,.wfls-form-field li.wfls-option-select .wfselect2-container--default,.wfls-form-field li.wfls-option-select .wfselect2-container--default .wfselect2-selection--single{text-align:left;height:40px;border-radius:0;border:0;background-color:#fff;box-shadow:1px 1px 1px 2px rgba(215,215,215,0.35)}ul.wfls-option li.wfls-option-select .wfls-option-select-option .wfselect2-selection__rendered,ul.wfls-option li.wfls-option-select .wfselect2-container--default .wfselect2-selection__rendered,ul.wfls-option li.wfls-option-select .wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__rendered,.wfls-form-field li.wfls-option-select .wfls-option-select-option .wfselect2-selection__rendered,.wfls-form-field li.wfls-option-select .wfselect2-container--default .wfselect2-selection__rendered,.wfls-form-field li.wfls-option-select .wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__rendered{color:#333;line-height:40px}ul.wfls-option li.wfls-option-select .wfls-option-select-option .wfselect2-selection__arrow,ul.wfls-option li.wfls-option-select .wfselect2-container--default .wfselect2-selection__arrow,ul.wfls-option li.wfls-option-select .wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__arrow,.wfls-form-field li.wfls-option-select .wfls-option-select-option .wfselect2-selection__arrow,.wfls-form-field li.wfls-option-select .wfselect2-container--default .wfselect2-selection__arrow,.wfls-form-field li.wfls-option-select .wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__arrow{height:38px}ul.wfls-option li.wfls-option-select .wfls-option-select-option.wfselect2-container--disabled .wfselect2-selection__rendered,ul.wfls-option li.wfls-option-select .wfselect2-container--default.wfselect2-container--disabled .wfselect2-selection__rendered,ul.wfls-option li.wfls-option-select .wfselect2-container--default .wfselect2-selection--single.wfselect2-container--disabled .wfselect2-selection__rendered,.wfls-form-field li.wfls-option-select .wfls-option-select-option.wfselect2-container--disabled .wfselect2-selection__rendered,.wfls-form-field li.wfls-option-select .wfselect2-container--default.wfselect2-container--disabled .wfselect2-selection__rendered,.wfls-form-field li.wfls-option-select .wfselect2-container--default .wfselect2-selection--single.wfselect2-container--disabled .wfselect2-selection__rendered{color:#aaa}ul.wfls-option li.wfls-option-select .wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__arrow b,.wfls-form-field li.wfls-option-select .wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__arrow b{border-color:#333 transparent transparent}ul.wfls-option li.wfls-option-select .wfselect2-container--default.wfselect2-container--open .wfselect2-selection--single .wfselect2-selection__arrow b,.wfls-form-field li.wfls-option-select .wfselect2-container--default.wfselect2-container--open .wfselect2-selection--single .wfselect2-selection__arrow b{border-color:transparent transparent #333}ul.wfls-option.wfls-option-token select,.wfls-form-field.wfls-option-token select{width:240px}@media (min-width: 768px){ul.wfls-option.wfls-option-token select,.wfls-form-field.wfls-option-token select{width:280px}}@media (min-width: 992px){ul.wfls-option.wfls-option-token select,.wfls-form-field.wfls-option-token select{width:320px}}ul.wfls-option.wfls-option-token .wfselect2-container--default,ul.wfls-option.wfls-option-token .wfselect2-container--default .wfselect2-selection--multiple,.wfls-form-field.wfls-option-token .wfselect2-container--default,.wfls-form-field.wfls-option-token .wfselect2-container--default .wfselect2-selection--multiple{border-color:#e2e2e2}ul.wfls-option.wfls-option-token .wfselect2-container--default .wfselect2-selection__choice,ul.wfls-option.wfls-option-token .wfselect2-container--default .wfselect2-selection--multiple .wfselect2-selection__choice,.wfls-form-field.wfls-option-token .wfselect2-container--default .wfselect2-selection__choice,.wfls-form-field.wfls-option-token .wfselect2-container--default .wfselect2-selection--multiple .wfselect2-selection__choice{background-color:#fff;border-color:#e2e2e2;padding:0.5rem}ul.wfls-option.wfls-option-token .wfselect2-container--default .wfselect2-search__field,ul.wfls-option.wfls-option-token .wfselect2-container--default .wfselect2-selection--multiple .wfselect2-search__field,.wfls-form-field.wfls-option-token .wfselect2-container--default .wfselect2-search__field,.wfls-form-field.wfls-option-token .wfselect2-container--default .wfselect2-selection--multiple .wfselect2-search__field{margin-right:5px;margin-top:5px;padding:0.5rem 0}#wfls-option-require-2fa{margin-top:1rem}#wfls-option-require-2fa>li>ul{margin-left:1rem}@media (min-width: 768px){#wfls-option-require-2fa>li>ul{margin-left:1.5rem}}#wfls-option-require-2fa>li>ul:first-of-type{margin-left:0}#wfls-option-require-2fa>li>ul>.wfls-option-checkbox{margin:0 1rem 0 0}.wfls-option-sub{padding-left:2rem !important;margin-left:30px !important}.wfls-select2-suppress-dropdown .wfselect2-results,.wfls-select2-suppress-dropdown .wfselect2-dropdown{display:none}.wfls-options-controls{direction:ltr;background:#ffffff;border-bottom:1px solid #e2e2e2;position:absolute;left:160px;right:0px;top:46px;z-index:900;padding-left:15px;padding-right:15px}@media (min-width: 616px){.wfls-options-controls{position:fixed}}.wfls-options-controls .wfls-block{margin:0}@media (min-width: 782px){.wfls-options-controls .wfls-block{margin:0.5rem 0}}.wfls-options-controls,.sticky-menu .wfls-options-controls{top:32px}.folded .wfls-options-controls{left:36px}@media only screen and (max-width: 960px){.auto-fold .wfls-options-controls{left:36px}}.rtl .wfls-options-controls{right:160px;left:0px}.rtl .folded .wfls-options-controls{right:36px}@media only screen and (max-width: 960px){.rtl .auto-fold .wfls-options-controls{right:36px}}@media screen and (max-width: 782px){.wfls-options-controls,.folded .wfls-options-controls,.auto-fold .wfls-options-controls,.rtl .wfls-options-controls,.rtl .folded .wfls-options-controls,.rtl .auto-fold .wfls-options-controls{left:-10px;right:0px}}.wfls-options-controls-spacer{height:45px}@media (min-width: 782px){.wfls-options-controls-spacer{height:75px}}.wfls-options-controls-spacer,.sticky-menu .wfls-options-controls-spacer{top:61px}.wordfence .wfselect2-container .wfselect2-selection--single{border:1px solid #dadada;font-weight:normal;font-size:0.8rem}#wfls-notices{margin-top:15px}#wfls-notices .wfls-admin-notice{margin-left:0px;margin-right:0px}.wfls-success-text,.wfls-notice-text{display:inline-block;vertical-align:middle;line-height:1.3;font-size:16px;font-weight:bold;font-style:italic}.wfls-notice{margin:12px 0;padding:8px;background-color:#ffffe0;border:1px solid #ffd975;border-width:1px 1px 1px 10px}.wfls-notice-text{color:#6d798c}.wfls-success{margin:12px 0;padding:8px;background-color:#ffffff;border:1px solid #16bc9b;border-width:1px 1px 1px 10px}.wfls-success-text{color:#11967a}.wfls-premium-callout{border:1px solid #dfdfdf;background-color:#ffffff;padding:16px;margin:20px 0 0;text-align:center}.wfls-premium-callout ul{margin:8px 0;padding:0 0 0 15px}.wfls-premium-callout ul li{list-style-type:disc;margin:0;padding:0}.wfls-premium-callout .center{text-align:center;margin:0}.wfls-premium-callout .button-primary{text-align:center;text-transform:uppercase;font-weight:bold;background-color:#00709e}table.wfls-table{background-color:transparent;border-collapse:collapse;border-spacing:0}table.wfls-table td,table.wfls-table th{padding:0}.wfls-table caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}.wfls-table th{text-align:left}.wfls-table{width:100%;max-width:100%;margin-bottom:20px}.wfls-table>thead>tr>th,.wfls-table>thead>tr>td,.wfls-table>tbody>tr>th,.wfls-table>tbody>tr>td,.wfls-table>tfoot>tr>th,.wfls-table>tfoot>tr>td{padding:8px;line-height:1.42857;vertical-align:top;border-top:1px solid #ddd}.wfls-table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.wfls-table>caption+thead>tr:first-child>th,.wfls-table>caption+thead>tr:first-child>td,.wfls-table>colgroup+thead>tr:first-child>th,.wfls-table>colgroup+thead>tr:first-child>td,.wfls-table>thead:first-child>tr:first-child>th,.wfls-table>thead:first-child>tr:first-child>td{border-top:0}.wfls-table>tbody+tbody{border-top:2px solid #ddd}.wfls-table .wfls-table{background-color:#fff}.wfls-table-header-separators>thead>tr>th{border-left:2px solid #ddd}.wfls-table-header-separators>thead>tr>th:first-child{border-left:0}.wfls-table-condensed>thead>tr>th,.wfls-table-condensed>thead>tr>td,.wfls-table-condensed>tbody>tr>th,.wfls-table-condensed>tbody>tr>td,.wfls-table-condensed>tfoot>tr>th,.wfls-table-condensed>tfoot>tr>td{padding:5px}.wfls-table-expanded>thead>tr>th,.wfls-table-expanded>thead>tr>td,.wfls-table-expanded>tbody>tr>th,.wfls-table-expanded>tbody>tr>td,.wfls-table-expanded>tfoot>tr>th,.wfls-table-expanded>tfoot>tr>td{padding:0.5rem 1rem}@media (min-width: 768px){.wfls-table-expanded>thead>tr>th,.wfls-table-expanded>thead>tr>td,.wfls-table-expanded>tbody>tr>th,.wfls-table-expanded>tbody>tr>td,.wfls-table-expanded>tfoot>tr>th,.wfls-table-expanded>tfoot>tr>td{padding:1rem 1.5rem}}.wfls-table-bordered{border:1px solid #ddd}.wfls-table-bordered>thead>tr>th,.wfls-table-bordered>thead>tr>td,.wfls-table-bordered>tbody>tr>th,.wfls-table-bordered>tbody>tr>td,.wfls-table-bordered>tfoot>tr>th,.wfls-table-bordered>tfoot>tr>td{border:1px solid #ddd}.wfls-table-bordered>thead>tr>th,.wfls-table-bordered>thead>tr>td{border-bottom-width:2px}.wfls-table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.wfls-table-hover>tbody>tr:hover{background-color:#f5f5f5}table.wfls-table col[class*="col-"]{position:static;float:none;display:table-column}table.wfls-table td[class*="col-"],table.wfls-table th[class*="col-"]{position:static;float:none;display:table-cell}.wfls-table>thead>tr>td.active,.wfls-table>thead>tr>th.active,.wfls-table>thead>tr.active>td,.wfls-table>thead>tr.active>th,.wfls-table>tbody>tr>td.active,.wfls-table>tbody>tr>th.active,.wfls-table>tbody>tr.active>td,.wfls-table>tbody>tr.active>th,.wfls-table>tfoot>tr>td.active,.wfls-table>tfoot>tr>th.active,.wfls-table>tfoot>tr.active>td,.wfls-table>tfoot>tr.active>th{background-color:#f5f5f5}.wfls-table-hover>tbody>tr>td.active:hover,.wfls-table-hover>tbody>tr>th.active:hover,.wfls-table-hover>tbody>tr.active:hover>td,.wfls-table-hover>tbody>tr:hover>.active,.wfls-table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.wfls-table>thead>tr>td.success,.wfls-table>thead>tr>th.success,.wfls-table>thead>tr.success>td,.wfls-table>thead>tr.success>th,.wfls-table>tbody>tr>td.success,.wfls-table>tbody>tr>th.success,.wfls-table>tbody>tr.success>td,.wfls-table>tbody>tr.success>th,.wfls-table>tfoot>tr>td.success,.wfls-table>tfoot>tr>th.success,.wfls-table>tfoot>tr.success>td,.wfls-table>tfoot>tr.success>th{background-color:#dff0d8}.wfls-table-hover>tbody>tr>td.success:hover,.wfls-table-hover>tbody>tr>th.success:hover,.wfls-table-hover>tbody>tr.success:hover>td,.wfls-table-hover>tbody>tr:hover>.success,.wfls-table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.wfls-table>thead>tr>td.info,.wfls-table>thead>tr>th.info,.wfls-table>thead>tr.info>td,.wfls-table>thead>tr.info>th,.wfls-table>tbody>tr>td.info,.wfls-table>tbody>tr>th.info,.wfls-table>tbody>tr.info>td,.wfls-table>tbody>tr.info>th,.wfls-table>tfoot>tr>td.info,.wfls-table>tfoot>tr>th.info,.wfls-table>tfoot>tr.info>td,.wfls-table>tfoot>tr.info>th{background-color:#d9edf7}.wfls-table-hover>tbody>tr>td.info:hover,.wfls-table-hover>tbody>tr>th.info:hover,.wfls-table-hover>tbody>tr.info:hover>td,.wfls-table-hover>tbody>tr:hover>.info,.wfls-table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.wfls-table>thead>tr>td.warning,.wfls-table>thead>tr>th.warning,.wfls-table>thead>tr.warning>td,.wfls-table>thead>tr.warning>th,.wfls-table>tbody>tr>td.warning,.wfls-table>tbody>tr>th.warning,.wfls-table>tbody>tr.warning>td,.wfls-table>tbody>tr.warning>th,.wfls-table>tfoot>tr>td.warning,.wfls-table>tfoot>tr>th.warning,.wfls-table>tfoot>tr.warning>td,.wfls-table>tfoot>tr.warning>th{background-color:#fcf8e3}.wfls-table-hover>tbody>tr>td.warning:hover,.wfls-table-hover>tbody>tr>th.warning:hover,.wfls-table-hover>tbody>tr.warning:hover>td,.wfls-table-hover>tbody>tr:hover>.warning,.wfls-table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.wfls-table>thead>tr>td.danger,.wfls-table>thead>tr>th.danger,.wfls-table>thead>tr.danger>td,.wfls-table>thead>tr.danger>th,.wfls-table>tbody>tr>td.danger,.wfls-table>tbody>tr>th.danger,.wfls-table>tbody>tr.danger>td,.wfls-table>tbody>tr.danger>th,.wfls-table>tfoot>tr>td.danger,.wfls-table>tfoot>tr>th.danger,.wfls-table>tfoot>tr.danger>td,.wfls-table>tfoot>tr.danger>th{background-color:#f2dede}.wfls-table-hover>tbody>tr>td.danger:hover,.wfls-table-hover>tbody>tr>th.danger:hover,.wfls-table-hover>tbody>tr.danger:hover>td,.wfls-table-hover>tbody>tr:hover>.danger,.wfls-table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}.wfls-table-responsive{overflow-x:auto;min-height:0.01%}@media screen and (max-width: 767px){.wfls-table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.wfls-table-responsive>.wfls-table{margin-bottom:0}.wfls-table-responsive>.wfls-table>thead>tr>th,.wfls-table-responsive>.wfls-table>thead>tr>td,.wfls-table-responsive>.wfls-table>tbody>tr>th,.wfls-table-responsive>.wfls-table>tbody>tr>td,.wfls-table-responsive>.wfls-table>tfoot>tr>th,.wfls-table-responsive>.wfls-table>tfoot>tr>td{white-space:nowrap}.wfls-table-responsive>.wfls-table-bordered{border:0}.wfls-table-responsive>.wfls-table-bordered>thead>tr>th:first-child,.wfls-table-responsive>.wfls-table-bordered>thead>tr>td:first-child,.wfls-table-responsive>.wfls-table-bordered>tbody>tr>th:first-child,.wfls-table-responsive>.wfls-table-bordered>tbody>tr>td:first-child,.wfls-table-responsive>.wfls-table-bordered>tfoot>tr>th:first-child,.wfls-table-responsive>.wfls-table-bordered>tfoot>tr>td:first-child{border-left:0}.wfls-table-responsive>.wfls-table-bordered>thead>tr>th:last-child,.wfls-table-responsive>.wfls-table-bordered>thead>tr>td:last-child,.wfls-table-responsive>.wfls-table-bordered>tbody>tr>th:last-child,.wfls-table-responsive>.wfls-table-bordered>tbody>tr>td:last-child,.wfls-table-responsive>.wfls-table-bordered>tfoot>tr>th:last-child,.wfls-table-responsive>.wfls-table-bordered>tfoot>tr>td:last-child{border-right:0}.wfls-table-responsive>.wfls-table-bordered>tbody>tr:last-child>th,.wfls-table-responsive>.wfls-table-bordered>tbody>tr:last-child>td,.wfls-table-responsive>.wfls-table-bordered>tfoot>tr:last-child>th,.wfls-table-responsive>.wfls-table-bordered>tfoot>tr:last-child>td{border-bottom:0}}.wfls-sortable{position:relative;padding-right:2rem !important}.wfls-sortable .wfls-sorted-ascending,.wfls-sortable .wfls-sorted-descending{display:none;position:absolute;right:1rem;top:50%;transform:translateY(-50%)}.wfls-sortable.wfls-unsorted:hover .wfls-sorted-ascending{display:block}.wfls-sortable.wfls-unsorted,.wfls-sortable.wfls-sorted-ascending,.wfls-sortable.wfls-sorted-descending{cursor:pointer}.wfls-sortable.wfls-unsorted:hover,.wfls-sortable.wfls-sorted-ascending:hover,.wfls-sortable.wfls-sorted-descending:hover{background-color:#e0e0e0}.wfls-sortable.wfls-sorted-ascending,.wfls-sortable.wfls-sorted-descending{background-color:#e0e0e0}.wfls-sortable.wfls-sorted-ascending .wfls-sorted-ascending{display:block}.wfls-sortable.wfls-sorted-descending .wfls-sorted-descending{display:block}.wfls-nav{margin-bottom:0;padding-left:0;list-style:none}.wfls-nav:before,.wfls-nav:after{content:" ";display:table}.wfls-nav:after{clear:both}.wfls-nav>li{position:relative;display:block}.wfls-nav>li>a{position:relative;display:block;padding:8px 12px}.wfls-nav>li>a:hover,.wfls-nav>li>a:focus{text-decoration:none;background-color:#e2e2e2}.wfls-nav>li.wfls-disabled>a{color:#777}.wfls-nav>li.wfls-disabled>a:hover,.wfls-nav>li.wfls-disabled>a:focus{color:#777;text-decoration:none;background-color:transparent;cursor:not-allowed}.wfls-nav .wfls-open>a,.wfls-nav .wfls-open>a:hover,.wfls-nav .wfls-open>a:focus{background-color:#e2e2e2;border-color:#00709e}.wfls-nav>li>a>img{max-width:none}.wfls-nav-tabs{border-bottom:1px solid #d0d0d0}.wfls-nav-tabs>li{float:left;margin-bottom:-1px}.wfls-nav-tabs>li>a{margin-right:2px;line-height:1.42857;border:1px solid transparent;border-radius:4px 4px 0 0}.wfls-nav-tabs>li>a:hover{border-color:#e2e2e2 #e2e2e2 #d0d0d0}.wfls-nav-tabs>li.wfls-active>a,.wfls-nav-tabs>li.wfls-active>a:hover,.wfls-nav-tabs>li.wfls-active>a:focus{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.wfls-nav-pills>li{float:left}.wfls-nav-pills>li>a{border-radius:4px;text-decoration:none;position:relative;display:block;padding:8px 12px}.wfls-nav-pills>li>a:hover,.wfls-nav-pills>li>a:focus{text-decoration:none !important;background-color:#e2e2e2}.wfls-nav-pills>li+li{margin-left:2px}.wfls-nav-pills>li.wfls-active>a,.wfls-nav-pills>li.wfls-active>a:hover,.wfls-nav-pills>li.wfls-active>a:focus{color:#fff;background-color:#00709e}.wfls-nav-pills.wfls-nav-pills-bordered>li>a{border:1px solid #e2e2e2}.wfls-nav-pills.wfls-nav-pills-connected>li>a{border-radius:0;border-right-width:0px}.wfls-nav-pills.wfls-nav-pills-connected>li+li{margin-left:0}.wfls-nav-pills.wfls-nav-pills-connected>li.active+li>a{border-left-width:0px}.wfls-nav-pills.wfls-nav-pills-connected>li:first-of-type>a{-moz-border-radius:4px 0 0 4px;-webkit-border-radius:4px;border-radius:4px 0 0 4px}.wfls-nav-pills.wfls-nav-pills-connected>li:last-of-type>a{-moz-border-radius:0 4px 4px 0;-webkit-border-radius:0;border-radius:0 4px 4px 0;border-right-width:1px}.wfls-nav-stacked>li{float:none}.wfls-nav-stacked>li+li{margin-top:2px;margin-left:0}.wfls-nav-justified,.wfls-nav-tabs.wfls-nav-justified{width:100%}.wfls-nav-justified>li,.wfls-nav-tabs.wfls-nav-justified>li{float:none}.wfls-nav-justified>li>a,.wfls-nav-tabs.wfls-nav-justified>li>a{text-align:center;margin-bottom:5px}.wfls-nav-justified>.wfls-dropdown .wfls-dropdown-menu{top:auto;left:auto}@media (min-width: 768px){.wfls-nav-justified>li,.wfls-nav-tabs.wfls-nav-justified>li{display:table-cell;width:1%}.wfls-nav-justified>li>a,.wfls-nav-tabs.wfls-nav-justified>li>a{margin-bottom:0}}.wfls-nav-tabs-justified,.wfls-nav-tabs.wfls-nav-justified{border-bottom:0}.wfls-nav-tabs-justified>li>a,.wfls-nav-tabs.wfls-nav-justified>li>a{margin-right:0;border-radius:4px}.wfls-nav-tabs-justified>.wfls-active>a,.wfls-nav-tabs.wfls-nav-justified>.wfls-active>a,.wfls-nav-tabs-justified>.wfls-active>a:hover,.wfls-nav-tabs.wfls-nav-justified>.wfls-active>a:hover,.wfls-nav-tabs-justified>.wfls-active>a:focus,.wfls-nav-tabs.wfls-nav-justified>.wfls-active>a:focus{border:1px solid #ddd}@media (min-width: 768px){.wfls-nav-tabs-justified>li>a,.wfls-nav-tabs.wfls-nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.wfls-nav-tabs-justified>.wfls-active>a,.wfls-nav-tabs.wfls-nav-justified>.wfls-active>a,.wfls-nav-tabs-justified>.wfls-active>a:hover,.wfls-nav-tabs.wfls-nav-justified>.wfls-active>a:hover,.wfls-nav-tabs-justified>.wfls-active>a:focus,.wfls-nav-tabs.wfls-nav-justified>.wfls-active>a:focus{border-bottom-color:#fff}}.wfls-tab-content>.wfls-tab-pane{display:none}.wfls-tab-content>.wfls-active{display:block}.wfls-nav-tabs .wfls-dropdown-menu{margin-top:-1px;-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0}.wfls-navbar-brand{float:left;padding:12px 8px;font-size:18px;line-height:20px;margin:10px 0 0 0}.wfls-navbar-brand:hover,.wfls-navbar-brand:focus{text-decoration:none}.wfls-navbar-brand>img{display:block}@media (min-width: 768px){.navbar>.container .wfls-navbar-brand,.navbar>.container-fluid .wfls-navbar-brand{margin-left:-8px}}.wfls-caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid \9;border-right:4px solid transparent;border-left:4px solid transparent}.wfls-dropup,.wfls-dropdown{position:relative}.wfls-dropdown-toggle:focus{outline:0}.wfls-dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;text-align:left;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);background-clip:padding-box}.wfls-dropdown-menu .wfls-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.wfls-dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.42857;color:#333;text-decoration:none;white-space:nowrap}.wfls-dropdown-menu>li>a:hover,.wfls-dropdown-menu>li>a:focus{text-decoration:none;color:#262626;background-color:#f5f5f5}.wfls-dropdown-menu>.wfls-active>a,.wfls-dropdown-menu>.wfls-active>a:hover,.wfls-dropdown-menu>.wfls-active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#00709e}.wfls-dropdown-menu>.wfls-disabled>a,.wfls-dropdown-menu>.wfls-disabled>a:hover,.wfls-dropdown-menu>.wfls-disabled>a:focus{color:#777}.wfls-dropdown-menu>.wfls-disabled>a:hover,.wfls-dropdown-menu>.wfls-disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);cursor:not-allowed}.wfls-open>.wfls-dropdown-menu{display:block}.wfls-open>a{outline:0}.wfls-dropdown-menu-right{left:auto;right:0}.wfls-dropdown-menu-left{left:0;right:auto}.wfls-dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857;color:#777;white-space:nowrap}.wfls-dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.wfls-pull-right>.wfls-dropdown-menu{right:0;left:auto}.wfls-dropup .wfls-caret,.wfls-navbar-fixed-bottom .wfls-dropdown .wfls-caret{border-top:0;border-bottom:4px dashed;border-bottom:4px solid \9;content:""}.wfls-dropup .wfls-dropdown-menu,.wfls-navbar-fixed-bottom .wfls-dropdown .wfls-dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width: 768px){.wfls-navbar-right .wfls-dropdown-menu{right:0;left:auto}.wfls-navbar-right .wfls-dropdown-menu-left{left:0;right:auto}}.wfls-mobile-dropdown{border:1px solid #ccc;margin-left:.5em;padding:5px 10px;font-size:14px;line-height:24px;margin:10px 10px 0 0;background:#f1f1f1;color:#000;font-weight:600;text-decoration:none}table.wfls-dataTable{width:auto;max-width:800px;clear:both;border-collapse:collapse;border-spacing:0}table.wfls-dataTable>thead th,table.wfls-dataTable>tfoot th{font-weight:bold}table.wfls-dataTable>thead th,table.wfls-dataTable>thead td{cursor:pointer;text-align:left;font-size:11px;border:1px solid #ccc;padding:8px 4px 5px 9px;text-transform:uppercase}table.wfls-dataTable>thead th:active,table.wfls-dataTable>thead td:active{outline:none}table.wfls-dataTable>tfoot th,table.wfls-dataTable>tfoot td{padding:10px 18px 6px 18px;border-top:1px solid #111}table.wfls-dataTable>thead .sorting,table.wfls-dataTable>thead .sorting_asc,table.wfls-dataTable>thead .sorting_desc{cursor:pointer;*cursor:hand}table.wfls-dataTable>thead .sorting,table.wfls-dataTable>thead .sorting_asc,table.wfls-dataTable>thead .sorting_desc,table.wfls-dataTable>thead .sorting_asc_disabled,table.wfls-dataTable>thead .sorting_desc_disabled{background-repeat:no-repeat;background-position:center right}table.wfls-dataTable>thead .sorting{background-image:url(../img/sort_both.png)}table.wfls-dataTable>thead .sorting_asc{background-image:url(../img/sort_asc.png)}table.wfls-dataTable>thead .sorting_desc{background-image:url(../img/sort_desc.png)}table.wfls-dataTable>thead .sorting_asc_disabled{background-image:url(../img/sort_asc_disabled.png)}table.wfls-dataTable>thead .sorting_desc_disabled{background-image:url(../img/sort_desc_disabled.png)}table.wfls-dataTable>tbody>tr{background-color:#ffffff}table.wfls-dataTable>tbody>tr.selected{background-color:#B0BED9}table.wfls-dataTable>tbody>tr>th,table.wfls-dataTable>tbody>tr>td{padding:5px 8px}table.wfls-dataTable.row-border>tbody>tr>th,table.wfls-dataTable.row-border>tbody>tr>td,table.wfls-dataTable.display>tbody>tr>th,table.wfls-dataTable.display>tbody>tr>td{border:1px solid #cccccc}table.wfls-dataTable.row-border>tbody>tr:first-child>th,table.wfls-dataTable.row-border>tbody>tr:first-child>td,table.wfls-dataTable.display>tbody>tr:first-child>th,table.wfls-dataTable.display>tbody>tr:first-child>td{border-top:none}table.wfls-dataTable.cell-border>tbody>tr>th,table.wfls-dataTable.cell-border>tbody>tr>td{border-top:1px solid #ddd;border-right:1px solid #ddd}table.wfls-dataTable.cell-border>tbody>tr>th:first-child,table.wfls-dataTable.cell-border>tbody>tr>td:first-child{border-left:1px solid #ddd}table.wfls-dataTable.cell-border>tbody>tr:first-child>th,table.wfls-dataTable.cell-border>tbody>tr:first-child>td{border-top:none}table.wfls-dataTable.stripe>tbody>tr.odd,table.wfls-dataTable.display>tbody>tr.odd{background-color:#f9f9f9}table.wfls-dataTable.stripe>tbody>tr.odd.selected,table.wfls-dataTable.display>tbody>tr.odd.selected{background-color:#acbad4}table.wfls-dataTable.hover>tbody>tr:hover,table.wfls-dataTable.display>tbody>tr:hover{background-color:#f6f6f6}table.wfls-dataTable.hover>tbody>tr:hover.selected,table.wfls-dataTable.display>tbody>tr:hover.selected{background-color:#aab7d1}table.wfls-dataTable.order-column>tbody>tr>.sorting_1,table.wfls-dataTable.order-column>tbody>tr>.sorting_2,table.wfls-dataTable.order-column>tbody>tr>.sorting_3,table.wfls-dataTable.display tbody>tr>.sorting_1,table.wfls-dataTable.display>tbody>tr>.sorting_2,table.wfls-dataTable.display>tbody>tr>.sorting_3{background-color:#fafafa}table.wfls-dataTable.order-column>tbody>tr.selected>.sorting_1,table.wfls-dataTable.order-column>tbody>tr.selected>.sorting_2,table.wfls-dataTable.order-column>tbody>tr.selected>.sorting_3,table.wfls-dataTable.display>tbody>tr.selected>.sorting_1,table.wfls-dataTable.display>tbody>tr.selected>.sorting_2,table.wfls-dataTable.display>tbody>tr.selected>.sorting_3{background-color:#acbad5}table.wfls-dataTable.display>tbody>tr.odd>.sorting_1,table.wfls-dataTable.order-column.stripe>tbody>tr.odd>.sorting_1{background-color:#f1f1f1}table.wfls-dataTable.display>tbody>tr.odd>.sorting_2,table.wfls-dataTable.order-column.stripe>tbody>tr.odd>.sorting_2{background-color:#f3f3f3}table.wfls-dataTable.display>tbody>tr.odd>.sorting_3,table.wfls-dataTable.order-column.stripe>tbody>tr.odd>.sorting_3{background-color:whitesmoke}table.wfls-dataTable.display>tbody>tr.odd.selected>.sorting_1,table.wfls-dataTable.order-column.stripe>tbody>tr.odd.selected>.sorting_1{background-color:#a6b4cd}table.wfls-dataTable.display>tbody>tr.odd.selected>.sorting_2,table.wfls-dataTable.order-column.stripe>tbody>tr.odd.selected>.sorting_2{background-color:#a8b5cf}table.wfls-dataTable.display>tbody>tr.odd.selected>.sorting_3,table.wfls-dataTable.order-column.stripe>tbody>tr.odd.selected>.sorting_3{background-color:#a9b7d1}table.wfls-dataTable.display>tbody>tr.even>.sorting_1,table.wfls-dataTable.order-column.stripe>tbody>tr.even>.sorting_1{background-color:#fafafa}table.wfls-dataTable.display>tbody>tr.even>.sorting_2,table.wfls-dataTable.order-column.stripe>tbody>tr.even>.sorting_2{background-color:#fcfcfc}table.wfls-dataTable.display>tbody>tr.even>.sorting_3,table.wfls-dataTable.order-column.stripe>tbody>tr.even>.sorting_3{background-color:#fefefe}table.wfls-dataTable.display>tbody>tr.even.selected>.sorting_1,table.wfls-dataTable.order-column.stripe>tbody>tr.even.selected>.sorting_1{background-color:#acbad5}table.wfls-dataTable.display>tbody>tr.even.selected>.sorting_2,table.wfls-dataTable.order-column.stripe>tbody>tr.even.selected>.sorting_2{background-color:#aebcd6}table.wfls-dataTable.display>tbody>tr.even.selected>.sorting_3,table.wfls-dataTable.order-column.stripe>tbody>tr.even.selected>.sorting_3{background-color:#afbdd8}table.wfls-dataTable.display>tbody>tr:hover>.sorting_1,table.wfls-dataTable.order-column.hover>tbody>tr:hover>.sorting_1{background-color:#eaeaea}table.wfls-dataTable.display>tbody>tr:hover>.sorting_2,table.wfls-dataTable.order-column.hover>tbody>tr:hover>.sorting_2{background-color:#ececec}table.wfls-dataTable.display>tbody>tr:hover>.sorting_3,table.wfls-dataTable.order-column.hover>tbody>tr:hover>.sorting_3{background-color:#efefef}table.wfls-dataTable.display>tbody>tr:hover.selected>.sorting_1,table.wfls-dataTable.order-column.hover>tbody>tr:hover.selected>.sorting_1{background-color:#a2aec7}table.wfls-dataTable.display>tbody>tr:hover.selected>.sorting_2,table.wfls-dataTable.order-column.hover>tbody>tr:hover.selected>.sorting_2{background-color:#a3b0c9}table.wfls-dataTable.display>tbody>tr:hover.selected>.sorting_3,table.wfls-dataTable.order-column.hover>tbody>tr:hover.selected>.sorting_3{background-color:#a5b2cb}table.wfls-dataTable.no-footer{border-bottom:1px solid #111}table.wfls-dataTable.nowrap th,table.wfls-dataTable.nowrap td{white-space:nowrap}table.wfls-dataTable.compact thead th,table.wfls-dataTable.compact thead td{padding:4px 17px 4px 4px}table.wfls-dataTable.compact tfoot th,table.wfls-dataTable.compact tfoot td{padding:4px}table.wfls-dataTable.compact>tbody>tr>th,table.wfls-dataTable.compact>tbody>tr>td{padding:4px}table.wfls-dataTable th.dt-left,table.wfls-dataTable td.dt-left{text-align:left}table.wfls-dataTable th.dt-center,table.wfls-dataTable td.dt-center,table.wfls-dataTable td.dataTables_empty{text-align:center}table.wfls-dataTable th.dt-right,table.wfls-dataTable td.dt-right{text-align:right}table.wfls-dataTable th.dt-justify,table.wfls-dataTable td.dt-justify{text-align:justify}table.wfls-dataTable th.dt-nowrap,table.wfls-dataTable td.dt-nowrap{white-space:nowrap}table.wfls-dataTable thead th.dt-head-left,table.wfls-dataTable thead td.dt-head-left,table.wfls-dataTable tfoot th.dt-head-left,table.wfls-dataTable tfoot td.dt-head-left{text-align:left}table.wfls-dataTable thead th.dt-head-center,table.wfls-dataTable thead td.dt-head-center,table.wfls-dataTable tfoot th.dt-head-center,table.wfls-dataTable tfoot td.dt-head-center{text-align:center}table.wfls-dataTable thead th.dt-head-right,table.wfls-dataTable thead td.dt-head-right,table.wfls-dataTable tfoot th.dt-head-right,table.wfls-dataTable tfoot td.dt-head-right{text-align:right}table.wfls-dataTable thead th.dt-head-justify,table.wfls-dataTable thead td.dt-head-justify,table.wfls-dataTable tfoot th.dt-head-justify,table.wfls-dataTable tfoot td.dt-head-justify{text-align:justify}table.wfls-dataTable thead th.dt-head-nowrap,table.wfls-dataTable thead td.dt-head-nowrap,table.wfls-dataTable tfoot th.dt-head-nowrap,table.wfls-dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.wfls-dataTable>tbody>tr>th.dt-body-left,table.wfls-dataTable>tbody>tr>td.dt-body-left{text-align:left}table.wfls-dataTable>tbody>tr>th.dt-body-center,table.wfls-dataTable>tbody>tr>td.dt-body-center{text-align:center}table.wfls-dataTable>tbody>tr>th.dt-body-right,table.wfls-dataTable>tbody>tr>td.dt-body-right{text-align:right}table.wfls-dataTable>tbody>tr>th.dt-body-justify,table.wfls-dataTable>tbody>tr>td.dt-body-justify{text-align:justify}table.wfls-dataTable>tbody>tr>th.dt-body-nowrap,table.wfls-dataTable>tbody>tr>td.dt-body-nowrap{white-space:nowrap}table.wfls-dataTable table.dataTable,table.wfls-dataTable th,table.wfls-dataTable td{-webkit-box-sizing:content-box;box-sizing:content-box}.wfls-dataTables_wrapper{position:relative;clear:both;*zoom:1;zoom:1}.wfls-dataTables_wrapper .dataTables_length{float:left}.wfls-dataTables_wrapper .dataTables_filter{float:right;text-align:right}.wfls-dataTables_wrapper .dataTables_filter input{margin-left:0.5em}.wfls-dataTables_wrapper .dataTables_info{clear:both;float:left;padding-top:0.755em}.wfls-dataTables_wrapper .dataTables_paginate{float:right;text-align:right;padding-top:0.25em}.wfls-dataTables_wrapper .dataTables_paginate .paginate_button{box-sizing:border-box;display:inline-block;min-width:1.5em;padding:0.5em 1em;margin-left:2px;text-align:center;text-decoration:none !important;cursor:pointer;*cursor:hand;color:#333 !important;border:1px solid transparent;border-radius:2px}.wfls-dataTables_wrapper .dataTables_paginate .paginate_button.current,.wfls-dataTables_wrapper .dataTables_paginate .paginate_button.current:hover{color:#333 !important;border:1px solid #979797;background-color:white;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #fff), color-stop(100%, #dcdcdc));background:-webkit-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-moz-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-ms-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-o-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:linear-gradient(to bottom, #ffffff 0%,#dcdcdc 100%)}.wfls-dataTables_wrapper .dataTables_paginate .paginate_button.disabled,.wfls-dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover,.wfls-dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active{cursor:default;color:#666 !important;border:1px solid transparent;background:transparent;box-shadow:none}.wfls-dataTables_wrapper .dataTables_paginate .paginate_button:hover{color:white !important;border:1px solid #111;background-color:#585858;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111));background:-webkit-linear-gradient(top, #585858 0%, #111 100%);background:-moz-linear-gradient(top, #585858 0%, #111 100%);background:-ms-linear-gradient(top, #585858 0%, #111 100%);background:-o-linear-gradient(top, #585858 0%, #111 100%);background:linear-gradient(to bottom, #585858 0%,#111111 100%)}.wfls-dataTables_wrapper .dataTables_paginate .paginate_button:active{outline:none;background-color:#2b2b2b;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));background:-webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:linear-gradient(to bottom, #2b2b2b 0%,#0c0c0c 100%);box-shadow:inset 0 0 3px #111}.wfls-dataTables_wrapper .dataTables_paginate .ellipsis{padding:0 1em}.wfls-dataTables_wrapper .dataTables_processing{position:absolute;top:50%;left:50%;width:100%;height:40px;margin-left:-50%;margin-top:-25px;padding-top:20px;text-align:center;font-size:1.2em;background-color:white;background:-webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255,255,255,0)), color-stop(25%, rgba(255,255,255,0.9)), color-stop(75%, rgba(255,255,255,0.9)), color-stop(100%, rgba(255,255,255,0)));background:-webkit-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-moz-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-ms-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-o-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:linear-gradient(to right, rgba(255,255,255,0) 0%,rgba(255,255,255,0.9) 25%,rgba(255,255,255,0.9) 75%,rgba(255,255,255,0) 100%)}.wfls-dataTables_wrapper .dataTables_length,.wfls-dataTables_wrapper .dataTables_filter,.wfls-dataTables_wrapper .dataTables_info,.wfls-dataTables_wrapper .dataTables_processing,.wfls-dataTables_wrapper .dataTables_paginate{color:#333}.wfls-dataTables_wrapper .dataTables_scroll{clear:both}.wfls-dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody{*margin-top:-1px;-webkit-overflow-scrolling:touch}.wfls-dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody th,.wfls-dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody td{vertical-align:middle}.wfls-dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody th>div.dataTables_sizing,.wfls-dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody td>div.dataTables_sizing{height:0;overflow:hidden;margin:0 !important;padding:0 !important}.wfls-dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:1px solid #111}.wfls-dataTables_wrapper.no-footer div.dataTables_scrollHead table,.wfls-dataTables_wrapper.no-footer div.dataTables_scrollBody table{border-bottom:none}.wfls-dataTables_wrapper:after{visibility:hidden;display:block;content:"";clear:both;height:0}@media screen and (max-width: 767px){.wfls-dataTables_wrapper .dataTables_info,.wfls-dataTables_wrapper .dataTables_paginate{float:none;text-align:center}.wfls-dataTables_wrapper .dataTables_paginate{margin-top:0.5em}}@media screen and (max-width: 640px){.wfls-dataTables_wrapper .dataTables_length,.wfls-dataTables_wrapper .dataTables_filter{float:none;text-align:center}.wfls-dataTables_wrapper .dataTables_filter{margin-top:0.5em}}.wfls-alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.wfls-alert h4{margin-top:0;color:inherit}.wfls-alert .wfls-alert-link{font-weight:bold}.wfls-alert>p,.wfls-alert>ul{margin-bottom:0}.wfls-alert>p+p{margin-top:5px}.wfls-alert-dismissable,.wfls-alert-dismissible{padding-right:35px}.wfls-alert-dismissable .close,.wfls-alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.wfls-alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}.wfls-alert-success hr{border-top-color:#c9e2b3}.wfls-alert-success .alert-link{color:#2b542c}.wfls-alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.wfls-alert-info hr{border-top-color:#a6e1ec}.wfls-alert-info .alert-link{color:#245269}.wfls-alert-warning{background-color:#fcf8e3;border-color:#faebcc;color:#8a6d3b}.wfls-alert-warning hr{border-top-color:#f7e1b5}.wfls-alert-warning .alert-link{color:#66512c}.wfls-alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442}.wfls-alert-danger hr{border-top-color:#e4b9c0}.wfls-alert-danger .alert-link{color:#843534}#wfls-onboarding-standalone-modal{margin-bottom:1rem}#wfls-onboarding-standalone-modal #wfls-onboarding-standalone-modal-header{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:row;flex-direction:row;background-color:#00709e;color:#ffffff;padding:1rem 2rem}#wfls-onboarding-standalone-modal #wfls-onboarding-standalone-modal-header #wfls-onboarding-standalone-modal-dismiss{font-size:1.35rem;color:#ffffff;text-decoration:none}#wfls-onboarding-standalone-modal #wfls-onboarding-standalone-modal-header #wfls-onboarding-standalone-modal-dismiss:hover{color:#f1f1f1}#wfls-onboarding-standalone-modal #wfls-onboarding-standalone-modal-header>*:last-child{-webkit-flex-grow:1;flex-grow:1;text-align:right}#wfls-onboarding-standalone-modal #wfls-onboarding-standalone-modal-content{background-color:#ffffff;padding:1rem 2rem}#wfls-onboarding-standalone-modal #wfls-onboarding-standalone-modal-content>p{margin-bottom:0}#wfls-onboarding-standalone-modal #wfls-onboarding-standalone-modal-content>p:first-child{margin-top:0}#wfls-onboarding-standalone-modal #wfls-onboarding-standalone-modal-footer{background-color:#525355;color:#ffffff;padding:0.5rem 2rem}#wfls-onboarding-standalone-modal #wfls-onboarding-standalone-modal-footer>ul{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-end;justify-content:flex-end;-webkit-flex-direction:row;flex-direction:row;margin:0;padding:0}#wfls-onboarding-standalone-modal #wfls-onboarding-standalone-modal-footer>ul>li{margin:0;padding:0 0 0 1rem}.wfls-grace-period-container{display:flex;align-items:center;justify-content:left;margin-bottom:1rem;margin-top:1rem}.wfls-grace-period-container .wfls-grace-period-input-container{margin-right:1.5rem;text-align:center}.wfls-grace-period-container .wfls-grace-period-input-container label{display:block;font-weight:bold}.wfls-grace-period-container .wfls-grace-period-input-container input{width:3em;text-align:center}#wfls-reset-grace-period-failed{text-align:center}#toplevel_page_WFLS .wp-menu-image img{max-width:16px;max-height:16px}
|
css/{colorbox.1610634190.css → colorbox.1625749951.css}
RENAMED
File without changes
|
css/{font-awesome.1610634190.css → font-awesome.1625749951.css}
RENAMED
File without changes
|
css/{ionicons.1610634190.css → ionicons.1625749951.css}
RENAMED
File without changes
|
css/jquery-ui-timepicker-addon.1610634190.css
DELETED
@@ -1 +0,0 @@
|
|
1 |
-
.ui-timepicker-div .ui-widget-header{margin-bottom:8px}.ui-timepicker-div dl{text-align:left}.ui-timepicker-div dl dt{float:left;clear:left;padding:0 0 0 5px}.ui-timepicker-div dl dd{margin:0 10px 10px 40%}.ui-timepicker-div td{font-size:90%}.ui-tpicker-grid-label{background:none;border:none;margin:0;padding:0}.ui-timepicker-div .ui_tpicker_unit_hide{display:none}.ui-timepicker-rtl{direction:rtl}.ui-timepicker-rtl dl{text-align:right;padding:0 5px 0 0}.ui-timepicker-rtl dl dt{float:right;clear:right}.ui-timepicker-rtl dl dd{margin:0 40% 10px 10px}.ui-timepicker-div.ui-timepicker-oneLine{padding-right:2px}.ui-timepicker-div.ui-timepicker-oneLine .ui_tpicker_time,.ui-timepicker-div.ui-timepicker-oneLine dt{display:none}.ui-timepicker-div.ui-timepicker-oneLine .ui_tpicker_time_label{display:block;padding-top:2px}.ui-timepicker-div.ui-timepicker-oneLine dl{text-align:right}.ui-timepicker-div.ui-timepicker-oneLine dl dd,.ui-timepicker-div.ui-timepicker-oneLine dl dd>div{display:inline-block;margin:0}.ui-timepicker-div.ui-timepicker-oneLine dl dd.ui_tpicker_minute:before,.ui-timepicker-div.ui-timepicker-oneLine dl dd.ui_tpicker_second:before{content:':';display:inline-block}.ui-timepicker-div.ui-timepicker-oneLine dl dd.ui_tpicker_millisec:before,.ui-timepicker-div.ui-timepicker-oneLine dl dd.ui_tpicker_microsec:before{content:'.';display:inline-block}.ui-timepicker-div.ui-timepicker-oneLine .ui_tpicker_unit_hide,.ui-timepicker-div.ui-timepicker-oneLine .ui_tpicker_unit_hide:before{display:none}
|
|
css/{jquery-ui.min.1610634190.css → jquery-ui.min.1625749951.css}
RENAMED
File without changes
|
css/{jquery-ui.structure.min.1610634190.css → jquery-ui.structure.min.1625749951.css}
RENAMED
File without changes
|
css/{jquery-ui.theme.min.1610634190.css → jquery-ui.theme.min.1625749951.css}
RENAMED
File without changes
|
css/login.1610634190.css
DELETED
@@ -1 +0,0 @@
|
|
1 |
-
#wfls-prompt-overlay{position:absolute;top:0px;right:0px;bottom:0px;left:0px;background-color:#fff;padding:26px 24px 46px;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:stretch;justify-content:stretch}#wfls-prompt-wrapper{-webkit-flex-grow:1;flex-grow:1;width:100%}.login form .wfls-textarea{font-size:1rem;width:100%;padding:3px;margin:2px 6px 16px 0;background:#fbfbfb;height:150px}.login form .wfls-remember-device-wrapper{font-weight:400;float:left;margin-bottom:0}.login form .wfls-remember-device-wrapper label{font-size:12px;line-height:19px}.wfls-2fa-code-help{text-decoration:none}.Zebra_Tooltip{background:0 0;position:absolute;z-index:8000}.Zebra_Tooltip .Zebra_Tooltip_Message{background:#000;border-radius:5px;box-shadow:0 0 6px rgba(0,0,0,0.6);color:#fff;font-size:12px;font-family:Tahoma,Arial,Helvetica,sans-serif;line-height:1.4;*margin-right:0;max-width:250px;padding:10px;position:relative;_width:expression(document.body.clientWidth > 250px ? '250px': 'auto');border:0 solid #000}.Zebra_Tooltip .Zebra_Tooltip_Message.Zebra_Tooltip_Has_Close{padding-right:23px}.Zebra_Tooltip .Zebra_Tooltip_Arrow{position:absolute;width:20px;height:10px;overflow:hidden}.Zebra_Tooltip .Zebra_Tooltip_Arrow.Zebra_Tooltip_Arrow_Bottom{bottom:0}.Zebra_Tooltip .Zebra_Tooltip_Arrow.Zebra_Tooltip_Arrow_Bottom div{top:0;border-color:#000 transparent transparent;_border-bottom-color:pink}.Zebra_Tooltip .Zebra_Tooltip_Arrow.Zebra_Tooltip_Arrow_Bottom div.Zebra_Tooltip_Arrow_Border{border-color:#000 transparent transparent}.Zebra_Tooltip .Zebra_Tooltip_Arrow.Zebra_Tooltip_Arrow_Top{top:0}.Zebra_Tooltip .Zebra_Tooltip_Arrow.Zebra_Tooltip_Arrow_Top div{bottom:0;border-color:transparent transparent #000;_border-top-color:pink}.Zebra_Tooltip .Zebra_Tooltip_Arrow.Zebra_Tooltip_Arrow_Top div.Zebra_Tooltip_Arrow_Border{border-color:transparent transparent #000}.Zebra_Tooltip .Zebra_Tooltip_Arrow div{position:absolute;border-style:solid;border-width:10px;width:0;height:0;left:0;_border-left-color:pink;_border-right-color:pink;_filter:chroma(color=pink)}.Zebra_Tooltip .Zebra_Tooltip_Arrow div.Zebra_Tooltip_Arrow_Border{border-width:10px;box-shadow:0 0 6px rgba(0,0,0,0.6);left:0}.Zebra_Tooltip .Zebra_Tooltip_Close{color:#fff;font-family:Arial,sans-serif;font-size:18px;line-height:1;padding:0 4px;position:absolute;right:2px;text-decoration:none;top:2px}.Zebra_Tooltip .Zebra_Tooltip_Close:hover{color:#000;background:#c2d076;border-radius:5px}
|
|
css/login.1625749951.css
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
#wfls-prompt-overlay{position:absolute;top:0px;right:0px;bottom:0px;left:0px;background-color:#fff;padding:26px 24px 46px;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:stretch;justify-content:stretch}.woocommerce #wfls-prompt-overlay{padding:0;display:block}#wfls-prompt-wrapper{-webkit-flex-grow:1;flex-grow:1;width:100%}.login form .wfls-textarea{font-size:1rem;width:100%;padding:3px;margin:2px 6px 16px 0;background:#fbfbfb;height:150px}.login form .wfls-remember-device-wrapper{font-weight:400;float:left;margin-bottom:0}.login form .wfls-remember-device-wrapper label{font-size:12px;line-height:19px}.wfls-2fa-code-help{text-decoration:none}.wfls-registration-captcha-contact{text-decoration:underline}.Zebra_Tooltip{background:0 0;position:absolute;z-index:8000}.Zebra_Tooltip .Zebra_Tooltip_Message{background:#000;border-radius:5px;box-shadow:0 0 6px rgba(0,0,0,0.6);color:#fff;font-size:12px;font-family:Tahoma,Arial,Helvetica,sans-serif;line-height:1.4;*margin-right:0;max-width:250px;padding:10px;position:relative;_width:expression(document.body.clientWidth > 250px ? '250px': 'auto');border:0 solid #000}.Zebra_Tooltip .Zebra_Tooltip_Message.Zebra_Tooltip_Has_Close{padding-right:23px}.Zebra_Tooltip .Zebra_Tooltip_Arrow{position:absolute;width:20px;height:10px;overflow:hidden}.Zebra_Tooltip .Zebra_Tooltip_Arrow.Zebra_Tooltip_Arrow_Bottom{bottom:0}.Zebra_Tooltip .Zebra_Tooltip_Arrow.Zebra_Tooltip_Arrow_Bottom div{top:0;border-color:#000 transparent transparent;_border-bottom-color:pink}.Zebra_Tooltip .Zebra_Tooltip_Arrow.Zebra_Tooltip_Arrow_Bottom div.Zebra_Tooltip_Arrow_Border{border-color:#000 transparent transparent}.Zebra_Tooltip .Zebra_Tooltip_Arrow.Zebra_Tooltip_Arrow_Top{top:0}.Zebra_Tooltip .Zebra_Tooltip_Arrow.Zebra_Tooltip_Arrow_Top div{bottom:0;border-color:transparent transparent #000;_border-top-color:pink}.Zebra_Tooltip .Zebra_Tooltip_Arrow.Zebra_Tooltip_Arrow_Top div.Zebra_Tooltip_Arrow_Border{border-color:transparent transparent #000}.Zebra_Tooltip .Zebra_Tooltip_Arrow div{position:absolute;border-style:solid;border-width:10px;width:0;height:0;left:0;_border-left-color:pink;_border-right-color:pink;_filter:chroma(color=pink)}.Zebra_Tooltip .Zebra_Tooltip_Arrow div.Zebra_Tooltip_Arrow_Border{border-width:10px;box-shadow:0 0 6px rgba(0,0,0,0.6);left:0}.Zebra_Tooltip .Zebra_Tooltip_Close{color:#fff;font-family:Arial,sans-serif;font-size:18px;line-height:1;padding:0 4px;position:absolute;right:2px;text-decoration:none;top:2px}.Zebra_Tooltip .Zebra_Tooltip_Close:hover{color:#000;background:#c2d076;border-radius:5px}
|
css/{wfselect2.min.1610634190.css → wfselect2.min.1625749951.css}
RENAMED
File without changes
|
js/{Chart.bundle.min.1610634190.js → Chart.bundle.min.1625749951.js}
RENAMED
File without changes
|
js/{admin-global.1610634190.js → admin-global.1625749951.js}
RENAMED
@@ -1,7 +1,7 @@
|
|
1 |
(function($) {
|
2 |
window['GWFLS'] = {
|
3 |
init: function() {
|
4 |
-
|
5 |
},
|
6 |
|
7 |
/**
|
@@ -58,6 +58,22 @@
|
|
58 |
function() { $('.wfls-notice[data-notice-id="' + nid + '"]').fadeOut(); }
|
59 |
);
|
60 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
61 |
};
|
62 |
|
63 |
$(function() {
|
1 |
(function($) {
|
2 |
window['GWFLS'] = {
|
3 |
init: function() {
|
4 |
+
this.register_create_user_events();
|
5 |
},
|
6 |
|
7 |
/**
|
58 |
function() { $('.wfls-notice[data-notice-id="' + nid + '"]').fadeOut(); }
|
59 |
);
|
60 |
},
|
61 |
+
|
62 |
+
register_create_user_events: function() {
|
63 |
+
var container = $('#wfls-grace-period-toggle-container');
|
64 |
+
if (container.length) {
|
65 |
+
var gracePeriodToggle = container.detach().find('tr');
|
66 |
+
$('#createuser #role').on('change', function() {
|
67 |
+
var select = $(this);
|
68 |
+
gracePeriodToggle.detach();
|
69 |
+
var role = select.val();
|
70 |
+
var row = select.closest('tr');
|
71 |
+
if (role === 'administrator') {
|
72 |
+
gracePeriodToggle.insertAfter(row);
|
73 |
+
}
|
74 |
+
}).trigger('change');
|
75 |
+
}
|
76 |
+
}
|
77 |
};
|
78 |
|
79 |
$(function() {
|
js/{admin.1610634190.js → admin.1625749951.js}
RENAMED
@@ -380,6 +380,23 @@
|
|
380 |
});
|
381 |
});
|
382 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
383 |
$('#wfls-save-changes').on('click', function(e) {
|
384 |
e.preventDefault();
|
385 |
e.stopPropagation();
|
@@ -520,6 +537,13 @@
|
|
520 |
WFLS.pendingChanges = {};
|
521 |
WFLS.updatePendingChanges();
|
522 |
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
523 |
},
|
524 |
|
525 |
updatePendingChanges: function() {
|
@@ -686,6 +710,18 @@
|
|
686 |
}
|
687 |
|
688 |
var prompt = $.tmpl(WFLSVars.modalTemplate, {title: heading, message: body});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
689 |
var promptHTML = $("<div />").append(prompt).html();
|
690 |
var callback = settings.onComplete;
|
691 |
settings.overlayClose = false;
|
380 |
});
|
381 |
});
|
382 |
|
383 |
+
//Dropdown/Text Options
|
384 |
+
$('select.wfls-option-select, input.wfls-option-input').each(function() {
|
385 |
+
$(this).data('original', $(this).val());
|
386 |
+
}).on('change input', function(e) {
|
387 |
+
var input = $(this);
|
388 |
+
var name = input.attr('name');
|
389 |
+
var value = input.val();
|
390 |
+
var original = input.data('original');
|
391 |
+
if (value === original || (input.hasClass('wfls-option-input-required') && value === '')) {
|
392 |
+
delete WFLS.pendingChanges[name];
|
393 |
+
}
|
394 |
+
else {
|
395 |
+
WFLS.pendingChanges[name] = value;
|
396 |
+
}
|
397 |
+
WFLS.updatePendingChanges();
|
398 |
+
});
|
399 |
+
|
400 |
$('#wfls-save-changes').on('click', function(e) {
|
401 |
e.preventDefault();
|
402 |
e.stopPropagation();
|
537 |
WFLS.pendingChanges = {};
|
538 |
WFLS.updatePendingChanges();
|
539 |
});
|
540 |
+
|
541 |
+
$('.wfls-persistent-notice').on('click', 'button', function() {
|
542 |
+
WFLS.ajax(
|
543 |
+
'wordfence_ls_dismiss_persistent_notice',
|
544 |
+
{notice_id: $(this).parent('.notice').attr('id')},
|
545 |
+
);
|
546 |
+
});
|
547 |
},
|
548 |
|
549 |
updatePendingChanges: function() {
|
710 |
}
|
711 |
|
712 |
var prompt = $.tmpl(WFLSVars.modalTemplate, {title: heading, message: body});
|
713 |
+
|
714 |
+
if (typeof settings.additional_buttons !== 'undefined') {
|
715 |
+
var buttonSection = prompt.find('.wfls-modal-footer > ul');
|
716 |
+
for(index in settings.additional_buttons) {
|
717 |
+
var buttonSettings = settings.additional_buttons[index];
|
718 |
+
var button = $('<button>').text(buttonSettings.label)
|
719 |
+
.addClass('wfls-btn wfls-btn-default wfls-btn-callout-subtle wfls-additional-button')
|
720 |
+
.attr('id', buttonSettings.id);
|
721 |
+
buttonSection.prepend($("<li>").addClass('wfls-padding-add-left-small').append(button));
|
722 |
+
}
|
723 |
+
}
|
724 |
+
|
725 |
var promptHTML = $("<div />").append(prompt).html();
|
726 |
var callback = settings.onComplete;
|
727 |
settings.overlayClose = false;
|
js/jquery-ui-timepicker-addon.1610634190.js
DELETED
@@ -1,2291 +0,0 @@
|
|
1 |
-
/*! jQuery Timepicker Addon - v1.6.3 - 2016-04-20
|
2 |
-
* http://trentrichardson.com/examples/timepicker
|
3 |
-
* Copyright (c) 2016 Trent Richardson; Licensed MIT */
|
4 |
-
(function (factory) {
|
5 |
-
if (typeof define === 'function' && define.amd) {
|
6 |
-
define(['jquery', 'jquery-ui'], factory);
|
7 |
-
} else {
|
8 |
-
factory(jQuery);
|
9 |
-
}
|
10 |
-
}(function ($) {
|
11 |
-
|
12 |
-
/*
|
13 |
-
* Lets not redefine timepicker, Prevent "Uncaught RangeError: Maximum call stack size exceeded"
|
14 |
-
*/
|
15 |
-
$.ui.timepicker = $.ui.timepicker || {};
|
16 |
-
if ($.ui.timepicker.version) {
|
17 |
-
return;
|
18 |
-
}
|
19 |
-
|
20 |
-
/*
|
21 |
-
* Extend jQueryUI, get it started with our version number
|
22 |
-
*/
|
23 |
-
$.extend($.ui, {
|
24 |
-
timepicker: {
|
25 |
-
version: "1.6.3"
|
26 |
-
}
|
27 |
-
});
|
28 |
-
|
29 |
-
/*
|
30 |
-
* Timepicker manager.
|
31 |
-
* Use the singleton instance of this class, $.timepicker, to interact with the time picker.
|
32 |
-
* Settings for (groups of) time pickers are maintained in an instance object,
|
33 |
-
* allowing multiple different settings on the same page.
|
34 |
-
*/
|
35 |
-
var Timepicker = function () {
|
36 |
-
this.regional = []; // Available regional settings, indexed by language code
|
37 |
-
this.regional[''] = { // Default regional settings
|
38 |
-
currentText: 'Now',
|
39 |
-
closeText: 'Done',
|
40 |
-
amNames: ['AM', 'A'],
|
41 |
-
pmNames: ['PM', 'P'],
|
42 |
-
timeFormat: 'HH:mm',
|
43 |
-
timeSuffix: '',
|
44 |
-
timeOnlyTitle: 'Choose Time',
|
45 |
-
timeText: 'Time',
|
46 |
-
hourText: 'Hour',
|
47 |
-
minuteText: 'Minute',
|
48 |
-
secondText: 'Second',
|
49 |
-
millisecText: 'Millisecond',
|
50 |
-
microsecText: 'Microsecond',
|
51 |
-
timezoneText: 'Time Zone',
|
52 |
-
isRTL: false
|
53 |
-
};
|
54 |
-
this._defaults = { // Global defaults for all the datetime picker instances
|
55 |
-
showButtonPanel: true,
|
56 |
-
timeOnly: false,
|
57 |
-
timeOnlyShowDate: false,
|
58 |
-
showHour: null,
|
59 |
-
showMinute: null,
|
60 |
-
showSecond: null,
|
61 |
-
showMillisec: null,
|
62 |
-
showMicrosec: null,
|
63 |
-
showTimezone: null,
|
64 |
-
showTime: true,
|
65 |
-
stepHour: 1,
|
66 |
-
stepMinute: 1,
|
67 |
-
stepSecond: 1,
|
68 |
-
stepMillisec: 1,
|
69 |
-
stepMicrosec: 1,
|
70 |
-
hour: 0,
|
71 |
-
minute: 0,
|
72 |
-
second: 0,
|
73 |
-
millisec: 0,
|
74 |
-
microsec: 0,
|
75 |
-
timezone: null,
|
76 |
-
hourMin: 0,
|
77 |
-
minuteMin: 0,
|
78 |
-
secondMin: 0,
|
79 |
-
millisecMin: 0,
|
80 |
-
microsecMin: 0,
|
81 |
-
hourMax: 23,
|
82 |
-
minuteMax: 59,
|
83 |
-
secondMax: 59,
|
84 |
-
millisecMax: 999,
|
85 |
-
microsecMax: 999,
|
86 |
-
minDateTime: null,
|
87 |
-
maxDateTime: null,
|
88 |
-
maxTime: null,
|
89 |
-
minTime: null,
|
90 |
-
onSelect: null,
|
91 |
-
hourGrid: 0,
|
92 |
-
minuteGrid: 0,
|
93 |
-
secondGrid: 0,
|
94 |
-
millisecGrid: 0,
|
95 |
-
microsecGrid: 0,
|
96 |
-
alwaysSetTime: true,
|
97 |
-
separator: ' ',
|
98 |
-
altFieldTimeOnly: true,
|
99 |
-
altTimeFormat: null,
|
100 |
-
altSeparator: null,
|
101 |
-
altTimeSuffix: null,
|
102 |
-
altRedirectFocus: true,
|
103 |
-
pickerTimeFormat: null,
|
104 |
-
pickerTimeSuffix: null,
|
105 |
-
showTimepicker: true,
|
106 |
-
timezoneList: null,
|
107 |
-
addSliderAccess: false,
|
108 |
-
sliderAccessArgs: null,
|
109 |
-
controlType: 'slider',
|
110 |
-
oneLine: false,
|
111 |
-
defaultValue: null,
|
112 |
-
parse: 'strict',
|
113 |
-
afterInject: null
|
114 |
-
};
|
115 |
-
$.extend(this._defaults, this.regional['']);
|
116 |
-
};
|
117 |
-
|
118 |
-
$.extend(Timepicker.prototype, {
|
119 |
-
$input: null,
|
120 |
-
$altInput: null,
|
121 |
-
$timeObj: null,
|
122 |
-
inst: null,
|
123 |
-
hour_slider: null,
|
124 |
-
minute_slider: null,
|
125 |
-
second_slider: null,
|
126 |
-
millisec_slider: null,
|
127 |
-
microsec_slider: null,
|
128 |
-
timezone_select: null,
|
129 |
-
maxTime: null,
|
130 |
-
minTime: null,
|
131 |
-
hour: 0,
|
132 |
-
minute: 0,
|
133 |
-
second: 0,
|
134 |
-
millisec: 0,
|
135 |
-
microsec: 0,
|
136 |
-
timezone: null,
|
137 |
-
hourMinOriginal: null,
|
138 |
-
minuteMinOriginal: null,
|
139 |
-
secondMinOriginal: null,
|
140 |
-
millisecMinOriginal: null,
|
141 |
-
microsecMinOriginal: null,
|
142 |
-
hourMaxOriginal: null,
|
143 |
-
minuteMaxOriginal: null,
|
144 |
-
secondMaxOriginal: null,
|
145 |
-
millisecMaxOriginal: null,
|
146 |
-
microsecMaxOriginal: null,
|
147 |
-
ampm: '',
|
148 |
-
formattedDate: '',
|
149 |
-
formattedTime: '',
|
150 |
-
formattedDateTime: '',
|
151 |
-
timezoneList: null,
|
152 |
-
units: ['hour', 'minute', 'second', 'millisec', 'microsec'],
|
153 |
-
support: {},
|
154 |
-
control: null,
|
155 |
-
|
156 |
-
/*
|
157 |
-
* Override the default settings for all instances of the time picker.
|
158 |
-
* @param {Object} settings object - the new settings to use as defaults (anonymous object)
|
159 |
-
* @return {Object} the manager object
|
160 |
-
*/
|
161 |
-
setDefaults: function (settings) {
|
162 |
-
extendRemove(this._defaults, settings || {});
|
163 |
-
return this;
|
164 |
-
},
|
165 |
-
|
166 |
-
/*
|
167 |
-
* Create a new Timepicker instance
|
168 |
-
*/
|
169 |
-
_newInst: function ($input, opts) {
|
170 |
-
var tp_inst = new Timepicker(),
|
171 |
-
inlineSettings = {},
|
172 |
-
fns = {},
|
173 |
-
overrides, i;
|
174 |
-
|
175 |
-
for (var attrName in this._defaults) {
|
176 |
-
if (this._defaults.hasOwnProperty(attrName)) {
|
177 |
-
var attrValue = $input.attr('time:' + attrName);
|
178 |
-
if (attrValue) {
|
179 |
-
try {
|
180 |
-
inlineSettings[attrName] = eval(attrValue);
|
181 |
-
} catch (err) {
|
182 |
-
inlineSettings[attrName] = attrValue;
|
183 |
-
}
|
184 |
-
}
|
185 |
-
}
|
186 |
-
}
|
187 |
-
|
188 |
-
overrides = {
|
189 |
-
beforeShow: function (input, dp_inst) {
|
190 |
-
if ($.isFunction(tp_inst._defaults.evnts.beforeShow)) {
|
191 |
-
return tp_inst._defaults.evnts.beforeShow.call($input[0], input, dp_inst, tp_inst);
|
192 |
-
}
|
193 |
-
},
|
194 |
-
onChangeMonthYear: function (year, month, dp_inst) {
|
195 |
-
// Update the time as well : this prevents the time from disappearing from the $input field.
|
196 |
-
// tp_inst._updateDateTime(dp_inst);
|
197 |
-
if ($.isFunction(tp_inst._defaults.evnts.onChangeMonthYear)) {
|
198 |
-
tp_inst._defaults.evnts.onChangeMonthYear.call($input[0], year, month, dp_inst, tp_inst);
|
199 |
-
}
|
200 |
-
},
|
201 |
-
onClose: function (dateText, dp_inst) {
|
202 |
-
if (tp_inst.timeDefined === true && $input.val() !== '') {
|
203 |
-
tp_inst._updateDateTime(dp_inst);
|
204 |
-
}
|
205 |
-
if ($.isFunction(tp_inst._defaults.evnts.onClose)) {
|
206 |
-
tp_inst._defaults.evnts.onClose.call($input[0], dateText, dp_inst, tp_inst);
|
207 |
-
}
|
208 |
-
}
|
209 |
-
};
|
210 |
-
for (i in overrides) {
|
211 |
-
if (overrides.hasOwnProperty(i)) {
|
212 |
-
fns[i] = opts[i] || this._defaults[i] || null;
|
213 |
-
}
|
214 |
-
}
|
215 |
-
|
216 |
-
tp_inst._defaults = $.extend({}, this._defaults, inlineSettings, opts, overrides, {
|
217 |
-
evnts: fns,
|
218 |
-
timepicker: tp_inst // add timepicker as a property of datepicker: $.datepicker._get(dp_inst, 'timepicker');
|
219 |
-
});
|
220 |
-
tp_inst.amNames = $.map(tp_inst._defaults.amNames, function (val) {
|
221 |
-
return val.toUpperCase();
|
222 |
-
});
|
223 |
-
tp_inst.pmNames = $.map(tp_inst._defaults.pmNames, function (val) {
|
224 |
-
return val.toUpperCase();
|
225 |
-
});
|
226 |
-
|
227 |
-
// detect which units are supported
|
228 |
-
tp_inst.support = detectSupport(
|
229 |
-
tp_inst._defaults.timeFormat +
|
230 |
-
(tp_inst._defaults.pickerTimeFormat ? tp_inst._defaults.pickerTimeFormat : '') +
|
231 |
-
(tp_inst._defaults.altTimeFormat ? tp_inst._defaults.altTimeFormat : ''));
|
232 |
-
|
233 |
-
// controlType is string - key to our this._controls
|
234 |
-
if (typeof(tp_inst._defaults.controlType) === 'string') {
|
235 |
-
if (tp_inst._defaults.controlType === 'slider' && typeof($.ui.slider) === 'undefined') {
|
236 |
-
tp_inst._defaults.controlType = 'select';
|
237 |
-
}
|
238 |
-
tp_inst.control = tp_inst._controls[tp_inst._defaults.controlType];
|
239 |
-
}
|
240 |
-
// controlType is an object and must implement create, options, value methods
|
241 |
-
else {
|
242 |
-
tp_inst.control = tp_inst._defaults.controlType;
|
243 |
-
}
|
244 |
-
|
245 |
-
// prep the timezone options
|
246 |
-
var timezoneList = [-720, -660, -600, -570, -540, -480, -420, -360, -300, -270, -240, -210, -180, -120, -60,
|
247 |
-
0, 60, 120, 180, 210, 240, 270, 300, 330, 345, 360, 390, 420, 480, 525, 540, 570, 600, 630, 660, 690, 720, 765, 780, 840];
|
248 |
-
if (tp_inst._defaults.timezoneList !== null) {
|
249 |
-
timezoneList = tp_inst._defaults.timezoneList;
|
250 |
-
}
|
251 |
-
var tzl = timezoneList.length, tzi = 0, tzv = null;
|
252 |
-
if (tzl > 0 && typeof timezoneList[0] !== 'object') {
|
253 |
-
for (; tzi < tzl; tzi++) {
|
254 |
-
tzv = timezoneList[tzi];
|
255 |
-
timezoneList[tzi] = { value: tzv, label: $.timepicker.timezoneOffsetString(tzv, tp_inst.support.iso8601) };
|
256 |
-
}
|
257 |
-
}
|
258 |
-
tp_inst._defaults.timezoneList = timezoneList;
|
259 |
-
|
260 |
-
// set the default units
|
261 |
-
tp_inst.timezone = tp_inst._defaults.timezone !== null ? $.timepicker.timezoneOffsetNumber(tp_inst._defaults.timezone) :
|
262 |
-
((new Date()).getTimezoneOffset() * -1);
|
263 |
-
tp_inst.hour = tp_inst._defaults.hour < tp_inst._defaults.hourMin ? tp_inst._defaults.hourMin :
|
264 |
-
tp_inst._defaults.hour > tp_inst._defaults.hourMax ? tp_inst._defaults.hourMax : tp_inst._defaults.hour;
|
265 |
-
tp_inst.minute = tp_inst._defaults.minute < tp_inst._defaults.minuteMin ? tp_inst._defaults.minuteMin :
|
266 |
-
tp_inst._defaults.minute > tp_inst._defaults.minuteMax ? tp_inst._defaults.minuteMax : tp_inst._defaults.minute;
|
267 |
-
tp_inst.second = tp_inst._defaults.second < tp_inst._defaults.secondMin ? tp_inst._defaults.secondMin :
|
268 |
-
tp_inst._defaults.second > tp_inst._defaults.secondMax ? tp_inst._defaults.secondMax : tp_inst._defaults.second;
|
269 |
-
tp_inst.millisec = tp_inst._defaults.millisec < tp_inst._defaults.millisecMin ? tp_inst._defaults.millisecMin :
|
270 |
-
tp_inst._defaults.millisec > tp_inst._defaults.millisecMax ? tp_inst._defaults.millisecMax : tp_inst._defaults.millisec;
|
271 |
-
tp_inst.microsec = tp_inst._defaults.microsec < tp_inst._defaults.microsecMin ? tp_inst._defaults.microsecMin :
|
272 |
-
tp_inst._defaults.microsec > tp_inst._defaults.microsecMax ? tp_inst._defaults.microsecMax : tp_inst._defaults.microsec;
|
273 |
-
tp_inst.ampm = '';
|
274 |
-
tp_inst.$input = $input;
|
275 |
-
|
276 |
-
if (tp_inst._defaults.altField) {
|
277 |
-
tp_inst.$altInput = $(tp_inst._defaults.altField);
|
278 |
-
if (tp_inst._defaults.altRedirectFocus === true) {
|
279 |
-
tp_inst.$altInput.css({
|
280 |
-
cursor: 'pointer'
|
281 |
-
}).focus(function () {
|
282 |
-
$input.trigger("focus");
|
283 |
-
});
|
284 |
-
}
|
285 |
-
}
|
286 |
-
|
287 |
-
if (tp_inst._defaults.minDate === 0 || tp_inst._defaults.minDateTime === 0) {
|
288 |
-
tp_inst._defaults.minDate = new Date();
|
289 |
-
}
|
290 |
-
if (tp_inst._defaults.maxDate === 0 || tp_inst._defaults.maxDateTime === 0) {
|
291 |
-
tp_inst._defaults.maxDate = new Date();
|
292 |
-
}
|
293 |
-
|
294 |
-
// datepicker needs minDate/maxDate, timepicker needs minDateTime/maxDateTime..
|
295 |
-
if (tp_inst._defaults.minDate !== undefined && tp_inst._defaults.minDate instanceof Date) {
|
296 |
-
tp_inst._defaults.minDateTime = new Date(tp_inst._defaults.minDate.getTime());
|
297 |
-
}
|
298 |
-
if (tp_inst._defaults.minDateTime !== undefined && tp_inst._defaults.minDateTime instanceof Date) {
|
299 |
-
tp_inst._defaults.minDate = new Date(tp_inst._defaults.minDateTime.getTime());
|
300 |
-
}
|
301 |
-
if (tp_inst._defaults.maxDate !== undefined && tp_inst._defaults.maxDate instanceof Date) {
|
302 |
-
tp_inst._defaults.maxDateTime = new Date(tp_inst._defaults.maxDate.getTime());
|
303 |
-
}
|
304 |
-
if (tp_inst._defaults.maxDateTime !== undefined && tp_inst._defaults.maxDateTime instanceof Date) {
|
305 |
-
tp_inst._defaults.maxDate = new Date(tp_inst._defaults.maxDateTime.getTime());
|
306 |
-
}
|
307 |
-
tp_inst.$input.bind('focus', function () {
|
308 |
-
tp_inst._onFocus();
|
309 |
-
});
|
310 |
-
|
311 |
-
return tp_inst;
|
312 |
-
},
|
313 |
-
|
314 |
-
/*
|
315 |
-
* add our sliders to the calendar
|
316 |
-
*/
|
317 |
-
_addTimePicker: function (dp_inst) {
|
318 |
-
var currDT = $.trim((this.$altInput && this._defaults.altFieldTimeOnly) ? this.$input.val() + ' ' + this.$altInput.val() : this.$input.val());
|
319 |
-
|
320 |
-
this.timeDefined = this._parseTime(currDT);
|
321 |
-
this._limitMinMaxDateTime(dp_inst, false);
|
322 |
-
this._injectTimePicker();
|
323 |
-
this._afterInject();
|
324 |
-
},
|
325 |
-
|
326 |
-
/*
|
327 |
-
* parse the time string from input value or _setTime
|
328 |
-
*/
|
329 |
-
_parseTime: function (timeString, withDate) {
|
330 |
-
if (!this.inst) {
|
331 |
-
this.inst = $.datepicker._getInst(this.$input[0]);
|
332 |
-
}
|
333 |
-
|
334 |
-
if (withDate || !this._defaults.timeOnly) {
|
335 |
-
var dp_dateFormat = $.datepicker._get(this.inst, 'dateFormat');
|
336 |
-
try {
|
337 |
-
var parseRes = parseDateTimeInternal(dp_dateFormat, this._defaults.timeFormat, timeString, $.datepicker._getFormatConfig(this.inst), this._defaults);
|
338 |
-
if (!parseRes.timeObj) {
|
339 |
-
return false;
|
340 |
-
}
|
341 |
-
$.extend(this, parseRes.timeObj);
|
342 |
-
} catch (err) {
|
343 |
-
$.timepicker.log("Error parsing the date/time string: " + err +
|
344 |
-
"\ndate/time string = " + timeString +
|
345 |
-
"\ntimeFormat = " + this._defaults.timeFormat +
|
346 |
-
"\ndateFormat = " + dp_dateFormat);
|
347 |
-
return false;
|
348 |
-
}
|
349 |
-
return true;
|
350 |
-
} else {
|
351 |
-
var timeObj = $.datepicker.parseTime(this._defaults.timeFormat, timeString, this._defaults);
|
352 |
-
if (!timeObj) {
|
353 |
-
return false;
|
354 |
-
}
|
355 |
-
$.extend(this, timeObj);
|
356 |
-
return true;
|
357 |
-
}
|
358 |
-
},
|
359 |
-
|
360 |
-
/*
|
361 |
-
* Handle callback option after injecting timepicker
|
362 |
-
*/
|
363 |
-
_afterInject: function() {
|
364 |
-
var o = this.inst.settings;
|
365 |
-
if ($.isFunction(o.afterInject)) {
|
366 |
-
o.afterInject.call(this);
|
367 |
-
}
|
368 |
-
},
|
369 |
-
|
370 |
-
/*
|
371 |
-
* generate and inject html for timepicker into ui datepicker
|
372 |
-
*/
|
373 |
-
_injectTimePicker: function () {
|
374 |
-
var $dp = this.inst.dpDiv,
|
375 |
-
o = this.inst.settings,
|
376 |
-
tp_inst = this,
|
377 |
-
litem = '',
|
378 |
-
uitem = '',
|
379 |
-
show = null,
|
380 |
-
max = {},
|
381 |
-
gridSize = {},
|
382 |
-
size = null,
|
383 |
-
i = 0,
|
384 |
-
l = 0;
|
385 |
-
|
386 |
-
// Prevent displaying twice
|
387 |
-
if ($dp.find("div.ui-timepicker-div").length === 0 && o.showTimepicker) {
|
388 |
-
var noDisplay = ' ui_tpicker_unit_hide',
|
389 |
-
html = '<div class="ui-timepicker-div' + (o.isRTL ? ' ui-timepicker-rtl' : '') + (o.oneLine && o.controlType === 'select' ? ' ui-timepicker-oneLine' : '') + '"><dl>' + '<dt class="ui_tpicker_time_label' + ((o.showTime) ? '' : noDisplay) + '">' + o.timeText + '</dt>' +
|
390 |
-
'<dd class="ui_tpicker_time '+ ((o.showTime) ? '' : noDisplay) + '"><input class="ui_tpicker_time_input" ' + (o.timeInput ? '' : 'disabled') + '/></dd>';
|
391 |
-
|
392 |
-
// Create the markup
|
393 |
-
for (i = 0, l = this.units.length; i < l; i++) {
|
394 |
-
litem = this.units[i];
|
395 |
-
uitem = litem.substr(0, 1).toUpperCase() + litem.substr(1);
|
396 |
-
show = o['show' + uitem] !== null ? o['show' + uitem] : this.support[litem];
|
397 |
-
|
398 |
-
// Added by Peter Medeiros:
|
399 |
-
// - Figure out what the hour/minute/second max should be based on the step values.
|
400 |
-
// - Example: if stepMinute is 15, then minMax is 45.
|
401 |
-
max[litem] = parseInt((o[litem + 'Max'] - ((o[litem + 'Max'] - o[litem + 'Min']) % o['step' + uitem])), 10);
|
402 |
-
gridSize[litem] = 0;
|
403 |
-
|
404 |
-
html += '<dt class="ui_tpicker_' + litem + '_label' + (show ? '' : noDisplay) + '">' + o[litem + 'Text'] + '</dt>' +
|
405 |
-
'<dd class="ui_tpicker_' + litem + (show ? '' : noDisplay) + '"><div class="ui_tpicker_' + litem + '_slider' + (show ? '' : noDisplay) + '"></div>';
|
406 |
-
|
407 |
-
if (show && o[litem + 'Grid'] > 0) {
|
408 |
-
html += '<div style="padding-left: 1px"><table class="ui-tpicker-grid-label"><tr>';
|
409 |
-
|
410 |
-
if (litem === 'hour') {
|
411 |
-
for (var h = o[litem + 'Min']; h <= max[litem]; h += parseInt(o[litem + 'Grid'], 10)) {
|
412 |
-
gridSize[litem]++;
|
413 |
-
var tmph = $.datepicker.formatTime(this.support.ampm ? 'hht' : 'HH', {hour: h}, o);
|
414 |
-
html += '<td data-for="' + litem + '">' + tmph + '</td>';
|
415 |
-
}
|
416 |
-
}
|
417 |
-
else {
|
418 |
-
for (var m = o[litem + 'Min']; m <= max[litem]; m += parseInt(o[litem + 'Grid'], 10)) {
|
419 |
-
gridSize[litem]++;
|
420 |
-
html += '<td data-for="' + litem + '">' + ((m < 10) ? '0' : '') + m + '</td>';
|
421 |
-
}
|
422 |
-
}
|
423 |
-
|
424 |
-
html += '</tr></table></div>';
|
425 |
-
}
|
426 |
-
html += '</dd>';
|
427 |
-
}
|
428 |
-
|
429 |
-
// Timezone
|
430 |
-
var showTz = o.showTimezone !== null ? o.showTimezone : this.support.timezone;
|
431 |
-
html += '<dt class="ui_tpicker_timezone_label' + (showTz ? '' : noDisplay) + '">' + o.timezoneText + '</dt>';
|
432 |
-
html += '<dd class="ui_tpicker_timezone' + (showTz ? '' : noDisplay) + '"></dd>';
|
433 |
-
|
434 |
-
// Create the elements from string
|
435 |
-
html += '</dl></div>';
|
436 |
-
var $tp = $(html);
|
437 |
-
|
438 |
-
// if we only want time picker...
|
439 |
-
if (o.timeOnly === true) {
|
440 |
-
$tp.prepend('<div class="ui-widget-header ui-helper-clearfix ui-corner-all">' + '<div class="ui-datepicker-title">' + o.timeOnlyTitle + '</div>' + '</div>');
|
441 |
-
$dp.find('.ui-datepicker-header, .ui-datepicker-calendar').hide();
|
442 |
-
}
|
443 |
-
|
444 |
-
// add sliders, adjust grids, add events
|
445 |
-
for (i = 0, l = tp_inst.units.length; i < l; i++) {
|
446 |
-
litem = tp_inst.units[i];
|
447 |
-
uitem = litem.substr(0, 1).toUpperCase() + litem.substr(1);
|
448 |
-
show = o['show' + uitem] !== null ? o['show' + uitem] : this.support[litem];
|
449 |
-
|
450 |
-
// add the slider
|
451 |
-
tp_inst[litem + '_slider'] = tp_inst.control.create(tp_inst, $tp.find('.ui_tpicker_' + litem + '_slider'), litem, tp_inst[litem], o[litem + 'Min'], max[litem], o['step' + uitem]);
|
452 |
-
|
453 |
-
// adjust the grid and add click event
|
454 |
-
if (show && o[litem + 'Grid'] > 0) {
|
455 |
-
size = 100 * gridSize[litem] * o[litem + 'Grid'] / (max[litem] - o[litem + 'Min']);
|
456 |
-
$tp.find('.ui_tpicker_' + litem + ' table').css({
|
457 |
-
width: size + "%",
|
458 |
-
marginLeft: o.isRTL ? '0' : ((size / (-2 * gridSize[litem])) + "%"),
|
459 |
-
marginRight: o.isRTL ? ((size / (-2 * gridSize[litem])) + "%") : '0',
|
460 |
-
borderCollapse: 'collapse'
|
461 |
-
}).find("td").click(function (e) {
|
462 |
-
var $t = $(this),
|
463 |
-
h = $t.html(),
|
464 |
-
n = parseInt(h.replace(/[^0-9]/g), 10),
|
465 |
-
ap = h.replace(/[^apm]/ig),
|
466 |
-
f = $t.data('for'); // loses scope, so we use data-for
|
467 |
-
|
468 |
-
if (f === 'hour') {
|
469 |
-
if (ap.indexOf('p') !== -1 && n < 12) {
|
470 |
-
n += 12;
|
471 |
-
}
|
472 |
-
else {
|
473 |
-
if (ap.indexOf('a') !== -1 && n === 12) {
|
474 |
-
n = 0;
|
475 |
-
}
|
476 |
-
}
|
477 |
-
}
|
478 |
-
|
479 |
-
tp_inst.control.value(tp_inst, tp_inst[f + '_slider'], litem, n);
|
480 |
-
|
481 |
-
tp_inst._onTimeChange();
|
482 |
-
tp_inst._onSelectHandler();
|
483 |
-
}).css({
|
484 |
-
cursor: 'pointer',
|
485 |
-
width: (100 / gridSize[litem]) + '%',
|
486 |
-
textAlign: 'center',
|
487 |
-
overflow: 'hidden'
|
488 |
-
});
|
489 |
-
} // end if grid > 0
|
490 |
-
} // end for loop
|
491 |
-
|
492 |
-
// Add timezone options
|
493 |
-
this.timezone_select = $tp.find('.ui_tpicker_timezone').append('<select></select>').find("select");
|
494 |
-
$.fn.append.apply(this.timezone_select,
|
495 |
-
$.map(o.timezoneList, function (val, idx) {
|
496 |
-
return $("<option />").val(typeof val === "object" ? val.value : val).text(typeof val === "object" ? val.label : val);
|
497 |
-
}));
|
498 |
-
if (typeof(this.timezone) !== "undefined" && this.timezone !== null && this.timezone !== "") {
|
499 |
-
var local_timezone = (new Date(this.inst.selectedYear, this.inst.selectedMonth, this.inst.selectedDay, 12)).getTimezoneOffset() * -1;
|
500 |
-
if (local_timezone === this.timezone) {
|
501 |
-
selectLocalTimezone(tp_inst);
|
502 |
-
} else {
|
503 |
-
this.timezone_select.val(this.timezone);
|
504 |
-
}
|
505 |
-
} else {
|
506 |
-
if (typeof(this.hour) !== "undefined" && this.hour !== null && this.hour !== "") {
|
507 |
-
this.timezone_select.val(o.timezone);
|
508 |
-
} else {
|
509 |
-
selectLocalTimezone(tp_inst);
|
510 |
-
}
|
511 |
-
}
|
512 |
-
this.timezone_select.change(function () {
|
513 |
-
tp_inst._onTimeChange();
|
514 |
-
tp_inst._onSelectHandler();
|
515 |
-
tp_inst._afterInject();
|
516 |
-
});
|
517 |
-
// End timezone options
|
518 |
-
|
519 |
-
// inject timepicker into datepicker
|
520 |
-
var $buttonPanel = $dp.find('.ui-datepicker-buttonpane');
|
521 |
-
if ($buttonPanel.length) {
|
522 |
-
$buttonPanel.before($tp);
|
523 |
-
} else {
|
524 |
-
$dp.append($tp);
|
525 |
-
}
|
526 |
-
|
527 |
-
this.$timeObj = $tp.find('.ui_tpicker_time_input');
|
528 |
-
this.$timeObj.change(function () {
|
529 |
-
var timeFormat = tp_inst.inst.settings.timeFormat;
|
530 |
-
var parsedTime = $.datepicker.parseTime(timeFormat, this.value);
|
531 |
-
var update = new Date();
|
532 |
-
if (parsedTime) {
|
533 |
-
update.setHours(parsedTime.hour);
|
534 |
-
update.setMinutes(parsedTime.minute);
|
535 |
-
update.setSeconds(parsedTime.second);
|
536 |
-
$.datepicker._setTime(tp_inst.inst, update);
|
537 |
-
} else {
|
538 |
-
this.value = tp_inst.formattedTime;
|
539 |
-
this.blur();
|
540 |
-
}
|
541 |
-
});
|
542 |
-
|
543 |
-
if (this.inst !== null) {
|
544 |
-
var timeDefined = this.timeDefined;
|
545 |
-
this._onTimeChange();
|
546 |
-
this.timeDefined = timeDefined;
|
547 |
-
}
|
548 |
-
|
549 |
-
// slideAccess integration: http://trentrichardson.com/2011/11/11/jquery-ui-sliders-and-touch-accessibility/
|
550 |
-
if (this._defaults.addSliderAccess) {
|
551 |
-
var sliderAccessArgs = this._defaults.sliderAccessArgs,
|
552 |
-
rtl = this._defaults.isRTL;
|
553 |
-
sliderAccessArgs.isRTL = rtl;
|
554 |
-
|
555 |
-
setTimeout(function () { // fix for inline mode
|
556 |
-
if ($tp.find('.ui-slider-access').length === 0) {
|
557 |
-
$tp.find('.ui-slider:visible').sliderAccess(sliderAccessArgs);
|
558 |
-
|
559 |
-
// fix any grids since sliders are shorter
|
560 |
-
var sliderAccessWidth = $tp.find('.ui-slider-access:eq(0)').outerWidth(true);
|
561 |
-
if (sliderAccessWidth) {
|
562 |
-
$tp.find('table:visible').each(function () {
|
563 |
-
var $g = $(this),
|
564 |
-
oldWidth = $g.outerWidth(),
|
565 |
-
oldMarginLeft = $g.css(rtl ? 'marginRight' : 'marginLeft').toString().replace('%', ''),
|
566 |
-
newWidth = oldWidth - sliderAccessWidth,
|
567 |
-
newMarginLeft = ((oldMarginLeft * newWidth) / oldWidth) + '%',
|
568 |
-
css = { width: newWidth, marginRight: 0, marginLeft: 0 };
|
569 |
-
css[rtl ? 'marginRight' : 'marginLeft'] = newMarginLeft;
|
570 |
-
$g.css(css);
|
571 |
-
});
|
572 |
-
}
|
573 |
-
}
|
574 |
-
}, 10);
|
575 |
-
}
|
576 |
-
// end slideAccess integration
|
577 |
-
|
578 |
-
tp_inst._limitMinMaxDateTime(this.inst, true);
|
579 |
-
}
|
580 |
-
},
|
581 |
-
|
582 |
-
/*
|
583 |
-
* This function tries to limit the ability to go outside the
|
584 |
-
* min/max date range
|
585 |
-
*/
|
586 |
-
_limitMinMaxDateTime: function (dp_inst, adjustSliders) {
|
587 |
-
var o = this._defaults,
|
588 |
-
dp_date = new Date(dp_inst.selectedYear, dp_inst.selectedMonth, dp_inst.selectedDay);
|
589 |
-
|
590 |
-
if (!this._defaults.showTimepicker) {
|
591 |
-
return;
|
592 |
-
} // No time so nothing to check here
|
593 |
-
|
594 |
-
if ($.datepicker._get(dp_inst, 'minDateTime') !== null && $.datepicker._get(dp_inst, 'minDateTime') !== undefined && dp_date) {
|
595 |
-
var minDateTime = $.datepicker._get(dp_inst, 'minDateTime'),
|
596 |
-
minDateTimeDate = new Date(minDateTime.getFullYear(), minDateTime.getMonth(), minDateTime.getDate(), 0, 0, 0, 0);
|
597 |
-
|
598 |
-
if (this.hourMinOriginal === null || this.minuteMinOriginal === null || this.secondMinOriginal === null || this.millisecMinOriginal === null || this.microsecMinOriginal === null) {
|
599 |
-
this.hourMinOriginal = o.hourMin;
|
600 |
-
this.minuteMinOriginal = o.minuteMin;
|
601 |
-
this.secondMinOriginal = o.secondMin;
|
602 |
-
this.millisecMinOriginal = o.millisecMin;
|
603 |
-
this.microsecMinOriginal = o.microsecMin;
|
604 |
-
}
|
605 |
-
|
606 |
-
if (dp_inst.settings.timeOnly || minDateTimeDate.getTime() === dp_date.getTime()) {
|
607 |
-
this._defaults.hourMin = minDateTime.getHours();
|
608 |
-
if (this.hour <= this._defaults.hourMin) {
|
609 |
-
this.hour = this._defaults.hourMin;
|
610 |
-
this._defaults.minuteMin = minDateTime.getMinutes();
|
611 |
-
if (this.minute <= this._defaults.minuteMin) {
|
612 |
-
this.minute = this._defaults.minuteMin;
|
613 |
-
this._defaults.secondMin = minDateTime.getSeconds();
|
614 |
-
if (this.second <= this._defaults.secondMin) {
|
615 |
-
this.second = this._defaults.secondMin;
|
616 |
-
this._defaults.millisecMin = minDateTime.getMilliseconds();
|
617 |
-
if (this.millisec <= this._defaults.millisecMin) {
|
618 |
-
this.millisec = this._defaults.millisecMin;
|
619 |
-
this._defaults.microsecMin = minDateTime.getMicroseconds();
|
620 |
-
} else {
|
621 |
-
if (this.microsec < this._defaults.microsecMin) {
|
622 |
-
this.microsec = this._defaults.microsecMin;
|
623 |
-
}
|
624 |
-
this._defaults.microsecMin = this.microsecMinOriginal;
|
625 |
-
}
|
626 |
-
} else {
|
627 |
-
this._defaults.millisecMin = this.millisecMinOriginal;
|
628 |
-
this._defaults.microsecMin = this.microsecMinOriginal;
|
629 |
-
}
|
630 |
-
} else {
|
631 |
-
this._defaults.secondMin = this.secondMinOriginal;
|
632 |
-
this._defaults.millisecMin = this.millisecMinOriginal;
|
633 |
-
this._defaults.microsecMin = this.microsecMinOriginal;
|
634 |
-
}
|
635 |
-
} else {
|
636 |
-
this._defaults.minuteMin = this.minuteMinOriginal;
|
637 |
-
this._defaults.secondMin = this.secondMinOriginal;
|
638 |
-
this._defaults.millisecMin = this.millisecMinOriginal;
|
639 |
-
this._defaults.microsecMin = this.microsecMinOriginal;
|
640 |
-
}
|
641 |
-
} else {
|
642 |
-
this._defaults.hourMin = this.hourMinOriginal;
|
643 |
-
this._defaults.minuteMin = this.minuteMinOriginal;
|
644 |
-
this._defaults.secondMin = this.secondMinOriginal;
|
645 |
-
this._defaults.millisecMin = this.millisecMinOriginal;
|
646 |
-
this._defaults.microsecMin = this.microsecMinOriginal;
|
647 |
-
}
|
648 |
-
}
|
649 |
-
|
650 |
-
if ($.datepicker._get(dp_inst, 'maxDateTime') !== null && $.datepicker._get(dp_inst, 'maxDateTime') !== undefined && dp_date) {
|
651 |
-
var maxDateTime = $.datepicker._get(dp_inst, 'maxDateTime'),
|
652 |
-
maxDateTimeDate = new Date(maxDateTime.getFullYear(), maxDateTime.getMonth(), maxDateTime.getDate(), 0, 0, 0, 0);
|
653 |
-
|
654 |
-
if (this.hourMaxOriginal === null || this.minuteMaxOriginal === null || this.secondMaxOriginal === null || this.millisecMaxOriginal === null) {
|
655 |
-
this.hourMaxOriginal = o.hourMax;
|
656 |
-
this.minuteMaxOriginal = o.minuteMax;
|
657 |
-
this.secondMaxOriginal = o.secondMax;
|
658 |
-
this.millisecMaxOriginal = o.millisecMax;
|
659 |
-
this.microsecMaxOriginal = o.microsecMax;
|
660 |
-
}
|
661 |
-
|
662 |
-
if (dp_inst.settings.timeOnly || maxDateTimeDate.getTime() === dp_date.getTime()) {
|
663 |
-
this._defaults.hourMax = maxDateTime.getHours();
|
664 |
-
if (this.hour >= this._defaults.hourMax) {
|
665 |
-
this.hour = this._defaults.hourMax;
|
666 |
-
this._defaults.minuteMax = maxDateTime.getMinutes();
|
667 |
-
if (this.minute >= this._defaults.minuteMax) {
|
668 |
-
this.minute = this._defaults.minuteMax;
|
669 |
-
this._defaults.secondMax = maxDateTime.getSeconds();
|
670 |
-
if (this.second >= this._defaults.secondMax) {
|
671 |
-
this.second = this._defaults.secondMax;
|
672 |
-
this._defaults.millisecMax = maxDateTime.getMilliseconds();
|
673 |
-
if (this.millisec >= this._defaults.millisecMax) {
|
674 |
-
this.millisec = this._defaults.millisecMax;
|
675 |
-
this._defaults.microsecMax = maxDateTime.getMicroseconds();
|
676 |
-
} else {
|
677 |
-
if (this.microsec > this._defaults.microsecMax) {
|
678 |
-
this.microsec = this._defaults.microsecMax;
|
679 |
-
}
|
680 |
-
this._defaults.microsecMax = this.microsecMaxOriginal;
|
681 |
-
}
|
682 |
-
} else {
|
683 |
-
this._defaults.millisecMax = this.millisecMaxOriginal;
|
684 |
-
this._defaults.microsecMax = this.microsecMaxOriginal;
|
685 |
-
}
|
686 |
-
} else {
|
687 |
-
this._defaults.secondMax = this.secondMaxOriginal;
|
688 |
-
this._defaults.millisecMax = this.millisecMaxOriginal;
|
689 |
-
this._defaults.microsecMax = this.microsecMaxOriginal;
|
690 |
-
}
|
691 |
-
} else {
|
692 |
-
this._defaults.minuteMax = this.minuteMaxOriginal;
|
693 |
-
this._defaults.secondMax = this.secondMaxOriginal;
|
694 |
-
this._defaults.millisecMax = this.millisecMaxOriginal;
|
695 |
-
this._defaults.microsecMax = this.microsecMaxOriginal;
|
696 |
-
}
|
697 |
-
} else {
|
698 |
-
this._defaults.hourMax = this.hourMaxOriginal;
|
699 |
-
this._defaults.minuteMax = this.minuteMaxOriginal;
|
700 |
-
this._defaults.secondMax = this.secondMaxOriginal;
|
701 |
-
this._defaults.millisecMax = this.millisecMaxOriginal;
|
702 |
-
this._defaults.microsecMax = this.microsecMaxOriginal;
|
703 |
-
}
|
704 |
-
}
|
705 |
-
|
706 |
-
if (dp_inst.settings.minTime!==null) {
|
707 |
-
var tempMinTime=new Date("01/01/1970 " + dp_inst.settings.minTime);
|
708 |
-
if (this.hour<tempMinTime.getHours()) {
|
709 |
-
this.hour=this._defaults.hourMin=tempMinTime.getHours();
|
710 |
-
this.minute=this._defaults.minuteMin=tempMinTime.getMinutes();
|
711 |
-
} else if (this.hour===tempMinTime.getHours() && this.minute<tempMinTime.getMinutes()) {
|
712 |
-
this.minute=this._defaults.minuteMin=tempMinTime.getMinutes();
|
713 |
-
} else {
|
714 |
-
if (this._defaults.hourMin<tempMinTime.getHours()) {
|
715 |
-
this._defaults.hourMin=tempMinTime.getHours();
|
716 |
-
this._defaults.minuteMin=tempMinTime.getMinutes();
|
717 |
-
} else if (this._defaults.hourMin===tempMinTime.getHours()===this.hour && this._defaults.minuteMin<tempMinTime.getMinutes()) {
|
718 |
-
this._defaults.minuteMin=tempMinTime.getMinutes();
|
719 |
-
} else {
|
720 |
-
this._defaults.minuteMin=0;
|
721 |
-
}
|
722 |
-
}
|
723 |
-
}
|
724 |
-
|
725 |
-
if (dp_inst.settings.maxTime!==null) {
|
726 |
-
var tempMaxTime=new Date("01/01/1970 " + dp_inst.settings.maxTime);
|
727 |
-
if (this.hour>tempMaxTime.getHours()) {
|
728 |
-
this.hour=this._defaults.hourMax=tempMaxTime.getHours();
|
729 |
-
this.minute=this._defaults.minuteMax=tempMaxTime.getMinutes();
|
730 |
-
} else if (this.hour===tempMaxTime.getHours() && this.minute>tempMaxTime.getMinutes()) {
|
731 |
-
this.minute=this._defaults.minuteMax=tempMaxTime.getMinutes();
|
732 |
-
} else {
|
733 |
-
if (this._defaults.hourMax>tempMaxTime.getHours()) {
|
734 |
-
this._defaults.hourMax=tempMaxTime.getHours();
|
735 |
-
this._defaults.minuteMax=tempMaxTime.getMinutes();
|
736 |
-
} else if (this._defaults.hourMax===tempMaxTime.getHours()===this.hour && this._defaults.minuteMax>tempMaxTime.getMinutes()) {
|
737 |
-
this._defaults.minuteMax=tempMaxTime.getMinutes();
|
738 |
-
} else {
|
739 |
-
this._defaults.minuteMax=59;
|
740 |
-
}
|
741 |
-
}
|
742 |
-
}
|
743 |
-
|
744 |
-
if (adjustSliders !== undefined && adjustSliders === true) {
|
745 |
-
var hourMax = parseInt((this._defaults.hourMax - ((this._defaults.hourMax - this._defaults.hourMin) % this._defaults.stepHour)), 10),
|
746 |
-
minMax = parseInt((this._defaults.minuteMax - ((this._defaults.minuteMax - this._defaults.minuteMin) % this._defaults.stepMinute)), 10),
|
747 |
-
secMax = parseInt((this._defaults.secondMax - ((this._defaults.secondMax - this._defaults.secondMin) % this._defaults.stepSecond)), 10),
|
748 |
-
millisecMax = parseInt((this._defaults.millisecMax - ((this._defaults.millisecMax - this._defaults.millisecMin) % this._defaults.stepMillisec)), 10),
|
749 |
-
microsecMax = parseInt((this._defaults.microsecMax - ((this._defaults.microsecMax - this._defaults.microsecMin) % this._defaults.stepMicrosec)), 10);
|
750 |
-
|
751 |
-
if (this.hour_slider) {
|
752 |
-
this.control.options(this, this.hour_slider, 'hour', { min: this._defaults.hourMin, max: hourMax, step: this._defaults.stepHour });
|
753 |
-
this.control.value(this, this.hour_slider, 'hour', this.hour - (this.hour % this._defaults.stepHour));
|
754 |
-
}
|
755 |
-
if (this.minute_slider) {
|
756 |
-
this.control.options(this, this.minute_slider, 'minute', { min: this._defaults.minuteMin, max: minMax, step: this._defaults.stepMinute });
|
757 |
-
this.control.value(this, this.minute_slider, 'minute', this.minute - (this.minute % this._defaults.stepMinute));
|
758 |
-
}
|
759 |
-
if (this.second_slider) {
|
760 |
-
this.control.options(this, this.second_slider, 'second', { min: this._defaults.secondMin, max: secMax, step: this._defaults.stepSecond });
|
761 |
-
this.control.value(this, this.second_slider, 'second', this.second - (this.second % this._defaults.stepSecond));
|
762 |
-
}
|
763 |
-
if (this.millisec_slider) {
|
764 |
-
this.control.options(this, this.millisec_slider, 'millisec', { min: this._defaults.millisecMin, max: millisecMax, step: this._defaults.stepMillisec });
|
765 |
-
this.control.value(this, this.millisec_slider, 'millisec', this.millisec - (this.millisec % this._defaults.stepMillisec));
|
766 |
-
}
|
767 |
-
if (this.microsec_slider) {
|
768 |
-
this.control.options(this, this.microsec_slider, 'microsec', { min: this._defaults.microsecMin, max: microsecMax, step: this._defaults.stepMicrosec });
|
769 |
-
this.control.value(this, this.microsec_slider, 'microsec', this.microsec - (this.microsec % this._defaults.stepMicrosec));
|
770 |
-
}
|
771 |
-
}
|
772 |
-
|
773 |
-
},
|
774 |
-
|
775 |
-
/*
|
776 |
-
* when a slider moves, set the internal time...
|
777 |
-
* on time change is also called when the time is updated in the text field
|
778 |
-
*/
|
779 |
-
_onTimeChange: function () {
|
780 |
-
if (!this._defaults.showTimepicker) {
|
781 |
-
return;
|
782 |
-
}
|
783 |
-
var hour = (this.hour_slider) ? this.control.value(this, this.hour_slider, 'hour') : false,
|
784 |
-
minute = (this.minute_slider) ? this.control.value(this, this.minute_slider, 'minute') : false,
|
785 |
-
second = (this.second_slider) ? this.control.value(this, this.second_slider, 'second') : false,
|
786 |
-
millisec = (this.millisec_slider) ? this.control.value(this, this.millisec_slider, 'millisec') : false,
|
787 |
-
microsec = (this.microsec_slider) ? this.control.value(this, this.microsec_slider, 'microsec') : false,
|
788 |
-
timezone = (this.timezone_select) ? this.timezone_select.val() : false,
|
789 |
-
o = this._defaults,
|
790 |
-
pickerTimeFormat = o.pickerTimeFormat || o.timeFormat,
|
791 |
-
pickerTimeSuffix = o.pickerTimeSuffix || o.timeSuffix;
|
792 |
-
|
793 |
-
if (typeof(hour) === 'object') {
|
794 |
-
hour = false;
|
795 |
-
}
|
796 |
-
if (typeof(minute) === 'object') {
|
797 |
-
minute = false;
|
798 |
-
}
|
799 |
-
if (typeof(second) === 'object') {
|
800 |
-
second = false;
|
801 |
-
}
|
802 |
-
if (typeof(millisec) === 'object') {
|
803 |
-
millisec = false;
|
804 |
-
}
|
805 |
-
if (typeof(microsec) === 'object') {
|
806 |
-
microsec = false;
|
807 |
-
}
|
808 |
-
if (typeof(timezone) === 'object') {
|
809 |
-
timezone = false;
|
810 |
-
}
|
811 |
-
|
812 |
-
if (hour !== false) {
|
813 |
-
hour = parseInt(hour, 10);
|
814 |
-
}
|
815 |
-
if (minute !== false) {
|
816 |
-
minute = parseInt(minute, 10);
|
817 |
-
}
|
818 |
-
if (second !== false) {
|
819 |
-
second = parseInt(second, 10);
|
820 |
-
}
|
821 |
-
if (millisec !== false) {
|
822 |
-
millisec = parseInt(millisec, 10);
|
823 |
-
}
|
824 |
-
if (microsec !== false) {
|
825 |
-
microsec = parseInt(microsec, 10);
|
826 |
-
}
|
827 |
-
if (timezone !== false) {
|
828 |
-
timezone = timezone.toString();
|
829 |
-
}
|
830 |
-
|
831 |
-
var ampm = o[hour < 12 ? 'amNames' : 'pmNames'][0];
|
832 |
-
|
833 |
-
// If the update was done in the input field, the input field should not be updated.
|
834 |
-
// If the update was done using the sliders, update the input field.
|
835 |
-
var hasChanged = (
|
836 |
-
hour !== parseInt(this.hour,10) || // sliders should all be numeric
|
837 |
-
minute !== parseInt(this.minute,10) ||
|
838 |
-
second !== parseInt(this.second,10) ||
|
839 |
-
millisec !== parseInt(this.millisec,10) ||
|
840 |
-
microsec !== parseInt(this.microsec,10) ||
|
841 |
-
(this.ampm.length > 0 && (hour < 12) !== ($.inArray(this.ampm.toUpperCase(), this.amNames) !== -1)) ||
|
842 |
-
(this.timezone !== null && timezone !== this.timezone.toString()) // could be numeric or "EST" format, so use toString()
|
843 |
-
);
|
844 |
-
|
845 |
-
if (hasChanged) {
|
846 |
-
|
847 |
-
if (hour !== false) {
|
848 |
-
this.hour = hour;
|
849 |
-
}
|
850 |
-
if (minute !== false) {
|
851 |
-
this.minute = minute;
|
852 |
-
}
|
853 |
-
if (second !== false) {
|
854 |
-
this.second = second;
|
855 |
-
}
|
856 |
-
if (millisec !== false) {
|
857 |
-
this.millisec = millisec;
|
858 |
-
}
|
859 |
-
if (microsec !== false) {
|
860 |
-
this.microsec = microsec;
|
861 |
-
}
|
862 |
-
if (timezone !== false) {
|
863 |
-
this.timezone = timezone;
|
864 |
-
}
|
865 |
-
|
866 |
-
if (!this.inst) {
|
867 |
-
this.inst = $.datepicker._getInst(this.$input[0]);
|
868 |
-
}
|
869 |
-
|
870 |
-
this._limitMinMaxDateTime(this.inst, true);
|
871 |
-
}
|
872 |
-
if (this.support.ampm) {
|
873 |
-
this.ampm = ampm;
|
874 |
-
}
|
875 |
-
|
876 |
-
// Updates the time within the timepicker
|
877 |
-
this.formattedTime = $.datepicker.formatTime(o.timeFormat, this, o);
|
878 |
-
if (this.$timeObj) {
|
879 |
-
if (pickerTimeFormat === o.timeFormat) {
|
880 |
-
this.$timeObj.val(this.formattedTime + pickerTimeSuffix);
|
881 |
-
}
|
882 |
-
else {
|
883 |
-
this.$timeObj.val($.datepicker.formatTime(pickerTimeFormat, this, o) + pickerTimeSuffix);
|
884 |
-
}
|
885 |
-
if (this.$timeObj[0].setSelectionRange) {
|
886 |
-
var sPos = this.$timeObj[0].selectionStart;
|
887 |
-
var ePos = this.$timeObj[0].selectionEnd;
|
888 |
-
this.$timeObj[0].setSelectionRange(sPos, ePos);
|
889 |
-
}
|
890 |
-
}
|
891 |
-
|
892 |
-
this.timeDefined = true;
|
893 |
-
if (hasChanged) {
|
894 |
-
this._updateDateTime();
|
895 |
-
//this.$input.focus(); // may automatically open the picker on setDate
|
896 |
-
}
|
897 |
-
},
|
898 |
-
|
899 |
-
/*
|
900 |
-
* call custom onSelect.
|
901 |
-
* bind to sliders slidestop, and grid click.
|
902 |
-
*/
|
903 |
-
_onSelectHandler: function () {
|
904 |
-
var onSelect = this._defaults.onSelect || this.inst.settings.onSelect;
|
905 |
-
var inputEl = this.$input ? this.$input[0] : null;
|
906 |
-
if (onSelect && inputEl) {
|
907 |
-
onSelect.apply(inputEl, [this.formattedDateTime, this]);
|
908 |
-
}
|
909 |
-
},
|
910 |
-
|
911 |
-
/*
|
912 |
-
* update our input with the new date time..
|
913 |
-
*/
|
914 |
-
_updateDateTime: function (dp_inst) {
|
915 |
-
dp_inst = this.inst || dp_inst;
|
916 |
-
var dtTmp = (dp_inst.currentYear > 0?
|
917 |
-
new Date(dp_inst.currentYear, dp_inst.currentMonth, dp_inst.currentDay) :
|
918 |
-
new Date(dp_inst.selectedYear, dp_inst.selectedMonth, dp_inst.selectedDay)),
|
919 |
-
dt = $.datepicker._daylightSavingAdjust(dtTmp),
|
920 |
-
//dt = $.datepicker._daylightSavingAdjust(new Date(dp_inst.selectedYear, dp_inst.selectedMonth, dp_inst.selectedDay)),
|
921 |
-
//dt = $.datepicker._daylightSavingAdjust(new Date(dp_inst.currentYear, dp_inst.currentMonth, dp_inst.currentDay)),
|
922 |
-
dateFmt = $.datepicker._get(dp_inst, 'dateFormat'),
|
923 |
-
formatCfg = $.datepicker._getFormatConfig(dp_inst),
|
924 |
-
timeAvailable = dt !== null && this.timeDefined;
|
925 |
-
this.formattedDate = $.datepicker.formatDate(dateFmt, (dt === null ? new Date() : dt), formatCfg);
|
926 |
-
var formattedDateTime = this.formattedDate;
|
927 |
-
|
928 |
-
// if a slider was changed but datepicker doesn't have a value yet, set it
|
929 |
-
if (dp_inst.lastVal === "") {
|
930 |
-
dp_inst.currentYear = dp_inst.selectedYear;
|
931 |
-
dp_inst.currentMonth = dp_inst.selectedMonth;
|
932 |
-
dp_inst.currentDay = dp_inst.selectedDay;
|
933 |
-
}
|
934 |
-
|
935 |
-
/*
|
936 |
-
* remove following lines to force every changes in date picker to change the input value
|
937 |
-
* Bug descriptions: when an input field has a default value, and click on the field to pop up the date picker.
|
938 |
-
* If the user manually empty the value in the input field, the date picker will never change selected value.
|
939 |
-
*/
|
940 |
-
//if (dp_inst.lastVal !== undefined && (dp_inst.lastVal.length > 0 && this.$input.val().length === 0)) {
|
941 |
-
// return;
|
942 |
-
//}
|
943 |
-
|
944 |
-
if (this._defaults.timeOnly === true && this._defaults.timeOnlyShowDate === false) {
|
945 |
-
formattedDateTime = this.formattedTime;
|
946 |
-
} else if ((this._defaults.timeOnly !== true && (this._defaults.alwaysSetTime || timeAvailable)) || (this._defaults.timeOnly === true && this._defaults.timeOnlyShowDate === true)) {
|
947 |
-
formattedDateTime += this._defaults.separator + this.formattedTime + this._defaults.timeSuffix;
|
948 |
-
}
|
949 |
-
|
950 |
-
this.formattedDateTime = formattedDateTime;
|
951 |
-
|
952 |
-
if (!this._defaults.showTimepicker) {
|
953 |
-
this.$input.val(this.formattedDate);
|
954 |
-
} else if (this.$altInput && this._defaults.timeOnly === false && this._defaults.altFieldTimeOnly === true) {
|
955 |
-
this.$altInput.val(this.formattedTime);
|
956 |
-
this.$input.val(this.formattedDate);
|
957 |
-
} else if (this.$altInput) {
|
958 |
-
this.$input.val(formattedDateTime);
|
959 |
-
var altFormattedDateTime = '',
|
960 |
-
altSeparator = this._defaults.altSeparator !== null ? this._defaults.altSeparator : this._defaults.separator,
|
961 |
-
altTimeSuffix = this._defaults.altTimeSuffix !== null ? this._defaults.altTimeSuffix : this._defaults.timeSuffix;
|
962 |
-
|
963 |
-
if (!this._defaults.timeOnly) {
|
964 |
-
if (this._defaults.altFormat) {
|
965 |
-
altFormattedDateTime = $.datepicker.formatDate(this._defaults.altFormat, (dt === null ? new Date() : dt), formatCfg);
|
966 |
-
}
|
967 |
-
else {
|
968 |
-
altFormattedDateTime = this.formattedDate;
|
969 |
-
}
|
970 |
-
|
971 |
-
if (altFormattedDateTime) {
|
972 |
-
altFormattedDateTime += altSeparator;
|
973 |
-
}
|
974 |
-
}
|
975 |
-
|
976 |
-
if (this._defaults.altTimeFormat !== null) {
|
977 |
-
altFormattedDateTime += $.datepicker.formatTime(this._defaults.altTimeFormat, this, this._defaults) + altTimeSuffix;
|
978 |
-
}
|
979 |
-
else {
|
980 |
-
altFormattedDateTime += this.formattedTime + altTimeSuffix;
|
981 |
-
}
|
982 |
-
this.$altInput.val(altFormattedDateTime);
|
983 |
-
} else {
|
984 |
-
this.$input.val(formattedDateTime);
|
985 |
-
}
|
986 |
-
|
987 |
-
this.$input.trigger("change");
|
988 |
-
},
|
989 |
-
|
990 |
-
_onFocus: function () {
|
991 |
-
if (!this.$input.val() && this._defaults.defaultValue) {
|
992 |
-
this.$input.val(this._defaults.defaultValue);
|
993 |
-
var inst = $.datepicker._getInst(this.$input.get(0)),
|
994 |
-
tp_inst = $.datepicker._get(inst, 'timepicker');
|
995 |
-
if (tp_inst) {
|
996 |
-
if (tp_inst._defaults.timeOnly && (inst.input.val() !== inst.lastVal)) {
|
997 |
-
try {
|
998 |
-
$.datepicker._updateDatepicker(inst);
|
999 |
-
} catch (err) {
|
1000 |
-
$.timepicker.log(err);
|
1001 |
-
}
|
1002 |
-
}
|
1003 |
-
}
|
1004 |
-
}
|
1005 |
-
},
|
1006 |
-
|
1007 |
-
/*
|
1008 |
-
* Small abstraction to control types
|
1009 |
-
* We can add more, just be sure to follow the pattern: create, options, value
|
1010 |
-
*/
|
1011 |
-
_controls: {
|
1012 |
-
// slider methods
|
1013 |
-
slider: {
|
1014 |
-
create: function (tp_inst, obj, unit, val, min, max, step) {
|
1015 |
-
var rtl = tp_inst._defaults.isRTL; // if rtl go -60->0 instead of 0->60
|
1016 |
-
return obj.prop('slide', null).slider({
|
1017 |
-
orientation: "horizontal",
|
1018 |
-
value: rtl ? val * -1 : val,
|
1019 |
-
min: rtl ? max * -1 : min,
|
1020 |
-
max: rtl ? min * -1 : max,
|
1021 |
-
step: step,
|
1022 |
-
slide: function (event, ui) {
|
1023 |
-
tp_inst.control.value(tp_inst, $(this), unit, rtl ? ui.value * -1 : ui.value);
|
1024 |
-
tp_inst._onTimeChange();
|
1025 |
-
},
|
1026 |
-
stop: function (event, ui) {
|
1027 |
-
tp_inst._onSelectHandler();
|
1028 |
-
}
|
1029 |
-
});
|
1030 |
-
},
|
1031 |
-
options: function (tp_inst, obj, unit, opts, val) {
|
1032 |
-
if (tp_inst._defaults.isRTL) {
|
1033 |
-
if (typeof(opts) === 'string') {
|
1034 |
-
if (opts === 'min' || opts === 'max') {
|
1035 |
-
if (val !== undefined) {
|
1036 |
-
return obj.slider(opts, val * -1);
|
1037 |
-
}
|
1038 |
-
return Math.abs(obj.slider(opts));
|
1039 |
-
}
|
1040 |
-
return obj.slider(opts);
|
1041 |
-
}
|
1042 |
-
var min = opts.min,
|
1043 |
-
max = opts.max;
|
1044 |
-
opts.min = opts.max = null;
|
1045 |
-
if (min !== undefined) {
|
1046 |
-
opts.max = min * -1;
|
1047 |
-
}
|
1048 |
-
if (max !== undefined) {
|
1049 |
-
opts.min = max * -1;
|
1050 |
-
}
|
1051 |
-
return obj.slider(opts);
|
1052 |
-
}
|
1053 |
-
if (typeof(opts) === 'string' && val !== undefined) {
|
1054 |
-
return obj.slider(opts, val);
|
1055 |
-
}
|
1056 |
-
return obj.slider(opts);
|
1057 |
-
},
|
1058 |
-
value: function (tp_inst, obj, unit, val) {
|
1059 |
-
if (tp_inst._defaults.isRTL) {
|
1060 |
-
if (val !== undefined) {
|
1061 |
-
return obj.slider('value', val * -1);
|
1062 |
-
}
|
1063 |
-
return Math.abs(obj.slider('value'));
|
1064 |
-
}
|
1065 |
-
if (val !== undefined) {
|
1066 |
-
return obj.slider('value', val);
|
1067 |
-
}
|
1068 |
-
return obj.slider('value');
|
1069 |
-
}
|
1070 |
-
},
|
1071 |
-
// select methods
|
1072 |
-
select: {
|
1073 |
-
create: function (tp_inst, obj, unit, val, min, max, step) {
|
1074 |
-
var sel = '<select class="ui-timepicker-select ui-state-default ui-corner-all" data-unit="' + unit + '" data-min="' + min + '" data-max="' + max + '" data-step="' + step + '">',
|
1075 |
-
format = tp_inst._defaults.pickerTimeFormat || tp_inst._defaults.timeFormat;
|
1076 |
-
|
1077 |
-
for (var i = min; i <= max; i += step) {
|
1078 |
-
sel += '<option value="' + i + '"' + (i === val ? ' selected' : '') + '>';
|
1079 |
-
if (unit === 'hour') {
|
1080 |
-
sel += $.datepicker.formatTime($.trim(format.replace(/[^ht ]/ig, '')), {hour: i}, tp_inst._defaults);
|
1081 |
-
}
|
1082 |
-
else if (unit === 'millisec' || unit === 'microsec' || i >= 10) { sel += i; }
|
1083 |
-
else {sel += '0' + i.toString(); }
|
1084 |
-
sel += '</option>';
|
1085 |
-
}
|
1086 |
-
sel += '</select>';
|
1087 |
-
|
1088 |
-
obj.children('select').remove();
|
1089 |
-
|
1090 |
-
$(sel).appendTo(obj).change(function (e) {
|
1091 |
-
tp_inst._onTimeChange();
|
1092 |
-
tp_inst._onSelectHandler();
|
1093 |
-
tp_inst._afterInject();
|
1094 |
-
});
|
1095 |
-
|
1096 |
-
return obj;
|
1097 |
-
},
|
1098 |
-
options: function (tp_inst, obj, unit, opts, val) {
|
1099 |
-
var o = {},
|
1100 |
-
$t = obj.children('select');
|
1101 |
-
if (typeof(opts) === 'string') {
|
1102 |
-
if (val === undefined) {
|
1103 |
-
return $t.data(opts);
|
1104 |
-
}
|
1105 |
-
o[opts] = val;
|
1106 |
-
}
|
1107 |
-
else { o = opts; }
|
1108 |
-
return tp_inst.control.create(tp_inst, obj, $t.data('unit'), $t.val(), o.min>=0 ? o.min : $t.data('min'), o.max || $t.data('max'), o.step || $t.data('step'));
|
1109 |
-
},
|
1110 |
-
value: function (tp_inst, obj, unit, val) {
|
1111 |
-
var $t = obj.children('select');
|
1112 |
-
if (val !== undefined) {
|
1113 |
-
return $t.val(val);
|
1114 |
-
}
|
1115 |
-
return $t.val();
|
1116 |
-
}
|
1117 |
-
}
|
1118 |
-
} // end _controls
|
1119 |
-
|
1120 |
-
});
|
1121 |
-
|
1122 |
-
$.fn.extend({
|
1123 |
-
/*
|
1124 |
-
* shorthand just to use timepicker.
|
1125 |
-
*/
|
1126 |
-
timepicker: function (o) {
|
1127 |
-
o = o || {};
|
1128 |
-
var tmp_args = Array.prototype.slice.call(arguments);
|
1129 |
-
|
1130 |
-
if (typeof o === 'object') {
|
1131 |
-
tmp_args[0] = $.extend(o, {
|
1132 |
-
timeOnly: true
|
1133 |
-
});
|
1134 |
-
}
|
1135 |
-
|
1136 |
-
return $(this).each(function () {
|
1137 |
-
$.fn.datetimepicker.apply($(this), tmp_args);
|
1138 |
-
});
|
1139 |
-
},
|
1140 |
-
|
1141 |
-
/*
|
1142 |
-
* extend timepicker to datepicker
|
1143 |
-
*/
|
1144 |
-
datetimepicker: function (o) {
|
1145 |
-
o = o || {};
|
1146 |
-
var tmp_args = arguments;
|
1147 |
-
|
1148 |
-
if (typeof(o) === 'string') {
|
1149 |
-
if (o === 'getDate' || (o === 'option' && tmp_args.length === 2 && typeof (tmp_args[1]) === 'string')) {
|
1150 |
-
return $.fn.datepicker.apply($(this[0]), tmp_args);
|
1151 |
-
} else {
|
1152 |
-
return this.each(function () {
|
1153 |
-
var $t = $(this);
|
1154 |
-
$t.datepicker.apply($t, tmp_args);
|
1155 |
-
});
|
1156 |
-
}
|
1157 |
-
} else {
|
1158 |
-
return this.each(function () {
|
1159 |
-
var $t = $(this);
|
1160 |
-
$t.datepicker($.timepicker._newInst($t, o)._defaults);
|
1161 |
-
});
|
1162 |
-
}
|
1163 |
-
}
|
1164 |
-
});
|
1165 |
-
|
1166 |
-
/*
|
1167 |
-
* Public Utility to parse date and time
|
1168 |
-
*/
|
1169 |
-
$.datepicker.parseDateTime = function (dateFormat, timeFormat, dateTimeString, dateSettings, timeSettings) {
|
1170 |
-
var parseRes = parseDateTimeInternal(dateFormat, timeFormat, dateTimeString, dateSettings, timeSettings);
|
1171 |
-
if (parseRes.timeObj) {
|
1172 |
-
var t = parseRes.timeObj;
|
1173 |
-
parseRes.date.setHours(t.hour, t.minute, t.second, t.millisec);
|
1174 |
-
parseRes.date.setMicroseconds(t.microsec);
|
1175 |
-
}
|
1176 |
-
|
1177 |
-
return parseRes.date;
|
1178 |
-
};
|
1179 |
-
|
1180 |
-
/*
|
1181 |
-
* Public utility to parse time
|
1182 |
-
*/
|
1183 |
-
$.datepicker.parseTime = function (timeFormat, timeString, options) {
|
1184 |
-
var o = extendRemove(extendRemove({}, $.timepicker._defaults), options || {}),
|
1185 |
-
iso8601 = (timeFormat.replace(/\'.*?\'/g, '').indexOf('Z') !== -1);
|
1186 |
-
|
1187 |
-
// Strict parse requires the timeString to match the timeFormat exactly
|
1188 |
-
var strictParse = function (f, s, o) {
|
1189 |
-
|
1190 |
-
// pattern for standard and localized AM/PM markers
|
1191 |
-
var getPatternAmpm = function (amNames, pmNames) {
|
1192 |
-
var markers = [];
|
1193 |
-
if (amNames) {
|
1194 |
-
$.merge(markers, amNames);
|
1195 |
-
}
|
1196 |
-
if (pmNames) {
|
1197 |
-
$.merge(markers, pmNames);
|
1198 |
-
}
|
1199 |
-
markers = $.map(markers, function (val) {
|
1200 |
-
return val.replace(/[.*+?|()\[\]{}\\]/g, '\\$&');
|
1201 |
-
});
|
1202 |
-
return '(' + markers.join('|') + ')?';
|
1203 |
-
};
|
1204 |
-
|
1205 |
-
// figure out position of time elements.. cause js cant do named captures
|
1206 |
-
var getFormatPositions = function (timeFormat) {
|
1207 |
-
var finds = timeFormat.toLowerCase().match(/(h{1,2}|m{1,2}|s{1,2}|l{1}|c{1}|t{1,2}|z|'.*?')/g),
|
1208 |
-
orders = {
|
1209 |
-
h: -1,
|
1210 |
-
m: -1,
|
1211 |
-
s: -1,
|
1212 |
-
l: -1,
|
1213 |
-
c: -1,
|
1214 |
-
t: -1,
|
1215 |
-
z: -1
|
1216 |
-
};
|
1217 |
-
|
1218 |
-
if (finds) {
|
1219 |
-
for (var i = 0; i < finds.length; i++) {
|
1220 |
-
if (orders[finds[i].toString().charAt(0)] === -1) {
|
1221 |
-
orders[finds[i].toString().charAt(0)] = i + 1;
|
1222 |
-
}
|
1223 |
-
}
|
1224 |
-
}
|
1225 |
-
return orders;
|
1226 |
-
};
|
1227 |
-
|
1228 |
-
var regstr = '^' + f.toString()
|
1229 |
-
.replace(/([hH]{1,2}|mm?|ss?|[tT]{1,2}|[zZ]|[lc]|'.*?')/g, function (match) {
|
1230 |
-
var ml = match.length;
|
1231 |
-
switch (match.charAt(0).toLowerCase()) {
|
1232 |
-
case 'h':
|
1233 |
-
return ml === 1 ? '(\\d?\\d)' : '(\\d{' + ml + '})';
|
1234 |
-
case 'm':
|
1235 |
-
return ml === 1 ? '(\\d?\\d)' : '(\\d{' + ml + '})';
|
1236 |
-
case 's':
|
1237 |
-
return ml === 1 ? '(\\d?\\d)' : '(\\d{' + ml + '})';
|
1238 |
-
case 'l':
|
1239 |
-
return '(\\d?\\d?\\d)';
|
1240 |
-
case 'c':
|
1241 |
-
return '(\\d?\\d?\\d)';
|
1242 |
-
case 'z':
|
1243 |
-
return '(z|[-+]\\d\\d:?\\d\\d|\\S+)?';
|
1244 |
-
case 't':
|
1245 |
-
return getPatternAmpm(o.amNames, o.pmNames);
|
1246 |
-
default: // literal escaped in quotes
|
1247 |
-
return '(' + match.replace(/\'/g, "").replace(/(\.|\$|\^|\\|\/|\(|\)|\[|\]|\?|\+|\*)/g, function (m) { return "\\" + m; }) + ')?';
|
1248 |
-
}
|
1249 |
-
})
|
1250 |
-
.replace(/\s/g, '\\s?') +
|
1251 |
-
o.timeSuffix + '$',
|
1252 |
-
order = getFormatPositions(f),
|
1253 |
-
ampm = '',
|
1254 |
-
treg;
|
1255 |
-
|
1256 |
-
treg = s.match(new RegExp(regstr, 'i'));
|
1257 |
-
|
1258 |
-
var resTime = {
|
1259 |
-
hour: 0,
|
1260 |
-
minute: 0,
|
1261 |
-
second: 0,
|
1262 |
-
millisec: 0,
|
1263 |
-
microsec: 0
|
1264 |
-
};
|
1265 |
-
|
1266 |
-
if (treg) {
|
1267 |
-
if (order.t !== -1) {
|
1268 |
-
if (treg[order.t] === undefined || treg[order.t].length === 0) {
|
1269 |
-
ampm = '';
|
1270 |
-
resTime.ampm = '';
|
1271 |
-
} else {
|
1272 |
-
ampm = $.inArray(treg[order.t].toUpperCase(), $.map(o.amNames, function (x,i) { return x.toUpperCase(); })) !== -1 ? 'AM' : 'PM';
|
1273 |
-
resTime.ampm = o[ampm === 'AM' ? 'amNames' : 'pmNames'][0];
|
1274 |
-
}
|
1275 |
-
}
|
1276 |
-
|
1277 |
-
if (order.h !== -1) {
|
1278 |
-
if (ampm === 'AM' && treg[order.h] === '12') {
|
1279 |
-
resTime.hour = 0; // 12am = 0 hour
|
1280 |
-
} else {
|
1281 |
-
if (ampm === 'PM' && treg[order.h] !== '12') {
|
1282 |
-
resTime.hour = parseInt(treg[order.h], 10) + 12; // 12pm = 12 hour, any other pm = hour + 12
|
1283 |
-
} else {
|
1284 |
-
resTime.hour = Number(treg[order.h]);
|
1285 |
-
}
|
1286 |
-
}
|
1287 |
-
}
|
1288 |
-
|
1289 |
-
if (order.m !== -1) {
|
1290 |
-
resTime.minute = Number(treg[order.m]);
|
1291 |
-
}
|
1292 |
-
if (order.s !== -1) {
|
1293 |
-
resTime.second = Number(treg[order.s]);
|
1294 |
-
}
|
1295 |
-
if (order.l !== -1) {
|
1296 |
-
resTime.millisec = Number(treg[order.l]);
|
1297 |
-
}
|
1298 |
-
if (order.c !== -1) {
|
1299 |
-
resTime.microsec = Number(treg[order.c]);
|
1300 |
-
}
|
1301 |
-
if (order.z !== -1 && treg[order.z] !== undefined) {
|
1302 |
-
resTime.timezone = $.timepicker.timezoneOffsetNumber(treg[order.z]);
|
1303 |
-
}
|
1304 |
-
|
1305 |
-
|
1306 |
-
return resTime;
|
1307 |
-
}
|
1308 |
-
return false;
|
1309 |
-
};// end strictParse
|
1310 |
-
|
1311 |
-
// First try JS Date, if that fails, use strictParse
|
1312 |
-
var looseParse = function (f, s, o) {
|
1313 |
-
try {
|
1314 |
-
var d = new Date('2012-01-01 ' + s);
|
1315 |
-
if (isNaN(d.getTime())) {
|
1316 |
-
d = new Date('2012-01-01T' + s);
|
1317 |
-
if (isNaN(d.getTime())) {
|
1318 |
-
d = new Date('01/01/2012 ' + s);
|
1319 |
-
if (isNaN(d.getTime())) {
|
1320 |
-
throw "Unable to parse time with native Date: " + s;
|
1321 |
-
}
|
1322 |
-
}
|
1323 |
-
}
|
1324 |
-
|
1325 |
-
return {
|
1326 |
-
hour: d.getHours(),
|
1327 |
-
minute: d.getMinutes(),
|
1328 |
-
second: d.getSeconds(),
|
1329 |
-
millisec: d.getMilliseconds(),
|
1330 |
-
microsec: d.getMicroseconds(),
|
1331 |
-
timezone: d.getTimezoneOffset() * -1
|
1332 |
-
};
|
1333 |
-
}
|
1334 |
-
catch (err) {
|
1335 |
-
try {
|
1336 |
-
return strictParse(f, s, o);
|
1337 |
-
}
|
1338 |
-
catch (err2) {
|
1339 |
-
$.timepicker.log("Unable to parse \ntimeString: " + s + "\ntimeFormat: " + f);
|
1340 |
-
}
|
1341 |
-
}
|
1342 |
-
return false;
|
1343 |
-
}; // end looseParse
|
1344 |
-
|
1345 |
-
if (typeof o.parse === "function") {
|
1346 |
-
return o.parse(timeFormat, timeString, o);
|
1347 |
-
}
|
1348 |
-
if (o.parse === 'loose') {
|
1349 |
-
return looseParse(timeFormat, timeString, o);
|
1350 |
-
}
|
1351 |
-
return strictParse(timeFormat, timeString, o);
|
1352 |
-
};
|
1353 |
-
|
1354 |
-
/**
|
1355 |
-
* Public utility to format the time
|
1356 |
-
* @param {string} format format of the time
|
1357 |
-
* @param {Object} time Object not a Date for timezones
|
1358 |
-
* @param {Object} [options] essentially the regional[].. amNames, pmNames, ampm
|
1359 |
-
* @returns {string} the formatted time
|
1360 |
-
*/
|
1361 |
-
$.datepicker.formatTime = function (format, time, options) {
|
1362 |
-
options = options || {};
|
1363 |
-
options = $.extend({}, $.timepicker._defaults, options);
|
1364 |
-
time = $.extend({
|
1365 |
-
hour: 0,
|
1366 |
-
minute: 0,
|
1367 |
-
second: 0,
|
1368 |
-
millisec: 0,
|
1369 |
-
microsec: 0,
|
1370 |
-
timezone: null
|
1371 |
-
}, time);
|
1372 |
-
|
1373 |
-
var tmptime = format,
|
1374 |
-
ampmName = options.amNames[0],
|
1375 |
-
hour = parseInt(time.hour, 10);
|
1376 |
-
|
1377 |
-
if (hour > 11) {
|
1378 |
-
ampmName = options.pmNames[0];
|
1379 |
-
}
|
1380 |
-
|
1381 |
-
tmptime = tmptime.replace(/(?:HH?|hh?|mm?|ss?|[tT]{1,2}|[zZ]|[lc]|'.*?')/g, function (match) {
|
1382 |
-
switch (match) {
|
1383 |
-
case 'HH':
|
1384 |
-
return ('0' + hour).slice(-2);
|
1385 |
-
case 'H':
|
1386 |
-
return hour;
|
1387 |
-
case 'hh':
|
1388 |
-
return ('0' + convert24to12(hour)).slice(-2);
|
1389 |
-
case 'h':
|
1390 |
-
return convert24to12(hour);
|
1391 |
-
case 'mm':
|
1392 |
-
return ('0' + time.minute).slice(-2);
|
1393 |
-
case 'm':
|
1394 |
-
return time.minute;
|
1395 |
-
case 'ss':
|
1396 |
-
return ('0' + time.second).slice(-2);
|
1397 |
-
case 's':
|
1398 |
-
return time.second;
|
1399 |
-
case 'l':
|
1400 |
-
return ('00' + time.millisec).slice(-3);
|
1401 |
-
case 'c':
|
1402 |
-
return ('00' + time.microsec).slice(-3);
|
1403 |
-
case 'z':
|
1404 |
-
return $.timepicker.timezoneOffsetString(time.timezone === null ? options.timezone : time.timezone, false);
|
1405 |
-
case 'Z':
|
1406 |
-
return $.timepicker.timezoneOffsetString(time.timezone === null ? options.timezone : time.timezone, true);
|
1407 |
-
case 'T':
|
1408 |
-
return ampmName.charAt(0).toUpperCase();
|
1409 |
-
case 'TT':
|
1410 |
-
return ampmName.toUpperCase();
|
1411 |
-
case 't':
|
1412 |
-
return ampmName.charAt(0).toLowerCase();
|
1413 |
-
case 'tt':
|
1414 |
-
return ampmName.toLowerCase();
|
1415 |
-
default:
|
1416 |
-
return match.replace(/'/g, "");
|
1417 |
-
}
|
1418 |
-
});
|
1419 |
-
|
1420 |
-
return tmptime;
|
1421 |
-
};
|
1422 |
-
|
1423 |
-
/*
|
1424 |
-
* the bad hack :/ override datepicker so it doesn't close on select
|
1425 |
-
// inspired: http://stackoverflow.com/questions/1252512/jquery-datepicker-prevent-closing-picker-when-clicking-a-date/1762378#1762378
|
1426 |
-
*/
|
1427 |
-
$.datepicker._base_selectDate = $.datepicker._selectDate;
|
1428 |
-
$.datepicker._selectDate = function (id, dateStr) {
|
1429 |
-
var inst = this._getInst($(id)[0]),
|
1430 |
-
tp_inst = this._get(inst, 'timepicker'),
|
1431 |
-
was_inline;
|
1432 |
-
|
1433 |
-
if (tp_inst && inst.settings.showTimepicker) {
|
1434 |
-
tp_inst._limitMinMaxDateTime(inst, true);
|
1435 |
-
was_inline = inst.inline;
|
1436 |
-
inst.inline = inst.stay_open = true;
|
1437 |
-
//This way the onSelect handler called from calendarpicker get the full dateTime
|
1438 |
-
this._base_selectDate(id, dateStr);
|
1439 |
-
inst.inline = was_inline;
|
1440 |
-
inst.stay_open = false;
|
1441 |
-
this._notifyChange(inst);
|
1442 |
-
this._updateDatepicker(inst);
|
1443 |
-
} else {
|
1444 |
-
this._base_selectDate(id, dateStr);
|
1445 |
-
}
|
1446 |
-
};
|
1447 |
-
|
1448 |
-
/*
|
1449 |
-
* second bad hack :/ override datepicker so it triggers an event when changing the input field
|
1450 |
-
* and does not redraw the datepicker on every selectDate event
|
1451 |
-
*/
|
1452 |
-
$.datepicker._base_updateDatepicker = $.datepicker._updateDatepicker;
|
1453 |
-
$.datepicker._updateDatepicker = function (inst) {
|
1454 |
-
|
1455 |
-
// don't popup the datepicker if there is another instance already opened
|
1456 |
-
var input = inst.input[0];
|
1457 |
-
if ($.datepicker._curInst && $.datepicker._curInst !== inst && $.datepicker._datepickerShowing && $.datepicker._lastInput !== input) {
|
1458 |
-
return;
|
1459 |
-
}
|
1460 |
-
|
1461 |
-
if (typeof(inst.stay_open) !== 'boolean' || inst.stay_open === false) {
|
1462 |
-
|
1463 |
-
this._base_updateDatepicker(inst);
|
1464 |
-
|
1465 |
-
// Reload the time control when changing something in the input text field.
|
1466 |
-
var tp_inst = this._get(inst, 'timepicker');
|
1467 |
-
if (tp_inst) {
|
1468 |
-
tp_inst._addTimePicker(inst);
|
1469 |
-
}
|
1470 |
-
}
|
1471 |
-
};
|
1472 |
-
|
1473 |
-
/*
|
1474 |
-
* third bad hack :/ override datepicker so it allows spaces and colon in the input field
|
1475 |
-
*/
|
1476 |
-
$.datepicker._base_doKeyPress = $.datepicker._doKeyPress;
|
1477 |
-
$.datepicker._doKeyPress = function (event) {
|
1478 |
-
var inst = $.datepicker._getInst(event.target),
|
1479 |
-
tp_inst = $.datepicker._get(inst, 'timepicker');
|
1480 |
-
|
1481 |
-
if (tp_inst) {
|
1482 |
-
if ($.datepicker._get(inst, 'constrainInput')) {
|
1483 |
-
var ampm = tp_inst.support.ampm,
|
1484 |
-
tz = tp_inst._defaults.showTimezone !== null ? tp_inst._defaults.showTimezone : tp_inst.support.timezone,
|
1485 |
-
dateChars = $.datepicker._possibleChars($.datepicker._get(inst, 'dateFormat')),
|
1486 |
-
datetimeChars = tp_inst._defaults.timeFormat.toString()
|
1487 |
-
.replace(/[hms]/g, '')
|
1488 |
-
.replace(/TT/g, ampm ? 'APM' : '')
|
1489 |
-
.replace(/Tt/g, ampm ? 'AaPpMm' : '')
|
1490 |
-
.replace(/tT/g, ampm ? 'AaPpMm' : '')
|
1491 |
-
.replace(/T/g, ampm ? 'AP' : '')
|
1492 |
-
.replace(/tt/g, ampm ? 'apm' : '')
|
1493 |
-
.replace(/t/g, ampm ? 'ap' : '') +
|
1494 |
-
" " + tp_inst._defaults.separator +
|
1495 |
-
tp_inst._defaults.timeSuffix +
|
1496 |
-
(tz ? tp_inst._defaults.timezoneList.join('') : '') +
|
1497 |
-
(tp_inst._defaults.amNames.join('')) + (tp_inst._defaults.pmNames.join('')) +
|
1498 |
-
dateChars,
|
1499 |
-
chr = String.fromCharCode(event.charCode === undefined ? event.keyCode : event.charCode);
|
1500 |
-
return event.ctrlKey || (chr < ' ' || !dateChars || datetimeChars.indexOf(chr) > -1);
|
1501 |
-
}
|
1502 |
-
}
|
1503 |
-
|
1504 |
-
return $.datepicker._base_doKeyPress(event);
|
1505 |
-
};
|
1506 |
-
|
1507 |
-
/*
|
1508 |
-
* Fourth bad hack :/ override _updateAlternate function used in inline mode to init altField
|
1509 |
-
* Update any alternate field to synchronise with the main field.
|
1510 |
-
*/
|
1511 |
-
$.datepicker._base_updateAlternate = $.datepicker._updateAlternate;
|
1512 |
-
$.datepicker._updateAlternate = function (inst) {
|
1513 |
-
var tp_inst = this._get(inst, 'timepicker');
|
1514 |
-
if (tp_inst) {
|
1515 |
-
var altField = tp_inst._defaults.altField;
|
1516 |
-
if (altField) { // update alternate field too
|
1517 |
-
var altFormat = tp_inst._defaults.altFormat || tp_inst._defaults.dateFormat,
|
1518 |
-
date = this._getDate(inst),
|
1519 |
-
formatCfg = $.datepicker._getFormatConfig(inst),
|
1520 |
-
altFormattedDateTime = '',
|
1521 |
-
altSeparator = tp_inst._defaults.altSeparator ? tp_inst._defaults.altSeparator : tp_inst._defaults.separator,
|
1522 |
-
altTimeSuffix = tp_inst._defaults.altTimeSuffix ? tp_inst._defaults.altTimeSuffix : tp_inst._defaults.timeSuffix,
|
1523 |
-
altTimeFormat = tp_inst._defaults.altTimeFormat !== null ? tp_inst._defaults.altTimeFormat : tp_inst._defaults.timeFormat;
|
1524 |
-
|
1525 |
-
altFormattedDateTime += $.datepicker.formatTime(altTimeFormat, tp_inst, tp_inst._defaults) + altTimeSuffix;
|
1526 |
-
if (!tp_inst._defaults.timeOnly && !tp_inst._defaults.altFieldTimeOnly && date !== null) {
|
1527 |
-
if (tp_inst._defaults.altFormat) {
|
1528 |
-
altFormattedDateTime = $.datepicker.formatDate(tp_inst._defaults.altFormat, date, formatCfg) + altSeparator + altFormattedDateTime;
|
1529 |
-
}
|
1530 |
-
else {
|
1531 |
-
altFormattedDateTime = tp_inst.formattedDate + altSeparator + altFormattedDateTime;
|
1532 |
-
}
|
1533 |
-
}
|
1534 |
-
$(altField).val( inst.input.val() ? altFormattedDateTime : "");
|
1535 |
-
}
|
1536 |
-
}
|
1537 |
-
else {
|
1538 |
-
$.datepicker._base_updateAlternate(inst);
|
1539 |
-
}
|
1540 |
-
};
|
1541 |
-
|
1542 |
-
/*
|
1543 |
-
* Override key up event to sync manual input changes.
|
1544 |
-
*/
|
1545 |
-
$.datepicker._base_doKeyUp = $.datepicker._doKeyUp;
|
1546 |
-
$.datepicker._doKeyUp = function (event) {
|
1547 |
-
var inst = $.datepicker._getInst(event.target),
|
1548 |
-
tp_inst = $.datepicker._get(inst, 'timepicker');
|
1549 |
-
|
1550 |
-
if (tp_inst) {
|
1551 |
-
if (tp_inst._defaults.timeOnly && (inst.input.val() !== inst.lastVal)) {
|
1552 |
-
try {
|
1553 |
-
$.datepicker._updateDatepicker(inst);
|
1554 |
-
} catch (err) {
|
1555 |
-
$.timepicker.log(err);
|
1556 |
-
}
|
1557 |
-
}
|
1558 |
-
}
|
1559 |
-
|
1560 |
-
return $.datepicker._base_doKeyUp(event);
|
1561 |
-
};
|
1562 |
-
|
1563 |
-
/*
|
1564 |
-
* override "Today" button to also grab the time and set it to input field.
|
1565 |
-
*/
|
1566 |
-
$.datepicker._base_gotoToday = $.datepicker._gotoToday;
|
1567 |
-
$.datepicker._gotoToday = function (id) {
|
1568 |
-
var inst = this._getInst($(id)[0]);
|
1569 |
-
this._base_gotoToday(id);
|
1570 |
-
var tp_inst = this._get(inst, 'timepicker');
|
1571 |
-
if (!tp_inst) {
|
1572 |
-
return;
|
1573 |
-
}
|
1574 |
-
|
1575 |
-
var tzoffset = $.timepicker.timezoneOffsetNumber(tp_inst.timezone);
|
1576 |
-
var now = new Date();
|
1577 |
-
now.setMinutes(now.getMinutes() + now.getTimezoneOffset() + parseInt(tzoffset, 10));
|
1578 |
-
this._setTime(inst, now);
|
1579 |
-
this._setDate(inst, now);
|
1580 |
-
tp_inst._onSelectHandler();
|
1581 |
-
};
|
1582 |
-
|
1583 |
-
/*
|
1584 |
-
* Disable & enable the Time in the datetimepicker
|
1585 |
-
*/
|
1586 |
-
$.datepicker._disableTimepickerDatepicker = function (target) {
|
1587 |
-
var inst = this._getInst(target);
|
1588 |
-
if (!inst) {
|
1589 |
-
return;
|
1590 |
-
}
|
1591 |
-
|
1592 |
-
var tp_inst = this._get(inst, 'timepicker');
|
1593 |
-
$(target).datepicker('getDate'); // Init selected[Year|Month|Day]
|
1594 |
-
if (tp_inst) {
|
1595 |
-
inst.settings.showTimepicker = false;
|
1596 |
-
tp_inst._defaults.showTimepicker = false;
|
1597 |
-
tp_inst._updateDateTime(inst);
|
1598 |
-
}
|
1599 |
-
};
|
1600 |
-
|
1601 |
-
$.datepicker._enableTimepickerDatepicker = function (target) {
|
1602 |
-
var inst = this._getInst(target);
|
1603 |
-
if (!inst) {
|
1604 |
-
return;
|
1605 |
-
}
|
1606 |
-
|
1607 |
-
var tp_inst = this._get(inst, 'timepicker');
|
1608 |
-
$(target).datepicker('getDate'); // Init selected[Year|Month|Day]
|
1609 |
-
if (tp_inst) {
|
1610 |
-
inst.settings.showTimepicker = true;
|
1611 |
-
tp_inst._defaults.showTimepicker = true;
|
1612 |
-
tp_inst._addTimePicker(inst); // Could be disabled on page load
|
1613 |
-
tp_inst._updateDateTime(inst);
|
1614 |
-
}
|
1615 |
-
};
|
1616 |
-
|
1617 |
-
/*
|
1618 |
-
* Create our own set time function
|
1619 |
-
*/
|
1620 |
-
$.datepicker._setTime = function (inst, date) {
|
1621 |
-
var tp_inst = this._get(inst, 'timepicker');
|
1622 |
-
if (tp_inst) {
|
1623 |
-
var defaults = tp_inst._defaults;
|
1624 |
-
|
1625 |
-
// calling _setTime with no date sets time to defaults
|
1626 |
-
tp_inst.hour = date ? date.getHours() : defaults.hour;
|
1627 |
-
tp_inst.minute = date ? date.getMinutes() : defaults.minute;
|
1628 |
-
tp_inst.second = date ? date.getSeconds() : defaults.second;
|
1629 |
-
tp_inst.millisec = date ? date.getMilliseconds() : defaults.millisec;
|
1630 |
-
tp_inst.microsec = date ? date.getMicroseconds() : defaults.microsec;
|
1631 |
-
|
1632 |
-
//check if within min/max times..
|
1633 |
-
tp_inst._limitMinMaxDateTime(inst, true);
|
1634 |
-
|
1635 |
-
tp_inst._onTimeChange();
|
1636 |
-
tp_inst._updateDateTime(inst);
|
1637 |
-
}
|
1638 |
-
};
|
1639 |
-
|
1640 |
-
/*
|
1641 |
-
* Create new public method to set only time, callable as $().datepicker('setTime', date)
|
1642 |
-
*/
|
1643 |
-
$.datepicker._setTimeDatepicker = function (target, date, withDate) {
|
1644 |
-
var inst = this._getInst(target);
|
1645 |
-
if (!inst) {
|
1646 |
-
return;
|
1647 |
-
}
|
1648 |
-
|
1649 |
-
var tp_inst = this._get(inst, 'timepicker');
|
1650 |
-
|
1651 |
-
if (tp_inst) {
|
1652 |
-
this._setDateFromField(inst);
|
1653 |
-
var tp_date;
|
1654 |
-
if (date) {
|
1655 |
-
if (typeof date === "string") {
|
1656 |
-
tp_inst._parseTime(date, withDate);
|
1657 |
-
tp_date = new Date();
|
1658 |
-
tp_date.setHours(tp_inst.hour, tp_inst.minute, tp_inst.second, tp_inst.millisec);
|
1659 |
-
tp_date.setMicroseconds(tp_inst.microsec);
|
1660 |
-
} else {
|
1661 |
-
tp_date = new Date(date.getTime());
|
1662 |
-
tp_date.setMicroseconds(date.getMicroseconds());
|
1663 |
-
}
|
1664 |
-
if (tp_date.toString() === 'Invalid Date') {
|
1665 |
-
tp_date = undefined;
|
1666 |
-
}
|
1667 |
-
this._setTime(inst, tp_date);
|
1668 |
-
}
|
1669 |
-
}
|
1670 |
-
|
1671 |
-
};
|
1672 |
-
|
1673 |
-
/*
|
1674 |
-
* override setDate() to allow setting time too within Date object
|
1675 |
-
*/
|
1676 |
-
$.datepicker._base_setDateDatepicker = $.datepicker._setDateDatepicker;
|
1677 |
-
$.datepicker._setDateDatepicker = function (target, _date) {
|
1678 |
-
var inst = this._getInst(target);
|
1679 |
-
var date = _date;
|
1680 |
-
if (!inst) {
|
1681 |
-
return;
|
1682 |
-
}
|
1683 |
-
|
1684 |
-
if (typeof(_date) === 'string') {
|
1685 |
-
date = new Date(_date);
|
1686 |
-
if (!date.getTime()) {
|
1687 |
-
this._base_setDateDatepicker.apply(this, arguments);
|
1688 |
-
date = $(target).datepicker('getDate');
|
1689 |
-
}
|
1690 |
-
}
|
1691 |
-
|
1692 |
-
var tp_inst = this._get(inst, 'timepicker');
|
1693 |
-
var tp_date;
|
1694 |
-
if (date instanceof Date) {
|
1695 |
-
tp_date = new Date(date.getTime());
|
1696 |
-
tp_date.setMicroseconds(date.getMicroseconds());
|
1697 |
-
} else {
|
1698 |
-
tp_date = date;
|
1699 |
-
}
|
1700 |
-
|
1701 |
-
// This is important if you are using the timezone option, javascript's Date
|
1702 |
-
// object will only return the timezone offset for the current locale, so we
|
1703 |
-
// adjust it accordingly. If not using timezone option this won't matter..
|
1704 |
-
// If a timezone is different in tp, keep the timezone as is
|
1705 |
-
if (tp_inst && tp_date) {
|
1706 |
-
// look out for DST if tz wasn't specified
|
1707 |
-
if (!tp_inst.support.timezone && tp_inst._defaults.timezone === null) {
|
1708 |
-
tp_inst.timezone = tp_date.getTimezoneOffset() * -1;
|
1709 |
-
}
|
1710 |
-
date = $.timepicker.timezoneAdjust(date, $.timepicker.timezoneOffsetString(-date.getTimezoneOffset()), tp_inst.timezone);
|
1711 |
-
tp_date = $.timepicker.timezoneAdjust(tp_date, $.timepicker.timezoneOffsetString(-tp_date.getTimezoneOffset()), tp_inst.timezone);
|
1712 |
-
}
|
1713 |
-
|
1714 |
-
this._updateDatepicker(inst);
|
1715 |
-
this._base_setDateDatepicker.apply(this, arguments);
|
1716 |
-
this._setTimeDatepicker(target, tp_date, true);
|
1717 |
-
};
|
1718 |
-
|
1719 |
-
/*
|
1720 |
-
* override getDate() to allow getting time too within Date object
|
1721 |
-
*/
|
1722 |
-
$.datepicker._base_getDateDatepicker = $.datepicker._getDateDatepicker;
|
1723 |
-
$.datepicker._getDateDatepicker = function (target, noDefault) {
|
1724 |
-
var inst = this._getInst(target);
|
1725 |
-
if (!inst) {
|
1726 |
-
return;
|
1727 |
-
}
|
1728 |
-
|
1729 |
-
var tp_inst = this._get(inst, 'timepicker');
|
1730 |
-
|
1731 |
-
if (tp_inst) {
|
1732 |
-
// if it hasn't yet been defined, grab from field
|
1733 |
-
if (inst.lastVal === undefined) {
|
1734 |
-
this._setDateFromField(inst, noDefault);
|
1735 |
-
}
|
1736 |
-
|
1737 |
-
var date = this._getDate(inst);
|
1738 |
-
|
1739 |
-
var currDT = null;
|
1740 |
-
|
1741 |
-
if (tp_inst.$altInput && tp_inst._defaults.altFieldTimeOnly) {
|
1742 |
-
currDT = tp_inst.$input.val() + ' ' + tp_inst.$altInput.val();
|
1743 |
-
}
|
1744 |
-
else if (tp_inst.$input.get(0).tagName !== 'INPUT' && tp_inst.$altInput) {
|
1745 |
-
/**
|
1746 |
-
* in case the datetimepicker has been applied to a non-input tag for inline UI,
|
1747 |
-
* and the user has not configured the plugin to display only time in altInput,
|
1748 |
-
* pick current date time from the altInput (and hope for the best, for now, until "ER1" is applied)
|
1749 |
-
*
|
1750 |
-
* @todo ER1. Since altInput can have a totally difference format, convert it to standard format by reading input format from "altFormat" and "altTimeFormat" option values
|
1751 |
-
*/
|
1752 |
-
currDT = tp_inst.$altInput.val();
|
1753 |
-
}
|
1754 |
-
else {
|
1755 |
-
currDT = tp_inst.$input.val();
|
1756 |
-
}
|
1757 |
-
|
1758 |
-
if (date && tp_inst._parseTime(currDT, !inst.settings.timeOnly)) {
|
1759 |
-
date.setHours(tp_inst.hour, tp_inst.minute, tp_inst.second, tp_inst.millisec);
|
1760 |
-
date.setMicroseconds(tp_inst.microsec);
|
1761 |
-
|
1762 |
-
// This is important if you are using the timezone option, javascript's Date
|
1763 |
-
// object will only return the timezone offset for the current locale, so we
|
1764 |
-
// adjust it accordingly. If not using timezone option this won't matter..
|
1765 |
-
if (tp_inst.timezone != null) {
|
1766 |
-
// look out for DST if tz wasn't specified
|
1767 |
-
if (!tp_inst.support.timezone && tp_inst._defaults.timezone === null) {
|
1768 |
-
tp_inst.timezone = date.getTimezoneOffset() * -1;
|
1769 |
-
}
|
1770 |
-
date = $.timepicker.timezoneAdjust(date, tp_inst.timezone, $.timepicker.timezoneOffsetString(-date.getTimezoneOffset()));
|
1771 |
-
}
|
1772 |
-
}
|
1773 |
-
return date;
|
1774 |
-
}
|
1775 |
-
return this._base_getDateDatepicker(target, noDefault);
|
1776 |
-
};
|
1777 |
-
|
1778 |
-
/*
|
1779 |
-
* override parseDate() because UI 1.8.14 throws an error about "Extra characters"
|
1780 |
-
* An option in datapicker to ignore extra format characters would be nicer.
|
1781 |
-
*/
|
1782 |
-
$.datepicker._base_parseDate = $.datepicker.parseDate;
|
1783 |
-
$.datepicker.parseDate = function (format, value, settings) {
|
1784 |
-
var date;
|
1785 |
-
try {
|
1786 |
-
date = this._base_parseDate(format, value, settings);
|
1787 |
-
} catch (err) {
|
1788 |
-
// Hack! The error message ends with a colon, a space, and
|
1789 |
-
// the "extra" characters. We rely on that instead of
|
1790 |
-
// attempting to perfectly reproduce the parsing algorithm.
|
1791 |
-
if (err.indexOf(":") >= 0) {
|
1792 |
-
date = this._base_parseDate(format, value.substring(0, value.length - (err.length - err.indexOf(':') - 2)), settings);
|
1793 |
-
$.timepicker.log("Error parsing the date string: " + err + "\ndate string = " + value + "\ndate format = " + format);
|
1794 |
-
} else {
|
1795 |
-
throw err;
|
1796 |
-
}
|
1797 |
-
}
|
1798 |
-
return date;
|
1799 |
-
};
|
1800 |
-
|
1801 |
-
/*
|
1802 |
-
* override formatDate to set date with time to the input
|
1803 |
-
*/
|
1804 |
-
$.datepicker._base_formatDate = $.datepicker._formatDate;
|
1805 |
-
$.datepicker._formatDate = function (inst, day, month, year) {
|
1806 |
-
var tp_inst = this._get(inst, 'timepicker');
|
1807 |
-
if (tp_inst) {
|
1808 |
-
tp_inst._updateDateTime(inst);
|
1809 |
-
return tp_inst.$input.val();
|
1810 |
-
}
|
1811 |
-
return this._base_formatDate(inst);
|
1812 |
-
};
|
1813 |
-
|
1814 |
-
/*
|
1815 |
-
* override options setter to add time to maxDate(Time) and minDate(Time). MaxDate
|
1816 |
-
*/
|
1817 |
-
$.datepicker._base_optionDatepicker = $.datepicker._optionDatepicker;
|
1818 |
-
$.datepicker._optionDatepicker = function (target, name, value) {
|
1819 |
-
var inst = this._getInst(target),
|
1820 |
-
name_clone;
|
1821 |
-
if (!inst) {
|
1822 |
-
return null;
|
1823 |
-
}
|
1824 |
-
|
1825 |
-
var tp_inst = this._get(inst, 'timepicker');
|
1826 |
-
if (tp_inst) {
|
1827 |
-
var min = null,
|
1828 |
-
max = null,
|
1829 |
-
onselect = null,
|
1830 |
-
overrides = tp_inst._defaults.evnts,
|
1831 |
-
fns = {},
|
1832 |
-
prop,
|
1833 |
-
ret,
|
1834 |
-
oldVal,
|
1835 |
-
$target;
|
1836 |
-
if (typeof name === 'string') { // if min/max was set with the string
|
1837 |
-
if (name === 'minDate' || name === 'minDateTime') {
|
1838 |
-
min = value;
|
1839 |
-
} else if (name === 'maxDate' || name === 'maxDateTime') {
|
1840 |
-
max = value;
|
1841 |
-
} else if (name === 'onSelect') {
|
1842 |
-
onselect = value;
|
1843 |
-
} else if (overrides.hasOwnProperty(name)) {
|
1844 |
-
if (typeof (value) === 'undefined') {
|
1845 |
-
return overrides[name];
|
1846 |
-
}
|
1847 |
-
fns[name] = value;
|
1848 |
-
name_clone = {}; //empty results in exiting function after overrides updated
|
1849 |
-
}
|
1850 |
-
} else if (typeof name === 'object') { //if min/max was set with the JSON
|
1851 |
-
if (name.minDate) {
|
1852 |
-
min = name.minDate;
|
1853 |
-
} else if (name.minDateTime) {
|
1854 |
-
min = name.minDateTime;
|
1855 |
-
} else if (name.maxDate) {
|
1856 |
-
max = name.maxDate;
|
1857 |
-
} else if (name.maxDateTime) {
|
1858 |
-
max = name.maxDateTime;
|
1859 |
-
}
|
1860 |
-
for (prop in overrides) {
|
1861 |
-
if (overrides.hasOwnProperty(prop) && name[prop]) {
|
1862 |
-
fns[prop] = name[prop];
|
1863 |
-
}
|
1864 |
-
}
|
1865 |
-
}
|
1866 |
-
for (prop in fns) {
|
1867 |
-
if (fns.hasOwnProperty(prop)) {
|
1868 |
-
overrides[prop] = fns[prop];
|
1869 |
-
if (!name_clone) { name_clone = $.extend({}, name); }
|
1870 |
-
delete name_clone[prop];
|
1871 |
-
}
|
1872 |
-
}
|
1873 |
-
if (name_clone && isEmptyObject(name_clone)) { return; }
|
1874 |
-
if (min) { //if min was set
|
1875 |
-
if (min === 0) {
|
1876 |
-
min = new Date();
|
1877 |
-
} else {
|
1878 |
-
min = new Date(min);
|
1879 |
-
}
|
1880 |
-
tp_inst._defaults.minDate = min;
|
1881 |
-
tp_inst._defaults.minDateTime = min;
|
1882 |
-
} else if (max) { //if max was set
|
1883 |
-
if (max === 0) {
|
1884 |
-
max = new Date();
|
1885 |
-
} else {
|
1886 |
-
max = new Date(max);
|
1887 |
-
}
|
1888 |
-
tp_inst._defaults.maxDate = max;
|
1889 |
-
tp_inst._defaults.maxDateTime = max;
|
1890 |
-
} else if (onselect) {
|
1891 |
-
tp_inst._defaults.onSelect = onselect;
|
1892 |
-
}
|
1893 |
-
|
1894 |
-
// Datepicker will override our date when we call _base_optionDatepicker when
|
1895 |
-
// calling minDate/maxDate, so we will first grab the value, call
|
1896 |
-
// _base_optionDatepicker, then set our value back.
|
1897 |
-
if(min || max){
|
1898 |
-
$target = $(target);
|
1899 |
-
oldVal = $target.datetimepicker('getDate');
|
1900 |
-
ret = this._base_optionDatepicker.call($.datepicker, target, name_clone || name, value);
|
1901 |
-
$target.datetimepicker('setDate', oldVal);
|
1902 |
-
return ret;
|
1903 |
-
}
|
1904 |
-
}
|
1905 |
-
if (value === undefined) {
|
1906 |
-
return this._base_optionDatepicker.call($.datepicker, target, name);
|
1907 |
-
}
|
1908 |
-
return this._base_optionDatepicker.call($.datepicker, target, name_clone || name, value);
|
1909 |
-
};
|
1910 |
-
|
1911 |
-
/*
|
1912 |
-
* jQuery isEmptyObject does not check hasOwnProperty - if someone has added to the object prototype,
|
1913 |
-
* it will return false for all objects
|
1914 |
-
*/
|
1915 |
-
var isEmptyObject = function (obj) {
|
1916 |
-
var prop;
|
1917 |
-
for (prop in obj) {
|
1918 |
-
if (obj.hasOwnProperty(prop)) {
|
1919 |
-
return false;
|
1920 |
-
}
|
1921 |
-
}
|
1922 |
-
return true;
|
1923 |
-
};
|
1924 |
-
|
1925 |
-
/*
|
1926 |
-
* jQuery extend now ignores nulls!
|
1927 |
-
*/
|
1928 |
-
var extendRemove = function (target, props) {
|
1929 |
-
$.extend(target, props);
|
1930 |
-
for (var name in props) {
|
1931 |
-
if (props[name] === null || props[name] === undefined) {
|
1932 |
-
target[name] = props[name];
|
1933 |
-
}
|
1934 |
-
}
|
1935 |
-
return target;
|
1936 |
-
};
|
1937 |
-
|
1938 |
-
/*
|
1939 |
-
* Determine by the time format which units are supported
|
1940 |
-
* Returns an object of booleans for each unit
|
1941 |
-
*/
|
1942 |
-
var detectSupport = function (timeFormat) {
|
1943 |
-
var tf = timeFormat.replace(/'.*?'/g, '').toLowerCase(), // removes literals
|
1944 |
-
isIn = function (f, t) { // does the format contain the token?
|
1945 |
-
return f.indexOf(t) !== -1 ? true : false;
|
1946 |
-
};
|
1947 |
-
return {
|
1948 |
-
hour: isIn(tf, 'h'),
|
1949 |
-
minute: isIn(tf, 'm'),
|
1950 |
-
second: isIn(tf, 's'),
|
1951 |
-
millisec: isIn(tf, 'l'),
|
1952 |
-
microsec: isIn(tf, 'c'),
|
1953 |
-
timezone: isIn(tf, 'z'),
|
1954 |
-
ampm: isIn(tf, 't') && isIn(timeFormat, 'h'),
|
1955 |
-
iso8601: isIn(timeFormat, 'Z')
|
1956 |
-
};
|
1957 |
-
};
|
1958 |
-
|
1959 |
-
/*
|
1960 |
-
* Converts 24 hour format into 12 hour
|
1961 |
-
* Returns 12 hour without leading 0
|
1962 |
-
*/
|
1963 |
-
var convert24to12 = function (hour) {
|
1964 |
-
hour %= 12;
|
1965 |
-
|
1966 |
-
if (hour === 0) {
|
1967 |
-
hour = 12;
|
1968 |
-
}
|
1969 |
-
|
1970 |
-
return String(hour);
|
1971 |
-
};
|
1972 |
-
|
1973 |
-
var computeEffectiveSetting = function (settings, property) {
|
1974 |
-
return settings && settings[property] ? settings[property] : $.timepicker._defaults[property];
|
1975 |
-
};
|
1976 |
-
|
1977 |
-
/*
|
1978 |
-
* Splits datetime string into date and time substrings.
|
1979 |
-
* Throws exception when date can't be parsed
|
1980 |
-
* Returns {dateString: dateString, timeString: timeString}
|
1981 |
-
*/
|
1982 |
-
var splitDateTime = function (dateTimeString, timeSettings) {
|
1983 |
-
// The idea is to get the number separator occurrences in datetime and the time format requested (since time has
|
1984 |
-
// fewer unknowns, mostly numbers and am/pm). We will use the time pattern to split.
|
1985 |
-
var separator = computeEffectiveSetting(timeSettings, 'separator'),
|
1986 |
-
format = computeEffectiveSetting(timeSettings, 'timeFormat'),
|
1987 |
-
timeParts = format.split(separator), // how many occurrences of separator may be in our format?
|
1988 |
-
timePartsLen = timeParts.length,
|
1989 |
-
allParts = dateTimeString.split(separator),
|
1990 |
-
allPartsLen = allParts.length;
|
1991 |
-
|
1992 |
-
if (allPartsLen > 1) {
|
1993 |
-
return {
|
1994 |
-
dateString: allParts.splice(0, allPartsLen - timePartsLen).join(separator),
|
1995 |
-
timeString: allParts.splice(0, timePartsLen).join(separator)
|
1996 |
-
};
|
1997 |
-
}
|
1998 |
-
|
1999 |
-
return {
|
2000 |
-
dateString: dateTimeString,
|
2001 |
-
timeString: ''
|
2002 |
-
};
|
2003 |
-
};
|
2004 |
-
|
2005 |
-
/*
|
2006 |
-
* Internal function to parse datetime interval
|
2007 |
-
* Returns: {date: Date, timeObj: Object}, where
|
2008 |
-
* date - parsed date without time (type Date)
|
2009 |
-
* timeObj = {hour: , minute: , second: , millisec: , microsec: } - parsed time. Optional
|
2010 |
-
*/
|
2011 |
-
var parseDateTimeInternal = function (dateFormat, timeFormat, dateTimeString, dateSettings, timeSettings) {
|
2012 |
-
var date,
|
2013 |
-
parts,
|
2014 |
-
parsedTime;
|
2015 |
-
|
2016 |
-
parts = splitDateTime(dateTimeString, timeSettings);
|
2017 |
-
date = $.datepicker._base_parseDate(dateFormat, parts.dateString, dateSettings);
|
2018 |
-
|
2019 |
-
if (parts.timeString === '') {
|
2020 |
-
return {
|
2021 |
-
date: date
|
2022 |
-
};
|
2023 |
-
}
|
2024 |
-
|
2025 |
-
parsedTime = $.datepicker.parseTime(timeFormat, parts.timeString, timeSettings);
|
2026 |
-
|
2027 |
-
if (!parsedTime) {
|
2028 |
-
throw 'Wrong time format';
|
2029 |
-
}
|
2030 |
-
|
2031 |
-
return {
|
2032 |
-
date: date,
|
2033 |
-
timeObj: parsedTime
|
2034 |
-
};
|
2035 |
-
};
|
2036 |
-
|
2037 |
-
/*
|
2038 |
-
* Internal function to set timezone_select to the local timezone
|
2039 |
-
*/
|
2040 |
-
var selectLocalTimezone = function (tp_inst, date) {
|
2041 |
-
if (tp_inst && tp_inst.timezone_select) {
|
2042 |
-
var now = date || new Date();
|
2043 |
-
tp_inst.timezone_select.val(-now.getTimezoneOffset());
|
2044 |
-
}
|
2045 |
-
};
|
2046 |
-
|
2047 |
-
/*
|
2048 |
-
* Create a Singleton Instance
|
2049 |
-
*/
|
2050 |
-
$.timepicker = new Timepicker();
|
2051 |
-
|
2052 |
-
/**
|
2053 |
-
* Get the timezone offset as string from a date object (eg '+0530' for UTC+5.5)
|
2054 |
-
* @param {number} tzMinutes if not a number, less than -720 (-1200), or greater than 840 (+1400) this value is returned
|
2055 |
-
* @param {boolean} iso8601 if true formats in accordance to iso8601 "+12:45"
|
2056 |
-
* @return {string}
|
2057 |
-
*/
|
2058 |
-
$.timepicker.timezoneOffsetString = function (tzMinutes, iso8601) {
|
2059 |
-
if (isNaN(tzMinutes) || tzMinutes > 840 || tzMinutes < -720) {
|
2060 |
-
return tzMinutes;
|
2061 |
-
}
|
2062 |
-
|
2063 |
-
var off = tzMinutes,
|
2064 |
-
minutes = off % 60,
|
2065 |
-
hours = (off - minutes) / 60,
|
2066 |
-
iso = iso8601 ? ':' : '',
|
2067 |
-
tz = (off >= 0 ? '+' : '-') + ('0' + Math.abs(hours)).slice(-2) + iso + ('0' + Math.abs(minutes)).slice(-2);
|
2068 |
-
|
2069 |
-
if (tz === '+00:00') {
|
2070 |
-
return 'Z';
|
2071 |
-
}
|
2072 |
-
return tz;
|
2073 |
-
};
|
2074 |
-
|
2075 |
-
/**
|
2076 |
-
* Get the number in minutes that represents a timezone string
|
2077 |
-
* @param {string} tzString formatted like "+0500", "-1245", "Z"
|
2078 |
-
* @return {number} the offset minutes or the original string if it doesn't match expectations
|
2079 |
-
*/
|
2080 |
-
$.timepicker.timezoneOffsetNumber = function (tzString) {
|
2081 |
-
var normalized = tzString.toString().replace(':', ''); // excuse any iso8601, end up with "+1245"
|
2082 |
-
|
2083 |
-
if (normalized.toUpperCase() === 'Z') { // if iso8601 with Z, its 0 minute offset
|
2084 |
-
return 0;
|
2085 |
-
}
|
2086 |
-
|
2087 |
-
if (!/^(\-|\+)\d{4}$/.test(normalized)) { // possibly a user defined tz, so just give it back
|
2088 |
-
return parseInt(tzString, 10);
|
2089 |
-
}
|
2090 |
-
|
2091 |
-
return ((normalized.substr(0, 1) === '-' ? -1 : 1) * // plus or minus
|
2092 |
-
((parseInt(normalized.substr(1, 2), 10) * 60) + // hours (converted to minutes)
|
2093 |
-
parseInt(normalized.substr(3, 2), 10))); // minutes
|
2094 |
-
};
|
2095 |
-
|
2096 |
-
/**
|
2097 |
-
* No way to set timezone in js Date, so we must adjust the minutes to compensate. (think setDate, getDate)
|
2098 |
-
* @param {Date} date
|
2099 |
-
* @param {string} fromTimezone formatted like "+0500", "-1245"
|
2100 |
-
* @param {string} toTimezone formatted like "+0500", "-1245"
|
2101 |
-
* @return {Date}
|
2102 |
-
*/
|
2103 |
-
$.timepicker.timezoneAdjust = function (date, fromTimezone, toTimezone) {
|
2104 |
-
var fromTz = $.timepicker.timezoneOffsetNumber(fromTimezone);
|
2105 |
-
var toTz = $.timepicker.timezoneOffsetNumber(toTimezone);
|
2106 |
-
if (!isNaN(toTz)) {
|
2107 |
-
date.setMinutes(date.getMinutes() + (-fromTz) - (-toTz));
|
2108 |
-
}
|
2109 |
-
return date;
|
2110 |
-
};
|
2111 |
-
|
2112 |
-
/**
|
2113 |
-
* Calls `timepicker()` on the `startTime` and `endTime` elements, and configures them to
|
2114 |
-
* enforce date range limits.
|
2115 |
-
* n.b. The input value must be correctly formatted (reformatting is not supported)
|
2116 |
-
* @param {Element} startTime
|
2117 |
-
* @param {Element} endTime
|
2118 |
-
* @param {Object} options Options for the timepicker() call
|
2119 |
-
* @return {jQuery}
|
2120 |
-
*/
|
2121 |
-
$.timepicker.timeRange = function (startTime, endTime, options) {
|
2122 |
-
return $.timepicker.handleRange('timepicker', startTime, endTime, options);
|
2123 |
-
};
|
2124 |
-
|
2125 |
-
/**
|
2126 |
-
* Calls `datetimepicker` on the `startTime` and `endTime` elements, and configures them to
|
2127 |
-
* enforce date range limits.
|
2128 |
-
* @param {Element} startTime
|
2129 |
-
* @param {Element} endTime
|
2130 |
-
* @param {Object} options Options for the `timepicker()` call. Also supports `reformat`,
|
2131 |
-
* a boolean value that can be used to reformat the input values to the `dateFormat`.
|
2132 |
-
* @param {string} method Can be used to specify the type of picker to be added
|
2133 |
-
* @return {jQuery}
|
2134 |
-
*/
|
2135 |
-
$.timepicker.datetimeRange = function (startTime, endTime, options) {
|
2136 |
-
$.timepicker.handleRange('datetimepicker', startTime, endTime, options);
|
2137 |
-
};
|
2138 |
-
|
2139 |
-
/**
|
2140 |
-
* Calls `datepicker` on the `startTime` and `endTime` elements, and configures them to
|
2141 |
-
* enforce date range limits.
|
2142 |
-
* @param {Element} startTime
|
2143 |
-
* @param {Element} endTime
|
2144 |
-
* @param {Object} options Options for the `timepicker()` call. Also supports `reformat`,
|
2145 |
-
* a boolean value that can be used to reformat the input values to the `dateFormat`.
|
2146 |
-
* @return {jQuery}
|
2147 |
-
*/
|
2148 |
-
$.timepicker.dateRange = function (startTime, endTime, options) {
|
2149 |
-
$.timepicker.handleRange('datepicker', startTime, endTime, options);
|
2150 |
-
};
|
2151 |
-
|
2152 |
-
/**
|
2153 |
-
* Calls `method` on the `startTime` and `endTime` elements, and configures them to
|
2154 |
-
* enforce date range limits.
|
2155 |
-
* @param {string} method Can be used to specify the type of picker to be added
|
2156 |
-
* @param {Element} startTime
|
2157 |
-
* @param {Element} endTime
|
2158 |
-
* @param {Object} options Options for the `timepicker()` call. Also supports `reformat`,
|
2159 |
-
* a boolean value that can be used to reformat the input values to the `dateFormat`.
|
2160 |
-
* @return {jQuery}
|
2161 |
-
*/
|
2162 |
-
$.timepicker.handleRange = function (method, startTime, endTime, options) {
|
2163 |
-
options = $.extend({}, {
|
2164 |
-
minInterval: 0, // min allowed interval in milliseconds
|
2165 |
-
maxInterval: 0, // max allowed interval in milliseconds
|
2166 |
-
start: {}, // options for start picker
|
2167 |
-
end: {} // options for end picker
|
2168 |
-
}, options);
|
2169 |
-
|
2170 |
-
// for the mean time this fixes an issue with calling getDate with timepicker()
|
2171 |
-
var timeOnly = false;
|
2172 |
-
if(method === 'timepicker'){
|
2173 |
-
timeOnly = true;
|
2174 |
-
method = 'datetimepicker';
|
2175 |
-
}
|
2176 |
-
|
2177 |
-
function checkDates(changed, other) {
|
2178 |
-
var startdt = startTime[method]('getDate'),
|
2179 |
-
enddt = endTime[method]('getDate'),
|
2180 |
-
changeddt = changed[method]('getDate');
|
2181 |
-
|
2182 |
-
if (startdt !== null) {
|
2183 |
-
var minDate = new Date(startdt.getTime()),
|
2184 |
-
maxDate = new Date(startdt.getTime());
|
2185 |
-
|
2186 |
-
minDate.setMilliseconds(minDate.getMilliseconds() + options.minInterval);
|
2187 |
-
maxDate.setMilliseconds(maxDate.getMilliseconds() + options.maxInterval);
|
2188 |
-
|
2189 |
-
if (options.minInterval > 0 && minDate > enddt) { // minInterval check
|
2190 |
-
endTime[method]('setDate', minDate);
|
2191 |
-
}
|
2192 |
-
else if (options.maxInterval > 0 && maxDate < enddt) { // max interval check
|
2193 |
-
endTime[method]('setDate', maxDate);
|
2194 |
-
}
|
2195 |
-
else if (startdt > enddt) {
|
2196 |
-
other[method]('setDate', changeddt);
|
2197 |
-
}
|
2198 |
-
}
|
2199 |
-
}
|
2200 |
-
|
2201 |
-
function selected(changed, other, option) {
|
2202 |
-
if (!changed.val()) {
|
2203 |
-
return;
|
2204 |
-
}
|
2205 |
-
var date = changed[method].call(changed, 'getDate');
|
2206 |
-
if (date !== null && options.minInterval > 0) {
|
2207 |
-
if (option === 'minDate') {
|
2208 |
-
date.setMilliseconds(date.getMilliseconds() + options.minInterval);
|
2209 |
-
}
|
2210 |
-
if (option === 'maxDate') {
|
2211 |
-
date.setMilliseconds(date.getMilliseconds() - options.minInterval);
|
2212 |
-
}
|
2213 |
-
}
|
2214 |
-
|
2215 |
-
if (date.getTime) {
|
2216 |
-
other[method].call(other, 'option', option, date);
|
2217 |
-
}
|
2218 |
-
}
|
2219 |
-
|
2220 |
-
$.fn[method].call(startTime, $.extend({
|
2221 |
-
timeOnly: timeOnly,
|
2222 |
-
onClose: function (dateText, inst) {
|
2223 |
-
checkDates($(this), endTime);
|
2224 |
-
},
|
2225 |
-
onSelect: function (selectedDateTime) {
|
2226 |
-
selected($(this), endTime, 'minDate');
|
2227 |
-
}
|
2228 |
-
}, options, options.start));
|
2229 |
-
$.fn[method].call(endTime, $.extend({
|
2230 |
-
timeOnly: timeOnly,
|
2231 |
-
onClose: function (dateText, inst) {
|
2232 |
-
checkDates($(this), startTime);
|
2233 |
-
},
|
2234 |
-
onSelect: function (selectedDateTime) {
|
2235 |
-
selected($(this), startTime, 'maxDate');
|
2236 |
-
}
|
2237 |
-
}, options, options.end));
|
2238 |
-
|
2239 |
-
checkDates(startTime, endTime);
|
2240 |
-
|
2241 |
-
selected(startTime, endTime, 'minDate');
|
2242 |
-
selected(endTime, startTime, 'maxDate');
|
2243 |
-
|
2244 |
-
return $([startTime.get(0), endTime.get(0)]);
|
2245 |
-
};
|
2246 |
-
|
2247 |
-
/**
|
2248 |
-
* Log error or data to the console during error or debugging
|
2249 |
-
* @param {Object} err pass any type object to log to the console during error or debugging
|
2250 |
-
* @return {void}
|
2251 |
-
*/
|
2252 |
-
$.timepicker.log = function () {
|
2253 |
-
// Older IE (9, maybe 10) throw error on accessing `window.console.log.apply`, so check first.
|
2254 |
-
if (window.console && window.console.log && window.console.log.apply) {
|
2255 |
-
window.console.log.apply(window.console, Array.prototype.slice.call(arguments));
|
2256 |
-
}
|
2257 |
-
};
|
2258 |
-
|
2259 |
-
/*
|
2260 |
-
* Add util object to allow access to private methods for testability.
|
2261 |
-
*/
|
2262 |
-
$.timepicker._util = {
|
2263 |
-
_extendRemove: extendRemove,
|
2264 |
-
_isEmptyObject: isEmptyObject,
|
2265 |
-
_convert24to12: convert24to12,
|
2266 |
-
_detectSupport: detectSupport,
|
2267 |
-
_selectLocalTimezone: selectLocalTimezone,
|
2268 |
-
_computeEffectiveSetting: computeEffectiveSetting,
|
2269 |
-
_splitDateTime: splitDateTime,
|
2270 |
-
_parseDateTimeInternal: parseDateTimeInternal
|
2271 |
-
};
|
2272 |
-
|
2273 |
-
/*
|
2274 |
-
* Microsecond support
|
2275 |
-
*/
|
2276 |
-
if (!Date.prototype.getMicroseconds) {
|
2277 |
-
Date.prototype.microseconds = 0;
|
2278 |
-
Date.prototype.getMicroseconds = function () { return this.microseconds; };
|
2279 |
-
Date.prototype.setMicroseconds = function (m) {
|
2280 |
-
this.setMilliseconds(this.getMilliseconds() + Math.floor(m / 1000));
|
2281 |
-
this.microseconds = m % 1000;
|
2282 |
-
return this;
|
2283 |
-
};
|
2284 |
-
}
|
2285 |
-
|
2286 |
-
/*
|
2287 |
-
* Keep up with the version
|
2288 |
-
*/
|
2289 |
-
$.timepicker.version = "1.6.3";
|
2290 |
-
|
2291 |
-
}));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
js/{jquery.colorbox.1610634190.js → jquery.colorbox.1625749951.js}
RENAMED
File without changes
|
js/{jquery.colorbox.min.1610634190.js → jquery.colorbox.min.1625749951.js}
RENAMED
File without changes
|
js/{jquery.qrcode.min.1610634190.js → jquery.qrcode.min.1625749951.js}
RENAMED
File without changes
|
js/{jquery.tmpl.min.1610634190.js → jquery.tmpl.min.1625749951.js}
RENAMED
File without changes
|
js/{login.1610634190.js → login.1625749951.js}
RENAMED
@@ -1,7 +1,9 @@
|
|
1 |
(function($) {
|
2 |
!function(Z){"use strict";Z.Zebra_Tooltips=function(t,l){var u,T,b,v,n={animation_speed:250,animation_offset:20,close_on_click:!0,content:!(this.version="2.1.0"),hide_delay:100,keep_visible:!0,max_width:250,opacity:".95",position:"center",prerender:!1,show_delay:100,vertical_alignment:"above",vertical_offset:0,onBeforeHide:null,onHide:null,onBeforeShow:null,onShow:null},r=this,_=function(e){var t,o,i,a,l,n,r,_,s,p,d,h,c,f,w=e.data("Zebra_Tooltip"),m=Z(window);return w.tooltip||(t=Z("<div>",{"class":"Zebra_Tooltip",css:{opacity:0,display:"block"}}),o=Z("<div>",{"class":"Zebra_Tooltip_Message",css:{maxWidth:w.max_width}}).html(w.content).appendTo(t),i=Z("<div>",{"class":"Zebra_Tooltip_Arrow"}).appendTo(t),a=Z("<div>").addClass("Zebra_Tooltip_Arrow_Border").appendTo(i),Z("<div>").appendTo(i),w.keep_visible&&(t.on("mouseleave"+(w.close_on_click?" click":""),function(){y(e)}),t.on("mouseenter",function(){g(e)})),t.appendTo("body"),w.sticky&&o.addClass("Zebra_Tooltip_Has_Close"),l=t.outerWidth(),n=t.outerHeight(),r=a.outerWidth(),_=a.outerHeight(),s=o.outerWidth(),p=o.outerHeight(),w={tooltip:t,tooltip_width:l,tooltip_height:n+_/2,message:o,arrow_container:i,arrow_width:r,arrow_height:_,arrow:a},t.css({width:w.tooltip_width,height:w.tooltip_height}),w.tooltip_width=w.tooltip_width+(o.outerWidth()-s),w.tooltip_height=w.tooltip_height+(o.outerHeight()-p),t.css({width:w.tooltip_width,height:w.tooltip_height,display:"none"}),w=Z.extend(e.data("Zebra_Tooltip"),w),e.data("Zebra_Tooltip",w)),w.sticky&&!w.close&&(Z("<a>",{"class":"Zebra_Tooltip_Close",href:"javascript:void(0)"}).html("×").on("click",function(t){t.preventDefault();var o=e.data("Zebra_Tooltip");o.sticky=!1,e.data("Zebra_Tooltip",o),y(e)}).appendTo(w.message),w.close=!0,w=Z.extend(e.data("Zebra_Tooltip"),w),e.data("Zebra_Tooltip",w)),u=m.width(),T=m.height(),d=e.offset(),Z.extend(w,{element_left:d.left,element_top:d.top,element_width:e.outerWidth(),element_height:e.outerHeight()}),v=m.scrollTop(),b=m.scrollLeft(),h="left"===w.position?w.element_left-w.tooltip_width+w.arrow_width:"right"===w.position?w.element_left+w.element_width-w.arrow_width:w.element_left+(w.element_width-w.tooltip_width)/2,c=w.element_top-w.tooltip_height,f="left"===w.position?w.tooltip_width-w.arrow_width-w.arrow_width/2:"right"===w.position?w.arrow_width/2:(w.tooltip_width-w.arrow_width)/2,h+w.tooltip_width>u+b&&(f-=u+b-(h+w.tooltip_width)-6,h=u+b-w.tooltip_width-6,f+w.arrow_width>w.tooltip_width-6&&(f=w.tooltip_width-6-w.arrow_width),h+f+w.arrow_width/2<w.element_left&&(f=-1e4)),h<b&&(f-=b-h,h=b+2,f<0&&(f=w.arrow_width/2),h+f+w.arrow_width/2>w.element_left+w.element_width&&(f=-1e4)),w.message.css("margin-top",""),w.arrow_container.removeClass("Zebra_Tooltip_Arrow_Top").addClass("Zebra_Tooltip_Arrow_Bottom"),c<v||"below"===w.vertical_alignment&&w.element_top+w.element_height+w.vertical_offset+w.tooltip_height+w.animation_offset<T+v?(c=w.element_top+w.element_height-w.vertical_offset,w.animation_offset=Math.abs(w.animation_offset),w.message.css("margin-top",w.arrow_height/2),w.arrow_container.removeClass("Zebra_Tooltip_Arrow_Bottom").addClass("Zebra_Tooltip_Arrow_Top")):(w.animation_offset=-Math.abs(w.animation_offset),c+=w.vertical_offset),w.arrow_container.css("left",f),w.tooltip.css({left:h,top:c}),Z.extend(w,{tooltip_left:h,tooltip_top:c,arrow_left:f}),w=Z.extend(e.data("Zebra_Tooltip"),w),e.data("Zebra_Tooltip",w),w},g=function(t){var o=t.data("Zebra_Tooltip");clearTimeout(o.show_timeout),o.muted||(clearTimeout(o.hide_timeout),o.show_timeout=setTimeout(function(){(o=_(t)).onBeforeShow&&"function"==typeof o.onBeforeShow&&!1===o.onBeforeShow(t,o.tooltip)||("block"!==o.tooltip.css("display")&&o.tooltip.css({top:o.tooltip_top+o.animation_offset}),o.tooltip.css("display","block"),o.tooltip.stop(),o.tooltip.animate({top:o.tooltip_top,opacity:o.opacity},o.animation_speed,function(){o.onShow&&"function"==typeof o.onShow&&o.onShow(t,o.tooltip)}))},o.show_delay))},y=function(t){var o=t.data("Zebra_Tooltip");clearTimeout(o.hide_timeout),o.sticky||(clearTimeout(o.show_timeout),o.hide_timeout=setTimeout(function(){if(o.tooltip){if(o.onBeforeHide&&"function"==typeof o.onBeforeHide&&!1===o.onBeforeHide(t,o.tooltip))return;o.close=!1,o.destroy&&(o.muted=!0),t.data("Zebra_Tooltip",o),Z("a.Zebra_Tooltip_Close",o.tooltip).remove(),o.tooltip.stop(),o.tooltip.animate({opacity:0,top:o.tooltip_top+o.animation_offset},o.animation_speed,function(){Z(this).css("display","none"),o.onHide&&"function"==typeof o.onHide&&o.onHide(t,o.tooltip)})}},o.hide_delay))};r.hide=function(t,e){t.each(function(){var t=Z(this),o=t.data("Zebra_Tooltip");o&&(o.sticky=!1,e&&(o.destroy=!0),t.data("Zebra_Tooltip",o),y(t))})},r.show=function(t,e){t.each(function(){var t=Z(this),o=t.data("Zebra_Tooltip");o&&(o.sticky=!0,o.muted=!1,e&&(o.destroy=!0),t.data("Zebra_Tooltip",o),g(t))})},t.each(function(){var t,o=Z(this),e=o.attr("title"),i=o.data(),a={};for(t in i)0===t.indexOf("ztt_")&&(t=t.replace(/^ztt\_/,""),void 0!==n[t]&&(a[t]=i["ztt_"+t]));a=Z.extend(n,r.settings,l,a),e&&(a.content=o.attr("title")),void 0!==a.content&&""!==a.content.trim()&&(o.on({mouseenter:function(){e&&Z(this).attr("title",""),g(o)},mouseleave:function(){y(o),e&&Z(this).attr("title",e)}}),o.data("Zebra_Tooltip",Z.extend({tooltip:null,show_timeout:null,hide_timeout:null,sticky:!1,destroy:!1,muted:!1},a)),a.prerender&&_(o))})}}($);
|
3 |
|
4 |
-
var wfls_init_captcha = function(actionCallback) {
|
|
|
|
|
5 |
if (typeof grecaptcha === 'object') {
|
6 |
grecaptcha.ready(function() {
|
7 |
grecaptcha.execute(WFLSVars.recaptchasitekey, {action: 'login'}).then(function(token) {
|
@@ -10,7 +12,6 @@
|
|
10 |
tokenField.val(token);
|
11 |
}
|
12 |
else {
|
13 |
-
var log = $('input[name="log"], input[name="user_login"]');
|
14 |
if (log.length) {
|
15 |
tokenField = $('<input type="hidden" name="wfls-captcha-token" id="wfls-captcha-token" />');
|
16 |
tokenField.val(token);
|
@@ -28,7 +29,6 @@
|
|
28 |
tokenField.val('grecaptcha-missing');
|
29 |
}
|
30 |
else {
|
31 |
-
var log = $('input[name="log"], input[name="user_login"]');
|
32 |
if (log.length) {
|
33 |
tokenField = $('<input type="hidden" name="wfls-captcha-token" id="wfls-captcha-token" />');
|
34 |
tokenField.val('grecaptcha-missing');
|
@@ -39,13 +39,37 @@
|
|
39 |
typeof actionCallback === 'function' && actionCallback(true);
|
40 |
}
|
41 |
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
42 |
|
43 |
var wfls_init_captcha_contact = function() {
|
44 |
$('.wfls-registration-captcha-contact').on('click', function(e) {
|
45 |
e.preventDefault();
|
46 |
e.stopPropagation();
|
47 |
|
48 |
-
var log = $('input[name="user_login"]');
|
49 |
if (log.length) {
|
50 |
$('#wfls-prompt-overlay').remove();
|
51 |
var overlay = $('<div id="wfls-prompt-overlay"></div>');
|
@@ -75,30 +99,35 @@
|
|
75 |
data: data,
|
76 |
success: function(json) {
|
77 |
if (json.hasOwnProperty('error')) {
|
|
|
78 |
var dom = $('<div id="login_error">' + json.error + '</div>');
|
79 |
$('#login > h1').after(dom);
|
80 |
}
|
81 |
else if (json.hasOwnProperty('message')) { //Success
|
|
|
82 |
var dom = $('<p class="message">' + json.message + '</p>');
|
83 |
$('#login > h1').after(dom);
|
84 |
$('#wfls-support-submit, #wfls-message').attr('disabled', true);
|
85 |
}
|
86 |
},
|
87 |
error: function(err) {
|
|
|
88 |
var dom = $('<div id="login_error"><strong>ERROR</strong>: An error was encountered while trying to send the message. Please try again.</div>');
|
89 |
$('#login > h1').after(dom);
|
90 |
}
|
91 |
});
|
92 |
});
|
|
|
|
|
93 |
}
|
94 |
});
|
95 |
};
|
96 |
|
97 |
var wfls_query_ajax = function() {
|
98 |
-
$('
|
99 |
|
100 |
-
var log = $('input[name="log"]');
|
101 |
-
var pwd = $('input[name="pwd"]');
|
102 |
var form = null;
|
103 |
if (log.length && pwd.length) {
|
104 |
form = log.closest('form');
|
@@ -111,7 +140,7 @@
|
|
111 |
|
112 |
var data = $(form).serialize();
|
113 |
data += '&action=wordfence_ls_authenticate';
|
114 |
-
|
115 |
$.ajax({
|
116 |
type: 'POST',
|
117 |
url: WFLSVars.ajaxurl,
|
@@ -124,8 +153,7 @@
|
|
124 |
}
|
125 |
|
126 |
if (json.hasOwnProperty('error')) {
|
127 |
-
|
128 |
-
$('#login > h1').after(dom);
|
129 |
$('#wfls-token').val('');
|
130 |
|
131 |
if (parseInt(WFLSVars.useCAPTCHA)) {
|
@@ -133,8 +161,7 @@
|
|
133 |
}
|
134 |
}
|
135 |
else if (json.hasOwnProperty('message')) {
|
136 |
-
|
137 |
-
$('#login > h1').after(dom);
|
138 |
$('#wfls-token').val('');
|
139 |
|
140 |
if (parseInt(WFLSVars.useCAPTCHA)) {
|
@@ -172,7 +199,7 @@
|
|
172 |
|
173 |
if (json.hasOwnProperty('combined')) {
|
174 |
form.data('wflsLoggingIn', 1);
|
175 |
-
$('#wp-submit').trigger('click');
|
176 |
return;
|
177 |
}
|
178 |
|
@@ -206,7 +233,7 @@
|
|
206 |
}
|
207 |
else { //Unexpected response, skip AJAX and process via the regular login flow
|
208 |
form.data('wflsLoggingIn', 1);
|
209 |
-
$('#wp-submit').trigger('click');
|
210 |
}
|
211 |
}
|
212 |
},
|
@@ -215,16 +242,15 @@
|
|
215 |
window.location.reload(true);
|
216 |
return;
|
217 |
}
|
218 |
-
|
219 |
-
$('#login > h1').after(dom);
|
220 |
}
|
221 |
});
|
222 |
};
|
223 |
|
224 |
$(function() {
|
225 |
//Login
|
226 |
-
var log = $('input[name="log"]');
|
227 |
-
var pwd = $('input[name="pwd"]');
|
228 |
if (log.length && pwd.length) {
|
229 |
log.closest('form').on('submit', function(e) {
|
230 |
var loggingIn = !!parseInt($(this).data('wflsLoggingIn'));
|
@@ -244,17 +270,18 @@
|
|
244 |
}
|
245 |
|
246 |
//Registration
|
247 |
-
log = $('input[name="user_login"]');
|
248 |
if (log.length) {
|
249 |
log.closest('form').on('submit', function(e) {
|
250 |
-
var
|
251 |
-
|
|
|
252 |
if (!registering && parseInt(WFLSVars.useCAPTCHA)) {
|
253 |
e.preventDefault();
|
254 |
e.stopPropagation();
|
255 |
|
256 |
-
|
257 |
-
wfls_init_captcha(function() {
|
258 |
}
|
259 |
});
|
260 |
}
|
@@ -264,7 +291,7 @@
|
|
264 |
verificationField.val(WFLSVars.verification);
|
265 |
}
|
266 |
else {
|
267 |
-
var log = $('input[name="log"], input[name="user_login"]');
|
268 |
if (log.length) {
|
269 |
verificationField = $('<input type="hidden" name="wfls-email-verification" id="wfls-email-verification" />');
|
270 |
verificationField.val(WFLSVars.verification);
|
1 |
(function($) {
|
2 |
!function(Z){"use strict";Z.Zebra_Tooltips=function(t,l){var u,T,b,v,n={animation_speed:250,animation_offset:20,close_on_click:!0,content:!(this.version="2.1.0"),hide_delay:100,keep_visible:!0,max_width:250,opacity:".95",position:"center",prerender:!1,show_delay:100,vertical_alignment:"above",vertical_offset:0,onBeforeHide:null,onHide:null,onBeforeShow:null,onShow:null},r=this,_=function(e){var t,o,i,a,l,n,r,_,s,p,d,h,c,f,w=e.data("Zebra_Tooltip"),m=Z(window);return w.tooltip||(t=Z("<div>",{"class":"Zebra_Tooltip",css:{opacity:0,display:"block"}}),o=Z("<div>",{"class":"Zebra_Tooltip_Message",css:{maxWidth:w.max_width}}).html(w.content).appendTo(t),i=Z("<div>",{"class":"Zebra_Tooltip_Arrow"}).appendTo(t),a=Z("<div>").addClass("Zebra_Tooltip_Arrow_Border").appendTo(i),Z("<div>").appendTo(i),w.keep_visible&&(t.on("mouseleave"+(w.close_on_click?" click":""),function(){y(e)}),t.on("mouseenter",function(){g(e)})),t.appendTo("body"),w.sticky&&o.addClass("Zebra_Tooltip_Has_Close"),l=t.outerWidth(),n=t.outerHeight(),r=a.outerWidth(),_=a.outerHeight(),s=o.outerWidth(),p=o.outerHeight(),w={tooltip:t,tooltip_width:l,tooltip_height:n+_/2,message:o,arrow_container:i,arrow_width:r,arrow_height:_,arrow:a},t.css({width:w.tooltip_width,height:w.tooltip_height}),w.tooltip_width=w.tooltip_width+(o.outerWidth()-s),w.tooltip_height=w.tooltip_height+(o.outerHeight()-p),t.css({width:w.tooltip_width,height:w.tooltip_height,display:"none"}),w=Z.extend(e.data("Zebra_Tooltip"),w),e.data("Zebra_Tooltip",w)),w.sticky&&!w.close&&(Z("<a>",{"class":"Zebra_Tooltip_Close",href:"javascript:void(0)"}).html("×").on("click",function(t){t.preventDefault();var o=e.data("Zebra_Tooltip");o.sticky=!1,e.data("Zebra_Tooltip",o),y(e)}).appendTo(w.message),w.close=!0,w=Z.extend(e.data("Zebra_Tooltip"),w),e.data("Zebra_Tooltip",w)),u=m.width(),T=m.height(),d=e.offset(),Z.extend(w,{element_left:d.left,element_top:d.top,element_width:e.outerWidth(),element_height:e.outerHeight()}),v=m.scrollTop(),b=m.scrollLeft(),h="left"===w.position?w.element_left-w.tooltip_width+w.arrow_width:"right"===w.position?w.element_left+w.element_width-w.arrow_width:w.element_left+(w.element_width-w.tooltip_width)/2,c=w.element_top-w.tooltip_height,f="left"===w.position?w.tooltip_width-w.arrow_width-w.arrow_width/2:"right"===w.position?w.arrow_width/2:(w.tooltip_width-w.arrow_width)/2,h+w.tooltip_width>u+b&&(f-=u+b-(h+w.tooltip_width)-6,h=u+b-w.tooltip_width-6,f+w.arrow_width>w.tooltip_width-6&&(f=w.tooltip_width-6-w.arrow_width),h+f+w.arrow_width/2<w.element_left&&(f=-1e4)),h<b&&(f-=b-h,h=b+2,f<0&&(f=w.arrow_width/2),h+f+w.arrow_width/2>w.element_left+w.element_width&&(f=-1e4)),w.message.css("margin-top",""),w.arrow_container.removeClass("Zebra_Tooltip_Arrow_Top").addClass("Zebra_Tooltip_Arrow_Bottom"),c<v||"below"===w.vertical_alignment&&w.element_top+w.element_height+w.vertical_offset+w.tooltip_height+w.animation_offset<T+v?(c=w.element_top+w.element_height-w.vertical_offset,w.animation_offset=Math.abs(w.animation_offset),w.message.css("margin-top",w.arrow_height/2),w.arrow_container.removeClass("Zebra_Tooltip_Arrow_Bottom").addClass("Zebra_Tooltip_Arrow_Top")):(w.animation_offset=-Math.abs(w.animation_offset),c+=w.vertical_offset),w.arrow_container.css("left",f),w.tooltip.css({left:h,top:c}),Z.extend(w,{tooltip_left:h,tooltip_top:c,arrow_left:f}),w=Z.extend(e.data("Zebra_Tooltip"),w),e.data("Zebra_Tooltip",w),w},g=function(t){var o=t.data("Zebra_Tooltip");clearTimeout(o.show_timeout),o.muted||(clearTimeout(o.hide_timeout),o.show_timeout=setTimeout(function(){(o=_(t)).onBeforeShow&&"function"==typeof o.onBeforeShow&&!1===o.onBeforeShow(t,o.tooltip)||("block"!==o.tooltip.css("display")&&o.tooltip.css({top:o.tooltip_top+o.animation_offset}),o.tooltip.css("display","block"),o.tooltip.stop(),o.tooltip.animate({top:o.tooltip_top,opacity:o.opacity},o.animation_speed,function(){o.onShow&&"function"==typeof o.onShow&&o.onShow(t,o.tooltip)}))},o.show_delay))},y=function(t){var o=t.data("Zebra_Tooltip");clearTimeout(o.hide_timeout),o.sticky||(clearTimeout(o.show_timeout),o.hide_timeout=setTimeout(function(){if(o.tooltip){if(o.onBeforeHide&&"function"==typeof o.onBeforeHide&&!1===o.onBeforeHide(t,o.tooltip))return;o.close=!1,o.destroy&&(o.muted=!0),t.data("Zebra_Tooltip",o),Z("a.Zebra_Tooltip_Close",o.tooltip).remove(),o.tooltip.stop(),o.tooltip.animate({opacity:0,top:o.tooltip_top+o.animation_offset},o.animation_speed,function(){Z(this).css("display","none"),o.onHide&&"function"==typeof o.onHide&&o.onHide(t,o.tooltip)})}},o.hide_delay))};r.hide=function(t,e){t.each(function(){var t=Z(this),o=t.data("Zebra_Tooltip");o&&(o.sticky=!1,e&&(o.destroy=!0),t.data("Zebra_Tooltip",o),y(t))})},r.show=function(t,e){t.each(function(){var t=Z(this),o=t.data("Zebra_Tooltip");o&&(o.sticky=!0,o.muted=!1,e&&(o.destroy=!0),t.data("Zebra_Tooltip",o),g(t))})},t.each(function(){var t,o=Z(this),e=o.attr("title"),i=o.data(),a={};for(t in i)0===t.indexOf("ztt_")&&(t=t.replace(/^ztt\_/,""),void 0!==n[t]&&(a[t]=i["ztt_"+t]));a=Z.extend(n,r.settings,l,a),e&&(a.content=o.attr("title")),void 0!==a.content&&""!==a.content.trim()&&(o.on({mouseenter:function(){e&&Z(this).attr("title",""),g(o)},mouseleave:function(){y(o),e&&Z(this).attr("title",e)}}),o.data("Zebra_Tooltip",Z.extend({tooltip:null,show_timeout:null,hide_timeout:null,sticky:!1,destroy:!1,muted:!1},a)),a.prerender&&_(o))})}}($);
|
3 |
|
4 |
+
var wfls_init_captcha = function(actionCallback, log) {
|
5 |
+
if (typeof log === 'undefined')
|
6 |
+
log = $('input[name="log"], input[name="user_login"], input[name=username]');
|
7 |
if (typeof grecaptcha === 'object') {
|
8 |
grecaptcha.ready(function() {
|
9 |
grecaptcha.execute(WFLSVars.recaptchasitekey, {action: 'login'}).then(function(token) {
|
12 |
tokenField.val(token);
|
13 |
}
|
14 |
else {
|
|
|
15 |
if (log.length) {
|
16 |
tokenField = $('<input type="hidden" name="wfls-captcha-token" id="wfls-captcha-token" />');
|
17 |
tokenField.val(token);
|
29 |
tokenField.val('grecaptcha-missing');
|
30 |
}
|
31 |
else {
|
|
|
32 |
if (log.length) {
|
33 |
tokenField = $('<input type="hidden" name="wfls-captcha-token" id="wfls-captcha-token" />');
|
34 |
tokenField.val('grecaptcha-missing');
|
39 |
typeof actionCallback === 'function' && actionCallback(true);
|
40 |
}
|
41 |
};
|
42 |
+
|
43 |
+
function showLoginMessage(messageHtml, type) {
|
44 |
+
var heading = $('#login > h1');
|
45 |
+
if (heading.length > 0) {
|
46 |
+
var dom = (type === 'error' ? $('<div id="login_error">') : $('<p class="message">'));
|
47 |
+
dom.addClass('wfls-login-message');
|
48 |
+
dom.html(messageHtml);
|
49 |
+
heading.after(dom);
|
50 |
+
dom.get(0).scrollIntoView();
|
51 |
+
}
|
52 |
+
else if ($('.woocommerce').length > 0){
|
53 |
+
var content = $('<div class="woocommerce wfls-login-message">');
|
54 |
+
var errorList = $('<ul role="alert">')
|
55 |
+
.addClass(type === 'error' ? 'woocommerce-error' : 'woocommerce-info');
|
56 |
+
content.append(errorList);
|
57 |
+
errorList.append($('<li>').html(messageHtml));
|
58 |
+
$('#primary').before(content);
|
59 |
+
content.get(0).scrollIntoView();
|
60 |
+
}
|
61 |
+
else {
|
62 |
+
alert(message);
|
63 |
+
}
|
64 |
+
}
|
65 |
+
|
66 |
|
67 |
var wfls_init_captcha_contact = function() {
|
68 |
$('.wfls-registration-captcha-contact').on('click', function(e) {
|
69 |
e.preventDefault();
|
70 |
e.stopPropagation();
|
71 |
|
72 |
+
var log = $('input[name="user_login"], #reg_email');
|
73 |
if (log.length) {
|
74 |
$('#wfls-prompt-overlay').remove();
|
75 |
var overlay = $('<div id="wfls-prompt-overlay"></div>');
|
99 |
data: data,
|
100 |
success: function(json) {
|
101 |
if (json.hasOwnProperty('error')) {
|
102 |
+
showLoginMessage(json.error, 'error');
|
103 |
var dom = $('<div id="login_error">' + json.error + '</div>');
|
104 |
$('#login > h1').after(dom);
|
105 |
}
|
106 |
else if (json.hasOwnProperty('message')) { //Success
|
107 |
+
showLoginMessage(json.message, 'message');
|
108 |
var dom = $('<p class="message">' + json.message + '</p>');
|
109 |
$('#login > h1').after(dom);
|
110 |
$('#wfls-support-submit, #wfls-message').attr('disabled', true);
|
111 |
}
|
112 |
},
|
113 |
error: function(err) {
|
114 |
+
showLoginMessage('An error was encountered while trying to send the message. Please try again.', 'error');
|
115 |
var dom = $('<div id="login_error"><strong>ERROR</strong>: An error was encountered while trying to send the message. Please try again.</div>');
|
116 |
$('#login > h1').after(dom);
|
117 |
}
|
118 |
});
|
119 |
});
|
120 |
+
|
121 |
+
field.find("#wfls-message").focus();
|
122 |
}
|
123 |
});
|
124 |
};
|
125 |
|
126 |
var wfls_query_ajax = function() {
|
127 |
+
$('.wfls-login-message').remove();
|
128 |
|
129 |
+
var log = $('input[name="log"],input[name=username]');
|
130 |
+
var pwd = $('input[name="pwd"],input[name=password]');
|
131 |
var form = null;
|
132 |
if (log.length && pwd.length) {
|
133 |
form = log.closest('form');
|
140 |
|
141 |
var data = $(form).serialize();
|
142 |
data += '&action=wordfence_ls_authenticate';
|
143 |
+
|
144 |
$.ajax({
|
145 |
type: 'POST',
|
146 |
url: WFLSVars.ajaxurl,
|
153 |
}
|
154 |
|
155 |
if (json.hasOwnProperty('error')) {
|
156 |
+
showLoginMessage(json.error, 'error');
|
|
|
157 |
$('#wfls-token').val('');
|
158 |
|
159 |
if (parseInt(WFLSVars.useCAPTCHA)) {
|
161 |
}
|
162 |
}
|
163 |
else if (json.hasOwnProperty('message')) {
|
164 |
+
showLoginMessage(json.message, 'message');
|
|
|
165 |
$('#wfls-token').val('');
|
166 |
|
167 |
if (parseInt(WFLSVars.useCAPTCHA)) {
|
199 |
|
200 |
if (json.hasOwnProperty('combined')) {
|
201 |
form.data('wflsLoggingIn', 1);
|
202 |
+
$('#wp-submit,[type=submit][name=login]').trigger('click');
|
203 |
return;
|
204 |
}
|
205 |
|
233 |
}
|
234 |
else { //Unexpected response, skip AJAX and process via the regular login flow
|
235 |
form.data('wflsLoggingIn', 1);
|
236 |
+
$('#wp-submit,[type=submit][name=login]').trigger('click');
|
237 |
}
|
238 |
}
|
239 |
},
|
242 |
window.location.reload(true);
|
243 |
return;
|
244 |
}
|
245 |
+
showLoginMessage('<strong>ERROR</strong>: An error was encountered while trying to authenticate. Please try again.', 'error');
|
|
|
246 |
}
|
247 |
});
|
248 |
};
|
249 |
|
250 |
$(function() {
|
251 |
//Login
|
252 |
+
var log = $('input[name="log"],input[name=username]');
|
253 |
+
var pwd = $('input[name="pwd"],input[name=password]');
|
254 |
if (log.length && pwd.length) {
|
255 |
log.closest('form').on('submit', function(e) {
|
256 |
var loggingIn = !!parseInt($(this).data('wflsLoggingIn'));
|
270 |
}
|
271 |
|
272 |
//Registration
|
273 |
+
log = $('input[name="user_login"], #reg_email');
|
274 |
if (log.length) {
|
275 |
log.closest('form').on('submit', function(e) {
|
276 |
+
var form = $(this);
|
277 |
+
var registering = !!parseInt(form.data('wflsRegistering'));
|
278 |
+
form.data('wflsRegistering', 0);
|
279 |
if (!registering && parseInt(WFLSVars.useCAPTCHA)) {
|
280 |
e.preventDefault();
|
281 |
e.stopPropagation();
|
282 |
|
283 |
+
form.data('wflsRegistering', 1);
|
284 |
+
wfls_init_captcha(function() { form.find('[type=submit]').first().trigger('click'); }, log);
|
285 |
}
|
286 |
});
|
287 |
}
|
291 |
verificationField.val(WFLSVars.verification);
|
292 |
}
|
293 |
else {
|
294 |
+
var log = $('input[name="log"], input[name="user_login"], input[name=username], #reg_email');
|
295 |
if (log.length) {
|
296 |
verificationField = $('<input type="hidden" name="wfls-email-verification" id="wfls-email-verification" />');
|
297 |
verificationField.val(WFLSVars.verification);
|
js/{wfselect2.min.1610634190.js → wfselect2.min.1625749951.js}
RENAMED
File without changes
|
readme.txt
CHANGED
@@ -3,8 +3,8 @@ Contributors: wfryan, wfmattr, mmaunder, wfmatt
|
|
3 |
Tags: security, login security, 2fa, two factor authentication, captcha, xml-rpc, mfa, 2 factor
|
4 |
Requires at least: 4.5
|
5 |
Requires PHP: 5.3
|
6 |
-
Tested up to: 5.
|
7 |
-
Stable tag: 1.0.
|
8 |
|
9 |
Secure your website with Wordfence Login Security, providing two-factor authentication, login and registration CAPTCHA, and XML-RPC protection.
|
10 |
|
@@ -58,6 +58,13 @@ Secure your website with Wordfence Login Security.
|
|
58 |
|
59 |
== Changelog ==
|
60 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
61 |
= 1.0.6 - January 14, 2021 =
|
62 |
* Improvement: Made a number of WordPress 5.6 and jQuery 3.x compatibility improvements.
|
63 |
* Improvement: Replaced the terms whitelist and blacklist with allowlist and blocklist.
|
3 |
Tags: security, login security, 2fa, two factor authentication, captcha, xml-rpc, mfa, 2 factor
|
4 |
Requires at least: 4.5
|
5 |
Requires PHP: 5.3
|
6 |
+
Tested up to: 5.8
|
7 |
+
Stable tag: 1.0.7
|
8 |
|
9 |
Secure your website with Wordfence Login Security, providing two-factor authentication, login and registration CAPTCHA, and XML-RPC protection.
|
10 |
|
58 |
|
59 |
== Changelog ==
|
60 |
|
61 |
+
= 1.0.7 - July 8, 2021 =
|
62 |
+
* Improvement: Added 2FA and reCAPTCHA support for WooCommerce login and registration forms
|
63 |
+
* Improvement: Added option to require 2FA for any role
|
64 |
+
* Improvement: Added logic to automatically disable NTP after repeated failures and option to manually disable NTP
|
65 |
+
* Change: Updated reCAPTCHA setup note
|
66 |
+
* Change: Updated plugin headers for compatibility with WordPress 5.8
|
67 |
+
|
68 |
= 1.0.6 - January 14, 2021 =
|
69 |
* Improvement: Made a number of WordPress 5.6 and jQuery 3.x compatibility improvements.
|
70 |
* Improvement: Replaced the terms whitelist and blacklist with allowlist and blocklist.
|
views/common/reset-grace-period.php
ADDED
@@ -0,0 +1,89 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
if (!defined('WORDFENCE_LS_VERSION')) { exit; }
|
3 |
+
|
4 |
+
if (!isset($defaultGracePeriod))
|
5 |
+
$defaultGracePeriod = \WordfenceLS\Controller_Settings::shared()->get_user_2fa_grace_period();
|
6 |
+
$defaultGracePeriod = max($defaultGracePeriod, 1);
|
7 |
+
$errorMessage = $gracePeriod === null ? __('Unable to Activate Grace Period', 'wordfence-2fa') : __('Unable to Reset Grace Period', 'wordfence-2fa');
|
8 |
+
?>
|
9 |
+
<div class="wfls-add-top wfls-add-bottom wfls-grace-period-container">
|
10 |
+
<div class="wfls-grace-period-input-container">
|
11 |
+
<label for="wfls-user-grace-period-override" style="display: none"><?php esc_html_e('Grace Period Override', 'wordfence-2fa') ?></label>
|
12 |
+
<input type="text" id="wfls-user-grace-period-override" maxlength="2" pattern="[0-9]+" value="<?php echo (int) $defaultGracePeriod ?>">
|
13 |
+
<label for="wfls-user-grace-period-override"><?php esc_html_e('days', 'wordfence-2fa') ?></label>
|
14 |
+
</div>
|
15 |
+
<div class="wfls-grace-period-button-container">
|
16 |
+
<button class="wfls-btn wfls-btn-default" id="wfls-reset-grace-period">
|
17 |
+
<?php echo $gracePeriod === null ? esc_html__('Activate Grace Period', 'wordfence-2fa') : esc_html__('Reset Grace Period', 'wordfence-2fa') ?>
|
18 |
+
</button>
|
19 |
+
|
20 |
+
</div>
|
21 |
+
</div>
|
22 |
+
<div>
|
23 |
+
<p id="wfls-reset-grace-period-failed" style="display: none"><strong><?php echo esc_html($errorMessage) ?></strong></p>
|
24 |
+
</div>
|
25 |
+
<script type="application/javascript">
|
26 |
+
(function($) {
|
27 |
+
$(function() {
|
28 |
+
var failureMessage = $('#wfls-reset-grace-period-failed');
|
29 |
+
var overrideInput = $('#wfls-user-grace-period-override');
|
30 |
+
var button = $('#wfls-reset-grace-period');
|
31 |
+
function reset2faGracePeriod(userId, gracePeriodOverride, success, failure) {
|
32 |
+
var ajaxContext = (typeof WFLS === 'undefined' ? GWFLS : WFLS);
|
33 |
+
ajaxContext.ajax(
|
34 |
+
'wordfence_ls_reset_2fa_grace_period',
|
35 |
+
{
|
36 |
+
user_id: userId,
|
37 |
+
grace_period_override: gracePeriodOverride
|
38 |
+
},
|
39 |
+
success,
|
40 |
+
failure
|
41 |
+
);
|
42 |
+
}
|
43 |
+
function handleError() {
|
44 |
+
if (typeof WFLS === 'object') {
|
45 |
+
WFLS.panelModal(
|
46 |
+
(WFLS.screenSize(500) ? '300px' : '400px'),
|
47 |
+
<?php echo json_encode($errorMessage) ?>,
|
48 |
+
<?php echo json_encode($gracePeriod === null ? __('An unexpected error occurred while attempting to activate the grace period.', 'wordfence-2fa') : __('An unexpected error occurred while attempting to reset the grace period.', 'wordfence-2fa')) ?>
|
49 |
+
);
|
50 |
+
}
|
51 |
+
else {
|
52 |
+
failureMessage.show();
|
53 |
+
}
|
54 |
+
button.prop('disabled', false);
|
55 |
+
overrideInput.prop('disabled', false);
|
56 |
+
}
|
57 |
+
button.on('click', function(e) {
|
58 |
+
e.preventDefault();
|
59 |
+
e.stopPropagation();
|
60 |
+
button.prop('disabled', true);
|
61 |
+
overrideInput.prop('disabled', true);
|
62 |
+
failureMessage.hide();
|
63 |
+
reset2faGracePeriod(
|
64 |
+
<?php echo json_encode($user->ID, true) ?>,
|
65 |
+
overrideInput.val(),
|
66 |
+
function(data) {
|
67 |
+
if ('error' in data) {
|
68 |
+
handleError();
|
69 |
+
return;
|
70 |
+
}
|
71 |
+
if (typeof WFLS === 'undefined')
|
72 |
+
window.location.href = '#wfls-user-settings';
|
73 |
+
window.location.reload();
|
74 |
+
},
|
75 |
+
handleError
|
76 |
+
);
|
77 |
+
});
|
78 |
+
overrideInput.on('input', function(e) {
|
79 |
+
var value = $(this).val();
|
80 |
+
value = value.replace(/[^0-9]/g, '');
|
81 |
+
value = parseInt(value);
|
82 |
+
if (isNaN(value) || value === 0)
|
83 |
+
value = '';
|
84 |
+
button.prop('disabled', value < 1);
|
85 |
+
$(this).val(value);
|
86 |
+
}).trigger('input');
|
87 |
+
});
|
88 |
+
})(jQuery);
|
89 |
+
</script>
|
views/common/revoke-grace-period.php
ADDED
@@ -0,0 +1,67 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
if (!defined('WORDFENCE_LS_VERSION')) { exit; }
|
3 |
+
|
4 |
+
$errorMessage = __('Unable to Revoke Grace Period', 'wordfence-2fa');
|
5 |
+
?>
|
6 |
+
<div class="wfls-add-top wfls-add-bottom wfls-grace-period-container">
|
7 |
+
<div class="wfls-grace-period-button-container">
|
8 |
+
<button class="wfls-btn wfls-btn-default" id="wfls-revoke-grace-period">
|
9 |
+
<?php esc_html_e('Revoke Grace Period', 'wordfence-2fa') ?>
|
10 |
+
</button>
|
11 |
+
|
12 |
+
</div>
|
13 |
+
</div>
|
14 |
+
<div>
|
15 |
+
<p id="wfls-revoke-grace-period-failed" style="display: none"><strong><?php echo esc_html($errorMessage) ?></strong></p>
|
16 |
+
</div>
|
17 |
+
<script type="application/javascript">
|
18 |
+
(function($) {
|
19 |
+
$(function() {
|
20 |
+
var failureMessage = $('#wfls-revoke-grace-period-failed');
|
21 |
+
var button = $('#wfls-revoke-grace-period');
|
22 |
+
function revoke2faGracePeriod(userId, success, failure) {
|
23 |
+
var ajaxContext = (typeof WFLS === 'undefined' ? GWFLS : WFLS);
|
24 |
+
ajaxContext.ajax(
|
25 |
+
'wordfence_ls_revoke_2fa_grace_period',
|
26 |
+
{
|
27 |
+
user_id: userId
|
28 |
+
},
|
29 |
+
success,
|
30 |
+
failure
|
31 |
+
);
|
32 |
+
}
|
33 |
+
function handleError() {
|
34 |
+
if (typeof WFLS === 'object') {
|
35 |
+
WFLS.panelModal(
|
36 |
+
(WFLS.screenSize(500) ? '300px' : '400px'),
|
37 |
+
<?php echo json_encode($errorMessage) ?>,
|
38 |
+
<?php echo json_encode(__('An unexpected error occurred while attempting to revoke the grace period.', 'wordfence-2fa')) ?>
|
39 |
+
);
|
40 |
+
}
|
41 |
+
else {
|
42 |
+
failureMessage.show();
|
43 |
+
}
|
44 |
+
button.prop('disabled', false);
|
45 |
+
}
|
46 |
+
button.on('click', function(e) {
|
47 |
+
e.preventDefault();
|
48 |
+
e.stopPropagation();
|
49 |
+
button.prop('disabled', true);
|
50 |
+
failureMessage.hide();
|
51 |
+
revoke2faGracePeriod(
|
52 |
+
<?php echo json_encode($user->ID, true) ?>,
|
53 |
+
function(data) {
|
54 |
+
if ('error' in data) {
|
55 |
+
handleError();
|
56 |
+
return;
|
57 |
+
}
|
58 |
+
if (typeof WFLS === 'undefined')
|
59 |
+
window.location.href = '#wfls-user-settings';
|
60 |
+
window.location.reload();
|
61 |
+
},
|
62 |
+
handleError
|
63 |
+
);
|
64 |
+
});
|
65 |
+
});
|
66 |
+
})(jQuery);
|
67 |
+
</script>
|
views/email/login-verification.php
CHANGED
@@ -8,15 +8,15 @@ if (!defined('WORDFENCE_LS_VERSION')) { exit; }
|
|
8 |
* @var bool $canEnable2FA Whether or not the user this is being sent to can enable 2FA. Optional
|
9 |
*/
|
10 |
?>
|
11 |
-
<strong><?php
|
12 |
<br><br>
|
13 |
-
<?php echo '<strong>' .
|
14 |
-
<?php echo '<strong>' .
|
15 |
<br><br>
|
16 |
-
<?php
|
17 |
<br><br>
|
18 |
<?php if (isset($canEnable2FA) && $canEnable2FA): ?>
|
19 |
-
<?php
|
20 |
<br><br>
|
21 |
<?php endif; ?>
|
22 |
-
<?php
|
8 |
* @var bool $canEnable2FA Whether or not the user this is being sent to can enable 2FA. Optional
|
9 |
*/
|
10 |
?>
|
11 |
+
<strong><?php echo wp_kses(sprintf(__('Please verify a login attempt for your account on <a href="%s"><strong>%s</strong></a>.', 'wordfence-ls'), esc_url($siteURL), $siteName), array('a'=>array('href'=>array()), 'strong'=>array())); ?></strong>
|
12 |
<br><br>
|
13 |
+
<?php echo '<strong>' . esc_html__('Request Time:', 'wordfence-ls') . '</strong> ' . esc_html(\WordfenceLS\Controller_Time::format_local_time('F j, Y h:i:s A')); ?><br>
|
14 |
+
<?php echo '<strong>' . esc_html__('IP:', 'wordfence-ls') . '</strong> ' . esc_html($ip); ?>
|
15 |
<br><br>
|
16 |
+
<?php echo wp_kses(__('The request was flagged as suspicious, and we need verification that you attempted to log in to allow it to proceed. This verification link <b>will be valid for 15 minutes</b> from the time it was sent. If you did not attempt this login, please change your password immediately.', 'wordfence-ls'), array('b'=>array())); ?>
|
17 |
<br><br>
|
18 |
<?php if (isset($canEnable2FA) && $canEnable2FA): ?>
|
19 |
+
<?php esc_html_e('You may bypass this verification step permanently by enabling two-factor authentication on your account.', 'wordfence-ls'); ?>
|
20 |
<br><br>
|
21 |
<?php endif; ?>
|
22 |
+
<?php echo wp_kses(sprintf(__('<a href="%s"><b>Verify and Log In</b></a>', 'wordfence-ls'), esc_url($verificationURL)), array('a'=>array('href'=>array()), 'b'=>array())); ?>
|
views/manage/activate.php
CHANGED
@@ -11,13 +11,13 @@ if (!defined('WORDFENCE_LS_VERSION')) { exit; }
|
|
11 |
<div class="wfls-block-header wfls-block-header-border-bottom">
|
12 |
<div class="wfls-block-header-content">
|
13 |
<div class="wfls-block-title">
|
14 |
-
<strong><?php
|
15 |
</div>
|
16 |
</div>
|
17 |
</div>
|
18 |
<div class="wfls-block-content wfls-padding-add-bottom">
|
19 |
-
<p><?php
|
20 |
-
<p><?php
|
21 |
<ul class="wfls-recovery-codes">
|
22 |
<?php
|
23 |
$recoveryCodeFileContents = sprintf(__('Two-Factor Authentication Recovery Codes - %s (%s)', 'wordfence-2fa'), home_url(), $user->user_login) . "\r\n";
|
@@ -30,19 +30,19 @@ if (!defined('WORDFENCE_LS_VERSION')) { exit; }
|
|
30 |
}
|
31 |
?>
|
32 |
</ul>
|
33 |
-
<p class="wfls-center"><a href="#" class="wfls-btn wfls-btn-default" id="wfls-recovery-download" target="_blank" rel="noopener noreferrer"><i class="dashicons dashicons-download"></i> <?php
|
34 |
|
35 |
<hr class="wfls-half">
|
36 |
|
37 |
-
<p><?php
|
38 |
<p><input type="text" id="wfls-activate-field" value="" size="6" maxlength="6" placeholder="123456" autocomplete="off"></p>
|
39 |
</div>
|
40 |
<div class="wfls-block-footer">
|
41 |
<div class="wfls-block-footer-content">
|
42 |
<div class="wfls-block-title">
|
43 |
-
<a href="<?php echo \WordfenceLS\Controller_Support::esc_supportURL(\WordfenceLS\Controller_Support::ITEM_MODULE_LOGIN_SECURITY_2FA); ?>" target="_blank" rel="noopener noreferrer"><?php
|
44 |
</div>
|
45 |
-
<div class="wfls-block-footer-action"><a href="#" id="wfls-activate" class="wfls-btn wfls-btn-default wfls-disabled"><?php
|
46 |
</div>
|
47 |
</div>
|
48 |
</div>
|
@@ -126,4 +126,4 @@ if (!defined('WORDFENCE_LS_VERSION')) { exit; }
|
|
126 |
'secondaryButtons' => array(array('id' => 'wfls-recovery-skipped-skip', 'label' => __('Skip', 'wordfence'), 'link' => '#')),
|
127 |
))->render();
|
128 |
?>
|
129 |
-
</script>
|
11 |
<div class="wfls-block-header wfls-block-header-border-bottom">
|
12 |
<div class="wfls-block-header-content">
|
13 |
<div class="wfls-block-title">
|
14 |
+
<strong><?php esc_html_e('2. Enter Code from Authenticator App', 'wordfence-2fa'); ?></strong>
|
15 |
</div>
|
16 |
</div>
|
17 |
</div>
|
18 |
<div class="wfls-block-content wfls-padding-add-bottom">
|
19 |
+
<p><?php esc_html_e('Download Recovery Codes', 'wordfence-2fa'); ?> <em class="wfls-text-small"><?php esc_html_e('Optional', 'wordfence-2fa'); ?></em></p>
|
20 |
+
<p><?php echo esc_html(sprintf(__('Use one of these %d codes to log in if you lose access to your authenticator device. Codes are %d characters long plus optional spaces. Each one may be used only once.', 'wordfence-2fa'), count($recovery), \WordfenceLS\Model_Crypto::strlen($recovery[0]) * 2)); ?></p>
|
21 |
<ul class="wfls-recovery-codes">
|
22 |
<?php
|
23 |
$recoveryCodeFileContents = sprintf(__('Two-Factor Authentication Recovery Codes - %s (%s)', 'wordfence-2fa'), home_url(), $user->user_login) . "\r\n";
|
30 |
}
|
31 |
?>
|
32 |
</ul>
|
33 |
+
<p class="wfls-center"><a href="#" class="wfls-btn wfls-btn-default" id="wfls-recovery-download" target="_blank" rel="noopener noreferrer"><i class="dashicons dashicons-download"></i> <?php esc_html_e('Download', 'wordfence-2fa'); ?></a></p>
|
34 |
|
35 |
<hr class="wfls-half">
|
36 |
|
37 |
+
<p><?php esc_html_e('Enter the code from your authenticator app below to verify and activate two-factor authentication for this account.', 'wordfence-2fa'); ?></p>
|
38 |
<p><input type="text" id="wfls-activate-field" value="" size="6" maxlength="6" placeholder="123456" autocomplete="off"></p>
|
39 |
</div>
|
40 |
<div class="wfls-block-footer">
|
41 |
<div class="wfls-block-footer-content">
|
42 |
<div class="wfls-block-title">
|
43 |
+
<a href="<?php echo \WordfenceLS\Controller_Support::esc_supportURL(\WordfenceLS\Controller_Support::ITEM_MODULE_LOGIN_SECURITY_2FA); ?>" target="_blank" rel="noopener noreferrer"><?php esc_html_e('For help on setting up an app, visit our help article.', 'wordfence-2fa'); ?></a>
|
44 |
</div>
|
45 |
+
<div class="wfls-block-footer-action"><a href="#" id="wfls-activate" class="wfls-btn wfls-btn-default wfls-disabled"><?php esc_html_e('Activate', 'wordfence-2fa'); ?></a></div>
|
46 |
</div>
|
47 |
</div>
|
48 |
</div>
|
126 |
'secondaryButtons' => array(array('id' => 'wfls-recovery-skipped-skip', 'label' => __('Skip', 'wordfence'), 'link' => '#')),
|
127 |
))->render();
|
128 |
?>
|
129 |
+
</script>
|
views/manage/code.php
CHANGED
@@ -10,7 +10,7 @@ if (!defined('WORDFENCE_LS_VERSION')) { exit; }
|
|
10 |
<div class="wfls-block-header wfls-block-header-border-bottom">
|
11 |
<div class="wfls-block-header-content">
|
12 |
<div class="wfls-block-title">
|
13 |
-
<strong><?php
|
14 |
</div>
|
15 |
</div>
|
16 |
</div>
|
10 |
<div class="wfls-block-header wfls-block-header-border-bottom">
|
11 |
<div class="wfls-block-header-content">
|
12 |
<div class="wfls-block-title">
|
13 |
+
<strong><?php esc_html_e('1. Scan Code or Enter Key', 'wordfence'); ?></strong>
|
14 |
</div>
|
15 |
</div>
|
16 |
</div>
|
views/manage/deactivate.php
CHANGED
@@ -14,13 +14,13 @@ if ($ownUser->ID == $user->ID) {
|
|
14 |
<div class="wfls-block-header wfls-block-header-border-bottom">
|
15 |
<div class="wfls-block-header-content">
|
16 |
<div class="wfls-block-title">
|
17 |
-
<strong><?php
|
18 |
</div>
|
19 |
</div>
|
20 |
</div>
|
21 |
<div class="wfls-block-content wfls-padding-add-bottom">
|
22 |
-
<p><?php if ($ownAccount) {
|
23 |
-
<p class="wfls-center wfls-add-top"><a href="#" class="wfls-btn wfls-btn-default" id="wfls-deactivate" target="_blank" rel="noopener noreferrer"><?php
|
24 |
</div>
|
25 |
</div>
|
26 |
<script type="text/x-jquery-template" id="wfls-tmpl-deactivate-prompt">
|
14 |
<div class="wfls-block-header wfls-block-header-border-bottom">
|
15 |
<div class="wfls-block-header-content">
|
16 |
<div class="wfls-block-title">
|
17 |
+
<strong><?php esc_html_e('Wordfence 2FA Active', 'wordfence-2fa'); ?></strong>
|
18 |
</div>
|
19 |
</div>
|
20 |
</div>
|
21 |
<div class="wfls-block-content wfls-padding-add-bottom">
|
22 |
+
<p><?php if ($ownAccount) { esc_html_e('Wordfence two-factor authentication is currently active on your account. You may deactivate it by clicking the button below.', 'wordfence-2fa'); } else { echo wp_kses(sprintf(__('Wordfence two-factor authentication is currently active on the account <strong>%s</strong>. You may deactivate it by clicking the button below.', 'wordfence-2fa'), esc_html($user->user_login)), array('strong'=>array())); } ?></p>
|
23 |
+
<p class="wfls-center wfls-add-top"><a href="#" class="wfls-btn wfls-btn-default" id="wfls-deactivate" target="_blank" rel="noopener noreferrer"><?php esc_html_e('Deactivate', 'wordfence-2fa'); ?></a></p>
|
24 |
</div>
|
25 |
</div>
|
26 |
<script type="text/x-jquery-template" id="wfls-tmpl-deactivate-prompt">
|
views/manage/grace-period.php
ADDED
@@ -0,0 +1,56 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
if (!defined('WORDFENCE_LS_VERSION')) { exit; }
|
3 |
+
/**
|
4 |
+
* @var \WP_User $user The user being edited. Required.
|
5 |
+
* @var bool $inGracePeriod
|
6 |
+
* @var bool $lockedOut
|
7 |
+
* @var int $requiredAt
|
8 |
+
*/
|
9 |
+
|
10 |
+
$ownAccount = false;
|
11 |
+
$ownUser = wp_get_current_user();
|
12 |
+
if ($ownUser->ID == $user->ID) {
|
13 |
+
$ownAccount = true;
|
14 |
+
}
|
15 |
+
$defaultGracePeriod = \WordfenceLS\Controller_Settings::shared()->get_user_2fa_grace_period();
|
16 |
+
$hasGracePeriod = $defaultGracePeriod > 0;
|
17 |
+
?>
|
18 |
+
<div class="wfls-block wfls-always-active wfls-flex-item-full-width">
|
19 |
+
<div class="wfls-block-header wfls-block-header-border-bottom">
|
20 |
+
<div class="wfls-block-header-content">
|
21 |
+
<div class="wfls-block-title">
|
22 |
+
<strong><?php echo $gracePeriod ? esc_html__('Grace Period', 'wordfence-2fa') : esc_html__('Locked Out', 'wordfence-2fa') ?></strong>
|
23 |
+
</div>
|
24 |
+
</div>
|
25 |
+
</div>
|
26 |
+
<div class="wfls-block-content">
|
27 |
+
<?php if ($gracePeriod): ?>
|
28 |
+
<p><?php
|
29 |
+
$requiredDateFormatted = \WordfenceLS\Controller_Time::format_local_time('F j, Y g:i A', $requiredAt);
|
30 |
+
echo $ownAccount ?
|
31 |
+
sprintf(wp_kses(__('Two-factor authentication will be required for your account beginning <strong>%s</strong>', 'wordfence-2fa'), array('strong'=>array())), $requiredDateFormatted) :
|
32 |
+
sprintf(wp_kses(__('Two-factor authentication will be required for user <strong>%s</strong> beginning <strong>%s</strong>.', 'wordfence-2fa'), array('strong'=>array())), esc_html($user->user_login), $requiredDateFormatted)
|
33 |
+
?></p>
|
34 |
+
<?php if (\WordfenceLS\Controller_Users::shared()->has_revokable_grace_period($user)): ?>
|
35 |
+
<?php echo \WordfenceLS\Model_View::create(
|
36 |
+
'common/revoke-grace-period',
|
37 |
+
array(
|
38 |
+
'user' => $user
|
39 |
+
))->render() ?>
|
40 |
+
<?php endif ?>
|
41 |
+
<?php else: ?>
|
42 |
+
<p>
|
43 |
+
<?php echo $ownAccount ?
|
44 |
+
esc_html__('Two-factor authentication is required for your account, but has not been configured.', 'wordfence-2fa') :
|
45 |
+
esc_html__('Two-factor authentication is required for this account, but has not been configured.', 'wordfence-2fa') ?>
|
46 |
+
</p>
|
47 |
+
<?php echo \WordfenceLS\Model_View::create(
|
48 |
+
'common/reset-grace-period',
|
49 |
+
array(
|
50 |
+
'user' => $user,
|
51 |
+
'gracePeriod' => $gracePeriod,
|
52 |
+
'defaultGracePeriod' => $defaultGracePeriod
|
53 |
+
))->render() ?>
|
54 |
+
<?php endif ?>
|
55 |
+
</div>
|
56 |
+
</div>
|
views/manage/regenerate.php
CHANGED
@@ -9,13 +9,13 @@ if (!defined('WORDFENCE_LS_VERSION')) { exit; }
|
|
9 |
<div class="wfls-block-header wfls-block-header-border-bottom">
|
10 |
<div class="wfls-block-header-content">
|
11 |
<div class="wfls-block-title">
|
12 |
-
<strong><?php
|
13 |
</div>
|
14 |
</div>
|
15 |
</div>
|
16 |
<div class="wfls-block-content wfls-padding-add-bottom">
|
17 |
-
<p id="wfls-recovery-code-count"><?php
|
18 |
-
<p class="wfls-center wfls-add-top"><a href="#" class="wfls-btn wfls-btn-default" id="wfls-recovery" target="_blank" rel="noopener noreferrer"><?php
|
19 |
</div>
|
20 |
</div>
|
21 |
<script type="text/x-jquery-template" id="wfls-tmpl-recovery-prompt">
|
9 |
<div class="wfls-block-header wfls-block-header-border-bottom">
|
10 |
<div class="wfls-block-header-content">
|
11 |
<div class="wfls-block-title">
|
12 |
+
<strong><?php esc_html_e('Recovery Codes', 'wordfence-2fa'); ?></strong>
|
13 |
</div>
|
14 |
</div>
|
15 |
</div>
|
16 |
<div class="wfls-block-content wfls-padding-add-bottom">
|
17 |
+
<p id="wfls-recovery-code-count"><?php echo esc_html(sprintf($remaining == 1 ? __('%d unused recovery code remains. You may generate a new set by clicking below.', 'wordfence-2fa') : __('%d unused recovery codes remain. You may generate a new set by clicking below.', 'wordfence-2fa'), $remaining)); ?></p>
|
18 |
+
<p class="wfls-center wfls-add-top"><a href="#" class="wfls-btn wfls-btn-default" id="wfls-recovery" target="_blank" rel="noopener noreferrer"><?php esc_html_e('Generate New Codes', 'wordfence-2fa'); ?></a></p>
|
19 |
</div>
|
20 |
</div>
|
21 |
<script type="text/x-jquery-template" id="wfls-tmpl-recovery-prompt">
|
views/onboarding/standalone-header.php
CHANGED
@@ -6,11 +6,11 @@ if (!defined('WORDFENCE_LS_VERSION')) { exit; }
|
|
6 |
?>
|
7 |
<div id="wfls-onboarding-standalone-modal">
|
8 |
<div id="wfls-onboarding-standalone-modal-header">
|
9 |
-
<div id="wfls-onboarding-standalone-modal-header-title"><?php
|
10 |
<div id="wfls-onboarding-standalone-modal-header-accessory"><a href="#" id="wfls-onboarding-standalone-modal-dismiss">×</a></div>
|
11 |
</div>
|
12 |
<div id="wfls-onboarding-standalone-modal-content">
|
13 |
-
<p><?php
|
14 |
<p><?php printf(__('If you\'re looking for a more comprehensive solution, the <a href="%s" target="_blank" rel="noopener noreferrer">full Wordfence plugin</a> includes all of the features in this plugin as well as a full-featured WordPress firewall, a security scanner, live traffic, and more. The standard installation includes a robust set of free features that can be upgraded via a Premium license key.', 'wordfence-2fa'), 'https://wordpress.org/plugins/wordfence/'); ?></p>
|
15 |
</div>
|
16 |
</div>
|
6 |
?>
|
7 |
<div id="wfls-onboarding-standalone-modal">
|
8 |
<div id="wfls-onboarding-standalone-modal-header">
|
9 |
+
<div id="wfls-onboarding-standalone-modal-header-title"><?php esc_html_e('Wordfence Login Security Installed', 'wordfence-2fa'); ?></div>
|
10 |
<div id="wfls-onboarding-standalone-modal-header-accessory"><a href="#" id="wfls-onboarding-standalone-modal-dismiss">×</a></div>
|
11 |
</div>
|
12 |
<div id="wfls-onboarding-standalone-modal-content">
|
13 |
+
<p><?php esc_html_e('You have just installed the Wordfence Login Security plugin. It contains a subset of the functionality found in the full Wordfence plugin: Two-factor Authentication, XML-RPC Protection and Login Page CAPTCHA.', 'wordfence-2fa'); ?></p>
|
14 |
<p><?php printf(__('If you\'re looking for a more comprehensive solution, the <a href="%s" target="_blank" rel="noopener noreferrer">full Wordfence plugin</a> includes all of the features in this plugin as well as a full-featured WordPress firewall, a security scanner, live traffic, and more. The standard installation includes a robust set of free features that can be upgraded via a Premium license key.', 'wordfence-2fa'), 'https://wordpress.org/plugins/wordfence/'); ?></p>
|
15 |
</div>
|
16 |
</div>
|
views/options/option-captcha-threshold.php
CHANGED
@@ -25,8 +25,8 @@ $selectOptions = array(
|
|
25 |
<ul>
|
26 |
<li class="wfls-option-title">
|
27 |
<ul class="wfls-flex-vertical wfls-flex-align-left">
|
28 |
-
<li><span id="wfls-option-recaptcha-threshold-label"><strong><?php
|
29 |
-
<li class="wfls-option-subtitle"><?php
|
30 |
</ul>
|
31 |
</li>
|
32 |
<li class="wfls-option-select wfls-padding-add-top-xs-small">
|
@@ -45,7 +45,7 @@ $selectOptions = array(
|
|
45 |
<li class="wfls-option-spacer"></li>
|
46 |
<li>
|
47 |
<canvas id="wfls-recaptcha-score-history"></canvas>
|
48 |
-
<div class="wfls-center"><a href="#" id="wfls-reset-recaptcha-score-stats" class="wfls-text-small"><?php
|
49 |
</li>
|
50 |
</ul>
|
51 |
</li>
|
25 |
<ul>
|
26 |
<li class="wfls-option-title">
|
27 |
<ul class="wfls-flex-vertical wfls-flex-align-left">
|
28 |
+
<li><span id="wfls-option-recaptcha-threshold-label"><strong><?php esc_html_e('reCAPTCHA human/bot threshold score', 'wordfence-2fa'); ?></strong></span></li>
|
29 |
+
<li class="wfls-option-subtitle"><?php esc_html_e('A reCAPTCHA score equal to or higher than this value will be considered human. Anything lower will be treated as a bot and require additional verification for login and registration.', 'wordfence-2fa'); ?></li>
|
30 |
</ul>
|
31 |
</li>
|
32 |
<li class="wfls-option-select wfls-padding-add-top-xs-small">
|
45 |
<li class="wfls-option-spacer"></li>
|
46 |
<li>
|
47 |
<canvas id="wfls-recaptcha-score-history"></canvas>
|
48 |
+
<div class="wfls-center"><a href="#" id="wfls-reset-recaptcha-score-stats" class="wfls-text-small"><?php esc_html_e('Reset Score Statistics', 'wordfence'); ?></a></div>
|
49 |
</li>
|
50 |
</ul>
|
51 |
</li>
|
views/options/option-captcha.php
CHANGED
@@ -11,21 +11,13 @@ $secretOptionName = \WordfenceLS\Controller_Settings::OPTION_RECAPTCHA_SECRET;
|
|
11 |
$secretValue = \WordfenceLS\Controller_Settings::shared()->get($secretOptionName);
|
12 |
?>
|
13 |
<ul id="wfls-option-enable-auth-captcha" data-option="<?php echo esc_attr($enableOptionName); ?>" data-enabled-value="1" data-disabled-value="0" data-original-value="<?php echo $currentEnableValue ? '1' : '0'; ?>">
|
14 |
-
<?php if (class_exists('WooCommerce')): ?>
|
15 |
-
<li class="wfls-padding-no-bottom">
|
16 |
-
<ul class="wfls-option wfls-padding-no-bottom">
|
17 |
-
<li class="wfls-option-spacer"></li>
|
18 |
-
<li class="wfls-option-subtitle"><div class="wfls-inline-notice"><i class="<?php echo (WORDFENCE_LS_FROM_CORE ? 'wf-fa wf-fa-exclamation-triangle' : 'wfls-fa wfls-fa-exclamation-triangle'); ?>" aria-hidden="true"></i><span><?php _e('We\'ve detected that you\'re using WooCommerce. reCAPTCHA support is currently incompatible with the WooCommerce login page and should not be enabled. Support may be added in a future version.', 'wordfence-ls'); ?></span></div></li>
|
19 |
-
</ul>
|
20 |
-
</li>
|
21 |
-
<?php endif; ?>
|
22 |
<li>
|
23 |
<ul class="wfls-option wfls-padding-add-bottom-small">
|
24 |
<li id="wfls-enable-auth-captcha" class="wfls-option-checkbox<?php echo ($currentEnableValue ? ' wfls-checked' : ''); ?>" role="checkbox" aria-checked="<?php echo ($currentEnableValue ? 'true' : 'false'); ?>" tabindex="0"><i class="wfls-ion-ios-checkmark-empty" aria-hidden="true" aria-labelledby="wfls-enable-auth-captcha-label"></i></li>
|
25 |
<li class="wfls-option-title">
|
26 |
<ul class="wfls-flex-vertical wfls-flex-align-left">
|
27 |
<li>
|
28 |
-
<strong id="wfls-enable-auth-captcha-label"><?php
|
29 |
</li>
|
30 |
<li class="wfls-option-subtitle"><?php printf(__('reCAPTCHA v3 does not make users solve puzzles or click a checkbox like previous versions. The only visible part is the reCAPTCHA logo. If a visitor\'s browser fails the CAPTCHA, Wordfence will send an email to the user\'s address with a link they can click to verify that they are a user of your site. You can read further details <a href="%s" target="_blank" rel="noopener noreferrer">in our documentation</a>.', 'wordfence-ls'), \WordfenceLS\Controller_Support::esc_supportURL(\WordfenceLS\Controller_Support::ITEM_MODULE_LOGIN_SECURITY_CAPTCHA)); ?></li>
|
31 |
</ul>
|
@@ -38,11 +30,11 @@ $secretValue = \WordfenceLS\Controller_Settings::shared()->get($secretOptionName
|
|
38 |
<li>
|
39 |
<table>
|
40 |
<tr class="wfls-option wfls-option-text" data-original-value="<?php echo esc_attr($siteKeyValue); ?>" data-text-option="<?php echo esc_attr($siteKeyOptionName); ?>">
|
41 |
-
<th id="wfls-enable-captcha-site-key-label" class="wfls-padding-add-bottom"><?php
|
42 |
<td class="wfls-option-text wfls-padding-add-bottom"><input type="text" name="recaptchaSiteKey" id="input-recaptchaSiteKey" class="wfls-form-control" value="<?php echo esc_attr($siteKeyValue); ?>"<?php if (!$currentEnableValue) { echo ' disabled'; } ?>></td>
|
43 |
</tr>
|
44 |
<tr class="wfls-option wfls-option-text" data-original-value="<?php echo esc_attr($secretValue); ?>" data-text-option="<?php echo esc_attr($secretOptionName); ?>">
|
45 |
-
<th id="wfls-enable-captcha-secret-label"><?php
|
46 |
<td class="wfls-option-text"><input type="text" name="recaptchaSecret" id="input-recaptchaSecret" class="wfls-form-control" value="<?php echo esc_attr($secretValue); ?>"<?php if (!$currentEnableValue) { echo ' disabled'; } ?>></td>
|
47 |
</tr>
|
48 |
</table>
|
@@ -52,7 +44,7 @@ $secretValue = \WordfenceLS\Controller_Settings::shared()->get($secretOptionName
|
|
52 |
<li class="wfls-option-spacer"></li>
|
53 |
<li class="wfls-option-title">
|
54 |
<ul class="wfls-flex-vertical wfls-flex-align-left">
|
55 |
-
<li class="wfls-option-subtitle"><?php
|
56 |
</ul>
|
57 |
</li>
|
58 |
</ul>
|
11 |
$secretValue = \WordfenceLS\Controller_Settings::shared()->get($secretOptionName);
|
12 |
?>
|
13 |
<ul id="wfls-option-enable-auth-captcha" data-option="<?php echo esc_attr($enableOptionName); ?>" data-enabled-value="1" data-disabled-value="0" data-original-value="<?php echo $currentEnableValue ? '1' : '0'; ?>">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
14 |
<li>
|
15 |
<ul class="wfls-option wfls-padding-add-bottom-small">
|
16 |
<li id="wfls-enable-auth-captcha" class="wfls-option-checkbox<?php echo ($currentEnableValue ? ' wfls-checked' : ''); ?>" role="checkbox" aria-checked="<?php echo ($currentEnableValue ? 'true' : 'false'); ?>" tabindex="0"><i class="wfls-ion-ios-checkmark-empty" aria-hidden="true" aria-labelledby="wfls-enable-auth-captcha-label"></i></li>
|
17 |
<li class="wfls-option-title">
|
18 |
<ul class="wfls-flex-vertical wfls-flex-align-left">
|
19 |
<li>
|
20 |
+
<strong id="wfls-enable-auth-captcha-label"><?php esc_html_e('Enable reCAPTCHA on the login and user registration pages', 'wordfence-ls'); ?></strong>
|
21 |
</li>
|
22 |
<li class="wfls-option-subtitle"><?php printf(__('reCAPTCHA v3 does not make users solve puzzles or click a checkbox like previous versions. The only visible part is the reCAPTCHA logo. If a visitor\'s browser fails the CAPTCHA, Wordfence will send an email to the user\'s address with a link they can click to verify that they are a user of your site. You can read further details <a href="%s" target="_blank" rel="noopener noreferrer">in our documentation</a>.', 'wordfence-ls'), \WordfenceLS\Controller_Support::esc_supportURL(\WordfenceLS\Controller_Support::ITEM_MODULE_LOGIN_SECURITY_CAPTCHA)); ?></li>
|
23 |
</ul>
|
30 |
<li>
|
31 |
<table>
|
32 |
<tr class="wfls-option wfls-option-text" data-original-value="<?php echo esc_attr($siteKeyValue); ?>" data-text-option="<?php echo esc_attr($siteKeyOptionName); ?>">
|
33 |
+
<th id="wfls-enable-captcha-site-key-label" class="wfls-padding-add-bottom"><?php esc_html_e('reCAPTCHA v3 Site Key', 'wordfence-ls'); ?></th>
|
34 |
<td class="wfls-option-text wfls-padding-add-bottom"><input type="text" name="recaptchaSiteKey" id="input-recaptchaSiteKey" class="wfls-form-control" value="<?php echo esc_attr($siteKeyValue); ?>"<?php if (!$currentEnableValue) { echo ' disabled'; } ?>></td>
|
35 |
</tr>
|
36 |
<tr class="wfls-option wfls-option-text" data-original-value="<?php echo esc_attr($secretValue); ?>" data-text-option="<?php echo esc_attr($secretOptionName); ?>">
|
37 |
+
<th id="wfls-enable-captcha-secret-label"><?php esc_html_e('reCAPTCHA v3 Secret', 'wordfence-ls'); ?></th>
|
38 |
<td class="wfls-option-text"><input type="text" name="recaptchaSecret" id="input-recaptchaSecret" class="wfls-form-control" value="<?php echo esc_attr($secretValue); ?>"<?php if (!$currentEnableValue) { echo ' disabled'; } ?>></td>
|
39 |
</tr>
|
40 |
</table>
|
44 |
<li class="wfls-option-spacer"></li>
|
45 |
<li class="wfls-option-title">
|
46 |
<ul class="wfls-flex-vertical wfls-flex-align-left">
|
47 |
+
<li class="wfls-option-subtitle"><?php echo wp_kses(__('Note: This feature requires a free site key and secret for the <a href="https://www.google.com/recaptcha/about/" target="_blank" rel="noopener noreferrer">Google reCAPTCHA v3 Service</a>. To set up new reCAPTCHA keys, log into your Google account and go to the <a href="https://www.google.com/recaptcha/admin" target="_blank" rel="noopener noreferrer">reCAPTCHA admin page</a>.', 'wordfence-ls'), array('a'=>array('href'=>array(), 'target'=>array(), 'rel'=>array()))); ?></li>
|
48 |
</ul>
|
49 |
</li>
|
50 |
</ul>
|
views/options/option-ip-source.php
CHANGED
@@ -16,7 +16,7 @@ $selectOptions = array(
|
|
16 |
<ul id="wfls-option-ip-source" class="wfls-option wfls-option-ip-source" data-option="<?php echo esc_attr(\WordfenceLS\Controller_Settings::OPTION_IP_SOURCE); ?>" data-original-value="<?php echo esc_attr(\WordfenceLS\Controller_Settings::shared()->get(\WordfenceLS\Controller_Settings::OPTION_IP_SOURCE)); ?>" data-text-area-option="<?php echo esc_attr(\WordfenceLS\Controller_Settings::OPTION_IP_TRUSTED_PROXIES); ?>" data-original-text-area-value="<?php echo esc_attr(\WordfenceLS\Controller_Settings::shared()->get(\WordfenceLS\Controller_Settings::OPTION_IP_TRUSTED_PROXIES)); ?>">
|
17 |
<li class="wfls-option-content wfls-no-right">
|
18 |
<ul class="wfls-flex-vertical wfls-flex-align-left">
|
19 |
-
<li class="wfls-option-title"><strong><?php
|
20 |
<li>
|
21 |
<ul class="wfls-flex-vertical wfls-flex-align-left">
|
22 |
<li class="wfls-padding-add-left">
|
@@ -44,8 +44,8 @@ $selectOptions = array(
|
|
44 |
<ul>
|
45 |
<li class="wfls-option-title">
|
46 |
<ul class="wfls-flex-vertical wfls-flex-align-left">
|
47 |
-
<li><?php
|
48 |
-
<li class="wfls-option-subtitle"><?php
|
49 |
</ul>
|
50 |
</li>
|
51 |
<li class="wfls-option-textarea">
|
16 |
<ul id="wfls-option-ip-source" class="wfls-option wfls-option-ip-source" data-option="<?php echo esc_attr(\WordfenceLS\Controller_Settings::OPTION_IP_SOURCE); ?>" data-original-value="<?php echo esc_attr(\WordfenceLS\Controller_Settings::shared()->get(\WordfenceLS\Controller_Settings::OPTION_IP_SOURCE)); ?>" data-text-area-option="<?php echo esc_attr(\WordfenceLS\Controller_Settings::OPTION_IP_TRUSTED_PROXIES); ?>" data-original-text-area-value="<?php echo esc_attr(\WordfenceLS\Controller_Settings::shared()->get(\WordfenceLS\Controller_Settings::OPTION_IP_TRUSTED_PROXIES)); ?>">
|
17 |
<li class="wfls-option-content wfls-no-right">
|
18 |
<ul class="wfls-flex-vertical wfls-flex-align-left">
|
19 |
+
<li class="wfls-option-title"><strong><?php esc_html_e('How to get IPs', 'wordfence-2fa'); ?></strong></li>
|
20 |
<li>
|
21 |
<ul class="wfls-flex-vertical wfls-flex-align-left">
|
22 |
<li class="wfls-padding-add-left">
|
44 |
<ul>
|
45 |
<li class="wfls-option-title">
|
46 |
<ul class="wfls-flex-vertical wfls-flex-align-left">
|
47 |
+
<li><?php esc_html_e('Trusted Proxies', 'wordfence-2fa'); ?></li>
|
48 |
+
<li class="wfls-option-subtitle"><?php esc_html_e('These IPs (or CIDR ranges) will be ignored when determining the requesting IP via the X-Forwarded-For HTTP header. Enter one IP or CIDR range per line.', 'wordfence-2fa'); ?></li>
|
49 |
</ul>
|
50 |
</li>
|
51 |
<li class="wfls-option-textarea">
|
views/options/option-ntp.php
ADDED
@@ -0,0 +1,88 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
if (!defined('WORDFENCE_LS_VERSION')) { exit; }
|
3 |
+
$maxFailures = (int) \WordfenceLS\Controller_Time::FAILURE_LIMIT;
|
4 |
+
$cronDisabled = \WordfenceLS\Controller_Settings::shared()->is_ntp_cron_disabled($failureCount);
|
5 |
+
$id = 'wfls-option-ntp';
|
6 |
+
?>
|
7 |
+
<ul id="<?php echo esc_attr($id); ?>" class="wfls-option wfls-flex-vertical wfls-flex-align-left">
|
8 |
+
<li class="wfls-option-title"><strong><?php esc_html_e('NTP', 'wordfence-2fa') ?></strong></li>
|
9 |
+
<li class="wfls-option-content">
|
10 |
+
<p><?php esc_html_e('NTP is a protocol that allows for remote time synchronization. Wordfence Login Security uses this protocol to ensure that it has the most accurate time which is necessary for TOTP-based two-factor authentication.', 'wordfence-2fa') ?></p>
|
11 |
+
<?php if (\WordfenceLS\Controller_Settings::shared()->is_ntp_disabled_via_constant()): ?>
|
12 |
+
<p><?php esc_html_e('The constant WORDFENCE_LS_DISABLE_NTP is defined which disables NTP entirely. Remove this constant or set it to a falsy value to enable NTP.', 'wordfence-2fa') ?></p>
|
13 |
+
<?php elseif ($cronDisabled): ?>
|
14 |
+
<?php if ($failureCount > 0): ?>
|
15 |
+
<p><strong><?php echo sprintf(esc_html__('NTP is currently disabled as %d subsequent attempts have failed.', 'wordfence-2fa'), $maxFailures) ?></strong></p>
|
16 |
+
<?php else: ?>
|
17 |
+
<p><?php esc_html_e('NTP was manually disabled.', 'wordfence-2fa') ?></p>
|
18 |
+
<?php endif ?>
|
19 |
+
<button id="wfls-reset-ntp-failure-count" class="wfls-btn wfls-btn-sm wfls-btn-default"><?php esc_html_e('Reset', 'wordfence-2fa') ?></button>
|
20 |
+
<?php else: ?>
|
21 |
+
<p><?php echo wp_kses(__('NTP is currently <strong>enabled</strong>.', 'wordfence-2fa'), array('strong'=>array())); ?></p>
|
22 |
+
<?php if ($failureCount > 0): ?>
|
23 |
+
<?php $remainingAttempts = $maxFailures - $failureCount; ?>
|
24 |
+
<p>
|
25 |
+
<strong><?php esc_html_e('NTP updates are currently failing.', 'wordfence-2fa') ?></strong>
|
26 |
+
<?php echo $remainingAttempts > 0 ? sprintf(esc_html__('NTP will be automatically disabled after %d more attempts.', 'wordfence-2fa'), $remainingAttempts) : esc_html__('NTP will be automatically disabled after 1 more attempt.', 'wordfence-2fa') ?>
|
27 |
+
</p>
|
28 |
+
<?php endif ?>
|
29 |
+
<button id="wfls-disable-ntp" class="wfls-btn wfls-btn-sm wfls-btn-default"><?php esc_html_e('Disable', 'wordfence-2fa') ?></button>
|
30 |
+
<?php endif ?>
|
31 |
+
</li>
|
32 |
+
</ul>
|
33 |
+
<script>
|
34 |
+
(function($) {
|
35 |
+
$(function() {
|
36 |
+
$('#wfls-reset-ntp-failure-count').on('click', function(e) {
|
37 |
+
e.preventDefault();
|
38 |
+
e.stopPropagation();
|
39 |
+
|
40 |
+
function handleError(message) {
|
41 |
+
WFLS.panelModal(
|
42 |
+
(WFLS.screenSize(500) ? '300px' : '400px'),
|
43 |
+
'<?php echo \WordfenceLS\Text\Model_JavaScript::esc_js(__('Error Resetting NTP', 'wordfence-2fa')); ?>',
|
44 |
+
typeof message === 'undefined' ? '<?php echo \WordfenceLS\Text\Model_JavaScript::esc_js(__('An error was encountered while trying to reset the NTP state. Please try again.', 'wordfence-2fa')); ?>' : message
|
45 |
+
);
|
46 |
+
}
|
47 |
+
|
48 |
+
WFLS.ajax('wordfence_ls_reset_ntp_failure_count', [],
|
49 |
+
function(response) {
|
50 |
+
if (response.error) {
|
51 |
+
handleError(response.error);
|
52 |
+
}
|
53 |
+
else {
|
54 |
+
window.location.reload();
|
55 |
+
}
|
56 |
+
},
|
57 |
+
function (error) {
|
58 |
+
handleError();
|
59 |
+
});
|
60 |
+
});
|
61 |
+
$('#wfls-disable-ntp').on('click', function(e) {
|
62 |
+
e.preventDefault();
|
63 |
+
e.stopPropagation();
|
64 |
+
|
65 |
+
function handleError(message) {
|
66 |
+
WFLS.panelModal(
|
67 |
+
(WFLS.screenSize(500) ? '300px' : '400px'),
|
68 |
+
'<?php echo \WordfenceLS\Text\Model_JavaScript::esc_js(__('Error Disabling NTP', 'wordfence-2fa')); ?>',
|
69 |
+
typeof message === 'undefined' ? '<?php echo \WordfenceLS\Text\Model_JavaScript::esc_js(__('An error was encountered while trying to disable NTP. Please try again.', 'wordfence-2fa')); ?>' : message
|
70 |
+
);
|
71 |
+
}
|
72 |
+
|
73 |
+
WFLS.ajax('wordfence_ls_disable_ntp', [],
|
74 |
+
function(response) {
|
75 |
+
if (response.error) {
|
76 |
+
handleError(response.error);
|
77 |
+
}
|
78 |
+
else {
|
79 |
+
window.location.reload();
|
80 |
+
}
|
81 |
+
},
|
82 |
+
function (error) {
|
83 |
+
handleError();
|
84 |
+
});
|
85 |
+
});
|
86 |
+
});
|
87 |
+
})(jQuery);
|
88 |
+
</script>
|
views/options/option-require-2fa.php
DELETED
@@ -1,245 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
if (!defined('WORDFENCE_LS_VERSION')) { exit; }
|
3 |
-
|
4 |
-
$requireOptionName = \WordfenceLS\Controller_Settings::OPTION_REQUIRE_2FA_ADMIN;
|
5 |
-
$currentRequireValue = \WordfenceLS\Controller_Settings::shared()->get_bool($requireOptionName);
|
6 |
-
|
7 |
-
$gracePeriodEnabledOptionName = \WordfenceLS\Controller_Settings::OPTION_REQUIRE_2FA_GRACE_PERIOD_ENABLED;
|
8 |
-
$currentGracePeriodEnabledValue = \WordfenceLS\Controller_Settings::shared()->get_bool($gracePeriodEnabledOptionName);
|
9 |
-
|
10 |
-
$gracePeriodDateOptionName = \WordfenceLS\Controller_Settings::OPTION_REQUIRE_2FA_GRACE_PERIOD;
|
11 |
-
$currentGracePeriodDateValue = \WordfenceLS\Controller_Settings::shared()->get_int($gracePeriodDateOptionName, \WordfenceLS\Controller_Time::time() + 7 *84600);
|
12 |
-
|
13 |
-
if ($currentGracePeriodEnabledValue && $currentGracePeriodDateValue < \WordfenceLS\Controller_Time::time()) { //Clear the grace period settings if this is the first page view since it expired
|
14 |
-
\WordfenceLS\Controller_Settings::shared()->set($gracePeriodEnabledOptionName, false);
|
15 |
-
$currentGracePeriodEnabledValue = false;
|
16 |
-
\WordfenceLS\Controller_Settings::shared()->remove($gracePeriodDateOptionName);
|
17 |
-
$currentGracePeriodDateValue = \WordfenceLS\Controller_Settings::shared()->get_int($gracePeriodDateOptionName, \WordfenceLS\Controller_Time::time() + 7 *84600);
|
18 |
-
}
|
19 |
-
|
20 |
-
$timeZoneMinutes = 0;
|
21 |
-
$tz = get_option('timezone_string');
|
22 |
-
if (!empty($tz)) {
|
23 |
-
$timezone = new DateTimeZone($tz);
|
24 |
-
$dtStr = gmdate("c", (int) $currentGracePeriodDateValue); //Have to do it this way because of PHP 5.2
|
25 |
-
$dt = new DateTime($dtStr, $timezone);
|
26 |
-
$timeZoneMinutes = (int) ($timezone->getOffset($dt) / 60);
|
27 |
-
}
|
28 |
-
else {
|
29 |
-
$gmt = get_option('gmt_offset');
|
30 |
-
if (!empty($gmt)) {
|
31 |
-
$timeZoneMinutes = (int) ($gmt * 60);
|
32 |
-
}
|
33 |
-
}
|
34 |
-
?>
|
35 |
-
<ul id="wfls-option-require-2fa" data-option="<?php echo esc_attr($requireOptionName); ?>" data-enabled-value="1" data-disabled-value="0" data-original-value="<?php echo $currentRequireValue ? '1' : '0'; ?>">
|
36 |
-
<li>
|
37 |
-
<ul class="wfls-option wfls-padding-add-bottom-small">
|
38 |
-
<li id="wfls-require-2fa-admin" class="wfls-option-checkbox<?php echo ($currentRequireValue ? ' wfls-checked' : ''); ?>" role="checkbox" aria-checked="<?php echo ($currentRequireValue ? 'true' : 'false'); ?>" tabindex="0"><i class="wfls-ion-ios-checkmark-empty" aria-hidden="true" aria-labelledby="wfls-require-2fa-admin-label"></i></li>
|
39 |
-
<li class="wfls-option-title">
|
40 |
-
<ul class="wfls-flex-vertical wfls-flex-align-left">
|
41 |
-
<li>
|
42 |
-
<strong id="wfls-require-2fa-admin-label"><?php _e('Require 2FA for all administrators', 'wordfence-2fa'); ?></strong>
|
43 |
-
</li>
|
44 |
-
<li class="wfls-option-subtitle"><?php _e('Note: This setting requires at least one administrator to have 2FA active. On multisite, this option applies only to super admins.', 'wordfence-2fa'); ?></li>
|
45 |
-
</ul>
|
46 |
-
</li>
|
47 |
-
</ul>
|
48 |
-
</li>
|
49 |
-
<li>
|
50 |
-
<ul class="wfls-option wfls-padding-no-top">
|
51 |
-
<li class="wfls-option-spacer"></li>
|
52 |
-
<li id="wfls-require-2fa-grace-period" class="wfls-flex-horizontal wfls-option-date">
|
53 |
-
<div class="wfls-option-checkbox<?php echo $currentGracePeriodEnabledValue ? ' wfls-checked' : ''; ?><?php echo $currentRequireValue ? '' : ' wfls-disabled'; ?>" data-original-value="<?php echo $currentGracePeriodEnabledValue ? '1' : '0'; ?>"><i class="wfls-ion-ios-checkmark-empty" aria-hidden="true"></i></div>
|
54 |
-
<span id="wfls-require-2fa-grace-period-label" class="wfls-padding-add-left wfls-padding-add-right"><?php _e('Grace period to require 2FA', 'wordfence'); ?> </span>
|
55 |
-
<input type="text" name="require2FAGracePeriod" id="input-require2FAGracePeriod" class="wfls-datetime wfls-form-control" placeholder="Enabled on..." data-value="<?php echo $currentGracePeriodDateValue; ?>" data-original-value="<?php echo $currentGracePeriodDateValue; ?>"<?php echo $currentGracePeriodEnabledValue ? '' : ' disabled'; ?>>
|
56 |
-
</li>
|
57 |
-
</ul>
|
58 |
-
</li>
|
59 |
-
<li>
|
60 |
-
<ul class="wfls-option wfls-padding-no-top">
|
61 |
-
<li class="wfls-option-spacer"></li>
|
62 |
-
<li class="wfls-option-spacer"></li>
|
63 |
-
<li><a href="#" id="wfls-send-grace-period-notification" class="wfls-btn wfls-btn-sm wfls-btn-default<?php echo (\WordfenceLS\Controller_Settings::shared()->get_bool(\WordfenceLS\Controller_Settings::OPTION_REQUIRE_2FA_ADMIN) && \WordfenceLS\Controller_Settings::shared()->get_bool(\WordfenceLS\Controller_Settings::OPTION_REQUIRE_2FA_GRACE_PERIOD_ENABLED) && \WordfenceLS\Controller_Time::time() < \WordfenceLS\Controller_Settings::shared()->get_int(\WordfenceLS\Controller_Settings::OPTION_REQUIRE_2FA_GRACE_PERIOD)) ? '' : ' wfls-disabled'; ?>"><?php _e('Send Notification', 'wordfence-2fa'); ?></a></li>
|
64 |
-
</ul>
|
65 |
-
</li>
|
66 |
-
</ul>
|
67 |
-
<script type="application/javascript">
|
68 |
-
(function($) {
|
69 |
-
$(function() {
|
70 |
-
$('#wfls-require-2fa-admin').on('keydown', function(e) {
|
71 |
-
if (e.keyCode == 32) {
|
72 |
-
e.preventDefault();
|
73 |
-
e.stopPropagation();
|
74 |
-
|
75 |
-
$(this).trigger('click');
|
76 |
-
}
|
77 |
-
});
|
78 |
-
|
79 |
-
$('#wfls-require-2fa-admin').on('click', function(e) {
|
80 |
-
e.preventDefault();
|
81 |
-
e.stopPropagation();
|
82 |
-
|
83 |
-
var optionElement = $('#wfls-option-require-2fa');
|
84 |
-
if (optionElement.hasClass('wfls-disabled')) {
|
85 |
-
return;
|
86 |
-
}
|
87 |
-
|
88 |
-
var option = optionElement.data('option');
|
89 |
-
var value = false;
|
90 |
-
var isActive = $(this).hasClass('wfls-checked');
|
91 |
-
if (isActive) {
|
92 |
-
$(this).removeClass('wfls-checked').attr('aria-checked', 'false');
|
93 |
-
$('#wfls-require-2fa-grace-period .wfls-option-checkbox').addClass('wfls-disabled');
|
94 |
-
$('#wfls-option-require-2fa .wfls-datetime').attr('disabled', true);
|
95 |
-
value = optionElement.data('disabledValue');
|
96 |
-
}
|
97 |
-
else {
|
98 |
-
$(this).addClass('wfls-checked').attr('aria-checked', 'true');
|
99 |
-
$('#wfls-require-2fa-grace-period .wfls-option-checkbox').removeClass('wfls-disabled');
|
100 |
-
if ($('#wfls-require-2fa-grace-period .wfls-option-checkbox').hasClass('wfls-checked')) {
|
101 |
-
$('#wfls-option-require-2fa .wfls-datetime').attr('disabled', false);
|
102 |
-
}
|
103 |
-
value = optionElement.data('enabledValue');
|
104 |
-
}
|
105 |
-
|
106 |
-
var originalValue = optionElement.data('originalValue');
|
107 |
-
if (originalValue == value) {
|
108 |
-
delete WFLS.pendingChanges[option];
|
109 |
-
}
|
110 |
-
else {
|
111 |
-
WFLS.pendingChanges[option] = value;
|
112 |
-
}
|
113 |
-
|
114 |
-
$(optionElement).trigger('change', [false]);
|
115 |
-
WFLS.updatePendingChanges();
|
116 |
-
});
|
117 |
-
|
118 |
-
$('#wfls-require-2fa-admin-label, #wfls-require-2fa-grace-period-label').on('click', function(e) {
|
119 |
-
var links = $(this).find('a');
|
120 |
-
var buffer = 10;
|
121 |
-
for (var i = 0; i < links.length; i++) {
|
122 |
-
var t = $(links[i]).offset().top;
|
123 |
-
var l = $(links[i]).offset().left;
|
124 |
-
var b = t + $(links[i]).height();
|
125 |
-
var r = l + $(links[i]).width();
|
126 |
-
|
127 |
-
if (e.pageX > l - buffer && e.pageX < r + buffer && e.pageY > t - buffer && e.pageY < b + buffer) {
|
128 |
-
return;
|
129 |
-
}
|
130 |
-
}
|
131 |
-
$(this).closest('.wfls-option').find('.wfls-option-checkbox').trigger('click');
|
132 |
-
}).css('cursor', 'pointer');
|
133 |
-
|
134 |
-
$('#wfls-option-require-2fa .wfls-datetime').datetimepicker({
|
135 |
-
dateFormat: 'yy-mm-dd',
|
136 |
-
timezone: <?php echo $timeZoneMinutes; ?>,
|
137 |
-
showTime: false,
|
138 |
-
showTimepicker: false,
|
139 |
-
showMonthAfterYear: true
|
140 |
-
}).each(function() {
|
141 |
-
var el = $(this);
|
142 |
-
if (el.attr('data-value')) {
|
143 |
-
el.datetimepicker('setDate', new Date(el.attr('data-value') * 1000));
|
144 |
-
}
|
145 |
-
}).on('change', function() {
|
146 |
-
var value = Math.floor($(this).datetimepicker('getDate').getTime() / 1000);
|
147 |
-
var originalValue = $('#input-require2FAGracePeriod').data('originalValue');
|
148 |
-
if (originalValue == value) {
|
149 |
-
delete WFLS.pendingChanges['<?php echo esc_js($gracePeriodDateOptionName); ?>'];
|
150 |
-
}
|
151 |
-
else {
|
152 |
-
WFLS.pendingChanges['<?php echo esc_js($gracePeriodDateOptionName); ?>'] = $(this).val();
|
153 |
-
}
|
154 |
-
WFLS.updatePendingChanges();
|
155 |
-
});
|
156 |
-
|
157 |
-
$('#wfls-require-2fa-grace-period .wfls-option-checkbox').on('click', function(e) {
|
158 |
-
e.preventDefault();
|
159 |
-
e.stopPropagation();
|
160 |
-
|
161 |
-
if ($(this).hasClass('wfls-disabled')) {
|
162 |
-
return;
|
163 |
-
}
|
164 |
-
|
165 |
-
var originalValue = $(this).data('originalValue');
|
166 |
-
var value = originalValue;
|
167 |
-
var isActive = $(this).hasClass('wfls-checked');
|
168 |
-
if (isActive) {
|
169 |
-
$(this).removeClass('wfls-checked');
|
170 |
-
$('#wfls-option-require-2fa .wfls-datetime').attr('disabled', true);
|
171 |
-
value = 0;
|
172 |
-
}
|
173 |
-
else {
|
174 |
-
$(this).addClass('wfls-checked');
|
175 |
-
$('#wfls-option-require-2fa .wfls-datetime').attr('disabled', false);
|
176 |
-
value = 1;
|
177 |
-
|
178 |
-
if (!$('#input-require2FAGracePeriod').val()) {
|
179 |
-
var date = new Date();
|
180 |
-
date.setDate(date.getDate() + 7);
|
181 |
-
$('#input-require2FAGracePeriod').datetimepicker('setDate', date);
|
182 |
-
}
|
183 |
-
}
|
184 |
-
|
185 |
-
if (originalValue == value) {
|
186 |
-
delete WFLS.pendingChanges['<?php echo esc_js($gracePeriodEnabledOptionName); ?>'];
|
187 |
-
}
|
188 |
-
else {
|
189 |
-
WFLS.pendingChanges['<?php echo esc_js($gracePeriodEnabledOptionName); ?>'] = value;
|
190 |
-
}
|
191 |
-
|
192 |
-
$('#wfls-option-require-2fa .wfls-datetime').trigger('change');
|
193 |
-
|
194 |
-
WFLS.updatePendingChanges();
|
195 |
-
});
|
196 |
-
|
197 |
-
$(window).on('wflsOptionsReset', function() {
|
198 |
-
$('#wfls-option-require-2fa').each(function() {
|
199 |
-
var enabledValue = $(this).data('enabledValue');
|
200 |
-
var disabledValue = $(this).data('disabledValue');
|
201 |
-
var originalValue = $(this).data('originalValue');
|
202 |
-
if (enabledValue == originalValue) {
|
203 |
-
$(this).find('#wfls-require-2fa-admin.wfls-option-checkbox').addClass('wfls-checked').attr('aria-checked', 'true');
|
204 |
-
}
|
205 |
-
else {
|
206 |
-
$(this).find('#wfls-require-2fa-admin.wfls-option-checkbox').removeClass('wfls-checked').attr('aria-checked', 'false');
|
207 |
-
}
|
208 |
-
$(this).trigger('change', [true]);
|
209 |
-
});
|
210 |
-
$('#wfls-require-2fa-grace-period .wfls-option-checkbox').each(function() {
|
211 |
-
var originalValue = $(this).data('originalValue');
|
212 |
-
$(this).toggleClass('wfls-checked', !!originalValue);
|
213 |
-
$('#wfls-option-require-2fa .wfls-datetime').attr('disabled', !originalValue);
|
214 |
-
});
|
215 |
-
$('.wfls-datetime').each(function() {
|
216 |
-
var el = $(this);
|
217 |
-
if (el.attr('data-value')) {
|
218 |
-
el.datetimepicker('setDate', new Date(el.attr('data-value') * 1000));
|
219 |
-
}
|
220 |
-
else {
|
221 |
-
el.val('');
|
222 |
-
}
|
223 |
-
});
|
224 |
-
});
|
225 |
-
|
226 |
-
$('#wfls-send-grace-period-notification').on('click', function(e) {
|
227 |
-
e.preventDefault();
|
228 |
-
e.stopPropagation();
|
229 |
-
|
230 |
-
WFLS.ajax('wordfence_ls_send_grace_period_notification', [],
|
231 |
-
function(response) {
|
232 |
-
if (response.error) {
|
233 |
-
WFLS.panelModal((WFLS.screenSize(500) ? '300px' : '400px'), '<?php echo \WordfenceLS\Text\Model_JavaScript::esc_js(__('Error Sending Notification', 'wordfence-2fa')); ?>', response.error);
|
234 |
-
}
|
235 |
-
else {
|
236 |
-
WFLS.panelModal((WFLS.screenSize(500) ? '300px' : '400px'), '<?php echo \WordfenceLS\Text\Model_JavaScript::esc_js(__('Notification Sent', 'wordfence-2fa')); ?>', response.confirmation);
|
237 |
-
}
|
238 |
-
},
|
239 |
-
function (error) {
|
240 |
-
WFLS.panelModal((WFLS.screenSize(500) ? '300px' : '400px'), '<?php echo \WordfenceLS\Text\Model_JavaScript::esc_js(__('Error Sending Notification', 'wordfence-2fa')); ?>', '<?php echo \WordfenceLS\Text\Model_JavaScript::esc_js(__('An error was encountered while trying to send the notification. Please try again.', 'wordfence-2fa')); ?>');
|
241 |
-
});
|
242 |
-
});
|
243 |
-
});
|
244 |
-
})(jQuery);
|
245 |
-
</script>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
views/options/option-roles.php
ADDED
@@ -0,0 +1,133 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
if (!defined('WORDFENCE_LS_VERSION')) { exit; }
|
3 |
+
|
4 |
+
use \WordfenceLS\Controller_Settings;
|
5 |
+
|
6 |
+
$states = array(
|
7 |
+
Controller_Settings::STATE_2FA_DISABLED => __('Disabled', 'wordfence-2fa'),
|
8 |
+
Controller_Settings::STATE_2FA_OPTIONAL => __('Optional', 'wordfence-2fa'),
|
9 |
+
Controller_Settings::STATE_2FA_REQUIRED => __('Required', 'wordfence-2fa')
|
10 |
+
);
|
11 |
+
|
12 |
+
$gracePeriod = Controller_Settings::shared()->get_int(Controller_Settings::OPTION_REQUIRE_2FA_USER_GRACE_PERIOD, Controller_Settings::DEFAULT_REQUIRE_2FA_USER_GRACE_PERIOD);
|
13 |
+
|
14 |
+
$requiredRoles = array();
|
15 |
+
foreach ($options as $option) {
|
16 |
+
if ($option['state'] === Controller_Settings::STATE_2FA_REQUIRED) {
|
17 |
+
$requiredRoles[$option['role']] = $option['title'];
|
18 |
+
}
|
19 |
+
}
|
20 |
+
|
21 |
+
?>
|
22 |
+
<ul class="wfls-option wfls-option-2fa-roles">
|
23 |
+
<li class="wfls-option-title">
|
24 |
+
<label><?php esc_html_e('2FA Roles', 'wordfence-2fa') ?></label>
|
25 |
+
</li>
|
26 |
+
<li class="wfls-option-content">
|
27 |
+
<ul>
|
28 |
+
<?php foreach ($options as $option): ?>
|
29 |
+
<?php $selectId = 'wfls-2fa-role-' . $option['name']; ?>
|
30 |
+
<li>
|
31 |
+
<label for="<?php echo esc_attr($selectId) ?>"><?php echo esc_html($option['title']) ?></label>
|
32 |
+
<select id="<?php echo esc_attr($selectId) ?>" name="<?php echo esc_attr($option['name']) ?>" class="wfls-option-select">
|
33 |
+
<?php foreach ($states as $key => $label): ?>
|
34 |
+
<?php if (!$option['allow_disabling'] && $key === Controller_Settings::STATE_2FA_DISABLED) continue; ?>
|
35 |
+
<option
|
36 |
+
value="<?php echo esc_attr($key); ?>"
|
37 |
+
<?php if($option['state'] === $key): ?> selected<?php endif ?>
|
38 |
+
<?php if(!$option['editable']): ?> disabled<?php endif ?>
|
39 |
+
>
|
40 |
+
<?php echo esc_html($label) ?>
|
41 |
+
</option>
|
42 |
+
<?php endforeach ?>
|
43 |
+
</select>
|
44 |
+
</li>
|
45 |
+
<?php endforeach ?>
|
46 |
+
</ul>
|
47 |
+
<?php if ($hasWoocommerce): ?>
|
48 |
+
<p><?php esc_html_e('By default, the customer role provided by WooCommerce does not have access to admin pages and therefore users in this role cannot configure two-factor authentication at this time.', 'wordfence-2fa') ?></p>
|
49 |
+
<?php endif ?>
|
50 |
+
</li>
|
51 |
+
<li class="wfls-2fa-grace-period-container">
|
52 |
+
<label for="wfls-2fa-grace-period" class="wfls-primary-label"><?php esc_html_e('Grace Period', 'wordfence-2fa') ?></label>
|
53 |
+
<input id="wfls-2fa-grace-period" type="text" pattern="[0-9]+" value="<?php echo (int)$gracePeriod; ?>" class="wfls-option-input wfls-option-input-required" name="<?php echo esc_html(Controller_Settings::OPTION_REQUIRE_2FA_USER_GRACE_PERIOD) ?>" maxlength="2">
|
54 |
+
<label for="wfls-2fa-grace-period"><?php esc_html_e('days') ?></label>
|
55 |
+
<div id="wfls-grace-period-zero-warning" style="display: none;">
|
56 |
+
<strong><?php esc_html_e('Setting the grace period to 0 will prevent users in roles where 2FA is required, including newly created users, from logging in if they have not already enabled two-factor authentication.', 'wordfence-2fa') ?></strong>
|
57 |
+
<a href="<?php echo esc_attr(\WordfenceLS\Controller_Support::esc_supportURL(\WordfenceLS\Controller_Support::ITEM_MODULE_LOGIN_SECURITY_ROLES)) ?>" target="_blank" rel="noopener noreferrer"><?php esc_html_e('Learn More', 'wordfence-2fa') ?></a>
|
58 |
+
</div>
|
59 |
+
<small><?php esc_html_e('For roles that require 2FA, users will have this many days to set up 2FA. Failure to set up 2FA during this period will result in the user losing account access. This grace period will apply to new users from the time of account creation. For existing users, this grace period will apply relative to the time at which the requirement is implemented. This grace period will not automatically apply to admins and must be manually enabled for each admin user.', 'wordfence-2fa') ?></small>
|
60 |
+
</li>
|
61 |
+
<?php if (!empty($requiredRoles)): ?>
|
62 |
+
<li class="wfls-2fa-notification-action">
|
63 |
+
<select id="wfls-grace-period-notification-role">
|
64 |
+
<?php foreach ($requiredRoles as $role => $label): ?>
|
65 |
+
<option value="<?php echo esc_attr($role) ?>"><?php echo esc_html($label) ?></option>
|
66 |
+
<?php endforeach ?>
|
67 |
+
</select>
|
68 |
+
<button class="wfls-btn wfls-btn-default wfls-btn-sm" id="wfls-send-grace-period-notification"><?php esc_html_e('Notify') ?></button>
|
69 |
+
<small><?php esc_html_e('Send an email to users with the selected role to notify them of the grace period for enabling 2FA.') ?></small>
|
70 |
+
</li>
|
71 |
+
<?php endif ?>
|
72 |
+
</ul>
|
73 |
+
<script>
|
74 |
+
(function($) {
|
75 |
+
function sendGracePeriodNotification(notifyAll) {
|
76 |
+
var request = {
|
77 |
+
role: $('#wfls-grace-period-notification-role').val()
|
78 |
+
};
|
79 |
+
if (typeof notifyAll !== "undefined" && notifyAll)
|
80 |
+
request.notify_all = true;
|
81 |
+
WFLS.ajax('wordfence_ls_send_grace_period_notification', request,
|
82 |
+
function(response) {
|
83 |
+
if (response.error) {
|
84 |
+
var settings = {
|
85 |
+
additional_buttons: []
|
86 |
+
};
|
87 |
+
if (response.limit_exceeded) {
|
88 |
+
settings.additional_buttons.push({
|
89 |
+
label: '<?php echo \WordfenceLS\Text\Model_JavaScript::esc_js(__('Send Anyway', 'wordfence-2fa')); ?>',
|
90 |
+
id: 'wfls-send-grace-period-notification-over-limit'
|
91 |
+
});
|
92 |
+
}
|
93 |
+
WFLS.panelModal((WFLS.screenSize(500) ? '300px' : '400px'), '<?php echo \WordfenceLS\Text\Model_JavaScript::esc_js(__('Error Sending Notification', 'wordfence-2fa')); ?>', response.error, settings);
|
94 |
+
}
|
95 |
+
else {
|
96 |
+
WFLS.panelModal((WFLS.screenSize(500) ? '300px' : '400px'), '<?php echo \WordfenceLS\Text\Model_JavaScript::esc_js(__('Notification Sent', 'wordfence-2fa')); ?>', response.confirmation);
|
97 |
+
}
|
98 |
+
if (request.notify_all) {
|
99 |
+
WFLS.panelClose();
|
100 |
+
}
|
101 |
+
},
|
102 |
+
function (error) {
|
103 |
+
WFLS.panelModal((WFLS.screenSize(500) ? '300px' : '400px'), '<?php echo \WordfenceLS\Text\Model_JavaScript::esc_js(__('Error Sending Notification', 'wordfence-2fa')); ?>', '<?php echo \WordfenceLS\Text\Model_JavaScript::esc_js(__('An error was encountered while trying to send the notification. Please try again.', 'wordfence-2fa')); ?>');
|
104 |
+
if (request.notify_all) {
|
105 |
+
WFLS.panelClose();
|
106 |
+
}
|
107 |
+
});
|
108 |
+
}
|
109 |
+
$('#wfls-send-grace-period-notification').on('click', function(e) {
|
110 |
+
e.preventDefault();
|
111 |
+
e.stopPropagation();
|
112 |
+
sendGracePeriodNotification();
|
113 |
+
});
|
114 |
+
$(document).on('click', '#wfls-send-grace-period-notification-over-limit', function() {
|
115 |
+
sendGracePeriodNotification(true);
|
116 |
+
$(this).prop("disabled", true);
|
117 |
+
});
|
118 |
+
$('#wfls-2fa-grace-period').on('input', function(e) {
|
119 |
+
var value = $(this).val();
|
120 |
+
value = value.replace(/[^0-9]/g, '');
|
121 |
+
value = parseInt(value);
|
122 |
+
if (isNaN(value))
|
123 |
+
value = '';
|
124 |
+
if (value === 0) {
|
125 |
+
$("#wfls-grace-period-zero-warning").show();
|
126 |
+
}
|
127 |
+
else {
|
128 |
+
$("#wfls-grace-period-zero-warning").hide();
|
129 |
+
}
|
130 |
+
$(this).val(value);
|
131 |
+
}).trigger('input');
|
132 |
+
})(jQuery);
|
133 |
+
</script>
|
views/options/option-select.php
CHANGED
@@ -19,7 +19,7 @@ $id = 'wfls-option-' . preg_replace('/[^a-z0-9]/i', '-', $selectOptionName);
|
|
19 |
<li class="wfls-option-spacer"></li>
|
20 |
<li class="wfls-option-content">
|
21 |
<ul>
|
22 |
-
<li class="wfls-option-title"><span id="<?php echo esc_attr($id); ?>-label"><?php echo esc_html($title); ?></span><?php if (!wfConfig::p() && isset($premium) && $premium) { echo ' <a href="https://www.wordfence.com/gnl1optionUpgrade/wordfence-signup/" target="_blank" rel="noopener noreferrer" class="wfls-premium-link">' .
|
23 |
<li class="wfls-option-select wfls-padding-add-top-xs-small">
|
24 |
<select<?php echo (!(!wfConfig::p() && isset($premium) && $premium) ? '' : ' disabled'); ?> aria-labelledby="<?php echo esc_attr($id); ?>-label">
|
25 |
<?php foreach ($selectOptions as $o): ?>
|
19 |
<li class="wfls-option-spacer"></li>
|
20 |
<li class="wfls-option-content">
|
21 |
<ul>
|
22 |
+
<li class="wfls-option-title"><span id="<?php echo esc_attr($id); ?>-label"><?php echo esc_html($title); ?></span><?php if (!wfConfig::p() && isset($premium) && $premium) { echo ' <a href="https://www.wordfence.com/gnl1optionUpgrade/wordfence-signup/" target="_blank" rel="noopener noreferrer" class="wfls-premium-link">' . esc_html__('Premium Feature', 'wordfence') . '</a>'; } ?><?php if (isset($helpLink)) { echo ' <a href="' . esc_attr($helpLink) . '" target="_blank" rel="noopener noreferrer" class="wfls-inline-help"><i class="' . (WORDFENCE_LS_FROM_CORE ? 'wf-fa wf-fa-question-circle-o' : 'wfls-fa wfls-fa-question-circle-o') . '" aria-hidden="true"></i></a>'; } ?></li>
|
23 |
<li class="wfls-option-select wfls-padding-add-top-xs-small">
|
24 |
<select<?php echo (!(!wfConfig::p() && isset($premium) && $premium) ? '' : ' disabled'); ?> aria-labelledby="<?php echo esc_attr($id); ?>-label">
|
25 |
<?php foreach ($selectOptions as $o): ?>
|
views/options/option-text.php
CHANGED
@@ -27,7 +27,7 @@ $id = 'wfls-option-' . preg_replace('/[^a-z0-9]/i', '-', $textOptionName);
|
|
27 |
<ul class="wfls-flex-vertical wfls-flex-align-left">
|
28 |
<li>
|
29 |
<?php endif; ?>
|
30 |
-
<span id="<?php echo esc_attr($id); ?>-label"><?php echo esc_html($title); ?></span><?php if (!wfConfig::p() && isset($premium) && $premium) { echo ' <a href="https://www.wordfence.com/gnl1optionUpgrade/wordfence-signup/" target="_blank" rel="noopener noreferrer" class="wfls-premium-link">' .
|
31 |
<?php if (isset($subtitle)): ?>
|
32 |
</li>
|
33 |
<li class="wfls-option-subtitle"><?php echo esc_html($subtitle); ?></li>
|
27 |
<ul class="wfls-flex-vertical wfls-flex-align-left">
|
28 |
<li>
|
29 |
<?php endif; ?>
|
30 |
+
<span id="<?php echo esc_attr($id); ?>-label"><?php echo esc_html($title); ?></span><?php if (!wfConfig::p() && isset($premium) && $premium) { echo ' <a href="https://www.wordfence.com/gnl1optionUpgrade/wordfence-signup/" target="_blank" rel="noopener noreferrer" class="wfls-premium-link">' . esc_html__('Premium Feature', 'wordfence') . '</a>'; } ?><?php if (isset($helpLink)) { echo ' <a href="' . esc_attr($helpLink) . '" target="_blank" rel="noopener noreferrer" class="wfls-inline-help"><i class="' . (WORDFENCE_LS_FROM_CORE ? 'wf-fa wf-fa-question-circle-o' : 'wfls-fa wfls-fa-question-circle-o') . '" aria-hidden="true"></i></a>'; } ?>
|
31 |
<?php if (isset($subtitle)): ?>
|
32 |
</li>
|
33 |
<li class="wfls-option-subtitle"><?php echo esc_html($subtitle); ?></li>
|
views/options/option-toggled-boolean-switch.php
CHANGED
@@ -29,7 +29,7 @@ $id = 'wfls-option-' . preg_replace('/[^a-z0-9]/i', '-', $optionName);
|
|
29 |
<ul class="wfls-flex-vertical wfls-flex-align-left">
|
30 |
<li>
|
31 |
<?php endif; ?>
|
32 |
-
<span id="<?php echo esc_attr($id); ?>-label"><?php echo (!empty($title)) ? esc_html($title) : ''; echo (!empty($htmlTitle)) ? wp_kses($htmlTitle, 'post') : ''; ?></span><?php if (!wfConfig::p() && isset($premium) && $premium) { echo ' <a href="https://www.wordfence.com/gnl1optionUpgrade/wordfence-signup/" target="_blank" rel="noopener noreferrer" class="wfls-premium-link">' .
|
33 |
<?php if (isset($subtitleHTML)): ?>
|
34 |
</li>
|
35 |
<li class="wfls-option-subtitle"><?php echo $subtitleHTML; ?></li>
|
29 |
<ul class="wfls-flex-vertical wfls-flex-align-left">
|
30 |
<li>
|
31 |
<?php endif; ?>
|
32 |
+
<span id="<?php echo esc_attr($id); ?>-label"><?php echo (!empty($title)) ? esc_html($title) : ''; echo (!empty($htmlTitle)) ? wp_kses($htmlTitle, 'post') : ''; ?></span><?php if (!wfConfig::p() && isset($premium) && $premium) { echo ' <a href="https://www.wordfence.com/gnl1optionUpgrade/wordfence-signup/" target="_blank" rel="noopener noreferrer" class="wfls-premium-link">' . esc_html__('Premium Feature', 'wordfence') . '</a>'; } ?><?php if (isset($helpLink)) { echo ' <a href="' . esc_attr($helpLink) . '" target="_blank" rel="noopener noreferrer" class="wfls-inline-help"><i class="' . (WORDFENCE_LS_FROM_CORE ? 'wf-fa wf-fa-question-circle-o' : 'wfls-fa wfls-fa-question-circle-o') . '" aria-hidden="true"></i></a>'; } ?>
|
33 |
<?php if (isset($subtitleHTML)): ?>
|
34 |
</li>
|
35 |
<li class="wfls-option-subtitle"><?php echo $subtitleHTML; ?></li>
|
views/options/option-toggled-segmented.php
CHANGED
@@ -18,7 +18,7 @@ if (!defined('WORDFENCE_LS_VERSION')) { exit; }
|
|
18 |
$id = 'wfls-option-' . preg_replace('/[^a-z0-9]/i', '-', $optionName);
|
19 |
?>
|
20 |
<ul id="<?php echo esc_attr($id); ?>" class="wfls-option wfls-option-toggled-segmented<?php if (!wfConfig::p() && isset($premium) && $premium) { echo ' wfls-option-premium'; } ?>" data-option="<?php echo esc_attr($optionName); ?>" data-enabled-value="<?php echo esc_attr($enabledValue); ?>" data-disabled-value="<?php echo esc_attr($disabledValue); ?>" data-original-value="<?php echo esc_attr($value == $enabledValue ? $enabledValue : $disabledValue); ?>">
|
21 |
-
<li class="wfls-option-title"><?php echo (!empty($title)) ? esc_html($title) : ''; echo (!empty($htmlTitle)) ? wp_kses($htmlTitle, 'post') : ''; ?><?php if (!wfConfig::p() && isset($premium) && $premium) { echo ' <a href="https://www.wordfence.com/gnl1optionUpgrade/wordfence-signup/" target="_blank" rel="noopener noreferrer" class="wfls-premium-link">' .
|
22 |
<li class="wfls-option-segments">
|
23 |
<?php
|
24 |
$onId = sanitize_key('wfls-segment-' . $optionName . '-on');
|
18 |
$id = 'wfls-option-' . preg_replace('/[^a-z0-9]/i', '-', $optionName);
|
19 |
?>
|
20 |
<ul id="<?php echo esc_attr($id); ?>" class="wfls-option wfls-option-toggled-segmented<?php if (!wfConfig::p() && isset($premium) && $premium) { echo ' wfls-option-premium'; } ?>" data-option="<?php echo esc_attr($optionName); ?>" data-enabled-value="<?php echo esc_attr($enabledValue); ?>" data-disabled-value="<?php echo esc_attr($disabledValue); ?>" data-original-value="<?php echo esc_attr($value == $enabledValue ? $enabledValue : $disabledValue); ?>">
|
21 |
+
<li class="wfls-option-title"><?php echo (!empty($title)) ? esc_html($title) : ''; echo (!empty($htmlTitle)) ? wp_kses($htmlTitle, 'post') : ''; ?><?php if (!wfConfig::p() && isset($premium) && $premium) { echo ' <a href="https://www.wordfence.com/gnl1optionUpgrade/wordfence-signup/" target="_blank" rel="noopener noreferrer" class="wfls-premium-link">' . esc_html__('Premium Feature', 'wordfence') . '</a>'; } ?><?php if (isset($helpLink)) { echo ' <a href="' . esc_attr($helpLink) . '" target="_blank" rel="noopener noreferrer" class="wfls-inline-help"><i class="' . (WORDFENCE_LS_FROM_CORE ? 'wf-fa wf-fa-question-circle-o' : 'wfls-fa wfls-fa-question-circle-o') . '" aria-hidden="true"></i></a>'; } ?></li>
|
22 |
<li class="wfls-option-segments">
|
23 |
<?php
|
24 |
$onId = sanitize_key('wfls-segment-' . $optionName . '-on');
|
views/options/option-toggled-select.php
CHANGED
@@ -24,7 +24,7 @@ $selectID = 'wfls-option-' . preg_replace('/[^a-z0-9]/i', '-', $selectOptionName
|
|
24 |
<li id="<?php echo esc_attr($toggleID); ?>" class="wfls-option-checkbox<?php echo ($toggleValue == $enabledToggleValue ? ' wfls-checked' : ''); ?>" role="checkbox" aria-checked="<?php echo ($toggleValue == $enabledToggleValue ? 'true' : 'false'); ?>" tabindex="0"><i class="wfls-ion-ios-checkmark-empty" aria-hidden="true"></i></li>
|
25 |
<li class="wfls-option-content">
|
26 |
<ul id="<?php echo esc_attr($selectID); ?>">
|
27 |
-
<li class="wfls-option-title"><span id="<?php echo esc_attr($selectID); ?>-label"><?php echo esc_html($title); ?></span><?php if (!wfConfig::p() && isset($premium) && $premium) { echo ' <a href="https://www.wordfence.com/gnl1optionUpgrade/wordfence-signup/" target="_blank" rel="noopener noreferrer" class="wfls-premium-link">' .
|
28 |
<li class="wfls-option-select wfls-padding-add-top-xs-small">
|
29 |
<select<?php echo ($toggleValue == $enabledToggleValue && !(!wfConfig::p() && isset($premium) && $premium) ? '' : ' disabled'); ?> aria-labelledby="<?php echo esc_attr($selectID); ?>-label">
|
30 |
<?php foreach ($selectOptions as $o): ?>
|
24 |
<li id="<?php echo esc_attr($toggleID); ?>" class="wfls-option-checkbox<?php echo ($toggleValue == $enabledToggleValue ? ' wfls-checked' : ''); ?>" role="checkbox" aria-checked="<?php echo ($toggleValue == $enabledToggleValue ? 'true' : 'false'); ?>" tabindex="0"><i class="wfls-ion-ios-checkmark-empty" aria-hidden="true"></i></li>
|
25 |
<li class="wfls-option-content">
|
26 |
<ul id="<?php echo esc_attr($selectID); ?>">
|
27 |
+
<li class="wfls-option-title"><span id="<?php echo esc_attr($selectID); ?>-label"><?php echo esc_html($title); ?></span><?php if (!wfConfig::p() && isset($premium) && $premium) { echo ' <a href="https://www.wordfence.com/gnl1optionUpgrade/wordfence-signup/" target="_blank" rel="noopener noreferrer" class="wfls-premium-link">' . esc_html__('Premium Feature', 'wordfence') . '</a>'; } ?><?php if (isset($helpLink)) { echo ' <a href="' . esc_attr($helpLink) . '" target="_blank" rel="noopener noreferrer" class="wfls-inline-help"><i class="' . (WORDFENCE_LS_FROM_CORE ? 'wf-fa wf-fa-question-circle-o' : 'wfls-fa wfls-fa-question-circle-o') . '" aria-hidden="true"></i></a>'; } ?></li>
|
28 |
<li class="wfls-option-select wfls-padding-add-top-xs-small">
|
29 |
<select<?php echo ($toggleValue == $enabledToggleValue && !(!wfConfig::p() && isset($premium) && $premium) ? '' : ' disabled'); ?> aria-labelledby="<?php echo esc_attr($selectID); ?>-label">
|
30 |
<?php foreach ($selectOptions as $o): ?>
|
views/options/option-toggled-sub.php
CHANGED
@@ -41,7 +41,7 @@ $subID = 'wfls-option-' . preg_replace('/[^a-z0-9]/i', '-', $subOptionName);
|
|
41 |
<ul id="<?php echo esc_attr($id); ?>" class="wfls-option wfls-option-toggled<?php if (!wfConfig::p() && isset($premium) && $premium) { echo ' wfls-option-premium'; } ?>" data-option="<?php echo esc_attr($optionName); ?>" data-enabled-value="<?php echo esc_attr($enabledValue); ?>" data-disabled-value="<?php echo esc_attr($disabledValue); ?>" data-original-value="<?php echo esc_attr($value == $enabledValue ? $enabledValue : $disabledValue); ?>">
|
42 |
<li class="wfls-option-checkbox<?php echo ($value == $enabledValue ? ' wfls-checked' : ''); ?>" role="checkbox" aria-checked="<?php echo ($value == $enabledValue ? 'true' : 'false'); ?>" tabindex="0" aria-labelledby="<?php echo esc_attr($id); ?>-label"><i class="wfls-ion-ios-checkmark-empty" aria-hidden="true"></i></li>
|
43 |
<li class="wfls-option-title">
|
44 |
-
<span id="<?php echo esc_attr($id); ?>-label"><?php echo $htmlTitle; ?></span><?php if (!wfConfig::p() && isset($premium) && $premium) { echo ' <a href="https://www.wordfence.com/gnl1optionUpgrade/wordfence-signup/" target="_blank" rel="noopener noreferrer" class="wfls-premium-link">' .
|
45 |
</li>
|
46 |
</ul>
|
47 |
</li>
|
@@ -49,7 +49,7 @@ $subID = 'wfls-option-' . preg_replace('/[^a-z0-9]/i', '-', $subOptionName);
|
|
49 |
<ul id="<?php echo esc_attr($subID); ?>" class="wfls-option wfls-option-toggled<?php if (!wfConfig::p() && isset($subPremium) && $subPremium) { echo ' wfls-option-premium'; } ?>" data-option="<?php echo esc_attr($subOptionName); ?>" data-enabled-value="<?php echo esc_attr($subEnabledValue); ?>" data-disabled-value="<?php echo esc_attr($subDisabledValue); ?>" data-original-value="<?php echo esc_attr($subValue == $subEnabledValue ? $subEnabledValue : $subDisabledValue); ?>">
|
50 |
<li class="wfls-option-checkbox<?php echo ($subValue == $subEnabledValue ? ' wfls-checked' : ''); ?>" role="checkbox" aria-checked="<?php echo ($subValue == $subEnabledValue ? 'true' : 'false'); ?>" tabindex="0" aria-labelledby="<?php echo esc_attr($subID); ?>-label"><i class="wfls-ion-ios-checkmark-empty" aria-hidden="true"></i></li>
|
51 |
<li class="wfls-option-title">
|
52 |
-
<span id="<?php echo esc_attr($subID); ?>-label"><?php echo $subHtmlTitle; ?></span><?php if (!wfConfig::p() && isset($subPremium) && $subPremium) { echo ' <a href="https://www.wordfence.com/gnl1optionUpgrade/wordfence-signup/" target="_blank" rel="noopener noreferrer" class="wfls-premium-link">' .
|
53 |
</li>
|
54 |
</ul>
|
55 |
</li>
|
41 |
<ul id="<?php echo esc_attr($id); ?>" class="wfls-option wfls-option-toggled<?php if (!wfConfig::p() && isset($premium) && $premium) { echo ' wfls-option-premium'; } ?>" data-option="<?php echo esc_attr($optionName); ?>" data-enabled-value="<?php echo esc_attr($enabledValue); ?>" data-disabled-value="<?php echo esc_attr($disabledValue); ?>" data-original-value="<?php echo esc_attr($value == $enabledValue ? $enabledValue : $disabledValue); ?>">
|
42 |
<li class="wfls-option-checkbox<?php echo ($value == $enabledValue ? ' wfls-checked' : ''); ?>" role="checkbox" aria-checked="<?php echo ($value == $enabledValue ? 'true' : 'false'); ?>" tabindex="0" aria-labelledby="<?php echo esc_attr($id); ?>-label"><i class="wfls-ion-ios-checkmark-empty" aria-hidden="true"></i></li>
|
43 |
<li class="wfls-option-title">
|
44 |
+
<span id="<?php echo esc_attr($id); ?>-label"><?php echo $htmlTitle; ?></span><?php if (!wfConfig::p() && isset($premium) && $premium) { echo ' <a href="https://www.wordfence.com/gnl1optionUpgrade/wordfence-signup/" target="_blank" rel="noopener noreferrer" class="wfls-premium-link">' . esc_html__('Premium Feature', 'wordfence') . '</a>'; } ?><?php if (isset($helpLink)) { echo ' <a href="' . esc_attr($helpLink) . '" target="_blank" rel="noopener noreferrer" class="wfls-inline-help"><i class="' . (WORDFENCE_LS_FROM_CORE ? 'wf-fa wf-fa-question-circle-o' : 'wfls-fa wfls-fa-question-circle-o') . '" aria-hidden="true"></i></a>'; } ?>
|
45 |
</li>
|
46 |
</ul>
|
47 |
</li>
|
49 |
<ul id="<?php echo esc_attr($subID); ?>" class="wfls-option wfls-option-toggled<?php if (!wfConfig::p() && isset($subPremium) && $subPremium) { echo ' wfls-option-premium'; } ?>" data-option="<?php echo esc_attr($subOptionName); ?>" data-enabled-value="<?php echo esc_attr($subEnabledValue); ?>" data-disabled-value="<?php echo esc_attr($subDisabledValue); ?>" data-original-value="<?php echo esc_attr($subValue == $subEnabledValue ? $subEnabledValue : $subDisabledValue); ?>">
|
50 |
<li class="wfls-option-checkbox<?php echo ($subValue == $subEnabledValue ? ' wfls-checked' : ''); ?>" role="checkbox" aria-checked="<?php echo ($subValue == $subEnabledValue ? 'true' : 'false'); ?>" tabindex="0" aria-labelledby="<?php echo esc_attr($subID); ?>-label"><i class="wfls-ion-ios-checkmark-empty" aria-hidden="true"></i></li>
|
51 |
<li class="wfls-option-title">
|
52 |
+
<span id="<?php echo esc_attr($subID); ?>-label"><?php echo $subHtmlTitle; ?></span><?php if (!wfConfig::p() && isset($subPremium) && $subPremium) { echo ' <a href="https://www.wordfence.com/gnl1optionUpgrade/wordfence-signup/" target="_blank" rel="noopener noreferrer" class="wfls-premium-link">' . esc_html__('Premium Feature', 'wordfence') . '</a>'; } ?><?php if (isset($subHelpLink)) { echo ' <a href="' . esc_attr($subHelpLink) . '" target="_blank" rel="noopener noreferrer" class="wfls-inline-help"><i class="' . (WORDFENCE_LS_FROM_CORE ? 'wf-fa wf-fa-question-circle-o' : 'wfls-fa wfls-fa-question-circle-o') . '" aria-hidden="true"></i></a>'; } ?>
|
53 |
</li>
|
54 |
</ul>
|
55 |
</li>
|
views/options/option-toggled-textarea.php
CHANGED
@@ -21,7 +21,7 @@ $textAreaID = 'wfls-option-' . preg_replace('/[^a-z0-9]/i', '-', $textAreaOption
|
|
21 |
?>
|
22 |
<ul class="wfls-option wfls-option-toggled-textarea<?php if (!wfConfig::p() && isset($premium) && $premium) { echo ' wfls-option-premium'; } ?>" data-toggle-option="<?php echo esc_attr($toggleOptionName); ?>" data-enabled-toggle-value="<?php echo esc_attr($enabledToggleValue); ?>" data-disabled-toggle-value="<?php echo esc_attr($disabledToggleValue); ?>" data-original-toggle-value="<?php echo esc_attr($toggleValue == $enabledToggleValue ? $enabledToggleValue : $disabledToggleValue); ?>" data-text-area-option="<?php echo esc_attr($textAreaOptionName); ?>" data-original-text-area-value="<?php echo esc_attr($textAreaValue); ?>">
|
23 |
<li id="<?php echo esc_attr($toggleID); ?>" class="wfls-option-checkbox<?php echo ($toggleValue == $enabledToggleValue ? ' wfls-checked' : ''); ?>" role="checkbox" aria-checked="<?php echo ($toggleValue == $enabledToggleValue ? 'true' : 'false'); ?>" tabindex="0"><i class="wfls-ion-ios-checkmark-empty" aria-hidden="true" aria-labelledby="<?php echo esc_attr($toggleID); ?>-label"></i></li>
|
24 |
-
<li class="wfls-option-title"><span id="<?php echo esc_attr($toggleID); ?>-label"><?php echo esc_html($title); ?></span><?php if (!wfConfig::p() && isset($premium) && $premium) { echo ' <a href="https://www.wordfence.com/gnl1optionUpgrade/wordfence-signup/" target="_blank" rel="noopener noreferrer" class="wfls-premium-link">' .
|
25 |
<li id="<?php echo esc_attr($textAreaID); ?>" class="wfls-option-textarea">
|
26 |
<select<?php echo ($toggleValue == $enabledToggleValue && !(!wfConfig::p() && isset($premium) && $premium) ? '' : ' disabled'); ?> aria-labelledby="<?php echo esc_attr($toggleID); ?>-label">
|
27 |
<textarea<?php echo (!(!wfConfig::p() && isset($premium) && $premium) ? '' : ' disabled'); ?>><?php echo esc_html($textAreaValue); ?></textarea>
|
21 |
?>
|
22 |
<ul class="wfls-option wfls-option-toggled-textarea<?php if (!wfConfig::p() && isset($premium) && $premium) { echo ' wfls-option-premium'; } ?>" data-toggle-option="<?php echo esc_attr($toggleOptionName); ?>" data-enabled-toggle-value="<?php echo esc_attr($enabledToggleValue); ?>" data-disabled-toggle-value="<?php echo esc_attr($disabledToggleValue); ?>" data-original-toggle-value="<?php echo esc_attr($toggleValue == $enabledToggleValue ? $enabledToggleValue : $disabledToggleValue); ?>" data-text-area-option="<?php echo esc_attr($textAreaOptionName); ?>" data-original-text-area-value="<?php echo esc_attr($textAreaValue); ?>">
|
23 |
<li id="<?php echo esc_attr($toggleID); ?>" class="wfls-option-checkbox<?php echo ($toggleValue == $enabledToggleValue ? ' wfls-checked' : ''); ?>" role="checkbox" aria-checked="<?php echo ($toggleValue == $enabledToggleValue ? 'true' : 'false'); ?>" tabindex="0"><i class="wfls-ion-ios-checkmark-empty" aria-hidden="true" aria-labelledby="<?php echo esc_attr($toggleID); ?>-label"></i></li>
|
24 |
+
<li class="wfls-option-title"><span id="<?php echo esc_attr($toggleID); ?>-label"><?php echo esc_html($title); ?></span><?php if (!wfConfig::p() && isset($premium) && $premium) { echo ' <a href="https://www.wordfence.com/gnl1optionUpgrade/wordfence-signup/" target="_blank" rel="noopener noreferrer" class="wfls-premium-link">' . esc_html__('Premium Feature', 'wordfence') . '</a>'; } ?><?php if (isset($helpLink)) { echo ' <a href="' . esc_attr($helpLink) . '" target="_blank" rel="noopener noreferrer" class="wfls-inline-help"><i class="' . (WORDFENCE_LS_FROM_CORE ? 'wf-fa wf-fa-question-circle-o' : 'wfls-fa wfls-fa-question-circle-o') . '" aria-hidden="true"></i></a>'; } ?></li>
|
25 |
<li id="<?php echo esc_attr($textAreaID); ?>" class="wfls-option-textarea">
|
26 |
<select<?php echo ($toggleValue == $enabledToggleValue && !(!wfConfig::p() && isset($premium) && $premium) ? '' : ' disabled'); ?> aria-labelledby="<?php echo esc_attr($toggleID); ?>-label">
|
27 |
<textarea<?php echo (!(!wfConfig::p() && isset($premium) && $premium) ? '' : ' disabled'); ?>><?php echo esc_html($textAreaValue); ?></textarea>
|
views/options/option-token.php
CHANGED
@@ -22,7 +22,7 @@ $id = 'wfls-option-' . preg_replace('/[^a-z0-9]/i', '-', $tokenOptionName);
|
|
22 |
<ul class="wfls-flex-vertical wfls-flex-align-left">
|
23 |
<li>
|
24 |
<?php endif; ?>
|
25 |
-
<span id="<?php echo esc_attr($id); ?>-label"><?php echo esc_html($title); ?></span><?php if (!wfConfig::p() && isset($premium) && $premium) { echo ' <a href="https://www.wordfence.com/gnl1optionUpgrade/wordfence-signup/" target="_blank" rel="noopener noreferrer" class="wfls-premium-link">' .
|
26 |
<?php if (isset($subtitle)): ?>
|
27 |
</li>
|
28 |
<li class="wfls-option-subtitle"><?php echo esc_html($subtitle); ?></li>
|
22 |
<ul class="wfls-flex-vertical wfls-flex-align-left">
|
23 |
<li>
|
24 |
<?php endif; ?>
|
25 |
+
<span id="<?php echo esc_attr($id); ?>-label"><?php echo esc_html($title); ?></span><?php if (!wfConfig::p() && isset($premium) && $premium) { echo ' <a href="https://www.wordfence.com/gnl1optionUpgrade/wordfence-signup/" target="_blank" rel="noopener noreferrer" class="wfls-premium-link">' . esc_html__('Premium Feature', 'wordfence') . '</a>'; } ?><?php if (isset($helpLink)) { echo ' <a href="' . esc_attr($helpLink) . '" target="_blank" rel="noopener noreferrer" class="wfls-inline-help"><i class="' . (WORDFENCE_LS_FROM_CORE ? 'wf-fa wf-fa-question-circle-o' : 'wfls-fa wfls-fa-question-circle-o') . '" aria-hidden="true"></i></a>'; } ?>
|
26 |
<?php if (isset($subtitle)): ?>
|
27 |
</li>
|
28 |
<li class="wfls-option-subtitle"><?php echo esc_html($subtitle); ?></li>
|
views/page/manage.php
CHANGED
@@ -17,16 +17,18 @@ if ($ownUser->ID == $user->ID) {
|
|
17 |
}
|
18 |
|
19 |
$enabled = \WordfenceLS\Controller_Users::shared()->has_2fa_active($user);
|
|
|
|
|
20 |
|
21 |
?>
|
22 |
-
<p><?php
|
23 |
<?php if ($canEditUsers): ?>
|
24 |
<div id="wfls-editing-display" class="wfls-flex-row wfls-flex-row-xs-wrappable wfls-flex-row-equal-heights">
|
25 |
<div class="wfls-block wfls-always-active wfls-flex-item-full-width wfls-add-bottom">
|
26 |
<div class="wfls-block-header wfls-block-header-border-bottom">
|
27 |
<div class="wfls-block-header-content">
|
28 |
<div class="wfls-block-title">
|
29 |
-
<strong><?php
|
30 |
</div>
|
31 |
</div>
|
32 |
</div>
|
@@ -86,6 +88,18 @@ $enabled = \WordfenceLS\Controller_Users::shared()->has_2fa_active($user);
|
|
86 |
</div>
|
87 |
<!-- end activation -->
|
88 |
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
89 |
<?php
|
90 |
/**
|
91 |
* Fires after the main content of the activation page has been output.
|
@@ -100,15 +114,15 @@ if (empty($tz)) {
|
|
100 |
}
|
101 |
?>
|
102 |
<?php if (\WordfenceLS\Controller_Permissions::shared()->can_manage_settings()): ?>
|
103 |
-
<p><?php
|
104 |
-
<?php
|
105 |
<?php
|
106 |
-
if (\WordfenceLS\Controller_Settings::shared()->
|
107 |
-
echo
|
108 |
}
|
109 |
else if (WORDFENCE_LS_FROM_CORE && $correctedTime != $time) {
|
110 |
-
echo
|
111 |
}
|
112 |
?>
|
113 |
-
<?php
|
114 |
-
<?php endif; ?>
|
17 |
}
|
18 |
|
19 |
$enabled = \WordfenceLS\Controller_Users::shared()->has_2fa_active($user);
|
20 |
+
$requires2fa = \WordfenceLS\Controller_Users::shared()->requires_2fa($user, $inGracePeriod, $requiredAt);
|
21 |
+
$lockedOut = $requires2fa && !$enabled;
|
22 |
|
23 |
?>
|
24 |
+
<p><?php echo wp_kses(sprintf(__('Two-Factor Authentication, or 2FA, significantly improves login security for your website. Wordfence 2FA works with a number of TOTP-based apps like Google Authenticator, FreeOTP, and Authy. For a full list of tested TOTP-based apps, <a href="%s" target="_blank" rel="noopener noreferrer">click here</a>.', 'wordfence-2fa'), \WordfenceLS\Controller_Support::esc_supportURL(\WordfenceLS\Controller_Support::ITEM_MODULE_LOGIN_SECURITY_2FA)), array('a'=>array('href'=>array(), 'target'=>array(), 'rel'=>array()))); ?></p>
|
25 |
<?php if ($canEditUsers): ?>
|
26 |
<div id="wfls-editing-display" class="wfls-flex-row wfls-flex-row-xs-wrappable wfls-flex-row-equal-heights">
|
27 |
<div class="wfls-block wfls-always-active wfls-flex-item-full-width wfls-add-bottom">
|
28 |
<div class="wfls-block-header wfls-block-header-border-bottom">
|
29 |
<div class="wfls-block-header-content">
|
30 |
<div class="wfls-block-title">
|
31 |
+
<strong><?php echo wp_kses(sprintf(__('Editing User: %s <span class="wfls-text-plain">%s</span>', 'wordfence-2fa'), get_avatar($user->ID, 16, '', $user->user_login), \WordfenceLS\Text\Model_HTML::esc_html($user->user_login) . ($ownAccount ? ' ' . __('(you)', 'wordfence-2fa') : '')), array('span'=>array('class'=>array()))); ?></strong>
|
32 |
</div>
|
33 |
</div>
|
34 |
</div>
|
88 |
</div>
|
89 |
<!-- end activation -->
|
90 |
</div>
|
91 |
+
<div id="wfls-grace-period-controls" class="wfls-flex-row wfls-flex-row-xs-wrappable wfls-flex-row-equal-heights"<?php if ($enabled || !($lockedOut || $inGracePeriod)) { echo ' style="display: none;"'; } ?>>
|
92 |
+
<div class="wfls-flex-row wfls-flex-row-equal-heights wfls-flex-item-xs-100 wfls-add-top">
|
93 |
+
<?php
|
94 |
+
echo \WordfenceLS\Model_View::create('manage/grace-period', array(
|
95 |
+
'user' => $user,
|
96 |
+
'lockedOut' => $lockedOut,
|
97 |
+
'gracePeriod' => $inGracePeriod,
|
98 |
+
'requiredAt' => $requiredAt
|
99 |
+
))->render();
|
100 |
+
?>
|
101 |
+
</div>
|
102 |
+
</div>
|
103 |
<?php
|
104 |
/**
|
105 |
* Fires after the main content of the activation page has been output.
|
114 |
}
|
115 |
?>
|
116 |
<?php if (\WordfenceLS\Controller_Permissions::shared()->can_manage_settings()): ?>
|
117 |
+
<p><?php esc_html_e('Server Time:', 'wordfence-2fa'); ?> <?php echo date('Y-m-d H:i:s', $time); ?> UTC (<?php echo \WordfenceLS\Controller_Time::format_local_time('Y-m-d H:i:s', $time) . ' ' . $tz; ?>)<br>
|
118 |
+
<?php esc_html_e('Browser Time:', 'wordfence-2fa'); ?> <script type="application/javascript">var date = new Date(); document.write(date.toUTCString() + ' (' + date.toString() + ')');</script><br>
|
119 |
<?php
|
120 |
+
if (\WordfenceLS\Controller_Settings::shared()->is_ntp_enabled()) {
|
121 |
+
echo esc_html__('Corrected Time (NTP):', 'wordfence-2fa') . ' ' . date('Y-m-d H:i:s', $correctedTime) . ' UTC (' . \WordfenceLS\Controller_Time::format_local_time('Y-m-d H:i:s', $correctedTime) . ' ' . $tz . ')<br>';
|
122 |
}
|
123 |
else if (WORDFENCE_LS_FROM_CORE && $correctedTime != $time) {
|
124 |
+
echo esc_html__('Corrected Time (WF):', 'wordfence-2fa') . ' ' . date('Y-m-d H:i:s', $correctedTime) . ' UTC (' . \WordfenceLS\Controller_Time::format_local_time('Y-m-d H:i:s', $correctedTime) . ' ' . $tz . ')<br>';
|
125 |
}
|
126 |
?>
|
127 |
+
<?php esc_html_e('Detected IP:', 'wordfence-2fa'); ?> <?php echo \WordfenceLS\Text\Model_HTML::esc_html(\WordfenceLS\Model_Request::current()->ip()); if (\WordfenceLS\Controller_Whitelist::shared()->is_whitelisted(\WordfenceLS\Model_Request::current()->ip())) { echo ' (' . esc_html__('allowlisted', 'wordfence-2fa') . ')'; } ?></p>
|
128 |
+
<?php endif; ?>
|
views/page/role.php
ADDED
@@ -0,0 +1,55 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
if (!defined('WORDFENCE_LS_VERSION')) { exit; }
|
3 |
+
?>
|
4 |
+
<?php if (is_multisite()): ?>
|
5 |
+
<p><em>(<?php esc_html_e('This page only shows users and roles on the main site of this network', 'wordfence') ?>)</em></p>
|
6 |
+
<?php endif ?>
|
7 |
+
<div class="wfls-block wfls-always-active wfls-flex-item-full-width wfls-add-bottom">
|
8 |
+
<?php if ($requiredAt === false): ?>
|
9 |
+
<div class="wfls-block-content">
|
10 |
+
<p><?php echo esc_html(sprintf(__('2FA is not required for the %s role', 'wordfence-2fa'), $roleTitle)) ?></p>
|
11 |
+
</div>
|
12 |
+
<?php elseif (empty($users)): ?>
|
13 |
+
<div class="wfls-block-content">
|
14 |
+
<p>
|
15 |
+
<?php if ($page == 1): ?>
|
16 |
+
<?php echo esc_html(sprintf(__('No users found in the %s state for the %s role', 'wordfence-2fa'), $stateTitle, $roleTitle)) ?>
|
17 |
+
<?php else: ?>
|
18 |
+
<?php echo esc_html(sprintf(__('Page %d is out of range', 'wordfence-2fa'), $page)) ?>
|
19 |
+
<?php endif ?>
|
20 |
+
</p>
|
21 |
+
</div>
|
22 |
+
<?php else: ?>
|
23 |
+
<table class="wfls-table wfls-table-striped wfls-table-header-separators wfls-table-expanded wfls-no-bottom">
|
24 |
+
<tr>
|
25 |
+
<th>User</th>
|
26 |
+
<th>Required Date</th>
|
27 |
+
</tr>
|
28 |
+
<?php foreach ($users as $user): ?>
|
29 |
+
<tr>
|
30 |
+
<th scope="row"><a href="<?php echo esc_attr(get_edit_user_link($user->user_id)) ?>#wfls-user-settings"><?php echo esc_html($user->user_login) ?></a></td>
|
31 |
+
<td>
|
32 |
+
<?php if ($user->required_at): ?>
|
33 |
+
<?php echo esc_html(\WordfenceLS\Controller_Time::format_local_time('F j, Y g:i A', $user->required_at)) ?>
|
34 |
+
<?php else: ?>
|
35 |
+
<?php esc_html_e('N/A', 'wordfence'); ?>
|
36 |
+
<?php endif ?>
|
37 |
+
</td>
|
38 |
+
</tr>
|
39 |
+
<?php endforeach ?>
|
40 |
+
<?php if ($page != 1 || !$lastPage): ?>
|
41 |
+
<tr>
|
42 |
+
<td colspan="2" class="wfls-center">
|
43 |
+
<?php if ($page > 1): ?>
|
44 |
+
<a href="<?php echo esc_attr(add_query_arg($pageKey, $page-1) . "#$stateKey") ?>"><span class="dashicons dashicons-arrow-left-alt2"></span></a>
|
45 |
+
<?php endif ?>
|
46 |
+
<strong class="wfls-page-indicator"><?php esc_html_e('Page ') ?><?php echo (int) $page ?></strong>
|
47 |
+
<?php if (!$lastPage): ?>
|
48 |
+
<a href="<?php echo esc_attr(add_query_arg($pageKey, $page+1) . "#$stateKey") ?>"><span class="dashicons dashicons-arrow-right-alt2"></span></a>
|
49 |
+
<?php endif ?>
|
50 |
+
</td>
|
51 |
+
</tr>
|
52 |
+
<?php endif ?>
|
53 |
+
</table>
|
54 |
+
<?php endif ?>
|
55 |
+
</div>
|
views/page/settings.php
CHANGED
@@ -15,9 +15,9 @@ if (!defined('WORDFENCE_LS_VERSION')) { exit; }
|
|
15 |
<div id="wfls-options" class="wfls-flex-row wfls-flex-row-equal-heights wfls-flex-item-xs-100">
|
16 |
<?php
|
17 |
echo \WordfenceLS\Model_View::create('settings/options', array(
|
18 |
-
|
19 |
))->render();
|
20 |
?>
|
21 |
</div>
|
22 |
<!-- end options content -->
|
23 |
-
</div>
|
15 |
<div id="wfls-options" class="wfls-flex-row wfls-flex-row-equal-heights wfls-flex-item-xs-100">
|
16 |
<?php
|
17 |
echo \WordfenceLS\Model_View::create('settings/options', array(
|
18 |
+
'hasWoocommerce' => $hasWoocommerce
|
19 |
))->render();
|
20 |
?>
|
21 |
</div>
|
22 |
<!-- end options content -->
|
23 |
+
</div>
|
views/settings/options.php
CHANGED
@@ -5,11 +5,11 @@ if (!defined('WORDFENCE_LS_VERSION')) { exit; }
|
|
5 |
<div class="wfls-block-header wfls-block-header-border-bottom">
|
6 |
<div class="wfls-block-header-content">
|
7 |
<div class="wfls-block-title">
|
8 |
-
<strong><?php
|
9 |
</div>
|
10 |
</div>
|
11 |
<div class="wfls-block-header-action wfls-block-header-action-text wfls-nowrap wfls-padding-add-right-responsive">
|
12 |
-
<a href="#" id="wfls-cancel-changes" class="wfls-btn wfls-btn-sm wfls-btn-default wfls-disabled"><?php
|
13 |
</div>
|
14 |
</div>
|
15 |
<div class="wfls-block-content">
|
@@ -20,38 +20,27 @@ if (!defined('WORDFENCE_LS_VERSION')) { exit; }
|
|
20 |
$options = array();
|
21 |
if (is_multisite()) {
|
22 |
$options[] = array(
|
|
|
23 |
'name' => 'enabled-roles.super-admin',
|
24 |
-
'enabledValue' => '1',
|
25 |
-
'disabledValue' => '0',
|
26 |
-
'value' => '1',
|
27 |
'title' => __('Super Administrator', 'wordfence-2fa'),
|
28 |
-
'editable' =>
|
|
|
|
|
29 |
);
|
30 |
}
|
31 |
|
32 |
foreach ($roles->role_objects as $name => $r) {
|
33 |
/** @var \WP_Role $r */
|
34 |
$options[] = array(
|
|
|
35 |
'name' => 'enabled-roles.' . $name,
|
36 |
-
'enabledValue' => '1',
|
37 |
-
'disabledValue' => '0',
|
38 |
-
'value' => $r->has_cap(\WordfenceLS\Controller_Permissions::CAP_ACTIVATE_2FA_SELF) ? '1' : '0',
|
39 |
'title' => $roles->role_names[$name],
|
40 |
-
'editable' =>
|
|
|
|
|
41 |
);
|
42 |
}
|
43 |
-
|
44 |
-
echo \WordfenceLS\Model_View::create('options/option-toggled-multiple', array(
|
45 |
-
'title' => new \WordfenceLS\Text\Model_HTML('<strong>' . __('Enable 2FA for these roles', 'wordfence-2fa') . '</strong>'),
|
46 |
-
'options' => $options,
|
47 |
-
'wrap' => true,
|
48 |
-
))->render();
|
49 |
-
?>
|
50 |
-
</li>
|
51 |
-
<li>
|
52 |
-
<?php
|
53 |
-
echo \WordfenceLS\Model_View::create('options/option-require-2fa', array(
|
54 |
-
))->render();
|
55 |
?>
|
56 |
</li>
|
57 |
<li>
|
@@ -61,7 +50,7 @@ if (!defined('WORDFENCE_LS_VERSION')) { exit; }
|
|
61 |
'enabledValue' => '1',
|
62 |
'disabledValue' => '0',
|
63 |
'value' => \WordfenceLS\Controller_Settings::shared()->get_bool(\WordfenceLS\Controller_Settings::OPTION_REMEMBER_DEVICE_ENABLED) ? '1': '0',
|
64 |
-
'title' => new \WordfenceLS\Text\Model_HTML('<strong>' .
|
65 |
'subtitle' => __('If enabled, users with 2FA enabled may choose to be prompted for a code only once every 30 days per device.', 'wordfence-2fa'),
|
66 |
))->render();
|
67 |
?>
|
@@ -71,7 +60,7 @@ if (!defined('WORDFENCE_LS_VERSION')) { exit; }
|
|
71 |
echo \WordfenceLS\Model_View::create('options/option-switch', array(
|
72 |
'optionName' => \WordfenceLS\Controller_Settings::OPTION_XMLRPC_ENABLED,
|
73 |
'value' => \WordfenceLS\Controller_Settings::shared()->get_bool(\WordfenceLS\Controller_Settings::OPTION_XMLRPC_ENABLED) ? '1': '0',
|
74 |
-
'title' => new \WordfenceLS\Text\Model_HTML('<strong>' .
|
75 |
'subtitle' => __('If enabled, XML-RPC calls that require authentication will also require a valid 2FA code to be appended to the password. You must choose the "Skipped" option if you use the WordPress app, the Jetpack plugin, or other services that require XML-RPC.', 'wordfence-2fa'),
|
76 |
'states' => array(
|
77 |
array('value' => '0', 'label' => __('Skipped', 'wordfence-2fa')),
|
@@ -89,7 +78,7 @@ if (!defined('WORDFENCE_LS_VERSION')) { exit; }
|
|
89 |
'enabledValue' => '0',
|
90 |
'disabledValue' => '1',
|
91 |
'value' => \WordfenceLS\Controller_Settings::shared()->get_bool(\WordfenceLS\Controller_Settings::OPTION_ALLOW_XML_RPC) ? '1': '0',
|
92 |
-
'title' => new \WordfenceLS\Text\Model_HTML('<strong>' .
|
93 |
'subtitle' => __('If disabled, XML-RPC requests that attempt authentication will be rejected.', 'wordfence-2fa'),
|
94 |
))->render();
|
95 |
?>
|
@@ -99,7 +88,7 @@ if (!defined('WORDFENCE_LS_VERSION')) { exit; }
|
|
99 |
echo \WordfenceLS\Model_View::create('options/option-textarea', array(
|
100 |
'textOptionName' => \WordfenceLS\Controller_Settings::OPTION_2FA_WHITELISTED,
|
101 |
'textValue' => implode("\n", \WordfenceLS\Controller_Settings::shared()->whitelisted_ips()),
|
102 |
-
'title' => new \WordfenceLS\Text\Model_HTML('<strong>' .
|
103 |
'alignTitle' => 'top',
|
104 |
'subtitle' => __('Allowlisted IPs must be placed on separate lines. You can specify ranges using the following formats: 127.0.0.1/24, 127.0.0.[1-100], or 127.0.0.1-127.0.1.100.', 'wordfence-2fa'),
|
105 |
'subtitlePosition' => 'value',
|
@@ -126,7 +115,7 @@ if (!defined('WORDFENCE_LS_VERSION')) { exit; }
|
|
126 |
'enabledValue' => '1',
|
127 |
'disabledValue' => '0',
|
128 |
'value' => \WordfenceLS\Controller_Settings::shared()->get_bool(\WordfenceLS\Controller_Settings::OPTION_CAPTCHA_TEST_MODE) ? '1': '0',
|
129 |
-
'title' => new \WordfenceLS\Text\Model_HTML('<strong>' .
|
130 |
'subtitle' => __('While in test mode, reCAPTCHA will score login and registration requests but not actually block them. The scores will be recorded and can be used to select a human/bot threshold value.', 'wordfence-2fa'),
|
131 |
))->render();
|
132 |
?>
|
@@ -138,6 +127,24 @@ if (!defined('WORDFENCE_LS_VERSION')) { exit; }
|
|
138 |
?>
|
139 |
</li>
|
140 |
<?php endif; ?>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
141 |
<li>
|
142 |
<?php
|
143 |
echo \WordfenceLS\Model_View::create('options/option-toggled', array(
|
@@ -145,11 +152,11 @@ if (!defined('WORDFENCE_LS_VERSION')) { exit; }
|
|
145 |
'enabledValue' => '1',
|
146 |
'disabledValue' => '0',
|
147 |
'value' => \WordfenceLS\Controller_Settings::shared()->get_bool(\WordfenceLS\Controller_Settings::OPTION_DELETE_ON_DEACTIVATION) ? '1': '0',
|
148 |
-
'title' => new \WordfenceLS\Text\Model_HTML('<strong>' .
|
149 |
'subtitle' => __('If enabled, all settings and 2FA records will be deleted on deactivation. If later reactivated, all users that previously had 2FA active will need to set it up again.', 'wordfence-2fa'),
|
150 |
))->render();
|
151 |
?>
|
152 |
</li>
|
153 |
</ul>
|
154 |
</div>
|
155 |
-
</div>
|
5 |
<div class="wfls-block-header wfls-block-header-border-bottom">
|
6 |
<div class="wfls-block-header-content">
|
7 |
<div class="wfls-block-title">
|
8 |
+
<strong><?php esc_html_e('Settings', 'wordfence-2fa'); ?></strong>
|
9 |
</div>
|
10 |
</div>
|
11 |
<div class="wfls-block-header-action wfls-block-header-action-text wfls-nowrap wfls-padding-add-right-responsive">
|
12 |
+
<a href="#" id="wfls-cancel-changes" class="wfls-btn wfls-btn-sm wfls-btn-default wfls-disabled"><?php echo wp_kses(__('Cancel<span class="wfls-visible-sm-inline"> Changes</span>', 'wordfence-2fa'), array('span'=>array('class'=>array()))); ?></a> <a href="#" id="wfls-save-changes" class="wfls-btn wfls-btn-sm wfls-btn-primary wfls-disabled"><?php echo wp_kses(__('Save<span class="wfls-visible-sm-inline"> Changes</span>', 'wordfence-2fa'), array('span'=>array('class'=>array()))); ?></a>
|
13 |
</div>
|
14 |
</div>
|
15 |
<div class="wfls-block-content">
|
20 |
$options = array();
|
21 |
if (is_multisite()) {
|
22 |
$options[] = array(
|
23 |
+
'role' => 'super-admin',
|
24 |
'name' => 'enabled-roles.super-admin',
|
|
|
|
|
|
|
25 |
'title' => __('Super Administrator', 'wordfence-2fa'),
|
26 |
+
'editable' => true,
|
27 |
+
'allow_disabling' => false,
|
28 |
+
'state' => \WordfenceLS\Controller_Settings::shared()->get_required_2fa_role_activation_time('super-admin') !== false ? 'required' : 'optional'
|
29 |
);
|
30 |
}
|
31 |
|
32 |
foreach ($roles->role_objects as $name => $r) {
|
33 |
/** @var \WP_Role $r */
|
34 |
$options[] = array(
|
35 |
+
'role' => $name,
|
36 |
'name' => 'enabled-roles.' . $name,
|
|
|
|
|
|
|
37 |
'title' => $roles->role_names[$name],
|
38 |
+
'editable' => true,
|
39 |
+
'allow_disabling' => (!is_multisite() && $name == 'administrator' ? false : true),
|
40 |
+
'state' => \WordfenceLS\Controller_Settings::shared()->get_required_2fa_role_activation_time($name) !== false ? 'required' : ($r->has_cap(\WordfenceLS\Controller_Permissions::CAP_ACTIVATE_2FA_SELF) ? 'optional' : 'disabled')
|
41 |
);
|
42 |
}
|
43 |
+
echo \WordfenceLS\Model_View::create('options/option-roles', array('options' => $options, 'hasWoocommerce' => $hasWoocommerce))->render();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
44 |
?>
|
45 |
</li>
|
46 |
<li>
|
50 |
'enabledValue' => '1',
|
51 |
'disabledValue' => '0',
|
52 |
'value' => \WordfenceLS\Controller_Settings::shared()->get_bool(\WordfenceLS\Controller_Settings::OPTION_REMEMBER_DEVICE_ENABLED) ? '1': '0',
|
53 |
+
'title' => new \WordfenceLS\Text\Model_HTML('<strong>' . esc_html__('Allow remembering device for 30 days', 'wordfence-2fa') . '</strong>'),
|
54 |
'subtitle' => __('If enabled, users with 2FA enabled may choose to be prompted for a code only once every 30 days per device.', 'wordfence-2fa'),
|
55 |
))->render();
|
56 |
?>
|
60 |
echo \WordfenceLS\Model_View::create('options/option-switch', array(
|
61 |
'optionName' => \WordfenceLS\Controller_Settings::OPTION_XMLRPC_ENABLED,
|
62 |
'value' => \WordfenceLS\Controller_Settings::shared()->get_bool(\WordfenceLS\Controller_Settings::OPTION_XMLRPC_ENABLED) ? '1': '0',
|
63 |
+
'title' => new \WordfenceLS\Text\Model_HTML('<strong>' . esc_html__('Require 2FA for XML-RPC call authentication', 'wordfence-2fa') . '</strong>'),
|
64 |
'subtitle' => __('If enabled, XML-RPC calls that require authentication will also require a valid 2FA code to be appended to the password. You must choose the "Skipped" option if you use the WordPress app, the Jetpack plugin, or other services that require XML-RPC.', 'wordfence-2fa'),
|
65 |
'states' => array(
|
66 |
array('value' => '0', 'label' => __('Skipped', 'wordfence-2fa')),
|
78 |
'enabledValue' => '0',
|
79 |
'disabledValue' => '1',
|
80 |
'value' => \WordfenceLS\Controller_Settings::shared()->get_bool(\WordfenceLS\Controller_Settings::OPTION_ALLOW_XML_RPC) ? '1': '0',
|
81 |
+
'title' => new \WordfenceLS\Text\Model_HTML('<strong>' . esc_html__('Disable XML-RPC authentication', 'wordfence-2fa') . '</strong>'),
|
82 |
'subtitle' => __('If disabled, XML-RPC requests that attempt authentication will be rejected.', 'wordfence-2fa'),
|
83 |
))->render();
|
84 |
?>
|
88 |
echo \WordfenceLS\Model_View::create('options/option-textarea', array(
|
89 |
'textOptionName' => \WordfenceLS\Controller_Settings::OPTION_2FA_WHITELISTED,
|
90 |
'textValue' => implode("\n", \WordfenceLS\Controller_Settings::shared()->whitelisted_ips()),
|
91 |
+
'title' => new \WordfenceLS\Text\Model_HTML('<strong>' . esc_html__('Allowlisted IP addresses that bypass 2FA', 'wordfence-2fa') . '</strong>'),
|
92 |
'alignTitle' => 'top',
|
93 |
'subtitle' => __('Allowlisted IPs must be placed on separate lines. You can specify ranges using the following formats: 127.0.0.1/24, 127.0.0.[1-100], or 127.0.0.1-127.0.1.100.', 'wordfence-2fa'),
|
94 |
'subtitlePosition' => 'value',
|
115 |
'enabledValue' => '1',
|
116 |
'disabledValue' => '0',
|
117 |
'value' => \WordfenceLS\Controller_Settings::shared()->get_bool(\WordfenceLS\Controller_Settings::OPTION_CAPTCHA_TEST_MODE) ? '1': '0',
|
118 |
+
'title' => new \WordfenceLS\Text\Model_HTML('<strong>' . esc_html__('Run reCAPTCHA in test mode', 'wordfence-2fa') . '</strong>'),
|
119 |
'subtitle' => __('While in test mode, reCAPTCHA will score login and registration requests but not actually block them. The scores will be recorded and can be used to select a human/bot threshold value.', 'wordfence-2fa'),
|
120 |
))->render();
|
121 |
?>
|
127 |
?>
|
128 |
</li>
|
129 |
<?php endif; ?>
|
130 |
+
<li>
|
131 |
+
<?php
|
132 |
+
echo \WordfenceLS\Model_View::create('options/option-ntp', array(
|
133 |
+
))->render();
|
134 |
+
?>
|
135 |
+
</li>
|
136 |
+
<li>
|
137 |
+
<?php
|
138 |
+
echo \WordfenceLS\Model_View::create('options/option-toggled', array(
|
139 |
+
'optionName' => \WordfenceLS\Controller_Settings::OPTION_ENABLE_WOOCOMMERCE_INTEGRATION,
|
140 |
+
'enabledValue' => '1',
|
141 |
+
'disabledValue' => '0',
|
142 |
+
'value' => \WordfenceLS\Controller_Settings::shared()->get_bool(\WordfenceLS\Controller_Settings::OPTION_ENABLE_WOOCOMMERCE_INTEGRATION) ? '1': '0',
|
143 |
+
'title' => new \WordfenceLS\Text\Model_HTML('<strong>' . esc_html__('Enable WooCommerce integration', 'wordfence-2fa') . '</strong>'),
|
144 |
+
'subtitle' => __('When enabled, reCAPTCHA and 2FA prompt support will be added to WooCommerce login and registration forms in addition to the default WordPress forms. Testing WooCommerce forms after enabling this feature is recommended to ensure plugin compatibility.', 'wordfence-2fa'),
|
145 |
+
))->render();
|
146 |
+
?>
|
147 |
+
</li>
|
148 |
<li>
|
149 |
<?php
|
150 |
echo \WordfenceLS\Model_View::create('options/option-toggled', array(
|
152 |
'enabledValue' => '1',
|
153 |
'disabledValue' => '0',
|
154 |
'value' => \WordfenceLS\Controller_Settings::shared()->get_bool(\WordfenceLS\Controller_Settings::OPTION_DELETE_ON_DEACTIVATION) ? '1': '0',
|
155 |
+
'title' => new \WordfenceLS\Text\Model_HTML('<strong>' . esc_html__('Delete Login Security tables and data on deactivation', 'wordfence-2fa') . '</strong>'),
|
156 |
'subtitle' => __('If enabled, all settings and 2FA records will be deleted on deactivation. If later reactivated, all users that previously had 2FA active will need to set it up again.', 'wordfence-2fa'),
|
157 |
))->render();
|
158 |
?>
|
159 |
</li>
|
160 |
</ul>
|
161 |
</div>
|
162 |
+
</div>
|
views/settings/user-stats.php
CHANGED
@@ -8,50 +8,63 @@ if (!defined('WORDFENCE_LS_VERSION')) { exit; }
|
|
8 |
<div class="wfls-block-header wfls-block-header-border-bottom">
|
9 |
<div class="wfls-block-header-content">
|
10 |
<div class="wfls-block-title">
|
11 |
-
<strong><?php
|
12 |
</div>
|
13 |
</div>
|
14 |
<div class="wfls-block-header-action wfls-block-header-action-text wfls-nowrap wfls-padding-add-right-responsive">
|
15 |
-
<a href="users.php"><?php
|
16 |
</div>
|
17 |
</div>
|
18 |
<div class="wfls-block-content wfls-padding-no-left wfls-padding-no-right">
|
19 |
<table class="wfls-table wfls-table-striped wfls-table-header-separators wfls-table-expanded wfls-no-bottom">
|
20 |
<thead>
|
21 |
<tr>
|
22 |
-
<th><?php
|
23 |
-
<th class="wfls-center"><?php
|
24 |
-
<th class="wfls-center"><?php
|
|
|
25 |
</tr>
|
26 |
</thead>
|
27 |
<tbody>
|
28 |
<?php
|
29 |
$roles = new WP_Roles();
|
30 |
foreach ($counts['avail_roles'] as $roleTag => $count):
|
|
|
31 |
$role = $roles->get_role($roleTag);
|
32 |
-
if (!$role) { continue; }
|
33 |
$names = $roles->get_names();
|
34 |
-
$roleName = $names[$roleTag];
|
|
|
|
|
|
|
|
|
|
|
35 |
?>
|
36 |
<tr>
|
37 |
<td><?php echo \WordfenceLS\Text\Model_HTML::esc_html(translate_user_role($roleName)); ?></td>
|
38 |
<td class="wfls-center"><?php echo number_format($count); ?></td>
|
39 |
-
<td class="wfls-center"><?php echo
|
|
|
|
|
|
|
|
|
|
|
40 |
</tr>
|
41 |
<?php endforeach; ?>
|
42 |
</tbody>
|
43 |
<tfoot>
|
44 |
<tr>
|
45 |
-
<th><?php
|
46 |
<th class="wfls-center"><?php echo number_format($counts['total_users']); ?></th>
|
47 |
<th class="wfls-center"><?php echo number_format($counts['active_total_users']); ?></th>
|
|
|
48 |
</tr>
|
49 |
<?php if (is_multisite()): ?>
|
50 |
<tr>
|
51 |
-
<td colspan="
|
52 |
</tr>
|
53 |
<?php endif; ?>
|
54 |
</tfoot>
|
55 |
</table>
|
56 |
</div>
|
57 |
-
</div>
|
8 |
<div class="wfls-block-header wfls-block-header-border-bottom">
|
9 |
<div class="wfls-block-header-content">
|
10 |
<div class="wfls-block-title">
|
11 |
+
<strong><?php esc_html_e('User Summary', 'wordfence-2fa'); ?></strong>
|
12 |
</div>
|
13 |
</div>
|
14 |
<div class="wfls-block-header-action wfls-block-header-action-text wfls-nowrap wfls-padding-add-right-responsive">
|
15 |
+
<a href="users.php"><?php esc_html_e('Manage Users', 'wordfence'); ?></a>
|
16 |
</div>
|
17 |
</div>
|
18 |
<div class="wfls-block-content wfls-padding-no-left wfls-padding-no-right">
|
19 |
<table class="wfls-table wfls-table-striped wfls-table-header-separators wfls-table-expanded wfls-no-bottom">
|
20 |
<thead>
|
21 |
<tr>
|
22 |
+
<th><?php esc_html_e('Role', 'wordfence-2fa'); ?></th>
|
23 |
+
<th class="wfls-center"><?php esc_html_e('Total Users', 'wordfence-2fa'); ?></th>
|
24 |
+
<th class="wfls-center"><?php esc_html_e('2FA Active', 'wordfence-2fa'); ?></th>
|
25 |
+
<th class="wfls-center"><?php esc_html_e('2FA Inactive', 'wordfence-2fa'); ?></th>
|
26 |
</tr>
|
27 |
</thead>
|
28 |
<tbody>
|
29 |
<?php
|
30 |
$roles = new WP_Roles();
|
31 |
foreach ($counts['avail_roles'] as $roleTag => $count):
|
32 |
+
$superAdmin = ($roleTag === 'super-admin');
|
33 |
$role = $roles->get_role($roleTag);
|
34 |
+
if (!$superAdmin && !$role) { continue; }
|
35 |
$names = $roles->get_names();
|
36 |
+
$roleName = $superAdmin ? __('Super Administrator', 'wordfence-2fa') : $names[$roleTag];
|
37 |
+
$activeCount = (isset($counts['active_avail_roles'][$roleTag]) ? $counts['active_avail_roles'][$roleTag] : 0);
|
38 |
+
$inactiveCount = $count - $activeCount;
|
39 |
+
$requiredAt = \WordfenceLS\Controller_Settings::shared()->get_required_2fa_role_activation_time($roleTag);
|
40 |
+
$inactive = $inactiveCount > 0 && $requiredAt !== false;
|
41 |
+
$viewUsersBaseUrl = 'admin.php?' . http_build_query(array('page' => 'WFLS', 'role'=> $roleTag));
|
42 |
?>
|
43 |
<tr>
|
44 |
<td><?php echo \WordfenceLS\Text\Model_HTML::esc_html(translate_user_role($roleName)); ?></td>
|
45 |
<td class="wfls-center"><?php echo number_format($count); ?></td>
|
46 |
+
<td class="wfls-center"><?php echo number_format($activeCount); ?></td>
|
47 |
+
<td class="wfls-center">
|
48 |
+
<?php if ($inactive): ?><a href="<?php echo esc_attr(is_multisite() ? network_admin_url($viewUsersBaseUrl) : admin_url($viewUsersBaseUrl)); ?>"><?php endif ?>
|
49 |
+
<?php echo number_format($inactiveCount); ?>
|
50 |
+
<?php if ($inactive): ?> (<?php esc_html_e('View users', 'wordfence-2fa') ?>)</a><?php endif ?>
|
51 |
+
</td>
|
52 |
</tr>
|
53 |
<?php endforeach; ?>
|
54 |
</tbody>
|
55 |
<tfoot>
|
56 |
<tr>
|
57 |
+
<th><?php esc_html_e('Total', 'wordfence-2fa'); ?></th>
|
58 |
<th class="wfls-center"><?php echo number_format($counts['total_users']); ?></th>
|
59 |
<th class="wfls-center"><?php echo number_format($counts['active_total_users']); ?></th>
|
60 |
+
<th class="wfls-center"><?php echo number_format($counts['total_users'] - $counts['active_total_users']); ?></th>
|
61 |
</tr>
|
62 |
<?php if (is_multisite()): ?>
|
63 |
<tr>
|
64 |
+
<td colspan="4" class="wfls-text-small"><?php esc_html_e('* User counts currently only reflect the main site on multisite installations.', 'wordfence-2fa'); ?></td>
|
65 |
</tr>
|
66 |
<?php endif; ?>
|
67 |
</tfoot>
|
68 |
</table>
|
69 |
</div>
|
70 |
+
</div>
|
views/user/grace-period-toggle.php
ADDED
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
if (!defined('WORDFENCE_LS_VERSION')) { exit; }
|
3 |
+
|
4 |
+
?>
|
5 |
+
<table id="wfls-grace-period-toggle-container" style="display: none">
|
6 |
+
<tr>
|
7 |
+
<th scope="row"><label for="wfls-grace-period-toggle"><?php esc_html_e('2FA Grace Period', 'wordfence-2fa') ?></label></th>
|
8 |
+
<td>
|
9 |
+
<input id="wfls-grace-period-toggle" name="wfls-grace-period-toggle" type="checkbox">
|
10 |
+
<label for="wfls-grace-period-toggle"><?php esc_html_e('Allow a grace period for this user prior to requiring Wordfence 2FA') ?></label>
|
11 |
+
</td>
|
12 |
+
</tr>
|
13 |
+
</table>
|
wordfence-login-security.php
CHANGED
@@ -4,8 +4,10 @@ Plugin Name: Wordfence Login Security
|
|
4 |
Description: Wordfence Login Security
|
5 |
Author: Wordfence
|
6 |
Author URI: http://www.wordfence.com/
|
7 |
-
Version: 1.0.
|
8 |
Network: true
|
|
|
|
|
9 |
*/
|
10 |
if (defined('WP_INSTALLING') && WP_INSTALLING) { return; }
|
11 |
if (!defined('ABSPATH')) { exit; }
|
@@ -33,8 +35,10 @@ if ($wfCoreActive && !(isset($wfCoreLoading) && $wfCoreLoading)) {
|
|
33 |
else {
|
34 |
define('WORDFENCE_LS_FROM_CORE', ($wfCoreActive && isset($wfCoreLoading) && $wfCoreLoading));
|
35 |
|
36 |
-
define('WORDFENCE_LS_VERSION', '1.0.
|
37 |
-
define('WORDFENCE_LS_BUILD_NUMBER', '
|
|
|
|
|
38 |
|
39 |
if (!defined('WORDFENCE_LS_EMAIL_VALIDITY_DURATION_MINUTES')) { define('WORDFENCE_LS_EMAIL_VALIDITY_DURATION_MINUTES', 15); }
|
40 |
|
@@ -101,4 +105,4 @@ else {
|
|
101 |
if (!defined('WORDFENCE_LS_VERSIONONLY_MODE') && (!defined('WORDFENCE_USE_LEGACY_2FA') || (defined('WORDFENCE_USE_LEGACY_2FA') && !WORDFENCE_USE_LEGACY_2FA))) { //Used to get version from file
|
102 |
\WordfenceLS\Controller_WordfenceLS::shared()->init();
|
103 |
}
|
104 |
-
}
|
4 |
Description: Wordfence Login Security
|
5 |
Author: Wordfence
|
6 |
Author URI: http://www.wordfence.com/
|
7 |
+
Version: 1.0.7
|
8 |
Network: true
|
9 |
+
Requires at least: 4.5
|
10 |
+
Requires PHP: 5.3
|
11 |
*/
|
12 |
if (defined('WP_INSTALLING') && WP_INSTALLING) { return; }
|
13 |
if (!defined('ABSPATH')) { exit; }
|
35 |
else {
|
36 |
define('WORDFENCE_LS_FROM_CORE', ($wfCoreActive && isset($wfCoreLoading) && $wfCoreLoading));
|
37 |
|
38 |
+
define('WORDFENCE_LS_VERSION', '1.0.7');
|
39 |
+
define('WORDFENCE_LS_BUILD_NUMBER', '1625749951');
|
40 |
+
|
41 |
+
define('WORDFENCE_LS_PLUGIN_BASENAME', plugin_basename(__FILE__));
|
42 |
|
43 |
if (!defined('WORDFENCE_LS_EMAIL_VALIDITY_DURATION_MINUTES')) { define('WORDFENCE_LS_EMAIL_VALIDITY_DURATION_MINUTES', 15); }
|
44 |
|
105 |
if (!defined('WORDFENCE_LS_VERSIONONLY_MODE') && (!defined('WORDFENCE_USE_LEGACY_2FA') || (defined('WORDFENCE_USE_LEGACY_2FA') && !WORDFENCE_USE_LEGACY_2FA))) { //Used to get version from file
|
106 |
\WordfenceLS\Controller_WordfenceLS::shared()->init();
|
107 |
}
|
108 |
+
}
|