Shield Security for WordPress - Version 8.5.7

Version Description

  • Current Release = Released: 10th February, 2020 - Release Notes

  • (v.7) ADDED: New admin notice to indicate that the plugin is currently disabled.

  • (v.7) IMPROVED: Malware scanning for premium assets always uses hashes where possible to verify contents.

  • (v.7) IMPROVED: Optimised loading of libraries that run for certain features, if they aren't enabled.

  • (v.7) IMPROVED: Prevent a rare fatal error on activation.

Download this release

Release Info

Developer paultgoodchild
Plugin Icon 128x128 Shield Security for WordPress
Version 8.5.7
Comparing to
See all releases

Code changes from version 8.4.4 to 8.5.7

Files changed (104) hide show
  1. changelog.html +53 -1
  2. icwp-wpsf.php +4 -22
  3. plugin-spec.php +4 -4
  4. readme.txt +43 -18
  5. resources/css/bootstrap4.css +393 -207
  6. resources/css/bootstrap4.min.css +2 -2
  7. resources/css/introjs.min.css +1 -0
  8. resources/css/plugin.css +29 -20
  9. resources/images/pluginlogo_32x32.png +0 -0
  10. resources/js/bootstrap4.bundle.js +430 -309
  11. resources/js/bootstrap4.bundle.min.js +2 -2
  12. resources/js/bootstrap4.js +376 -290
  13. resources/js/bootstrap4.min.js +2 -2
  14. resources/js/global-plugin.js +12 -0
  15. resources/js/introjs.min.js +1 -0
  16. resources/js/plugin.js +10 -1
  17. resources/js/shield-tables.js +18 -0
  18. src/common/icwp-data.php +0 -606
  19. src/common/wp-admin-notices.php +0 -92
  20. src/common/wp-widget.php +0 -22
  21. src/config/feature-admin_access_restriction.php +11 -0
  22. src/config/feature-audit_trail.php +2 -0
  23. src/config/feature-hack_protect.php +0 -34
  24. src/config/feature-headers.php +13 -1
  25. src/config/feature-ips.php +13 -0
  26. src/config/feature-plugin.php +17 -9
  27. src/features/admin_access_restriction.php +43 -11
  28. src/features/audit_trail.php +1 -1
  29. src/features/autoupdates.php +0 -147
  30. src/features/base.php +105 -122
  31. src/features/base_wpsf.php +147 -137
  32. src/features/events.php +0 -8
  33. src/features/hack_protect.php +263 -244
  34. src/features/headers.php +133 -105
  35. src/features/insights.php +72 -44
  36. src/features/ips.php +62 -18
  37. src/features/license.php +9 -18
  38. src/features/login_protect.php +7 -27
  39. src/features/plugin.php +183 -168
  40. src/features/sessions.php +0 -8
  41. src/features/statistics.php +0 -25
  42. src/features/traffic.php +1 -8
  43. src/features/user_management.php +76 -43
  44. src/lib/src/Controller/Controller.php +115 -43
  45. src/lib/src/Databases/AuditTrail/EntryVO.php +10 -8
  46. src/lib/src/Databases/AuditTrail/Handler.php +16 -41
  47. src/lib/src/Databases/AuditTrail/Insert.php +2 -6
  48. src/lib/src/Databases/AuditTrail/Select.php +2 -1
  49. src/lib/src/Databases/AuditTrail/Update.php +8 -0
  50. src/lib/src/Databases/Base/BaseQuery.php +38 -8
  51. src/lib/src/Databases/Base/EntryVO.php +0 -8
  52. src/lib/src/Databases/Base/EntryVoConsumer.php +31 -0
  53. src/lib/src/Databases/Base/Handler.php +5 -5
  54. src/lib/src/Databases/Base/Select.php +23 -5
  55. src/lib/src/Databases/Events/Insert.php +1 -0
  56. src/lib/src/Databases/Events/Update.php +1 -0
  57. src/lib/src/Databases/GeoIp/Select.php +2 -3
  58. src/lib/src/Databases/IPs/CommonFilters.php +25 -0
  59. src/lib/src/Databases/IPs/Delete.php +2 -5
  60. src/lib/src/Databases/IPs/EntryVO.php +13 -14
  61. src/lib/src/Databases/IPs/Handler.php +3 -2
  62. src/lib/src/Databases/IPs/Select.php +25 -8
  63. src/lib/src/Databases/IPs/Update.php +9 -1
  64. src/lib/src/Databases/ScanQueue/Update.php +9 -0
  65. src/lib/src/Databases/Scanner/Common.php +82 -0
  66. src/lib/src/Databases/Scanner/Delete.php +1 -21
  67. src/lib/src/Databases/Scanner/EntryVO.php +7 -7
  68. src/lib/src/Databases/Scanner/Select.php +1 -65
  69. src/lib/src/Databases/Scanner/Update.php +38 -0
  70. src/lib/src/Databases/Session/Insert.php +10 -6
  71. src/lib/src/Databases/Session/Select.php +2 -1
  72. src/lib/src/Databases/Tally/Insert.php +1 -1
  73. src/lib/src/Databases/Traffic/Insert.php +14 -0
  74. src/lib/src/Databases/Traffic/Select.php +4 -5
  75. src/lib/src/Deprecated/Foundation.php +7 -18
  76. src/lib/src/Modules/AuditTrail/Auditors/Base.php +0 -1
  77. src/lib/src/Modules/AuditTrail/Auditors/Posts.php +3 -3
  78. src/lib/src/Modules/AuditTrail/Auditors/Users.php +2 -2
  79. src/lib/src/Modules/AuditTrail/Lib/AuditWriter.php +72 -0
  80. src/lib/src/Modules/AuditTrail/Lib/Ops/Commit.php +108 -0
  81. src/lib/src/Modules/Autoupdates/Options.php +8 -1
  82. src/lib/src/Modules/Base/BaseModCon.php +44 -112
  83. src/lib/src/Modules/Base/Lib/BaseService.php +36 -0
  84. src/lib/src/Modules/Base/Options.php +32 -28
  85. src/lib/src/Modules/Base/Strings.php +2 -0
  86. src/lib/src/Modules/CommentsFilter/Scan/Bot.php +4 -4
  87. src/lib/src/Modules/CommentsFilter/Scan/Human.php +2 -1
  88. src/lib/src/Modules/CommentsFilter/Token/Create.php +0 -3
  89. src/lib/src/Modules/Email/Options.php +1 -0
  90. src/lib/src/Modules/Events/Lib/EventsListener.php +61 -0
  91. src/lib/src/Modules/Events/Lib/EventsService.php +82 -0
  92. src/lib/src/Modules/Events/Lib/StatsWriter.php +52 -0
  93. src/lib/src/Modules/Events/Strings.php +2 -2
  94. src/lib/src/Modules/Firewall/Options.php +7 -0
  95. src/lib/src/Modules/HackGuard/AjaxHandler.php +71 -70
  96. src/lib/src/Modules/HackGuard/Lib/Snapshots/Build/BuildHashesForAsset.php +48 -0
  97. src/lib/src/Modules/HackGuard/Lib/Snapshots/Build/BuildHashesFromApi.php +88 -0
  98. src/lib/src/Modules/HackGuard/Lib/Snapshots/Build/BuildHashesFromDir.php +84 -0
  99. src/lib/src/Modules/HackGuard/Lib/Snapshots/FindAssetsToSnap.php +36 -0
  100. src/lib/src/Modules/HackGuard/Lib/Snapshots/Store.php +277 -0
  101. src/lib/src/Modules/HackGuard/Lib/Snapshots/StoreAction/BaseAction.php +48 -0
  102. src/lib/src/Modules/HackGuard/Lib/Snapshots/StoreAction/BaseBulk.php +10 -0
  103. src/lib/src/Modules/HackGuard/Lib/Snapshots/StoreAction/Build.php +64 -0
  104. src/lib/src/Modules/HackGuard/Lib/Snapshots/StoreAction/BuildAll.php +16 -0
changelog.html CHANGED
@@ -1,3 +1,55 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  <p>= 8.3 - Series =
2
  <em>Released: 18th November, 2019</em> - <a href="https://shsec.io/g3">Release Notes</a></p>
3
  <ul>
@@ -1359,4 +1411,4 @@ will outright block any access they have to your WordPress site.</p>
1359
  <li>You can now add a comment to IP addresses in the whitelist/blacklist. To do this, write your IP address then type a SPACE and write whatever you want (don&#39;t take a new line).</li>
1360
  <li>You can now set to delete ALL firewall settings when you deactivate the plugin.</li>
1361
  <li>Improved formatting of the firewall log.</li>
1362
- </ul>
1
+ <p>= 8.5 - Series =
2
+ <em>Released: 8th January, 2020</em> - <a href="https://shsec.io/gb">Release Notes</a></p>
3
+ <ul>
4
+ <li><strong>(v.7)</strong> ADDED: New admin notice to indicate that the plugin is currently disabled.</li>
5
+ <li><strong>(v.7)</strong> IMPROVED: Optimised loading of libraries that run for certain options, if they aren&#39;t enabled.</li>
6
+ <li><strong>(v.7)</strong> IMPROVED: Prevent a rare fatal error on activation.</li>
7
+ <li><strong>(v.6)</strong> FIXED: Locking session to IP address was not handling all IP addresses correctly.</li>
8
+ <li><strong>(v.5)</strong> FIXED: Further protection against errors if IP address is of a private network.</li>
9
+ <li><strong>(v.5)</strong> FIXED: Can&#39;t activate plugins in a particular scenario.</li>
10
+ <li><strong>(v.5)</strong> FIXED: Traffic Logger wasn&#39;t capturing traffic in some cases.</li>
11
+ <li><strong>(v.3)</strong> FIXED: Prevent MySQL error when Shield is running on private network or local machine.</li>
12
+ <li><strong>(v.3)</strong> FIXED: Prevent duplicate emails being sent when removing Security Admin key.</li>
13
+ <li><strong>(v.2)</strong> ADDED: Introductory tour of plugin, on activation.</li>
14
+ <li><strong>(v.2)</strong> IMPROVED: Enhanced IP detection of service providers for exclusion from traffic log.</li>
15
+ <li><strong>(v.2)</strong> IMPROVED: Plugin/Theme Hack Guard Snapshot building is optimised to reduce disruption is some cases.</li>
16
+ <li><strong>(v.2)</strong> IMPROVED: Visitor IP detection processing.</li>
17
+ <li><strong>(v.2)</strong> IMPROVED: Improved cache-prevention of Login Two-Factor Authentication portal.</li>
18
+ <li><strong>(v.2)</strong> FIXED: Firewall email alert was not sent when using certain dedicated email plugins.</li>
19
+ <li><strong>(v.2)</strong> FIXED: Firewall 404 setting was redirecting instead of responding with 404.</li>
20
+ <li><strong>(v.2)</strong> ADDED: Added support for NodePing filtering in the traffic logger.</li>
21
+ <li><strong>(v.1)</strong> FIXED: Fix for page loading issue/slowdown in some cases.</li>
22
+ <li><strong>(v.0)</strong> NEW: Initial support for checksum scanning of premium plugins and themes.</li>
23
+ <li><strong>(v.0)</strong> NEW: Ability to switch-off Security Admin with an email confirmation if key is lost/forgotten.</li>
24
+ <li><strong>(v.0)</strong> NEW: Ability to auto-repair theme files.</li>
25
+ <li><strong>(v.0)</strong> ADDED: Ability to whitelist requests so that they are never blacklisted.</li>
26
+ <li><strong>(v.0)</strong> ADDED: Ability to filter the IP White/Black list tables for a specific IP address.</li>
27
+ <li><strong>(v.0)</strong> ADDED: Support for repeated audit trail entries - so the logs don&#39;t get filled with repeated messages.</li>
28
+ <li><strong>(v.0)</strong> ADDED: [<strong>PRO</strong>] Option to provide complete, custom Content Security Policy headers.</li>
29
+ <li><strong>(v.0)</strong> IMPROVED: Protection against a certain type of broken plugin installation if WordPress doesn&#39;t properly copy files.</li>
30
+ <li><strong>(v.0)</strong> IMPROVED: Redesigned Table UI for scan results.</li>
31
+ <li><strong>(v.0)</strong> IMPROVED: Redesigned Plugin/Theme File Guard.</li>
32
+ <li><strong>(v.0)</strong> IMPROVED: Completely re-written much of the scanners code.</li>
33
+ <li><strong>(v.0)</strong> IMPROVED: Better detection of the hosting server&#39;s IP addresses - i.e. support for IPv6 alongside IPv4.</li>
34
+ <li><strong>(v.0)</strong> FIXED: Two-Factor Authentication (2FA) login screen redirection bug.</li>
35
+ <li><strong>(v.0)</strong> FIXED: It was possible to temporarily by-pass the 2FA screen to gain access to WP Admin after logging-in.</li>
36
+ <li><strong>(v.0)</strong> CLEANED: Code cleaning.</li>
37
+ <li><strong>(v.0)</strong> UPDATED: Twitter Bootstrap library.</li>
38
+ </ul>
39
+ <p>= 8.4 - Series =
40
+ <em>Released: 29th November, 2019</em> - <a href="https://shsec.io/g5">Release Notes</a></p>
41
+ <ul>
42
+ <li><strong>(v.4)</strong> IMPROVED: Discovered serious conflict with SiteGround Optimizer plugin. Provided admin notice and automatic fixing.</li>
43
+ <li><strong>(v.4)</strong> FIXED: Protected against spurious error log notices when comparing hashes with &quot;nothing&quot;.</li>
44
+ <li><strong>(v.3)</strong> FIXED: Reduce chances of fatal error occurring during upgrade.</li>
45
+ <li><strong>(v.0)</strong> ADDED: Charts of important events on Overview page highlight effectiveness of Shield.</li>
46
+ <li><strong>(v.0)</strong> ADDED: Support for whitelisting IPv6 ranges.</li>
47
+ <li><strong>(v.0)</strong> ADDED: Allow Audit Trail logging for Shield&#39;s Bot Detection features for all free installations.</li>
48
+ <li><strong>(v.0)</strong> IMPROVED: Malware scanner false-positive lookups now use further intelligence from API.</li>
49
+ <li><strong>(v.0)</strong> IMPROVED: Refactor Comment SPAM implementation away from inline-Javascript.</li>
50
+ <li><strong>(v.0)</strong> IMPROVED: Consolidate Events/Statistics database table to significantly reduce DB size.</li>
51
+ <li><strong>(v.0)</strong> CLEANED: Significant clean-out of old, deprecated, retired code.</li>
52
+ </ul>
53
  <p>= 8.3 - Series =
54
  <em>Released: 18th November, 2019</em> - <a href="https://shsec.io/g3">Release Notes</a></p>
55
  <ul>
1411
  <li>You can now add a comment to IP addresses in the whitelist/blacklist. To do this, write your IP address then type a SPACE and write whatever you want (don&#39;t take a new line).</li>
1412
  <li>You can now set to delete ALL firewall settings when you deactivate the plugin.</li>
1413
  <li>Improved formatting of the firewall log.</li>
1414
+ </ul>
icwp-wpsf.php CHANGED
@@ -3,7 +3,7 @@
3
  * Plugin Name: Shield Security
4
  * Plugin URI: https://shsec.io/2f
5
  * Description: Powerful, Easy-To-Use #1 Rated WordPress Security System
6
- * Version: 8.4.4
7
  * Text Domain: wp-simple-firewall
8
  * Domain Path: /languages
9
  * Author: Shield Security
@@ -11,7 +11,7 @@
11
  */
12
 
13
  /**
14
- * Copyright (c) 2019 Shield Security <support@shieldsecurity.io>
15
  * All rights reserved.
16
  * "Shield" (formerly WordPress Simple Firewall) is distributed under the GNU
17
  * General Public License, Version 2, June 1991. Copyright (C) 1989, 1991 Free
@@ -35,28 +35,10 @@ if ( version_compare( PHP_VERSION, '5.4.0', '<' ) ) {
35
  return;
36
  }
37
 
38
- if ( !function_exists( '_wpsf_e' ) ) {
39
- /**
40
- * @param $sStr
41
- * @deprecated
42
- */
43
- function _wpsf_e( $sStr ) {
44
- _e( $sStr, 'wp-simple-firewall' );
45
- }
46
- }
47
- if ( !function_exists( '_wpsf__' ) ) {
48
- /**
49
- * @param $sStr
50
- * @return string|void
51
- * @deprecated
52
- */
53
- function _wpsf__( $sStr ) {
54
- return __( $sStr, 'wp-simple-firewall' );
55
- }
56
  }
57
 
58
- require_once( dirname( __FILE__ ).'/src/lib/vendor/autoload.php' );
59
-
60
  if ( !include_once( dirname( __FILE__ ).'/filesnotfound.php' ) ) {
61
  return;
62
  }
3
  * Plugin Name: Shield Security
4
  * Plugin URI: https://shsec.io/2f
5
  * Description: Powerful, Easy-To-Use #1 Rated WordPress Security System
6
+ * Version: 8.5.7
7
  * Text Domain: wp-simple-firewall
8
  * Domain Path: /languages
9
  * Author: Shield Security
11
  */
12
 
13
  /**
14
+ * Copyright (c) 2020 Shield Security <support@shieldsecurity.io>
15
  * All rights reserved.
16
  * "Shield" (formerly WordPress Simple Firewall) is distributed under the GNU
17
  * General Public License, Version 2, June 1991. Copyright (C) 1989, 1991 Free
35
  return;
36
  }
37
 
38
+ if ( @is_file( dirname( __FILE__ ).'/src/lib/vendor/autoload.php' ) ) {
39
+ require_once( dirname( __FILE__ ).'/src/lib/vendor/autoload.php' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
40
  }
41
 
 
 
42
  if ( !include_once( dirname( __FILE__ ).'/filesnotfound.php' ) ) {
43
  return;
44
  }
plugin-spec.php CHANGED
@@ -1,8 +1,8 @@
1
  {
2
  "properties": {
3
- "version": "8.4.4",
4
- "release_timestamp": 1575630000,
5
- "build": "201912.0601",
6
  "slug_parent": "icwp",
7
  "slug_plugin": "wpsf",
8
  "human_name": "Shield",
@@ -42,7 +42,7 @@
42
  },
43
  "plugin_admin": {
44
  "css": [
45
- "bootstrap4",
46
  "bootstrap-select.min",
47
  "plugin",
48
  "featherlight"
1
  {
2
  "properties": {
3
+ "version": "8.5.7",
4
+ "release_timestamp": 1581339113,
5
+ "build": "202002.1001",
6
  "slug_parent": "icwp",
7
  "slug_plugin": "wpsf",
8
  "human_name": "Shield",
42
  },
43
  "plugin_admin": {
44
  "css": [
45
+ "bootstrap4.min",
46
  "bootstrap-select.min",
47
  "plugin",
48
  "featherlight"
readme.txt CHANGED
@@ -8,7 +8,7 @@ Requires at least: 3.5.2
8
  Requires PHP: 5.4.0
9
  Recommended PHP: 7.0
10
  Tested up to: 5.3
11
- Stable tag: 8.4.4
12
 
13
  Smarter security protection from hackers through automation. Powerful scanners, 2-Factor Auth, limit logins, auto IP blocks & more.
14
 
@@ -370,22 +370,47 @@ You will always be able to use Shield Security and its free features in-full.
370
 
371
  [Go Pro for just $1/month](https://shsec.io/aa).
372
 
373
- = 8.4.4 - Current Release =
374
- *Released: 6th December, 2019* - [Release Notes](https://shsec.io/g5)
375
-
376
- * **(v.4)** IMPROVED: Discovered serious conflict with SiteGround Optimizer plugin. Provided admin notice and automatic fixing.
377
- * **(v.4)** FIXED: Protected against spurious error log notices when comparing hashes with "nothing".
378
-
379
- = 8.4 - Series =
380
- *Released: 29th November, 2019* - [Release Notes](https://shsec.io/g5)
381
-
382
- * **(v.3)** FIXED: Reduce chances of fatal error occurring during upgrade.
383
- * **(v.0)** ADDED: Charts of important events on Overview page highlight effectiveness of Shield.
384
- * **(v.0)** ADDED: Support for whitelisting IPv6 ranges.
385
- * **(v.0)** ADDED: Allow Audit Trail logging for Shield's Bot Detection features for all free installations.
386
- * **(v.0)** IMPROVED: Malware scanner false-positive lookups now use further intelligence from API.
387
- * **(v.0)** IMPROVED: Refactor Comment SPAM implementation away from inline-Javascript.
388
- * **(v.0)** IMPROVED: Consolidate Events/Statistics database table to significantly reduce DB size.
389
- * **(v.0)** CLEANED: Significant clean-out of old, deprecated, retired code.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
390
 
391
  #### [Full Shield Security Changelog](https://shsec.io/shieldwporgfullchangelog)
8
  Requires PHP: 5.4.0
9
  Recommended PHP: 7.0
10
  Tested up to: 5.3
11
+ Stable tag: 8.5.7
12
 
13
  Smarter security protection from hackers through automation. Powerful scanners, 2-Factor Auth, limit logins, auto IP blocks & more.
14
 
370
 
371
  [Go Pro for just $1/month](https://shsec.io/aa).
372
 
373
+ = 8.5.7 - Current Release =
374
+ *Released: 10th February, 2020* - [Release Notes](https://shsec.io/gb)
375
+
376
+ * **(v.7)** ADDED: New admin notice to indicate that the plugin is currently disabled.
377
+ * **(v.7)** IMPROVED: Malware scanning for premium assets always uses hashes where possible to verify contents.
378
+ * **(v.7)** IMPROVED: Optimised loading of libraries that run for certain features, if they aren't enabled.
379
+ * **(v.7)** IMPROVED: Prevent a rare fatal error on activation.
380
+
381
+ = 8.5 - Series =
382
+ *Released: 8th January, 2020* - [Release Notes](https://shsec.io/gb)
383
+
384
+ * **(v.6)** FIXED: Locking session to IP address was not handling all IP addresses correctly.
385
+ * **(v.5)** FIXED: Further protection against errors if IP address is of a private network.
386
+ * **(v.5)** FIXED: Can't activate plugins in a particular scenario.
387
+ * **(v.5)** FIXED: Traffic Logger wasn't capturing traffic in some cases.
388
+ * **(v.3)** FIXED: Prevent MySQL error when Shield is running on private network or local machine.
389
+ * **(v.3)** FIXED: Prevent duplicate emails being sent when removing Security Admin key.
390
+ * **(v.2)** ADDED: Introductory tour of plugin, on activation.
391
+ * **(v.2)** IMPROVED: Enhanced IP detection of service providers for exclusion from traffic log.
392
+ * **(v.2)** IMPROVED: Plugin/Theme Hack Guard Snapshot building is optimised to reduce disruption is some cases.
393
+ * **(v.2)** IMPROVED: Visitor IP detection processing.
394
+ * **(v.2)** IMPROVED: Improved cache-prevention of Login Two-Factor Authentication portal.
395
+ * **(v.2)** FIXED: Firewall email alert was not sent when using certain dedicated email plugins.
396
+ * **(v.2)** FIXED: Firewall 404 setting was redirecting instead of responding with 404.
397
+ * **(v.2)** ADDED: Added support for NodePing filtering in the traffic logger.
398
+ * **(v.1)** FIXED: Fix for page loading issue/slowdown in some cases.
399
+ * **(v.0)** NEW: Initial support for checksum scanning of premium plugins and themes.
400
+ * **(v.0)** NEW: Ability to switch-off Security Admin with an email confirmation if key is lost/forgotten.
401
+ * **(v.0)** NEW: Ability to auto-repair theme files.
402
+ * **(v.0)** ADDED: Ability to whitelist requests so that they are never blacklisted.
403
+ * **(v.0)** ADDED: Ability to filter the IP White/Black list tables for a specific IP address.
404
+ * **(v.0)** ADDED: Support for repeated audit trail entries - so the logs don't get filled with repeated messages.
405
+ * **(v.0)** ADDED: [**PRO**] Option to provide complete, custom Content Security Policy headers.
406
+ * **(v.0)** IMPROVED: Protection against a certain type of broken plugin installation if WordPress doesn't properly copy files.
407
+ * **(v.0)** IMPROVED: Redesigned Table UI for scan results.
408
+ * **(v.0)** IMPROVED: Redesigned Plugin/Theme File Guard.
409
+ * **(v.0)** IMPROVED: Completely re-written much of the scanners code.
410
+ * **(v.0)** IMPROVED: Better detection of the hosting server's IP addresses - i.e. support for IPv6 alongside IPv4.
411
+ * **(v.0)** FIXED: Two-Factor Authentication (2FA) login screen redirection bug.
412
+ * **(v.0)** FIXED: It was possible to temporarily by-pass the 2FA screen to gain access to WP Admin after logging-in.
413
+ * **(v.0)** CLEANED: Code cleaning.
414
+ * **(v.0)** UPDATED: Twitter Bootstrap library.
415
 
416
  #### [Full Shield Security Changelog](https://shsec.io/shieldwporgfullchangelog)
resources/css/bootstrap4.css CHANGED
@@ -1,5 +1,5 @@
1
  /*!
2
- * Bootstrap v4.3.1 (https://getbootstrap.com/)
3
  * Copyright 2011-2019 The Bootstrap Authors
4
  * Copyright 2011-2019 Twitter, Inc.
5
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
@@ -63,7 +63,7 @@ body {
63
  background-color: #fff;
64
  }
65
 
66
- [tabindex="-1"]:focus {
67
  outline: 0 !important;
68
  }
69
 
@@ -163,20 +163,16 @@ a:hover {
163
  text-decoration: underline;
164
  }
165
 
166
- a:not([href]):not([tabindex]) {
167
  color: inherit;
168
  text-decoration: none;
169
  }
170
 
171
- a:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {
172
  color: inherit;
173
  text-decoration: none;
174
  }
175
 
176
- a:not([href]):not([tabindex]):focus {
177
- outline: 0;
178
- }
179
-
180
  pre,
181
  code,
182
  kbd,
@@ -507,7 +503,7 @@ mark,
507
  code {
508
  font-size: 87.5%;
509
  color: #e83e8c;
510
- word-break: break-word;
511
  }
512
 
513
  a > code {
@@ -577,7 +573,7 @@ pre code {
577
  }
578
  }
579
 
580
- .container-fluid {
581
  width: 100%;
582
  padding-right: 15px;
583
  padding-left: 15px;
@@ -585,6 +581,30 @@ pre code {
585
  margin-left: auto;
586
  }
587
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
588
  .row {
589
  display: -ms-flexbox;
590
  display: flex;
@@ -625,6 +645,42 @@ pre code {
625
  max-width: 100%;
626
  }
627
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
628
  .col-auto {
629
  -ms-flex: 0 0 auto;
630
  flex: 0 0 auto;
@@ -831,6 +887,36 @@ pre code {
831
  flex-grow: 1;
832
  max-width: 100%;
833
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
834
  .col-sm-auto {
835
  -ms-flex: 0 0 auto;
836
  flex: 0 0 auto;
@@ -1003,6 +1089,36 @@ pre code {
1003
  flex-grow: 1;
1004
  max-width: 100%;
1005
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1006
  .col-md-auto {
1007
  -ms-flex: 0 0 auto;
1008
  flex: 0 0 auto;
@@ -1175,6 +1291,36 @@ pre code {
1175
  flex-grow: 1;
1176
  max-width: 100%;
1177
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1178
  .col-lg-auto {
1179
  -ms-flex: 0 0 auto;
1180
  flex: 0 0 auto;
@@ -1347,6 +1493,36 @@ pre code {
1347
  flex-grow: 1;
1348
  max-width: 100%;
1349
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1350
  .col-xl-auto {
1351
  -ms-flex: 0 0 auto;
1352
  flex: 0 0 auto;
@@ -1881,6 +2057,11 @@ pre code {
1881
  border: 0;
1882
  }
1883
 
 
 
 
 
 
1884
  .form-control:focus {
1885
  color: #495057;
1886
  background-color: #fff;
@@ -1955,9 +2136,9 @@ select.form-control:focus::-ms-value {
1955
  .form-control-plaintext {
1956
  display: block;
1957
  width: 100%;
1958
- padding-top: 0.375rem;
1959
- padding-bottom: 0.375rem;
1960
  margin-bottom: 0;
 
1961
  line-height: 1.5;
1962
  color: #212529;
1963
  background-color: transparent;
@@ -2030,6 +2211,7 @@ textarea.form-control {
2030
  margin-left: -1.25rem;
2031
  }
2032
 
 
2033
  .form-check-input:disabled ~ .form-check-label {
2034
  color: #6c757d;
2035
  }
@@ -2077,12 +2259,19 @@ textarea.form-control {
2077
  border-radius: 0.25rem;
2078
  }
2079
 
 
 
 
 
 
 
 
2080
  .was-validated .form-control:valid, .form-control.is-valid {
2081
  border-color: #28a745;
2082
  padding-right: calc(1.5em + 0.75rem);
2083
- background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");
2084
  background-repeat: no-repeat;
2085
- background-position: center right calc(0.375em + 0.1875rem);
2086
  background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
2087
  }
2088
 
@@ -2091,12 +2280,6 @@ textarea.form-control {
2091
  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);
2092
  }
2093
 
2094
- .was-validated .form-control:valid ~ .valid-feedback,
2095
- .was-validated .form-control:valid ~ .valid-tooltip, .form-control.is-valid ~ .valid-feedback,
2096
- .form-control.is-valid ~ .valid-tooltip {
2097
- display: block;
2098
- }
2099
-
2100
  .was-validated textarea.form-control:valid, textarea.form-control.is-valid {
2101
  padding-right: calc(1.5em + 0.75rem);
2102
  background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);
@@ -2104,8 +2287,8 @@ textarea.form-control {
2104
 
2105
  .was-validated .custom-select:valid, .custom-select.is-valid {
2106
  border-color: #28a745;
2107
- padding-right: calc((1em + 0.75rem) * 3 / 4 + 1.75rem);
2108
- background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
2109
  }
2110
 
2111
  .was-validated .custom-select:valid:focus, .custom-select.is-valid:focus {
@@ -2113,18 +2296,6 @@ textarea.form-control {
2113
  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);
2114
  }
2115
 
2116
- .was-validated .custom-select:valid ~ .valid-feedback,
2117
- .was-validated .custom-select:valid ~ .valid-tooltip, .custom-select.is-valid ~ .valid-feedback,
2118
- .custom-select.is-valid ~ .valid-tooltip {
2119
- display: block;
2120
- }
2121
-
2122
- .was-validated .form-control-file:valid ~ .valid-feedback,
2123
- .was-validated .form-control-file:valid ~ .valid-tooltip, .form-control-file.is-valid ~ .valid-feedback,
2124
- .form-control-file.is-valid ~ .valid-tooltip {
2125
- display: block;
2126
- }
2127
-
2128
  .was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label {
2129
  color: #28a745;
2130
  }
@@ -2143,12 +2314,6 @@ textarea.form-control {
2143
  border-color: #28a745;
2144
  }
2145
 
2146
- .was-validated .custom-control-input:valid ~ .valid-feedback,
2147
- .was-validated .custom-control-input:valid ~ .valid-tooltip, .custom-control-input.is-valid ~ .valid-feedback,
2148
- .custom-control-input.is-valid ~ .valid-tooltip {
2149
- display: block;
2150
- }
2151
-
2152
  .was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before {
2153
  border-color: #34ce57;
2154
  background-color: #34ce57;
@@ -2166,12 +2331,6 @@ textarea.form-control {
2166
  border-color: #28a745;
2167
  }
2168
 
2169
- .was-validated .custom-file-input:valid ~ .valid-feedback,
2170
- .was-validated .custom-file-input:valid ~ .valid-tooltip, .custom-file-input.is-valid ~ .valid-feedback,
2171
- .custom-file-input.is-valid ~ .valid-tooltip {
2172
- display: block;
2173
- }
2174
-
2175
  .was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label {
2176
  border-color: #28a745;
2177
  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);
@@ -2200,12 +2359,19 @@ textarea.form-control {
2200
  border-radius: 0.25rem;
2201
  }
2202
 
 
 
 
 
 
 
 
2203
  .was-validated .form-control:invalid, .form-control.is-invalid {
2204
  border-color: #dc3545;
2205
  padding-right: calc(1.5em + 0.75rem);
2206
- background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E");
2207
  background-repeat: no-repeat;
2208
- background-position: center right calc(0.375em + 0.1875rem);
2209
  background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
2210
  }
2211
 
@@ -2214,12 +2380,6 @@ textarea.form-control {
2214
  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);
2215
  }
2216
 
2217
- .was-validated .form-control:invalid ~ .invalid-feedback,
2218
- .was-validated .form-control:invalid ~ .invalid-tooltip, .form-control.is-invalid ~ .invalid-feedback,
2219
- .form-control.is-invalid ~ .invalid-tooltip {
2220
- display: block;
2221
- }
2222
-
2223
  .was-validated textarea.form-control:invalid, textarea.form-control.is-invalid {
2224
  padding-right: calc(1.5em + 0.75rem);
2225
  background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);
@@ -2227,8 +2387,8 @@ textarea.form-control {
2227
 
2228
  .was-validated .custom-select:invalid, .custom-select.is-invalid {
2229
  border-color: #dc3545;
2230
- padding-right: calc((1em + 0.75rem) * 3 / 4 + 1.75rem);
2231
- background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
2232
  }
2233
 
2234
  .was-validated .custom-select:invalid:focus, .custom-select.is-invalid:focus {
@@ -2236,18 +2396,6 @@ textarea.form-control {
2236
  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);
2237
  }
2238
 
2239
- .was-validated .custom-select:invalid ~ .invalid-feedback,
2240
- .was-validated .custom-select:invalid ~ .invalid-tooltip, .custom-select.is-invalid ~ .invalid-feedback,
2241
- .custom-select.is-invalid ~ .invalid-tooltip {
2242
- display: block;
2243
- }
2244
-
2245
- .was-validated .form-control-file:invalid ~ .invalid-feedback,
2246
- .was-validated .form-control-file:invalid ~ .invalid-tooltip, .form-control-file.is-invalid ~ .invalid-feedback,
2247
- .form-control-file.is-invalid ~ .invalid-tooltip {
2248
- display: block;
2249
- }
2250
-
2251
  .was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label {
2252
  color: #dc3545;
2253
  }
@@ -2266,12 +2414,6 @@ textarea.form-control {
2266
  border-color: #dc3545;
2267
  }
2268
 
2269
- .was-validated .custom-control-input:invalid ~ .invalid-feedback,
2270
- .was-validated .custom-control-input:invalid ~ .invalid-tooltip, .custom-control-input.is-invalid ~ .invalid-feedback,
2271
- .custom-control-input.is-invalid ~ .invalid-tooltip {
2272
- display: block;
2273
- }
2274
-
2275
  .was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before {
2276
  border-color: #e4606d;
2277
  background-color: #e4606d;
@@ -2289,12 +2431,6 @@ textarea.form-control {
2289
  border-color: #dc3545;
2290
  }
2291
 
2292
- .was-validated .custom-file-input:invalid ~ .invalid-feedback,
2293
- .was-validated .custom-file-input:invalid ~ .invalid-tooltip, .custom-file-input.is-invalid ~ .invalid-feedback,
2294
- .custom-file-input.is-invalid ~ .invalid-tooltip {
2295
- display: block;
2296
- }
2297
-
2298
  .was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label {
2299
  border-color: #dc3545;
2300
  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);
@@ -2381,6 +2517,7 @@ textarea.form-control {
2381
  color: #212529;
2382
  text-align: center;
2383
  vertical-align: middle;
 
2384
  -webkit-user-select: none;
2385
  -moz-user-select: none;
2386
  -ms-user-select: none;
@@ -2432,6 +2569,9 @@ fieldset:disabled a.btn {
2432
  }
2433
 
2434
  .btn-primary:focus, .btn-primary.focus {
 
 
 
2435
  box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5);
2436
  }
2437
 
@@ -2466,6 +2606,9 @@ fieldset:disabled a.btn {
2466
  }
2467
 
2468
  .btn-secondary:focus, .btn-secondary.focus {
 
 
 
2469
  box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5);
2470
  }
2471
 
@@ -2500,6 +2643,9 @@ fieldset:disabled a.btn {
2500
  }
2501
 
2502
  .btn-success:focus, .btn-success.focus {
 
 
 
2503
  box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5);
2504
  }
2505
 
@@ -2534,6 +2680,9 @@ fieldset:disabled a.btn {
2534
  }
2535
 
2536
  .btn-info:focus, .btn-info.focus {
 
 
 
2537
  box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5);
2538
  }
2539
 
@@ -2568,6 +2717,9 @@ fieldset:disabled a.btn {
2568
  }
2569
 
2570
  .btn-warning:focus, .btn-warning.focus {
 
 
 
2571
  box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5);
2572
  }
2573
 
@@ -2602,6 +2754,9 @@ fieldset:disabled a.btn {
2602
  }
2603
 
2604
  .btn-danger:focus, .btn-danger.focus {
 
 
 
2605
  box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5);
2606
  }
2607
 
@@ -2636,6 +2791,9 @@ fieldset:disabled a.btn {
2636
  }
2637
 
2638
  .btn-light:focus, .btn-light.focus {
 
 
 
2639
  box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5);
2640
  }
2641
 
@@ -2670,6 +2828,9 @@ fieldset:disabled a.btn {
2670
  }
2671
 
2672
  .btn-dark:focus, .btn-dark.focus {
 
 
 
2673
  box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5);
2674
  }
2675
 
@@ -3419,9 +3580,9 @@ input[type="button"].btn-block {
3419
  .input-group > .custom-select,
3420
  .input-group > .custom-file {
3421
  position: relative;
3422
- -ms-flex: 1 1 auto;
3423
- flex: 1 1 auto;
3424
- width: 1%;
3425
  margin-bottom: 0;
3426
  }
3427
 
@@ -3613,7 +3774,10 @@ input[type="button"].btn-block {
3613
 
3614
  .custom-control-input {
3615
  position: absolute;
 
3616
  z-index: -1;
 
 
3617
  opacity: 0;
3618
  }
3619
 
@@ -3637,11 +3801,11 @@ input[type="button"].btn-block {
3637
  border-color: #b3d7ff;
3638
  }
3639
 
3640
- .custom-control-input:disabled ~ .custom-control-label {
3641
  color: #6c757d;
3642
  }
3643
 
3644
- .custom-control-input:disabled ~ .custom-control-label::before {
3645
  background-color: #e9ecef;
3646
  }
3647
 
@@ -3680,7 +3844,7 @@ input[type="button"].btn-block {
3680
  }
3681
 
3682
  .custom-checkbox .custom-control-input:checked ~ .custom-control-label::after {
3683
- background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e");
3684
  }
3685
 
3686
  .custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before {
@@ -3689,7 +3853,7 @@ input[type="button"].btn-block {
3689
  }
3690
 
3691
  .custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after {
3692
- background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e");
3693
  }
3694
 
3695
  .custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before {
@@ -3705,7 +3869,7 @@ input[type="button"].btn-block {
3705
  }
3706
 
3707
  .custom-radio .custom-control-input:checked ~ .custom-control-label::after {
3708
- background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e");
3709
  }
3710
 
3711
  .custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before {
@@ -3761,8 +3925,7 @@ input[type="button"].btn-block {
3761
  line-height: 1.5;
3762
  color: #495057;
3763
  vertical-align: middle;
3764
- background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px;
3765
- background-color: #fff;
3766
  border: 1px solid #ced4da;
3767
  border-radius: 0.25rem;
3768
  -webkit-appearance: none;
@@ -3796,6 +3959,11 @@ input[type="button"].btn-block {
3796
  display: none;
3797
  }
3798
 
 
 
 
 
 
3799
  .custom-select-sm {
3800
  height: calc(1.5em + 0.5rem + 2px);
3801
  padding-top: 0.25rem;
@@ -3834,6 +4002,7 @@ input[type="button"].btn-block {
3834
  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
3835
  }
3836
 
 
3837
  .custom-file-input:disabled ~ .custom-file-label {
3838
  background-color: #e9ecef;
3839
  }
@@ -3881,7 +4050,7 @@ input[type="button"].btn-block {
3881
 
3882
  .custom-range {
3883
  width: 100%;
3884
- height: calc(1rem + 0.4rem);
3885
  padding: 0;
3886
  background-color: transparent;
3887
  -webkit-appearance: none;
@@ -3916,6 +4085,7 @@ input[type="button"].btn-block {
3916
  background-color: #007bff;
3917
  border: 0;
3918
  border-radius: 1rem;
 
3919
  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
3920
  -webkit-appearance: none;
3921
  appearance: none;
@@ -3923,6 +4093,7 @@ input[type="button"].btn-block {
3923
 
3924
  @media (prefers-reduced-motion: reduce) {
3925
  .custom-range::-webkit-slider-thumb {
 
3926
  transition: none;
3927
  }
3928
  }
@@ -3947,6 +4118,7 @@ input[type="button"].btn-block {
3947
  background-color: #007bff;
3948
  border: 0;
3949
  border-radius: 1rem;
 
3950
  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
3951
  -moz-appearance: none;
3952
  appearance: none;
@@ -3954,6 +4126,7 @@ input[type="button"].btn-block {
3954
 
3955
  @media (prefers-reduced-motion: reduce) {
3956
  .custom-range::-moz-range-thumb {
 
3957
  transition: none;
3958
  }
3959
  }
@@ -3981,12 +4154,14 @@ input[type="button"].btn-block {
3981
  background-color: #007bff;
3982
  border: 0;
3983
  border-radius: 1rem;
 
3984
  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
3985
  appearance: none;
3986
  }
3987
 
3988
  @media (prefers-reduced-motion: reduce) {
3989
  .custom-range::-ms-thumb {
 
3990
  transition: none;
3991
  }
3992
  }
@@ -4157,8 +4332,8 @@ input[type="button"].btn-block {
4157
  padding: 0.5rem 1rem;
4158
  }
4159
 
4160
- .navbar > .container,
4161
- .navbar > .container-fluid {
4162
  display: -ms-flexbox;
4163
  display: flex;
4164
  -ms-flex-wrap: wrap;
@@ -4243,7 +4418,7 @@ input[type="button"].btn-block {
4243
 
4244
  @media (max-width: 575.98px) {
4245
  .navbar-expand-sm > .container,
4246
- .navbar-expand-sm > .container-fluid {
4247
  padding-right: 0;
4248
  padding-left: 0;
4249
  }
@@ -4268,7 +4443,7 @@ input[type="button"].btn-block {
4268
  padding-left: 0.5rem;
4269
  }
4270
  .navbar-expand-sm > .container,
4271
- .navbar-expand-sm > .container-fluid {
4272
  -ms-flex-wrap: nowrap;
4273
  flex-wrap: nowrap;
4274
  }
@@ -4285,7 +4460,7 @@ input[type="button"].btn-block {
4285
 
4286
  @media (max-width: 767.98px) {
4287
  .navbar-expand-md > .container,
4288
- .navbar-expand-md > .container-fluid {
4289
  padding-right: 0;
4290
  padding-left: 0;
4291
  }
@@ -4310,7 +4485,7 @@ input[type="button"].btn-block {
4310
  padding-left: 0.5rem;
4311
  }
4312
  .navbar-expand-md > .container,
4313
- .navbar-expand-md > .container-fluid {
4314
  -ms-flex-wrap: nowrap;
4315
  flex-wrap: nowrap;
4316
  }
@@ -4327,7 +4502,7 @@ input[type="button"].btn-block {
4327
 
4328
  @media (max-width: 991.98px) {
4329
  .navbar-expand-lg > .container,
4330
- .navbar-expand-lg > .container-fluid {
4331
  padding-right: 0;
4332
  padding-left: 0;
4333
  }
@@ -4352,7 +4527,7 @@ input[type="button"].btn-block {
4352
  padding-left: 0.5rem;
4353
  }
4354
  .navbar-expand-lg > .container,
4355
- .navbar-expand-lg > .container-fluid {
4356
  -ms-flex-wrap: nowrap;
4357
  flex-wrap: nowrap;
4358
  }
@@ -4369,7 +4544,7 @@ input[type="button"].btn-block {
4369
 
4370
  @media (max-width: 1199.98px) {
4371
  .navbar-expand-xl > .container,
4372
- .navbar-expand-xl > .container-fluid {
4373
  padding-right: 0;
4374
  padding-left: 0;
4375
  }
@@ -4394,7 +4569,7 @@ input[type="button"].btn-block {
4394
  padding-left: 0.5rem;
4395
  }
4396
  .navbar-expand-xl > .container,
4397
- .navbar-expand-xl > .container-fluid {
4398
  -ms-flex-wrap: nowrap;
4399
  flex-wrap: nowrap;
4400
  }
@@ -4417,7 +4592,7 @@ input[type="button"].btn-block {
4417
  }
4418
 
4419
  .navbar-expand > .container,
4420
- .navbar-expand > .container-fluid {
4421
  padding-right: 0;
4422
  padding-left: 0;
4423
  }
@@ -4437,7 +4612,7 @@ input[type="button"].btn-block {
4437
  }
4438
 
4439
  .navbar-expand > .container,
4440
- .navbar-expand > .container-fluid {
4441
  -ms-flex-wrap: nowrap;
4442
  flex-wrap: nowrap;
4443
  }
@@ -4486,7 +4661,7 @@ input[type="button"].btn-block {
4486
  }
4487
 
4488
  .navbar-light .navbar-toggler-icon {
4489
- background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");
4490
  }
4491
 
4492
  .navbar-light .navbar-text {
@@ -4534,7 +4709,7 @@ input[type="button"].btn-block {
4534
  }
4535
 
4536
  .navbar-dark .navbar-toggler-icon {
4537
- background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");
4538
  }
4539
 
4540
  .navbar-dark .navbar-text {
@@ -4581,6 +4756,7 @@ input[type="button"].btn-block {
4581
  .card-body {
4582
  -ms-flex: 1 1 auto;
4583
  flex: 1 1 auto;
 
4584
  padding: 1.25rem;
4585
  }
4586
 
@@ -4651,67 +4827,56 @@ input[type="button"].btn-block {
4651
  padding: 1.25rem;
4652
  }
4653
 
4654
- .card-img {
 
 
 
 
4655
  width: 100%;
4656
- border-radius: calc(0.25rem - 1px);
4657
  }
4658
 
 
4659
  .card-img-top {
4660
- width: 100%;
4661
  border-top-left-radius: calc(0.25rem - 1px);
4662
  border-top-right-radius: calc(0.25rem - 1px);
4663
  }
4664
 
 
4665
  .card-img-bottom {
4666
- width: 100%;
4667
  border-bottom-right-radius: calc(0.25rem - 1px);
4668
  border-bottom-left-radius: calc(0.25rem - 1px);
4669
  }
4670
 
4671
- .card-deck {
4672
- display: -ms-flexbox;
4673
- display: flex;
4674
- -ms-flex-direction: column;
4675
- flex-direction: column;
4676
- }
4677
-
4678
  .card-deck .card {
4679
  margin-bottom: 15px;
4680
  }
4681
 
4682
  @media (min-width: 576px) {
4683
  .card-deck {
 
 
4684
  -ms-flex-flow: row wrap;
4685
  flex-flow: row wrap;
4686
  margin-right: -15px;
4687
  margin-left: -15px;
4688
  }
4689
  .card-deck .card {
4690
- display: -ms-flexbox;
4691
- display: flex;
4692
  -ms-flex: 1 0 0%;
4693
  flex: 1 0 0%;
4694
- -ms-flex-direction: column;
4695
- flex-direction: column;
4696
  margin-right: 15px;
4697
  margin-bottom: 0;
4698
  margin-left: 15px;
4699
  }
4700
  }
4701
 
4702
- .card-group {
4703
- display: -ms-flexbox;
4704
- display: flex;
4705
- -ms-flex-direction: column;
4706
- flex-direction: column;
4707
- }
4708
-
4709
  .card-group > .card {
4710
  margin-bottom: 15px;
4711
  }
4712
 
4713
  @media (min-width: 576px) {
4714
  .card-group {
 
 
4715
  -ms-flex-flow: row wrap;
4716
  flex-flow: row wrap;
4717
  }
@@ -4775,27 +4940,19 @@ input[type="button"].btn-block {
4775
  overflow: hidden;
4776
  }
4777
 
4778
- .accordion > .card:not(:first-of-type) .card-header:first-child {
4779
- border-radius: 0;
4780
- }
4781
-
4782
- .accordion > .card:not(:first-of-type):not(:last-of-type) {
4783
- border-bottom: 0;
4784
- border-radius: 0;
4785
- }
4786
-
4787
- .accordion > .card:first-of-type {
4788
  border-bottom: 0;
4789
  border-bottom-right-radius: 0;
4790
  border-bottom-left-radius: 0;
4791
  }
4792
 
4793
- .accordion > .card:last-of-type {
4794
  border-top-left-radius: 0;
4795
  border-top-right-radius: 0;
4796
  }
4797
 
4798
- .accordion > .card .card-header {
 
4799
  margin-bottom: -1px;
4800
  }
4801
 
@@ -4862,7 +5019,7 @@ input[type="button"].btn-block {
4862
  }
4863
 
4864
  .page-link:focus {
4865
- z-index: 2;
4866
  outline: 0;
4867
  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
4868
  }
@@ -4879,7 +5036,7 @@ input[type="button"].btn-block {
4879
  }
4880
 
4881
  .page-item.active .page-link {
4882
- z-index: 1;
4883
  color: #fff;
4884
  background-color: #007bff;
4885
  border-color: #007bff;
@@ -5277,6 +5434,7 @@ a.badge-dark:focus, a.badge-dark.focus {
5277
  flex-direction: column;
5278
  -ms-flex-pack: center;
5279
  justify-content: center;
 
5280
  color: #fff;
5281
  text-align: center;
5282
  white-space: nowrap;
@@ -5350,7 +5508,6 @@ a.badge-dark:focus, a.badge-dark.focus {
5350
  position: relative;
5351
  display: block;
5352
  padding: 0.75rem 1.25rem;
5353
- margin-bottom: -1px;
5354
  background-color: #fff;
5355
  border: 1px solid rgba(0, 0, 0, 0.125);
5356
  }
@@ -5361,7 +5518,6 @@ a.badge-dark:focus, a.badge-dark.focus {
5361
  }
5362
 
5363
  .list-group-item:last-child {
5364
- margin-bottom: 0;
5365
  border-bottom-right-radius: 0.25rem;
5366
  border-bottom-left-radius: 0.25rem;
5367
  }
@@ -5379,49 +5535,68 @@ a.badge-dark:focus, a.badge-dark.focus {
5379
  border-color: #007bff;
5380
  }
5381
 
 
 
 
 
 
 
 
 
 
5382
  .list-group-horizontal {
5383
  -ms-flex-direction: row;
5384
  flex-direction: row;
5385
  }
5386
 
5387
- .list-group-horizontal .list-group-item {
5388
- margin-right: -1px;
5389
- margin-bottom: 0;
5390
- }
5391
-
5392
  .list-group-horizontal .list-group-item:first-child {
5393
- border-top-left-radius: 0.25rem;
5394
  border-bottom-left-radius: 0.25rem;
5395
  border-top-right-radius: 0;
5396
  }
5397
 
5398
  .list-group-horizontal .list-group-item:last-child {
5399
- margin-right: 0;
5400
  border-top-right-radius: 0.25rem;
5401
- border-bottom-right-radius: 0.25rem;
5402
  border-bottom-left-radius: 0;
5403
  }
5404
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5405
  @media (min-width: 576px) {
5406
  .list-group-horizontal-sm {
5407
  -ms-flex-direction: row;
5408
  flex-direction: row;
5409
  }
5410
- .list-group-horizontal-sm .list-group-item {
5411
- margin-right: -1px;
5412
- margin-bottom: 0;
5413
- }
5414
  .list-group-horizontal-sm .list-group-item:first-child {
5415
- border-top-left-radius: 0.25rem;
5416
  border-bottom-left-radius: 0.25rem;
5417
  border-top-right-radius: 0;
5418
  }
5419
  .list-group-horizontal-sm .list-group-item:last-child {
5420
- margin-right: 0;
5421
  border-top-right-radius: 0.25rem;
5422
- border-bottom-right-radius: 0.25rem;
5423
  border-bottom-left-radius: 0;
5424
  }
 
 
 
 
 
 
 
 
 
 
 
5425
  }
5426
 
5427
  @media (min-width: 768px) {
@@ -5429,21 +5604,25 @@ a.badge-dark:focus, a.badge-dark.focus {
5429
  -ms-flex-direction: row;
5430
  flex-direction: row;
5431
  }
5432
- .list-group-horizontal-md .list-group-item {
5433
- margin-right: -1px;
5434
- margin-bottom: 0;
5435
- }
5436
  .list-group-horizontal-md .list-group-item:first-child {
5437
- border-top-left-radius: 0.25rem;
5438
  border-bottom-left-radius: 0.25rem;
5439
  border-top-right-radius: 0;
5440
  }
5441
  .list-group-horizontal-md .list-group-item:last-child {
5442
- margin-right: 0;
5443
  border-top-right-radius: 0.25rem;
5444
- border-bottom-right-radius: 0.25rem;
5445
  border-bottom-left-radius: 0;
5446
  }
 
 
 
 
 
 
 
 
 
 
 
5447
  }
5448
 
5449
  @media (min-width: 992px) {
@@ -5451,21 +5630,25 @@ a.badge-dark:focus, a.badge-dark.focus {
5451
  -ms-flex-direction: row;
5452
  flex-direction: row;
5453
  }
5454
- .list-group-horizontal-lg .list-group-item {
5455
- margin-right: -1px;
5456
- margin-bottom: 0;
5457
- }
5458
  .list-group-horizontal-lg .list-group-item:first-child {
5459
- border-top-left-radius: 0.25rem;
5460
  border-bottom-left-radius: 0.25rem;
5461
  border-top-right-radius: 0;
5462
  }
5463
  .list-group-horizontal-lg .list-group-item:last-child {
5464
- margin-right: 0;
5465
  border-top-right-radius: 0.25rem;
5466
- border-bottom-right-radius: 0.25rem;
5467
  border-bottom-left-radius: 0;
5468
  }
 
 
 
 
 
 
 
 
 
 
 
5469
  }
5470
 
5471
  @media (min-width: 1200px) {
@@ -5473,40 +5656,39 @@ a.badge-dark:focus, a.badge-dark.focus {
5473
  -ms-flex-direction: row;
5474
  flex-direction: row;
5475
  }
5476
- .list-group-horizontal-xl .list-group-item {
5477
- margin-right: -1px;
5478
- margin-bottom: 0;
5479
- }
5480
  .list-group-horizontal-xl .list-group-item:first-child {
5481
- border-top-left-radius: 0.25rem;
5482
  border-bottom-left-radius: 0.25rem;
5483
  border-top-right-radius: 0;
5484
  }
5485
  .list-group-horizontal-xl .list-group-item:last-child {
5486
- margin-right: 0;
5487
  border-top-right-radius: 0.25rem;
5488
- border-bottom-right-radius: 0.25rem;
5489
  border-bottom-left-radius: 0;
5490
  }
 
 
 
 
 
 
 
 
 
 
 
5491
  }
5492
 
5493
  .list-group-flush .list-group-item {
5494
- border-right: 0;
5495
- border-left: 0;
5496
  border-radius: 0;
5497
  }
5498
 
5499
- .list-group-flush .list-group-item:last-child {
5500
- margin-bottom: -1px;
5501
- }
5502
-
5503
- .list-group-flush:first-child .list-group-item:first-child {
5504
- border-top: 0;
5505
  }
5506
 
5507
  .list-group-flush:last-child .list-group-item:last-child {
5508
- margin-bottom: 0;
5509
- border-bottom: 0;
5510
  }
5511
 
5512
  .list-group-item-primary {
@@ -5763,6 +5945,11 @@ a.close.disabled {
5763
  transform: none;
5764
  }
5765
 
 
 
 
 
 
5766
  .modal-dialog-scrollable {
5767
  display: -ms-flexbox;
5768
  display: flex;
@@ -5856,8 +6043,8 @@ a.close.disabled {
5856
  justify-content: space-between;
5857
  padding: 1rem 1rem;
5858
  border-bottom: 1px solid #dee2e6;
5859
- border-top-left-radius: 0.3rem;
5860
- border-top-right-radius: 0.3rem;
5861
  }
5862
 
5863
  .modal-header .close {
@@ -5880,22 +6067,20 @@ a.close.disabled {
5880
  .modal-footer {
5881
  display: -ms-flexbox;
5882
  display: flex;
 
 
5883
  -ms-flex-align: center;
5884
  align-items: center;
5885
  -ms-flex-pack: end;
5886
  justify-content: flex-end;
5887
- padding: 1rem;
5888
  border-top: 1px solid #dee2e6;
5889
- border-bottom-right-radius: 0.3rem;
5890
- border-bottom-left-radius: 0.3rem;
5891
- }
5892
-
5893
- .modal-footer > :not(:first-child) {
5894
- margin-left: .25rem;
5895
  }
5896
 
5897
- .modal-footer > :not(:last-child) {
5898
- margin-right: .25rem;
5899
  }
5900
 
5901
  .modal-scrollbar-measure {
@@ -6102,7 +6287,7 @@ a.close.disabled {
6102
  }
6103
 
6104
  .bs-popover-top > .arrow, .bs-popover-auto[x-placement^="top"] > .arrow {
6105
- bottom: calc((0.5rem + 1px) * -1);
6106
  }
6107
 
6108
  .bs-popover-top > .arrow::before, .bs-popover-auto[x-placement^="top"] > .arrow::before {
@@ -6122,7 +6307,7 @@ a.close.disabled {
6122
  }
6123
 
6124
  .bs-popover-right > .arrow, .bs-popover-auto[x-placement^="right"] > .arrow {
6125
- left: calc((0.5rem + 1px) * -1);
6126
  width: 0.5rem;
6127
  height: 1rem;
6128
  margin: 0.3rem 0;
@@ -6145,7 +6330,7 @@ a.close.disabled {
6145
  }
6146
 
6147
  .bs-popover-bottom > .arrow, .bs-popover-auto[x-placement^="bottom"] > .arrow {
6148
- top: calc((0.5rem + 1px) * -1);
6149
  }
6150
 
6151
  .bs-popover-bottom > .arrow::before, .bs-popover-auto[x-placement^="bottom"] > .arrow::before {
@@ -6176,7 +6361,7 @@ a.close.disabled {
6176
  }
6177
 
6178
  .bs-popover-left > .arrow, .bs-popover-auto[x-placement^="left"] > .arrow {
6179
- right: calc((0.5rem + 1px) * -1);
6180
  width: 0.5rem;
6181
  height: 1rem;
6182
  margin: 0.3rem 0;
@@ -6289,7 +6474,7 @@ a.close.disabled {
6289
  .carousel-fade .active.carousel-item-right {
6290
  z-index: 0;
6291
  opacity: 0;
6292
- transition: 0s 0.6s opacity;
6293
  }
6294
 
6295
  @media (prefers-reduced-motion: reduce) {
@@ -6351,11 +6536,11 @@ a.close.disabled {
6351
  }
6352
 
6353
  .carousel-control-prev-icon {
6354
- background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e");
6355
  }
6356
 
6357
  .carousel-control-next-icon {
6358
- background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e");
6359
  }
6360
 
6361
  .carousel-indicators {
@@ -7807,6 +7992,7 @@ button.bg-dark:focus {
7807
  width: 1px;
7808
  height: 1px;
7809
  padding: 0;
 
7810
  overflow: hidden;
7811
  clip: rect(0, 0, 0, 0);
7812
  white-space: nowrap;
1
  /*!
2
+ * Bootstrap v4.4.1 (https://getbootstrap.com/)
3
  * Copyright 2011-2019 The Bootstrap Authors
4
  * Copyright 2011-2019 Twitter, Inc.
5
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
63
  background-color: #fff;
64
  }
65
 
66
+ [tabindex="-1"]:focus:not(:focus-visible) {
67
  outline: 0 !important;
68
  }
69
 
163
  text-decoration: underline;
164
  }
165
 
166
+ a:not([href]) {
167
  color: inherit;
168
  text-decoration: none;
169
  }
170
 
171
+ a:not([href]):hover {
172
  color: inherit;
173
  text-decoration: none;
174
  }
175
 
 
 
 
 
176
  pre,
177
  code,
178
  kbd,
503
  code {
504
  font-size: 87.5%;
505
  color: #e83e8c;
506
+ word-wrap: break-word;
507
  }
508
 
509
  a > code {
573
  }
574
  }
575
 
576
+ .container-fluid, .container-sm, .container-md, .container-lg, .container-xl {
577
  width: 100%;
578
  padding-right: 15px;
579
  padding-left: 15px;
581
  margin-left: auto;
582
  }
583
 
584
+ @media (min-width: 576px) {
585
+ .container, .container-sm {
586
+ max-width: 540px;
587
+ }
588
+ }
589
+
590
+ @media (min-width: 768px) {
591
+ .container, .container-sm, .container-md {
592
+ max-width: 720px;
593
+ }
594
+ }
595
+
596
+ @media (min-width: 992px) {
597
+ .container, .container-sm, .container-md, .container-lg {
598
+ max-width: 960px;
599
+ }
600
+ }
601
+
602
+ @media (min-width: 1200px) {
603
+ .container, .container-sm, .container-md, .container-lg, .container-xl {
604
+ max-width: 1140px;
605
+ }
606
+ }
607
+
608
  .row {
609
  display: -ms-flexbox;
610
  display: flex;
645
  max-width: 100%;
646
  }
647
 
648
+ .row-cols-1 > * {
649
+ -ms-flex: 0 0 100%;
650
+ flex: 0 0 100%;
651
+ max-width: 100%;
652
+ }
653
+
654
+ .row-cols-2 > * {
655
+ -ms-flex: 0 0 50%;
656
+ flex: 0 0 50%;
657
+ max-width: 50%;
658
+ }
659
+
660
+ .row-cols-3 > * {
661
+ -ms-flex: 0 0 33.333333%;
662
+ flex: 0 0 33.333333%;
663
+ max-width: 33.333333%;
664
+ }
665
+
666
+ .row-cols-4 > * {
667
+ -ms-flex: 0 0 25%;
668
+ flex: 0 0 25%;
669
+ max-width: 25%;
670
+ }
671
+
672
+ .row-cols-5 > * {
673
+ -ms-flex: 0 0 20%;
674
+ flex: 0 0 20%;
675
+ max-width: 20%;
676
+ }
677
+
678
+ .row-cols-6 > * {
679
+ -ms-flex: 0 0 16.666667%;
680
+ flex: 0 0 16.666667%;
681
+ max-width: 16.666667%;
682
+ }
683
+
684
  .col-auto {
685
  -ms-flex: 0 0 auto;
686
  flex: 0 0 auto;
887
  flex-grow: 1;
888
  max-width: 100%;
889
  }
890
+ .row-cols-sm-1 > * {
891
+ -ms-flex: 0 0 100%;
892
+ flex: 0 0 100%;
893
+ max-width: 100%;
894
+ }
895
+ .row-cols-sm-2 > * {
896
+ -ms-flex: 0 0 50%;
897
+ flex: 0 0 50%;
898
+ max-width: 50%;
899
+ }
900
+ .row-cols-sm-3 > * {
901
+ -ms-flex: 0 0 33.333333%;
902
+ flex: 0 0 33.333333%;
903
+ max-width: 33.333333%;
904
+ }
905
+ .row-cols-sm-4 > * {
906
+ -ms-flex: 0 0 25%;
907
+ flex: 0 0 25%;
908
+ max-width: 25%;
909
+ }
910
+ .row-cols-sm-5 > * {
911
+ -ms-flex: 0 0 20%;
912
+ flex: 0 0 20%;
913
+ max-width: 20%;
914
+ }
915
+ .row-cols-sm-6 > * {
916
+ -ms-flex: 0 0 16.666667%;
917
+ flex: 0 0 16.666667%;
918
+ max-width: 16.666667%;
919
+ }
920
  .col-sm-auto {
921
  -ms-flex: 0 0 auto;
922
  flex: 0 0 auto;
1089
  flex-grow: 1;
1090
  max-width: 100%;
1091
  }
1092
+ .row-cols-md-1 > * {
1093
+ -ms-flex: 0 0 100%;
1094
+ flex: 0 0 100%;
1095
+ max-width: 100%;
1096
+ }
1097
+ .row-cols-md-2 > * {
1098
+ -ms-flex: 0 0 50%;
1099
+ flex: 0 0 50%;
1100
+ max-width: 50%;
1101
+ }
1102
+ .row-cols-md-3 > * {
1103
+ -ms-flex: 0 0 33.333333%;
1104
+ flex: 0 0 33.333333%;
1105
+ max-width: 33.333333%;
1106
+ }
1107
+ .row-cols-md-4 > * {
1108
+ -ms-flex: 0 0 25%;
1109
+ flex: 0 0 25%;
1110
+ max-width: 25%;
1111
+ }
1112
+ .row-cols-md-5 > * {
1113
+ -ms-flex: 0 0 20%;
1114
+ flex: 0 0 20%;
1115
+ max-width: 20%;
1116
+ }
1117
+ .row-cols-md-6 > * {
1118
+ -ms-flex: 0 0 16.666667%;
1119
+ flex: 0 0 16.666667%;
1120
+ max-width: 16.666667%;
1121
+ }
1122
  .col-md-auto {
1123
  -ms-flex: 0 0 auto;
1124
  flex: 0 0 auto;
1291
  flex-grow: 1;
1292
  max-width: 100%;
1293
  }
1294
+ .row-cols-lg-1 > * {
1295
+ -ms-flex: 0 0 100%;
1296
+ flex: 0 0 100%;
1297
+ max-width: 100%;
1298
+ }
1299
+ .row-cols-lg-2 > * {
1300
+ -ms-flex: 0 0 50%;
1301
+ flex: 0 0 50%;
1302
+ max-width: 50%;
1303
+ }
1304
+ .row-cols-lg-3 > * {
1305
+ -ms-flex: 0 0 33.333333%;
1306
+ flex: 0 0 33.333333%;
1307
+ max-width: 33.333333%;
1308
+ }
1309
+ .row-cols-lg-4 > * {
1310
+ -ms-flex: 0 0 25%;
1311
+ flex: 0 0 25%;
1312
+ max-width: 25%;
1313
+ }
1314
+ .row-cols-lg-5 > * {
1315
+ -ms-flex: 0 0 20%;
1316
+ flex: 0 0 20%;
1317
+ max-width: 20%;
1318
+ }
1319
+ .row-cols-lg-6 > * {
1320
+ -ms-flex: 0 0 16.666667%;
1321
+ flex: 0 0 16.666667%;
1322
+ max-width: 16.666667%;
1323
+ }
1324
  .col-lg-auto {
1325
  -ms-flex: 0 0 auto;
1326
  flex: 0 0 auto;
1493
  flex-grow: 1;
1494
  max-width: 100%;
1495
  }
1496
+ .row-cols-xl-1 > * {
1497
+ -ms-flex: 0 0 100%;
1498
+ flex: 0 0 100%;
1499
+ max-width: 100%;
1500
+ }
1501
+ .row-cols-xl-2 > * {
1502
+ -ms-flex: 0 0 50%;
1503
+ flex: 0 0 50%;
1504
+ max-width: 50%;
1505
+ }
1506
+ .row-cols-xl-3 > * {
1507
+ -ms-flex: 0 0 33.333333%;
1508
+ flex: 0 0 33.333333%;
1509
+ max-width: 33.333333%;
1510
+ }
1511
+ .row-cols-xl-4 > * {
1512
+ -ms-flex: 0 0 25%;
1513
+ flex: 0 0 25%;
1514
+ max-width: 25%;
1515
+ }
1516
+ .row-cols-xl-5 > * {
1517
+ -ms-flex: 0 0 20%;
1518
+ flex: 0 0 20%;
1519
+ max-width: 20%;
1520
+ }
1521
+ .row-cols-xl-6 > * {
1522
+ -ms-flex: 0 0 16.666667%;
1523
+ flex: 0 0 16.666667%;
1524
+ max-width: 16.666667%;
1525
+ }
1526
  .col-xl-auto {
1527
  -ms-flex: 0 0 auto;
1528
  flex: 0 0 auto;
2057
  border: 0;
2058
  }
2059
 
2060
+ .form-control:-moz-focusring {
2061
+ color: transparent;
2062
+ text-shadow: 0 0 0 #495057;
2063
+ }
2064
+
2065
  .form-control:focus {
2066
  color: #495057;
2067
  background-color: #fff;
2136
  .form-control-plaintext {
2137
  display: block;
2138
  width: 100%;
2139
+ padding: 0.375rem 0;
 
2140
  margin-bottom: 0;
2141
+ font-size: 1rem;
2142
  line-height: 1.5;
2143
  color: #212529;
2144
  background-color: transparent;
2211
  margin-left: -1.25rem;
2212
  }
2213
 
2214
+ .form-check-input[disabled] ~ .form-check-label,
2215
  .form-check-input:disabled ~ .form-check-label {
2216
  color: #6c757d;
2217
  }
2259
  border-radius: 0.25rem;
2260
  }
2261
 
2262
+ .was-validated :valid ~ .valid-feedback,
2263
+ .was-validated :valid ~ .valid-tooltip,
2264
+ .is-valid ~ .valid-feedback,
2265
+ .is-valid ~ .valid-tooltip {
2266
+ display: block;
2267
+ }
2268
+
2269
  .was-validated .form-control:valid, .form-control.is-valid {
2270
  border-color: #28a745;
2271
  padding-right: calc(1.5em + 0.75rem);
2272
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");
2273
  background-repeat: no-repeat;
2274
+ background-position: right calc(0.375em + 0.1875rem) center;
2275
  background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
2276
  }
2277
 
2280
  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);
2281
  }
2282
 
 
 
 
 
 
 
2283
  .was-validated textarea.form-control:valid, textarea.form-control.is-valid {
2284
  padding-right: calc(1.5em + 0.75rem);
2285
  background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);
2287
 
2288
  .was-validated .custom-select:valid, .custom-select.is-valid {
2289
  border-color: #28a745;
2290
+ padding-right: calc(0.75em + 2.3125rem);
2291
+ background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
2292
  }
2293
 
2294
  .was-validated .custom-select:valid:focus, .custom-select.is-valid:focus {
2296
  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);
2297
  }
2298
 
 
 
 
 
 
 
 
 
 
 
 
 
2299
  .was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label {
2300
  color: #28a745;
2301
  }
2314
  border-color: #28a745;
2315
  }
2316
 
 
 
 
 
 
 
2317
  .was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before {
2318
  border-color: #34ce57;
2319
  background-color: #34ce57;
2331
  border-color: #28a745;
2332
  }
2333
 
 
 
 
 
 
 
2334
  .was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label {
2335
  border-color: #28a745;
2336
  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);
2359
  border-radius: 0.25rem;
2360
  }
2361
 
2362
+ .was-validated :invalid ~ .invalid-feedback,
2363
+ .was-validated :invalid ~ .invalid-tooltip,
2364
+ .is-invalid ~ .invalid-feedback,
2365
+ .is-invalid ~ .invalid-tooltip {
2366
+ display: block;
2367
+ }
2368
+
2369
  .was-validated .form-control:invalid, .form-control.is-invalid {
2370
  border-color: #dc3545;
2371
  padding-right: calc(1.5em + 0.75rem);
2372
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");
2373
  background-repeat: no-repeat;
2374
+ background-position: right calc(0.375em + 0.1875rem) center;
2375
  background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
2376
  }
2377
 
2380
  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);
2381
  }
2382
 
 
 
 
 
 
 
2383
  .was-validated textarea.form-control:invalid, textarea.form-control.is-invalid {
2384
  padding-right: calc(1.5em + 0.75rem);
2385
  background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);
2387
 
2388
  .was-validated .custom-select:invalid, .custom-select.is-invalid {
2389
  border-color: #dc3545;
2390
+ padding-right: calc(0.75em + 2.3125rem);
2391
+ background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
2392
  }
2393
 
2394
  .was-validated .custom-select:invalid:focus, .custom-select.is-invalid:focus {
2396
  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);
2397
  }
2398
 
 
 
 
 
 
 
 
 
 
 
 
 
2399
  .was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label {
2400
  color: #dc3545;
2401
  }
2414
  border-color: #dc3545;
2415
  }
2416
 
 
 
 
 
 
 
2417
  .was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before {
2418
  border-color: #e4606d;
2419
  background-color: #e4606d;
2431
  border-color: #dc3545;
2432
  }
2433
 
 
 
 
 
 
 
2434
  .was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label {
2435
  border-color: #dc3545;
2436
  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);
2517
  color: #212529;
2518
  text-align: center;
2519
  vertical-align: middle;
2520
+ cursor: pointer;
2521
  -webkit-user-select: none;
2522
  -moz-user-select: none;
2523
  -ms-user-select: none;
2569
  }
2570
 
2571
  .btn-primary:focus, .btn-primary.focus {
2572
+ color: #fff;
2573
+ background-color: #0069d9;
2574
+ border-color: #0062cc;
2575
  box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5);
2576
  }
2577
 
2606
  }
2607
 
2608
  .btn-secondary:focus, .btn-secondary.focus {
2609
+ color: #fff;
2610
+ background-color: #5a6268;
2611
+ border-color: #545b62;
2612
  box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5);
2613
  }
2614
 
2643
  }
2644
 
2645
  .btn-success:focus, .btn-success.focus {
2646
+ color: #fff;
2647
+ background-color: #218838;
2648
+ border-color: #1e7e34;
2649
  box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5);
2650
  }
2651
 
2680
  }
2681
 
2682
  .btn-info:focus, .btn-info.focus {
2683
+ color: #fff;
2684
+ background-color: #138496;
2685
+ border-color: #117a8b;
2686
  box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5);
2687
  }
2688
 
2717
  }
2718
 
2719
  .btn-warning:focus, .btn-warning.focus {
2720
+ color: #212529;
2721
+ background-color: #e0a800;
2722
+ border-color: #d39e00;
2723
  box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5);
2724
  }
2725
 
2754
  }
2755
 
2756
  .btn-danger:focus, .btn-danger.focus {
2757
+ color: #fff;
2758
+ background-color: #c82333;
2759
+ border-color: #bd2130;
2760
  box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5);
2761
  }
2762
 
2791
  }
2792
 
2793
  .btn-light:focus, .btn-light.focus {
2794
+ color: #212529;
2795
+ background-color: #e2e6ea;
2796
+ border-color: #dae0e5;
2797
  box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5);
2798
  }
2799
 
2828
  }
2829
 
2830
  .btn-dark:focus, .btn-dark.focus {
2831
+ color: #fff;
2832
+ background-color: #23272b;
2833
+ border-color: #1d2124;
2834
  box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5);
2835
  }
2836
 
3580
  .input-group > .custom-select,
3581
  .input-group > .custom-file {
3582
  position: relative;
3583
+ -ms-flex: 1 1 0%;
3584
+ flex: 1 1 0%;
3585
+ min-width: 0;
3586
  margin-bottom: 0;
3587
  }
3588
 
3774
 
3775
  .custom-control-input {
3776
  position: absolute;
3777
+ left: 0;
3778
  z-index: -1;
3779
+ width: 1rem;
3780
+ height: 1.25rem;
3781
  opacity: 0;
3782
  }
3783
 
3801
  border-color: #b3d7ff;
3802
  }
3803
 
3804
+ .custom-control-input[disabled] ~ .custom-control-label, .custom-control-input:disabled ~ .custom-control-label {
3805
  color: #6c757d;
3806
  }
3807
 
3808
+ .custom-control-input[disabled] ~ .custom-control-label::before, .custom-control-input:disabled ~ .custom-control-label::before {
3809
  background-color: #e9ecef;
3810
  }
3811
 
3844
  }
3845
 
3846
  .custom-checkbox .custom-control-input:checked ~ .custom-control-label::after {
3847
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3e%3c/svg%3e");
3848
  }
3849
 
3850
  .custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before {
3853
  }
3854
 
3855
  .custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after {
3856
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e");
3857
  }
3858
 
3859
  .custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before {
3869
  }
3870
 
3871
  .custom-radio .custom-control-input:checked ~ .custom-control-label::after {
3872
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e");
3873
  }
3874
 
3875
  .custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before {
3925
  line-height: 1.5;
3926
  color: #495057;
3927
  vertical-align: middle;
3928
+ background: #fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px;
 
3929
  border: 1px solid #ced4da;
3930
  border-radius: 0.25rem;
3931
  -webkit-appearance: none;
3959
  display: none;
3960
  }
3961
 
3962
+ .custom-select:-moz-focusring {
3963
+ color: transparent;
3964
+ text-shadow: 0 0 0 #495057;
3965
+ }
3966
+
3967
  .custom-select-sm {
3968
  height: calc(1.5em + 0.5rem + 2px);
3969
  padding-top: 0.25rem;
4002
  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
4003
  }
4004
 
4005
+ .custom-file-input[disabled] ~ .custom-file-label,
4006
  .custom-file-input:disabled ~ .custom-file-label {
4007
  background-color: #e9ecef;
4008
  }
4050
 
4051
  .custom-range {
4052
  width: 100%;
4053
+ height: 1.4rem;
4054
  padding: 0;
4055
  background-color: transparent;
4056
  -webkit-appearance: none;
4085
  background-color: #007bff;
4086
  border: 0;
4087
  border-radius: 1rem;
4088
+ -webkit-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
4089
  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
4090
  -webkit-appearance: none;
4091
  appearance: none;
4093
 
4094
  @media (prefers-reduced-motion: reduce) {
4095
  .custom-range::-webkit-slider-thumb {
4096
+ -webkit-transition: none;
4097
  transition: none;
4098
  }
4099
  }
4118
  background-color: #007bff;
4119
  border: 0;
4120
  border-radius: 1rem;
4121
+ -moz-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
4122
  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
4123
  -moz-appearance: none;
4124
  appearance: none;
4126
 
4127
  @media (prefers-reduced-motion: reduce) {
4128
  .custom-range::-moz-range-thumb {
4129
+ -moz-transition: none;
4130
  transition: none;
4131
  }
4132
  }
4154
  background-color: #007bff;
4155
  border: 0;
4156
  border-radius: 1rem;
4157
+ -ms-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
4158
  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
4159
  appearance: none;
4160
  }
4161
 
4162
  @media (prefers-reduced-motion: reduce) {
4163
  .custom-range::-ms-thumb {
4164
+ -ms-transition: none;
4165
  transition: none;
4166
  }
4167
  }
4332
  padding: 0.5rem 1rem;
4333
  }
4334
 
4335
+ .navbar .container,
4336
+ .navbar .container-fluid, .navbar .container-sm, .navbar .container-md, .navbar .container-lg, .navbar .container-xl {
4337
  display: -ms-flexbox;
4338
  display: flex;
4339
  -ms-flex-wrap: wrap;
4418
 
4419
  @media (max-width: 575.98px) {
4420
  .navbar-expand-sm > .container,
4421
+ .navbar-expand-sm > .container-fluid, .navbar-expand-sm > .container-sm, .navbar-expand-sm > .container-md, .navbar-expand-sm > .container-lg, .navbar-expand-sm > .container-xl {
4422
  padding-right: 0;
4423
  padding-left: 0;
4424
  }
4443
  padding-left: 0.5rem;
4444
  }
4445
  .navbar-expand-sm > .container,
4446
+ .navbar-expand-sm > .container-fluid, .navbar-expand-sm > .container-sm, .navbar-expand-sm > .container-md, .navbar-expand-sm > .container-lg, .navbar-expand-sm > .container-xl {
4447
  -ms-flex-wrap: nowrap;
4448
  flex-wrap: nowrap;
4449
  }
4460
 
4461
  @media (max-width: 767.98px) {
4462
  .navbar-expand-md > .container,
4463
+ .navbar-expand-md > .container-fluid, .navbar-expand-md > .container-sm, .navbar-expand-md > .container-md, .navbar-expand-md > .container-lg, .navbar-expand-md > .container-xl {
4464
  padding-right: 0;
4465
  padding-left: 0;
4466
  }
4485
  padding-left: 0.5rem;
4486
  }
4487
  .navbar-expand-md > .container,
4488
+ .navbar-expand-md > .container-fluid, .navbar-expand-md > .container-sm, .navbar-expand-md > .container-md, .navbar-expand-md > .container-lg, .navbar-expand-md > .container-xl {
4489
  -ms-flex-wrap: nowrap;
4490
  flex-wrap: nowrap;
4491
  }
4502
 
4503
  @media (max-width: 991.98px) {
4504
  .navbar-expand-lg > .container,
4505
+ .navbar-expand-lg > .container-fluid, .navbar-expand-lg > .container-sm, .navbar-expand-lg > .container-md, .navbar-expand-lg > .container-lg, .navbar-expand-lg > .container-xl {
4506
  padding-right: 0;
4507
  padding-left: 0;
4508
  }
4527
  padding-left: 0.5rem;
4528
  }
4529
  .navbar-expand-lg > .container,
4530
+ .navbar-expand-lg > .container-fluid, .navbar-expand-lg > .container-sm, .navbar-expand-lg > .container-md, .navbar-expand-lg > .container-lg, .navbar-expand-lg > .container-xl {
4531
  -ms-flex-wrap: nowrap;
4532
  flex-wrap: nowrap;
4533
  }
4544
 
4545
  @media (max-width: 1199.98px) {
4546
  .navbar-expand-xl > .container,
4547
+ .navbar-expand-xl > .container-fluid, .navbar-expand-xl > .container-sm, .navbar-expand-xl > .container-md, .navbar-expand-xl > .container-lg, .navbar-expand-xl > .container-xl {
4548
  padding-right: 0;
4549
  padding-left: 0;
4550
  }
4569
  padding-left: 0.5rem;
4570
  }
4571
  .navbar-expand-xl > .container,
4572
+ .navbar-expand-xl > .container-fluid, .navbar-expand-xl > .container-sm, .navbar-expand-xl > .container-md, .navbar-expand-xl > .container-lg, .navbar-expand-xl > .container-xl {
4573
  -ms-flex-wrap: nowrap;
4574
  flex-wrap: nowrap;
4575
  }
4592
  }
4593
 
4594
  .navbar-expand > .container,
4595
+ .navbar-expand > .container-fluid, .navbar-expand > .container-sm, .navbar-expand > .container-md, .navbar-expand > .container-lg, .navbar-expand > .container-xl {
4596
  padding-right: 0;
4597
  padding-left: 0;
4598
  }
4612
  }
4613
 
4614
  .navbar-expand > .container,
4615
+ .navbar-expand > .container-fluid, .navbar-expand > .container-sm, .navbar-expand > .container-md, .navbar-expand > .container-lg, .navbar-expand > .container-xl {
4616
  -ms-flex-wrap: nowrap;
4617
  flex-wrap: nowrap;
4618
  }
4661
  }
4662
 
4663
  .navbar-light .navbar-toggler-icon {
4664
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");
4665
  }
4666
 
4667
  .navbar-light .navbar-text {
4709
  }
4710
 
4711
  .navbar-dark .navbar-toggler-icon {
4712
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba(255, 255, 255, 0.5)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");
4713
  }
4714
 
4715
  .navbar-dark .navbar-text {
4756
  .card-body {
4757
  -ms-flex: 1 1 auto;
4758
  flex: 1 1 auto;
4759
+ min-height: 1px;
4760
  padding: 1.25rem;
4761
  }
4762
 
4827
  padding: 1.25rem;
4828
  }
4829
 
4830
+ .card-img,
4831
+ .card-img-top,
4832
+ .card-img-bottom {
4833
+ -ms-flex-negative: 0;
4834
+ flex-shrink: 0;
4835
  width: 100%;
 
4836
  }
4837
 
4838
+ .card-img,
4839
  .card-img-top {
 
4840
  border-top-left-radius: calc(0.25rem - 1px);
4841
  border-top-right-radius: calc(0.25rem - 1px);
4842
  }
4843
 
4844
+ .card-img,
4845
  .card-img-bottom {
 
4846
  border-bottom-right-radius: calc(0.25rem - 1px);
4847
  border-bottom-left-radius: calc(0.25rem - 1px);
4848
  }
4849
 
 
 
 
 
 
 
 
4850
  .card-deck .card {
4851
  margin-bottom: 15px;
4852
  }
4853
 
4854
  @media (min-width: 576px) {
4855
  .card-deck {
4856
+ display: -ms-flexbox;
4857
+ display: flex;
4858
  -ms-flex-flow: row wrap;
4859
  flex-flow: row wrap;
4860
  margin-right: -15px;
4861
  margin-left: -15px;
4862
  }
4863
  .card-deck .card {
 
 
4864
  -ms-flex: 1 0 0%;
4865
  flex: 1 0 0%;
 
 
4866
  margin-right: 15px;
4867
  margin-bottom: 0;
4868
  margin-left: 15px;
4869
  }
4870
  }
4871
 
 
 
 
 
 
 
 
4872
  .card-group > .card {
4873
  margin-bottom: 15px;
4874
  }
4875
 
4876
  @media (min-width: 576px) {
4877
  .card-group {
4878
+ display: -ms-flexbox;
4879
+ display: flex;
4880
  -ms-flex-flow: row wrap;
4881
  flex-flow: row wrap;
4882
  }
4940
  overflow: hidden;
4941
  }
4942
 
4943
+ .accordion > .card:not(:last-of-type) {
 
 
 
 
 
 
 
 
 
4944
  border-bottom: 0;
4945
  border-bottom-right-radius: 0;
4946
  border-bottom-left-radius: 0;
4947
  }
4948
 
4949
+ .accordion > .card:not(:first-of-type) {
4950
  border-top-left-radius: 0;
4951
  border-top-right-radius: 0;
4952
  }
4953
 
4954
+ .accordion > .card > .card-header {
4955
+ border-radius: 0;
4956
  margin-bottom: -1px;
4957
  }
4958
 
5019
  }
5020
 
5021
  .page-link:focus {
5022
+ z-index: 3;
5023
  outline: 0;
5024
  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
5025
  }
5036
  }
5037
 
5038
  .page-item.active .page-link {
5039
+ z-index: 3;
5040
  color: #fff;
5041
  background-color: #007bff;
5042
  border-color: #007bff;
5434
  flex-direction: column;
5435
  -ms-flex-pack: center;
5436
  justify-content: center;
5437
+ overflow: hidden;
5438
  color: #fff;
5439
  text-align: center;
5440
  white-space: nowrap;
5508
  position: relative;
5509
  display: block;
5510
  padding: 0.75rem 1.25rem;
 
5511
  background-color: #fff;
5512
  border: 1px solid rgba(0, 0, 0, 0.125);
5513
  }
5518
  }
5519
 
5520
  .list-group-item:last-child {
 
5521
  border-bottom-right-radius: 0.25rem;
5522
  border-bottom-left-radius: 0.25rem;
5523
  }
5535
  border-color: #007bff;
5536
  }
5537
 
5538
+ .list-group-item + .list-group-item {
5539
+ border-top-width: 0;
5540
+ }
5541
+
5542
+ .list-group-item + .list-group-item.active {
5543
+ margin-top: -1px;
5544
+ border-top-width: 1px;
5545
+ }
5546
+
5547
  .list-group-horizontal {
5548
  -ms-flex-direction: row;
5549
  flex-direction: row;
5550
  }
5551
 
 
 
 
 
 
5552
  .list-group-horizontal .list-group-item:first-child {
 
5553
  border-bottom-left-radius: 0.25rem;
5554
  border-top-right-radius: 0;
5555
  }
5556
 
5557
  .list-group-horizontal .list-group-item:last-child {
 
5558
  border-top-right-radius: 0.25rem;
 
5559
  border-bottom-left-radius: 0;
5560
  }
5561
 
5562
+ .list-group-horizontal .list-group-item.active {
5563
+ margin-top: 0;
5564
+ }
5565
+
5566
+ .list-group-horizontal .list-group-item + .list-group-item {
5567
+ border-top-width: 1px;
5568
+ border-left-width: 0;
5569
+ }
5570
+
5571
+ .list-group-horizontal .list-group-item + .list-group-item.active {
5572
+ margin-left: -1px;
5573
+ border-left-width: 1px;
5574
+ }
5575
+
5576
  @media (min-width: 576px) {
5577
  .list-group-horizontal-sm {
5578
  -ms-flex-direction: row;
5579
  flex-direction: row;
5580
  }
 
 
 
 
5581
  .list-group-horizontal-sm .list-group-item:first-child {
 
5582
  border-bottom-left-radius: 0.25rem;
5583
  border-top-right-radius: 0;
5584
  }
5585
  .list-group-horizontal-sm .list-group-item:last-child {
 
5586
  border-top-right-radius: 0.25rem;
 
5587
  border-bottom-left-radius: 0;
5588
  }
5589
+ .list-group-horizontal-sm .list-group-item.active {
5590
+ margin-top: 0;
5591
+ }
5592
+ .list-group-horizontal-sm .list-group-item + .list-group-item {
5593
+ border-top-width: 1px;
5594
+ border-left-width: 0;
5595
+ }
5596
+ .list-group-horizontal-sm .list-group-item + .list-group-item.active {
5597
+ margin-left: -1px;
5598
+ border-left-width: 1px;
5599
+ }
5600
  }
5601
 
5602
  @media (min-width: 768px) {
5604
  -ms-flex-direction: row;
5605
  flex-direction: row;
5606
  }
 
 
 
 
5607
  .list-group-horizontal-md .list-group-item:first-child {
 
5608
  border-bottom-left-radius: 0.25rem;
5609
  border-top-right-radius: 0;
5610
  }
5611
  .list-group-horizontal-md .list-group-item:last-child {
 
5612
  border-top-right-radius: 0.25rem;
 
5613
  border-bottom-left-radius: 0;
5614
  }
5615
+ .list-group-horizontal-md .list-group-item.active {
5616
+ margin-top: 0;
5617
+ }
5618
+ .list-group-horizontal-md .list-group-item + .list-group-item {
5619
+ border-top-width: 1px;
5620
+ border-left-width: 0;
5621
+ }
5622
+ .list-group-horizontal-md .list-group-item + .list-group-item.active {
5623
+ margin-left: -1px;
5624
+ border-left-width: 1px;
5625
+ }
5626
  }
5627
 
5628
  @media (min-width: 992px) {
5630
  -ms-flex-direction: row;
5631
  flex-direction: row;
5632
  }
 
 
 
 
5633
  .list-group-horizontal-lg .list-group-item:first-child {
 
5634
  border-bottom-left-radius: 0.25rem;
5635
  border-top-right-radius: 0;
5636
  }
5637
  .list-group-horizontal-lg .list-group-item:last-child {
 
5638
  border-top-right-radius: 0.25rem;
 
5639
  border-bottom-left-radius: 0;
5640
  }
5641
+ .list-group-horizontal-lg .list-group-item.active {
5642
+ margin-top: 0;
5643
+ }
5644
+ .list-group-horizontal-lg .list-group-item + .list-group-item {
5645
+ border-top-width: 1px;
5646
+ border-left-width: 0;
5647
+ }
5648
+ .list-group-horizontal-lg .list-group-item + .list-group-item.active {
5649
+ margin-left: -1px;
5650
+ border-left-width: 1px;
5651
+ }
5652
  }
5653
 
5654
  @media (min-width: 1200px) {
5656
  -ms-flex-direction: row;
5657
  flex-direction: row;
5658
  }
 
 
 
 
5659
  .list-group-horizontal-xl .list-group-item:first-child {
 
5660
  border-bottom-left-radius: 0.25rem;
5661
  border-top-right-radius: 0;
5662
  }
5663
  .list-group-horizontal-xl .list-group-item:last-child {
 
5664
  border-top-right-radius: 0.25rem;
 
5665
  border-bottom-left-radius: 0;
5666
  }
5667
+ .list-group-horizontal-xl .list-group-item.active {
5668
+ margin-top: 0;
5669
+ }
5670
+ .list-group-horizontal-xl .list-group-item + .list-group-item {
5671
+ border-top-width: 1px;
5672
+ border-left-width: 0;
5673
+ }
5674
+ .list-group-horizontal-xl .list-group-item + .list-group-item.active {
5675
+ margin-left: -1px;
5676
+ border-left-width: 1px;
5677
+ }
5678
  }
5679
 
5680
  .list-group-flush .list-group-item {
5681
+ border-right-width: 0;
5682
+ border-left-width: 0;
5683
  border-radius: 0;
5684
  }
5685
 
5686
+ .list-group-flush .list-group-item:first-child {
5687
+ border-top-width: 0;
 
 
 
 
5688
  }
5689
 
5690
  .list-group-flush:last-child .list-group-item:last-child {
5691
+ border-bottom-width: 0;
 
5692
  }
5693
 
5694
  .list-group-item-primary {
5945
  transform: none;
5946
  }
5947
 
5948
+ .modal.modal-static .modal-dialog {
5949
+ -webkit-transform: scale(1.02);
5950
+ transform: scale(1.02);
5951
+ }
5952
+
5953
  .modal-dialog-scrollable {
5954
  display: -ms-flexbox;
5955
  display: flex;
6043
  justify-content: space-between;
6044
  padding: 1rem 1rem;
6045
  border-bottom: 1px solid #dee2e6;
6046
+ border-top-left-radius: calc(0.3rem - 1px);
6047
+ border-top-right-radius: calc(0.3rem - 1px);
6048
  }
6049
 
6050
  .modal-header .close {
6067
  .modal-footer {
6068
  display: -ms-flexbox;
6069
  display: flex;
6070
+ -ms-flex-wrap: wrap;
6071
+ flex-wrap: wrap;
6072
  -ms-flex-align: center;
6073
  align-items: center;
6074
  -ms-flex-pack: end;
6075
  justify-content: flex-end;
6076
+ padding: 0.75rem;
6077
  border-top: 1px solid #dee2e6;
6078
+ border-bottom-right-radius: calc(0.3rem - 1px);
6079
+ border-bottom-left-radius: calc(0.3rem - 1px);
 
 
 
 
6080
  }
6081
 
6082
+ .modal-footer > * {
6083
+ margin: 0.25rem;
6084
  }
6085
 
6086
  .modal-scrollbar-measure {
6287
  }
6288
 
6289
  .bs-popover-top > .arrow, .bs-popover-auto[x-placement^="top"] > .arrow {
6290
+ bottom: calc(-0.5rem - 1px);
6291
  }
6292
 
6293
  .bs-popover-top > .arrow::before, .bs-popover-auto[x-placement^="top"] > .arrow::before {
6307
  }
6308
 
6309
  .bs-popover-right > .arrow, .bs-popover-auto[x-placement^="right"] > .arrow {
6310
+ left: calc(-0.5rem - 1px);
6311
  width: 0.5rem;
6312
  height: 1rem;
6313
  margin: 0.3rem 0;
6330
  }
6331
 
6332
  .bs-popover-bottom > .arrow, .bs-popover-auto[x-placement^="bottom"] > .arrow {
6333
+ top: calc(-0.5rem - 1px);
6334
  }
6335
 
6336
  .bs-popover-bottom > .arrow::before, .bs-popover-auto[x-placement^="bottom"] > .arrow::before {
6361
  }
6362
 
6363
  .bs-popover-left > .arrow, .bs-popover-auto[x-placement^="left"] > .arrow {
6364
+ right: calc(-0.5rem - 1px);
6365
  width: 0.5rem;
6366
  height: 1rem;
6367
  margin: 0.3rem 0;
6474
  .carousel-fade .active.carousel-item-right {
6475
  z-index: 0;
6476
  opacity: 0;
6477
+ transition: opacity 0s 0.6s;
6478
  }
6479
 
6480
  @media (prefers-reduced-motion: reduce) {
6536
  }
6537
 
6538
  .carousel-control-prev-icon {
6539
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3e%3c/svg%3e");
6540
  }
6541
 
6542
  .carousel-control-next-icon {
6543
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3e%3c/svg%3e");
6544
  }
6545
 
6546
  .carousel-indicators {
7992
  width: 1px;
7993
  height: 1px;
7994
  padding: 0;
7995
+ margin: -1px;
7996
  overflow: hidden;
7997
  clip: rect(0, 0, 0, 0);
7998
  white-space: nowrap;
resources/css/bootstrap4.min.css CHANGED
@@ -1,7 +1,7 @@
1
  /*!
2
- * Bootstrap v4.3.1 (https://getbootstrap.com/)
3
  * Copyright 2011-2019 The Bootstrap Authors
4
  * Copyright 2011-2019 Twitter, Inc.
5
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
6
- */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer::before{content:"\2014\00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-break:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-ms-flex-order:-1;order:-1}.order-last{-ms-flex-order:13;order:13}.order-0{-ms-flex-order:0;order:0}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-ms-flex-order:-1;order:-1}.order-sm-last{-ms-flex-order:13;order:13}.order-sm-0{-ms-flex-order:0;order:0}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-ms-flex-order:-1;order:-1}.order-md-last{-ms-flex-order:13;order:13}.order-md-0{-ms-flex-order:0;order:0}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-ms-flex-order:-1;order:-1}.order-lg-last{-ms-flex-order:13;order:13}.order-lg-0{-ms-flex-order:0;order:0}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-ms-flex-order:-1;order:-1}.order-xl-last{-ms-flex-order:13;order:13}.order-xl-0{-ms-flex-order:0;order:0}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;margin-bottom:1rem;color:#212529}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{color:#212529;background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-primary tbody+tbody,.table-primary td,.table-primary th,.table-primary thead th{border-color:#7abaff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-secondary tbody+tbody,.table-secondary td,.table-secondary th,.table-secondary thead th{border-color:#b3b7bb}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-success tbody+tbody,.table-success td,.table-success th,.table-success thead th{border-color:#8fd19e}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-info tbody+tbody,.table-info td,.table-info th,.table-info thead th{border-color:#86cfda}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-warning tbody+tbody,.table-warning td,.table-warning th,.table-warning thead th{border-color:#ffdf7e}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-danger tbody+tbody,.table-danger td,.table-danger th,.table-danger thead th{border-color:#ed969e}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-light tbody+tbody,.table-light td,.table-light th,.table-light thead th{border-color:#fbfcfc}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#95999c}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#343a40;border-color:#454d55}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#343a40}.table-dark td,.table-dark th,.table-dark thead th{border-color:#454d55}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:rgba(255,255,255,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding-top:.375rem;padding-bottom:.375rem;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}select.form-control[multiple],select.form-control[size]{height:auto}textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(40,167,69,.9);border-radius:.25rem}.form-control.is-valid,.was-validated .form-control:valid{border-color:#28a745;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:center right calc(.375em + .1875rem);background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.form-control.is-valid~.valid-feedback,.form-control.is-valid~.valid-tooltip,.was-validated .form-control:valid~.valid-feedback,.was-validated .form-control:valid~.valid-tooltip{display:block}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-valid,.was-validated .custom-select:valid{border-color:#28a745;padding-right:calc((1em + .75rem) * 3 / 4 + 1.75rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.custom-select.is-valid:focus,.was-validated .custom-select:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-select.is-valid~.valid-feedback,.custom-select.is-valid~.valid-tooltip,.was-validated .custom-select:valid~.valid-feedback,.was-validated .custom-select:valid~.valid-tooltip{display:block}.form-control-file.is-valid~.valid-feedback,.form-control-file.is-valid~.valid-tooltip,.was-validated .form-control-file:valid~.valid-feedback,.was-validated .form-control-file:valid~.valid-tooltip{display:block}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{border-color:#28a745}.custom-control-input.is-valid~.valid-feedback,.custom-control-input.is-valid~.valid-tooltip,.was-validated .custom-control-input:valid~.valid-feedback,.was-validated .custom-control-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{border-color:#34ce57;background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label::before{border-color:#28a745}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid~.valid-feedback,.custom-file-input.is-valid~.valid-tooltip,.was-validated .custom-file-input:valid~.valid-feedback,.was-validated .custom-file-input:valid~.valid-tooltip{display:block}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E");background-repeat:no-repeat;background-position:center right calc(.375em + .1875rem);background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-control.is-invalid~.invalid-feedback,.form-control.is-invalid~.invalid-tooltip,.was-validated .form-control:invalid~.invalid-feedback,.was-validated .form-control:invalid~.invalid-tooltip{display:block}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-invalid,.was-validated .custom-select:invalid{border-color:#dc3545;padding-right:calc((1em + .75rem) * 3 / 4 + 1.75rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.custom-select.is-invalid:focus,.was-validated .custom-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-select.is-invalid~.invalid-feedback,.custom-select.is-invalid~.invalid-tooltip,.was-validated .custom-select:invalid~.invalid-feedback,.was-validated .custom-select:invalid~.invalid-tooltip{display:block}.form-control-file.is-invalid~.invalid-feedback,.form-control-file.is-invalid~.invalid-tooltip,.was-validated .form-control-file:invalid~.invalid-feedback,.was-validated .form-control-file:invalid~.invalid-tooltip{display:block}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{border-color:#dc3545}.custom-control-input.is-invalid~.invalid-feedback,.custom-control-input.is-invalid~.invalid-tooltip,.was-validated .custom-control-input:invalid~.invalid-feedback,.was-validated .custom-control-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{border-color:#e4606d;background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label::before{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid~.invalid-feedback,.custom-file-input.is-invalid~.invalid-tooltip,.was-validated .custom-file-input:invalid~.invalid-feedback,.was-validated .custom-file-input:invalid~.invalid-tooltip{display:block}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-ms-flexbox;display:flex;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;-ms-flex-negative:0;flex-shrink:0;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#212529;text-align:center;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529;text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-outline-primary{color:#007bff;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;text-decoration:none}.btn-link:hover{color:#0056b3;text-decoration:underline}.btn-link.focus,.btn-link:focus{text-decoration:underline;box-shadow:none}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-left{right:auto;left:0}.dropdown-menu-right{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-left{right:auto;left:0}.dropdown-menu-sm-right{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-left{right:auto;left:0}.dropdown-menu-md-right{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-left{right:auto;left:0}.dropdown-menu-lg-right{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-left{right:auto;left:0}.dropdown-menu-xl-right{right:0;left:auto}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-ms-flex:1 1 auto;flex:1 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-toolbar{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:center;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control,.input-group>.form-control-plaintext{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;margin-bottom:0}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control,.input-group>.form-control-plaintext+.custom-file,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:last-child),.input-group>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-append,.input-group-prepend{display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn:focus,.input-group-prepend .btn:focus{z-index:3}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.custom-select,.input-group-lg>.form-control:not(textarea){height:calc(1.5em + 1rem + 2px)}.input-group-lg>.custom-select,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.custom-select,.input-group-sm>.form-control:not(textarea){height:calc(1.5em + .5rem + 2px)}.input-group-sm>.custom-select,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;border-color:#007bff;background-color:#007bff}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label::before{border-color:#80bdff}.custom-control-input:not(:disabled):active~.custom-control-label::before{color:#fff;background-color:#b3d7ff;border-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label::before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";background-color:#fff;border:#adb5bd solid 1px}.custom-control-label::after{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background:no-repeat 50%/50% 50%}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{border-color:#007bff;background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label::before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:.5rem}.custom-switch .custom-control-label::after{top:calc(.25rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#adb5bd;border-radius:.5rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-switch .custom-control-label::after{transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label::after{background-color:#fff;-webkit-transform:translateX(.75rem);transform:translateX(.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem 1.75rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;vertical-align:middle;background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{display:none}.custom-select-sm{height:calc(1.5em + .5rem + 2px);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.custom-select-lg{height:calc(1.5em + 1rem + 2px);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.custom-file{position:relative;display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(1.5em + .75rem + 2px);margin:0;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:disabled~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]::after{content:attr(data-browse)}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(1.5em + .75rem);padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:inherit;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;height:calc(1rem + .4rem);padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{transition:none}}.custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{transition:none}}.custom-range::-ms-thumb:active{background-color:#b3d7ff}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.custom-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#adb5bd}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#adb5bd}.custom-control-label::before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-control-label::before,.custom-file-label,.custom-select{transition:none}}.nav{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar>.container,.navbar>.container-fluid{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{display:-ms-flexbox;display:flex;-ms-flex:1 0 0%;flex:1 0 0%;-ms-flex-direction:column;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion>.card{overflow:hidden}.accordion>.card:not(:first-of-type) .card-header:first-child{border-radius:0}.accordion>.card:not(:first-of-type):not(:last-of-type){border-bottom:0;border-radius:0}.accordion>.card:first-of-type{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:last-of-type{border-top-left-radius:0;border-top-right-radius:0}.accordion>.card .card-header{margin-bottom:-1px}.breadcrumb{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:2;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:1;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.badge{transition:none}}a.badge:focus,a.badge:hover{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}a.badge-primary:focus,a.badge-primary:hover{color:#fff;background-color:#0062cc}a.badge-primary.focus,a.badge-primary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.badge-secondary{color:#fff;background-color:#6c757d}a.badge-secondary:focus,a.badge-secondary:hover{color:#fff;background-color:#545b62}a.badge-secondary.focus,a.badge-secondary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.badge-success{color:#fff;background-color:#28a745}a.badge-success:focus,a.badge-success:hover{color:#fff;background-color:#1e7e34}a.badge-success.focus,a.badge-success:focus{outline:0;box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.badge-info{color:#fff;background-color:#17a2b8}a.badge-info:focus,a.badge-info:hover{color:#fff;background-color:#117a8b}a.badge-info.focus,a.badge-info:focus{outline:0;box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.badge-warning{color:#212529;background-color:#ffc107}a.badge-warning:focus,a.badge-warning:hover{color:#212529;background-color:#d39e00}a.badge-warning.focus,a.badge-warning:focus{outline:0;box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.badge-danger{color:#fff;background-color:#dc3545}a.badge-danger:focus,a.badge-danger:hover{color:#fff;background-color:#bd2130}a.badge-danger.focus,a.badge-danger:focus{outline:0;box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.badge-light{color:#212529;background-color:#f8f9fa}a.badge-light:focus,a.badge-light:hover{color:#212529;background-color:#dae0e5}a.badge-light.focus,a.badge-light:focus{outline:0;box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.badge-dark{color:#fff;background-color:#343a40}a.badge-dark:focus,a.badge-dark:hover{color:#fff;background-color:#1d2124}a.badge-dark.focus,a.badge-dark:focus{outline:0;box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.media{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start}.media-body{-ms-flex:1;flex:1}.list-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-horizontal{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}@media (min-width:576px){.list-group-horizontal-sm{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-sm .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-sm .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}@media (min-width:768px){.list-group-horizontal-md{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-md .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-md .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}@media (min-width:992px){.list-group-horizontal-lg{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-lg .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-lg .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}@media (min-width:1200px){.list-group-horizontal-xl{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-xl .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-xl .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush .list-group-item:last-child{margin-bottom:-1px}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{margin-bottom:0;border-bottom:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{opacity:.75}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}a.close.disabled{pointer-events:none}.toast{max-width:350px;overflow:hidden;font-size:.875rem;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .25rem .75rem rgba(0,0,0,.1);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);opacity:0;border-radius:.25rem}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.25rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05)}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-50px);transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{-webkit-transform:none;transform:none}.modal-dialog-scrollable{display:-ms-flexbox;display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-footer,.modal-dialog-scrollable .modal-header{-ms-flex-negative:0;flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog-centered::before{display:block;height:calc(100vh - 1rem);content:""}.modal-dialog-centered.modal-dialog-scrollable{-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;height:100%}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable::before{content:none}.modal-content{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:.3rem;border-top-right-radius:.3rem}.modal-header .close{padding:1rem 1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end;padding:1rem;border-top:1px solid #dee2e6;border-bottom-right-radius:.3rem;border-bottom-left-radius:.3rem}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered::before{height:calc(100vh - 3.5rem)}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=top]>.arrow::before,.bs-popover-top>.arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top]>.arrow::after,.bs-popover-top>.arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{left:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right]>.arrow::before,.bs-popover-right>.arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right]>.arrow::after,.bs-popover-right>.arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=bottom]>.arrow::before,.bs-popover-bottom>.arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom]>.arrow::after,.bs-popover-bottom>.arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{right:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left]>.arrow::before,.bs-popover-left>.arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left]>.arrow::after,.bs-popover-left>.arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{-ms-touch-action:pan-y;touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-right,.carousel-item-next:not(.carousel-item-left){-webkit-transform:translateX(100%);transform:translateX(100%)}.active.carousel-item-left,.carousel-item-prev:not(.carousel-item-right){-webkit-transform:translateX(-100%);transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;-webkit-transform:none;transform:none}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{z-index:0;opacity:0;transition:0s .6s opacity}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:no-repeat 50%/100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{box-sizing:content-box;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}@-webkit-keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;-webkit-animation:spinner-border .75s linear infinite;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}@keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:spinner-grow .75s linear infinite;animation:spinner-grow .75s linear infinite}.spinner-grow-sm{width:1rem;height:1rem}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded-sm{border-radius:.2rem!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-lg{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.min-vw-100{min-width:100vw!important}.min-vh-100{min-height:100vh!important}.vw-100{width:100vw!important}.vh-100{height:100vh!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:rgba(0,0,0,0)}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace!important}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0056b3!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#494f54!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#19692c!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#0f6674!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#ba8b00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#a71d2a!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#cbd3da!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#121416!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none!important}.text-break{word-break:break-word!important;overflow-wrap:break-word!important}.text-reset{color:inherit!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px!important}.container{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}}
7
  /*# sourceMappingURL=bootstrap.min.css.map */
1
  /*!
2
+ * Bootstrap v4.4.1 (https://getbootstrap.com/)
3
  * Copyright 2011-2019 The Bootstrap Authors
4
  * Copyright 2011-2019 Twitter, Inc.
5
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
6
+ */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus:not(:focus-visible){outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]){color:inherit;text-decoration:none}a:not([href]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer::before{content:"\2014\00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid,.container-lg,.container-md,.container-sm,.container-xl{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-ms-flex-order:-1;order:-1}.order-last{-ms-flex-order:13;order:13}.order-0{-ms-flex-order:0;order:0}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-sm-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-sm-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-sm-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-sm-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-sm-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-sm-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-ms-flex-order:-1;order:-1}.order-sm-last{-ms-flex-order:13;order:13}.order-sm-0{-ms-flex-order:0;order:0}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-md-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-md-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-md-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-md-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-md-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-md-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-ms-flex-order:-1;order:-1}.order-md-last{-ms-flex-order:13;order:13}.order-md-0{-ms-flex-order:0;order:0}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-lg-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-lg-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-lg-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-lg-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-lg-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-lg-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-ms-flex-order:-1;order:-1}.order-lg-last{-ms-flex-order:13;order:13}.order-lg-0{-ms-flex-order:0;order:0}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-xl-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-xl-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-xl-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-xl-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-xl-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-xl-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-ms-flex-order:-1;order:-1}.order-xl-last{-ms-flex-order:13;order:13}.order-xl-0{-ms-flex-order:0;order:0}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;margin-bottom:1rem;color:#212529}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{color:#212529;background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-primary tbody+tbody,.table-primary td,.table-primary th,.table-primary thead th{border-color:#7abaff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-secondary tbody+tbody,.table-secondary td,.table-secondary th,.table-secondary thead th{border-color:#b3b7bb}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-success tbody+tbody,.table-success td,.table-success th,.table-success thead th{border-color:#8fd19e}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-info tbody+tbody,.table-info td,.table-info th,.table-info thead th{border-color:#86cfda}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-warning tbody+tbody,.table-warning td,.table-warning th,.table-warning thead th{border-color:#ffdf7e}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-danger tbody+tbody,.table-danger td,.table-danger th,.table-danger thead th{border-color:#ed969e}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-light tbody+tbody,.table-light td,.table-light th,.table-light thead th{border-color:#fbfcfc}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#95999c}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#343a40;border-color:#454d55}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#343a40}.table-dark td,.table-dark th,.table-dark thead th{border-color:#454d55}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:rgba(255,255,255,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;font-size:1rem;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}select.form-control[multiple],select.form-control[size]{height:auto}textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(40,167,69,.9);border-radius:.25rem}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:#28a745;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-valid,.was-validated .custom-select:valid{border-color:#28a745;padding-right:calc(.75em + 2.3125rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.custom-select.is-valid:focus,.was-validated .custom-select:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{border-color:#28a745}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{border-color:#34ce57;background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label::before{border-color:#28a745}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-invalid,.was-validated .custom-select:invalid{border-color:#dc3545;padding-right:calc(.75em + 2.3125rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.custom-select.is-invalid:focus,.was-validated .custom-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{border-color:#dc3545}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{border-color:#e4606d;background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label::before{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-ms-flexbox;display:flex;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;-ms-flex-negative:0;flex-shrink:0;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#212529;text-align:center;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529;text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#0069d9;border-color:#0062cc;box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{color:#fff;background-color:#5a6268;border-color:#545b62;box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#218838;border-color:#1e7e34;box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#138496;border-color:#117a8b;box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{color:#212529;background-color:#e0a800;border-color:#d39e00;box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c82333;border-color:#bd2130;box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{color:#212529;background-color:#e2e6ea;border-color:#dae0e5;box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{color:#fff;background-color:#23272b;border-color:#1d2124;box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-outline-primary{color:#007bff;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;text-decoration:none}.btn-link:hover{color:#0056b3;text-decoration:underline}.btn-link.focus,.btn-link:focus{text-decoration:underline;box-shadow:none}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-left{right:auto;left:0}.dropdown-menu-right{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-left{right:auto;left:0}.dropdown-menu-sm-right{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-left{right:auto;left:0}.dropdown-menu-md-right{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-left{right:auto;left:0}.dropdown-menu-lg-right{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-left{right:auto;left:0}.dropdown-menu-xl-right{right:0;left:auto}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-ms-flex:1 1 auto;flex:1 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-toolbar{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:center;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control,.input-group>.form-control-plaintext{position:relative;-ms-flex:1 1 0%;flex:1 1 0%;min-width:0;margin-bottom:0}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control,.input-group>.form-control-plaintext+.custom-file,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:last-child),.input-group>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-append,.input-group-prepend{display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn:focus,.input-group-prepend .btn:focus{z-index:3}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.custom-select,.input-group-lg>.form-control:not(textarea){height:calc(1.5em + 1rem + 2px)}.input-group-lg>.custom-select,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.custom-select,.input-group-sm>.form-control:not(textarea){height:calc(1.5em + .5rem + 2px)}.input-group-sm>.custom-select,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;left:0;z-index:-1;width:1rem;height:1.25rem;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;border-color:#007bff;background-color:#007bff}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label::before{border-color:#80bdff}.custom-control-input:not(:disabled):active~.custom-control-label::before{color:#fff;background-color:#b3d7ff;border-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label,.custom-control-input[disabled]~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label::before,.custom-control-input[disabled]~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label::before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";background-color:#fff;border:#adb5bd solid 1px}.custom-control-label::after{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background:no-repeat 50%/50% 50%}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{border-color:#007bff;background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label::before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:.5rem}.custom-switch .custom-control-label::after{top:calc(.25rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#adb5bd;border-radius:.5rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-switch .custom-control-label::after{transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label::after{background-color:#fff;-webkit-transform:translateX(.75rem);transform:translateX(.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem 1.75rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{display:none}.custom-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}.custom-select-sm{height:calc(1.5em + .5rem + 2px);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.custom-select-lg{height:calc(1.5em + 1rem + 2px);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.custom-file{position:relative;display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(1.5em + .75rem + 2px);margin:0;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:disabled~.custom-file-label,.custom-file-input[disabled]~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]::after{content:attr(data-browse)}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(1.5em + .75rem);padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:inherit;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;height:1.4rem;padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#007bff;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{-moz-transition:none;transition:none}}.custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#007bff;border:0;border-radius:1rem;-ms-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{-ms-transition:none;transition:none}}.custom-range::-ms-thumb:active{background-color:#b3d7ff}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.custom-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#adb5bd}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#adb5bd}.custom-control-label::before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-control-label::before,.custom-file-label,.custom-select{transition:none}}.nav{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar .container,.navbar .container-fluid,.navbar .container-lg,.navbar .container-md,.navbar .container-sm,.navbar .container-xl{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba(255, 255, 255, 0.5)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-body{-ms-flex:1 1 auto;flex:1 1 auto;min-height:1px;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img,.card-img-bottom,.card-img-top{-ms-flex-negative:0;flex-shrink:0;width:100%}.card-img,.card-img-top{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{-ms-flex:1 0 0%;flex:1 0 0%;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion>.card{overflow:hidden}.accordion>.card:not(:last-of-type){border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:not(:first-of-type){border-top-left-radius:0;border-top-right-radius:0}.accordion>.card>.card-header{border-radius:0;margin-bottom:-1px}.breadcrumb{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:3;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:3;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.badge{transition:none}}a.badge:focus,a.badge:hover{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}a.badge-primary:focus,a.badge-primary:hover{color:#fff;background-color:#0062cc}a.badge-primary.focus,a.badge-primary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.badge-secondary{color:#fff;background-color:#6c757d}a.badge-secondary:focus,a.badge-secondary:hover{color:#fff;background-color:#545b62}a.badge-secondary.focus,a.badge-secondary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.badge-success{color:#fff;background-color:#28a745}a.badge-success:focus,a.badge-success:hover{color:#fff;background-color:#1e7e34}a.badge-success.focus,a.badge-success:focus{outline:0;box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.badge-info{color:#fff;background-color:#17a2b8}a.badge-info:focus,a.badge-info:hover{color:#fff;background-color:#117a8b}a.badge-info.focus,a.badge-info:focus{outline:0;box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.badge-warning{color:#212529;background-color:#ffc107}a.badge-warning:focus,a.badge-warning:hover{color:#212529;background-color:#d39e00}a.badge-warning.focus,a.badge-warning:focus{outline:0;box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.badge-danger{color:#fff;background-color:#dc3545}a.badge-danger:focus,a.badge-danger:hover{color:#fff;background-color:#bd2130}a.badge-danger.focus,a.badge-danger:focus{outline:0;box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.badge-light{color:#212529;background-color:#f8f9fa}a.badge-light:focus,a.badge-light:hover{color:#212529;background-color:#dae0e5}a.badge-light.focus,a.badge-light:focus{outline:0;box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.badge-dark{color:#fff;background-color:#343a40}a.badge-dark:focus,a.badge-dark:hover{color:#fff;background-color:#1d2124}a.badge-dark.focus,a.badge-dark:focus{outline:0;box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.media{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start}.media-body{-ms-flex:1;flex:1}.list-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal .list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal .list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal .list-group-item.active{margin-top:0}.list-group-horizontal .list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal .list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media (min-width:576px){.list-group-horizontal-sm{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-sm .list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm .list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-sm .list-group-item.active{margin-top:0}.list-group-horizontal-sm .list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-sm .list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:768px){.list-group-horizontal-md{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-md .list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md .list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-md .list-group-item.active{margin-top:0}.list-group-horizontal-md .list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-md .list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:992px){.list-group-horizontal-lg{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-lg .list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg .list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-lg .list-group-item.active{margin-top:0}.list-group-horizontal-lg .list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-lg .list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1200px){.list-group-horizontal-xl{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-xl .list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl .list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xl .list-group-item.active{margin-top:0}.list-group-horizontal-xl .list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xl .list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush .list-group-item{border-right-width:0;border-left-width:0;border-radius:0}.list-group-flush .list-group-item:first-child{border-top-width:0}.list-group-flush:last-child .list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{opacity:.75}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}a.close.disabled{pointer-events:none}.toast{max-width:350px;overflow:hidden;font-size:.875rem;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .25rem .75rem rgba(0,0,0,.1);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);opacity:0;border-radius:.25rem}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.25rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05)}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-50px);transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{-webkit-transform:none;transform:none}.modal.modal-static .modal-dialog{-webkit-transform:scale(1.02);transform:scale(1.02)}.modal-dialog-scrollable{display:-ms-flexbox;display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-footer,.modal-dialog-scrollable .modal-header{-ms-flex-negative:0;flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog-centered::before{display:block;height:calc(100vh - 1rem);content:""}.modal-dialog-centered.modal-dialog-scrollable{-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;height:100%}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable::before{content:none}.modal-content{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.modal-header .close{padding:1rem 1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end;padding:.75rem;border-top:1px solid #dee2e6;border-bottom-right-radius:calc(.3rem - 1px);border-bottom-left-radius:calc(.3rem - 1px)}.modal-footer>*{margin:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered::before{height:calc(100vh - 3.5rem)}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=top]>.arrow::before,.bs-popover-top>.arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top]>.arrow::after,.bs-popover-top>.arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right]>.arrow::before,.bs-popover-right>.arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right]>.arrow::after,.bs-popover-right>.arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=bottom]>.arrow::before,.bs-popover-bottom>.arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom]>.arrow::after,.bs-popover-bottom>.arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left]>.arrow::before,.bs-popover-left>.arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left]>.arrow::after,.bs-popover-left>.arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{-ms-touch-action:pan-y;touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-right,.carousel-item-next:not(.carousel-item-left){-webkit-transform:translateX(100%);transform:translateX(100%)}.active.carousel-item-left,.carousel-item-prev:not(.carousel-item-right){-webkit-transform:translateX(-100%);transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;-webkit-transform:none;transform:none}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:no-repeat 50%/100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{box-sizing:content-box;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}@-webkit-keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;-webkit-animation:spinner-border .75s linear infinite;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}@keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:spinner-grow .75s linear infinite;animation:spinner-grow .75s linear infinite}.spinner-grow-sm{width:1rem;height:1rem}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded-sm{border-radius:.2rem!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-lg{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.min-vw-100{min-width:100vw!important}.min-vh-100{min-height:100vh!important}.vw-100{width:100vw!important}.vh-100{height:100vh!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:rgba(0,0,0,0)}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace!important}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0056b3!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#494f54!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#19692c!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#0f6674!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#ba8b00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#a71d2a!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#cbd3da!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#121416!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none!important}.text-break{word-break:break-word!important;overflow-wrap:break-word!important}.text-reset{color:inherit!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px!important}.container{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}}
7
  /*# sourceMappingURL=bootstrap.min.css.map */
resources/css/introjs.min.css ADDED
@@ -0,0 +1 @@
 
1
+ .introjs-overlay{position:absolute;box-sizing:content-box;z-index:999999;background-color:#000;opacity:0;background:-moz-radial-gradient(center,ellipse farthest-corner,rgba(0,0,0,.4) 0,rgba(0,0,0,.9) 100%);background:-webkit-gradient(radial,center center,0,center center,100%,color-stop(0,rgba(0,0,0,.4)),color-stop(100%,rgba(0,0,0,.9)));background:-webkit-radial-gradient(center,ellipse farthest-corner,rgba(0,0,0,.4) 0,rgba(0,0,0,.9) 100%);background:-o-radial-gradient(center,ellipse farthest-corner,rgba(0,0,0,.4) 0,rgba(0,0,0,.9) 100%);background:-ms-radial-gradient(center,ellipse farthest-corner,rgba(0,0,0,.4) 0,rgba(0,0,0,.9) 100%);background:radial-gradient(center,ellipse farthest-corner,rgba(0,0,0,.4) 0,rgba(0,0,0,.9) 100%);-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-ms-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out}.introjs-fixParent{z-index:auto!important;opacity:1!important;-webkit-transform:none!important;-moz-transform:none!important;-ms-transform:none!important;-o-transform:none!important;transform:none!important}.introjs-showElement,tr.introjs-showElement>td,tr.introjs-showElement>th{z-index:9999999!important}.introjs-disableInteraction{z-index:99999999!important;position:absolute;background-color:#fff;opacity:0}.introjs-relativePosition,tr.introjs-showElement>td,tr.introjs-showElement>th{position:relative}.introjs-helperLayer{box-sizing:content-box;position:absolute;z-index:9999998;background-color:#fff;background-color:rgba(255,255,255,.9);border:1px solid #777;border:1px solid rgba(0,0,0,.5);border-radius:4px;box-shadow:0 2px 15px rgba(0,0,0,.4);-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-ms-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out}.introjs-tooltipReferenceLayer{box-sizing:content-box;position:absolute;visibility:hidden;z-index:100000000;background-color:transparent;-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-ms-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out}.introjs-helperLayer *,.introjs-helperLayer :after,.introjs-helperLayer :before{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;-ms-box-sizing:content-box;-o-box-sizing:content-box;box-sizing:content-box}.introjs-helperNumberLayer{box-sizing:content-box;position:absolute;visibility:visible;top:-16px;left:-16px;z-index:9999999999!important;padding:2px;font-family:Arial,verdana,tahoma;font-size:13px;font-weight:700;color:#fff;text-align:center;text-shadow:1px 1px 1px rgba(0,0,0,.3);background:#ff3019;background:-webkit-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#ff3019),color-stop(100%,#cf0404));background:-moz-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-ms-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-o-linear-gradient(top,#ff3019 0,#cf0404 100%);background:linear-gradient(to bottom,#ff3019 0,#cf0404 100%);width:20px;height:20px;line-height:20px;border:3px solid #fff;border-radius:50%;box-shadow:0 2px 5px rgba(0,0,0,.4)}.introjs-arrow{border:5px solid transparent;content:'';position:absolute}.introjs-arrow.top{top:-10px;border-bottom-color:#fff}.introjs-arrow.top-right{top:-10px;right:10px;border-bottom-color:#fff}.introjs-arrow.top-middle{top:-10px;left:50%;margin-left:-5px;border-bottom-color:#fff}.introjs-arrow.right{right:-10px;top:10px;border-left-color:#fff}.introjs-arrow.right-bottom{bottom:10px;right:-10px;border-left-color:#fff}.introjs-arrow.bottom{bottom:-10px;border-top-color:#fff}.introjs-arrow.bottom-right{bottom:-10px;right:10px;border-top-color:#fff}.introjs-arrow.bottom-middle{bottom:-10px;left:50%;margin-left:-5px;border-top-color:#fff}.introjs-arrow.left{left:-10px;top:10px;border-right-color:#fff}.introjs-arrow.left-bottom{left:-10px;bottom:10px;border-right-color:#fff}.introjs-tooltip{box-sizing:content-box;position:absolute;visibility:visible;padding:10px;background-color:#fff;min-width:200px;max-width:300px;border-radius:3px;box-shadow:0 1px 10px rgba(0,0,0,.4);-webkit-transition:opacity .1s ease-out;-moz-transition:opacity .1s ease-out;-ms-transition:opacity .1s ease-out;-o-transition:opacity .1s ease-out;transition:opacity .1s ease-out}.introjs-tooltipbuttons{text-align:right;white-space:nowrap}.introjs-button{box-sizing:content-box;position:relative;overflow:visible;display:inline-block;padding:.3em .8em;border:1px solid #d4d4d4;margin:0;text-decoration:none;text-shadow:1px 1px 0 #fff;font:11px/normal sans-serif;color:#333;white-space:nowrap;cursor:pointer;outline:0;background-color:#ececec;background-image:-webkit-gradient(linear,0 0,0 100%,from(#f4f4f4),to(#ececec));background-image:-moz-linear-gradient(#f4f4f4,#ececec);background-image:-o-linear-gradient(#f4f4f4,#ececec);background-image:linear-gradient(#f4f4f4,#ececec);-webkit-background-clip:padding;-moz-background-clip:padding;-o-background-clip:padding-box;-webkit-border-radius:.2em;-moz-border-radius:.2em;border-radius:.2em;zoom:1;margin-top:10px}.introjs-button:hover{border-color:#bcbcbc;text-decoration:none;box-shadow:0 1px 1px #e3e3e3}.introjs-button:active,.introjs-button:focus{background-image:-webkit-gradient(linear,0 0,0 100%,from(#ececec),to(#f4f4f4));background-image:-moz-linear-gradient(#ececec,#f4f4f4);background-image:-o-linear-gradient(#ececec,#f4f4f4);background-image:linear-gradient(#ececec,#f4f4f4)}.introjs-button::-moz-focus-inner{padding:0;border:0}.introjs-skipbutton{box-sizing:content-box;margin-right:5px;color:#7a7a7a}.introjs-prevbutton{-webkit-border-radius:.2em 0 0 .2em;-moz-border-radius:.2em 0 0 .2em;border-radius:.2em 0 0 .2em;border-right:none}.introjs-prevbutton.introjs-fullbutton{border:1px solid #d4d4d4;-webkit-border-radius:.2em;-moz-border-radius:.2em;border-radius:.2em}.introjs-nextbutton{-webkit-border-radius:0 .2em .2em 0;-moz-border-radius:0 .2em .2em 0;border-radius:0 .2em .2em 0}.introjs-nextbutton.introjs-fullbutton{-webkit-border-radius:.2em;-moz-border-radius:.2em;border-radius:.2em}.introjs-disabled,.introjs-disabled:focus,.introjs-disabled:hover{color:#9a9a9a;border-color:#d4d4d4;box-shadow:none;cursor:default;background-color:#f4f4f4;background-image:none;text-decoration:none}.introjs-hidden{display:none}.introjs-bullets{text-align:center}.introjs-bullets ul{box-sizing:content-box;clear:both;margin:15px auto 0;padding:0;display:inline-block}.introjs-bullets ul li{box-sizing:content-box;list-style:none;float:left;margin:0 2px}.introjs-bullets ul li a{box-sizing:content-box;display:block;width:6px;height:6px;background:#ccc;border-radius:10px;-moz-border-radius:10px;-webkit-border-radius:10px;text-decoration:none;cursor:pointer}.introjs-bullets ul li a:hover{background:#999}.introjs-bullets ul li a.active{background:#999}.introjs-progress{box-sizing:content-box;overflow:hidden;height:10px;margin:10px 0 5px 0;border-radius:4px;background-color:#ecf0f1}.introjs-progressbar{box-sizing:content-box;float:left;width:0%;height:100%;font-size:10px;line-height:10px;text-align:center;background-color:#08c}.introjsFloatingElement{position:absolute;height:0;width:0;left:50%;top:50%}.introjs-fixedTooltip{position:fixed}.introjs-hint{box-sizing:content-box;position:absolute;background:0 0;width:20px;height:15px;cursor:pointer}.introjs-hint:focus{border:0;outline:0}.introjs-hidehint{display:none}.introjs-fixedhint{position:fixed}.introjs-hint:hover>.introjs-hint-pulse{border:5px solid rgba(60,60,60,.57)}.introjs-hint-pulse{box-sizing:content-box;width:10px;height:10px;border:5px solid rgba(60,60,60,.27);-webkit-border-radius:30px;-moz-border-radius:30px;border-radius:30px;background-color:rgba(136,136,136,.24);z-index:10;position:absolute;-webkit-transition:all .2s ease-out;-moz-transition:all .2s ease-out;-ms-transition:all .2s ease-out;-o-transition:all .2s ease-out;transition:all .2s ease-out}.introjs-hint-no-anim .introjs-hint-dot{-webkit-animation:none;-moz-animation:none;animation:none}.introjs-hint-dot{box-sizing:content-box;border:10px solid rgba(146,146,146,.36);background:0 0;-webkit-border-radius:60px;-moz-border-radius:60px;border-radius:60px;height:50px;width:50px;-webkit-animation:introjspulse 3s ease-out;-moz-animation:introjspulse 3s ease-out;animation:introjspulse 3s ease-out;-webkit-animation-iteration-count:infinite;-moz-animation-iteration-count:infinite;animation-iteration-count:infinite;position:absolute;top:-25px;left:-25px;z-index:1;opacity:0}@-webkit-keyframes introjspulse{0%{-webkit-transform:scale(0);opacity:0}25%{-webkit-transform:scale(0);opacity:.1}50%{-webkit-transform:scale(.1);opacity:.3}75%{-webkit-transform:scale(.5);opacity:.5}100%{-webkit-transform:scale(1);opacity:0}}@-moz-keyframes introjspulse{0%{-moz-transform:scale(0);opacity:0}25%{-moz-transform:scale(0);opacity:.1}50%{-moz-transform:scale(.1);opacity:.3}75%{-moz-transform:scale(.5);opacity:.5}100%{-moz-transform:scale(1);opacity:0}}@keyframes introjspulse{0%{transform:scale(0);opacity:0}25%{transform:scale(0);opacity:.1}50%{transform:scale(.1);opacity:.3}75%{transform:scale(.5);opacity:.5}100%{transform:scale(1);opacity:0}}
resources/css/plugin.css CHANGED
@@ -4,6 +4,9 @@
4
  body {
5
  overflow-y: scroll;
6
  }
 
 
 
7
  #wpcontent {
8
  padding: 0;
9
  }
@@ -58,7 +61,7 @@ body {
58
  margin-bottom: 50px;
59
  }
60
  #ColumnOptions .form-actions .btn {
61
- box-shadow: -1px 2px 2px rgba(0,0,0,0.3);
62
  opacity: 0.85;
63
  }
64
  #ColumnOptions .form-actions .btn:hover {
@@ -870,6 +873,7 @@ th.column-request_info {
870
  box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.2);
871
  }
872
  #odp-PageHead .nav-link {
 
873
  }
874
  #odp-PageHead .nav-link.active {
875
  font-weight: bold;
@@ -1037,24 +1041,19 @@ table.scan-table.wp-list-table button.toggle-row {
1037
  display: none;
1038
  }
1039
 
1040
- #ScanResultsPills {
1041
- margin-top: 25px;
1042
  }
1043
- #ScanResultsPills nav > a.nav-link {
1044
  color: #666666;
1045
- height: 72px;
1046
- margin-bottom: 15px;
1047
  }
1048
- #ScanResultsPills nav > a.nav-link.active {
1049
- background-color: transparent;
1050
  color: #333333;
1051
- font-weight: bolder;
1052
- font-size: 14px;
1053
  }
1054
- #ScanResultsPills .card.card-scan_results {
1055
  margin-top: 0;
1056
  }
1057
- #ScanResultsPills nav > a.nav-link .badge {
1058
  font-size: 12px;
1059
  }
1060
 
@@ -1068,10 +1067,9 @@ PTG SCAN TABLES
1068
  display: none;
1069
  }
1070
 
1071
-
1072
  .card.card-scan_results {
1073
- /*background-color: transparent;*/
1074
- /*border: 0 none;*/
1075
  }
1076
  .card.card-scan_results .card-header {
1077
  background-color: transparent;
@@ -1093,7 +1091,7 @@ table.odp-table.scan-table td.column-path code {
1093
  /*display: none;*/
1094
  }
1095
  .container-scantable {
1096
- max-height: 300px;
1097
  overflow: auto;
1098
  }
1099
  .container-scantable .tablenav.top,
@@ -1154,10 +1152,6 @@ input[type=checkbox].form-check-input {
1154
  }
1155
 
1156
  /** copied from bootstrap to override WP admin styles */
1157
- .wp-admin select.custom-select {
1158
- height: calc(1.5em + 0.75rem + 2px);
1159
- padding: 0.375rem 1.75rem 0.375rem 0.75rem;
1160
- }
1161
  .content-options {
1162
  font-size: 14px;
1163
  padding-top: 10px;
@@ -1223,4 +1217,19 @@ table.odp-table tr.audit-cat-2 td {
1223
  }
1224
  table.odp-table tr.audit-cat-3 td {
1225
  background-color: #fffdfd;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1226
  }
4
  body {
5
  overflow-y: scroll;
6
  }
7
+ body.rtl {
8
+ text-align: right;
9
+ }
10
  #wpcontent {
11
  padding: 0;
12
  }
61
  margin-bottom: 50px;
62
  }
63
  #ColumnOptions .form-actions .btn {
64
+ box-shadow: -1px 2px 2px rgba(0, 0, 0, 0.3);
65
  opacity: 0.85;
66
  }
67
  #ColumnOptions .form-actions .btn:hover {
873
  box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.2);
874
  }
875
  #odp-PageHead .nav-link {
876
+ color: #343434;
877
  }
878
  #odp-PageHead .nav-link.active {
879
  font-weight: bold;
1041
  display: none;
1042
  }
1043
 
1044
+ #ScanResultsTabs {
 
1045
  }
1046
+ #ScanResultsTabs ul.nav.nav-tabs a.nav-link {
1047
  color: #666666;
1048
+ font-size: 1.4rem;
 
1049
  }
1050
+ #ScanResultsTabs ul.nav.nav-tabs a.nav-link.active {
 
1051
  color: #333333;
 
 
1052
  }
1053
+ #ScanResultsTabs .card.card-scan_results {
1054
  margin-top: 0;
1055
  }
1056
+ #ScanResultsTabs nav > a.nav-link .badge {
1057
  font-size: 12px;
1058
  }
1059
 
1067
  display: none;
1068
  }
1069
 
 
1070
  .card.card-scan_results {
1071
+ background-color: transparent;
1072
+ border: 0 none;
1073
  }
1074
  .card.card-scan_results .card-header {
1075
  background-color: transparent;
1091
  /*display: none;*/
1092
  }
1093
  .container-scantable {
1094
+ max-height: 650px;
1095
  overflow: auto;
1096
  }
1097
  .container-scantable .tablenav.top,
1152
  }
1153
 
1154
  /** copied from bootstrap to override WP admin styles */
 
 
 
 
1155
  .content-options {
1156
  font-size: 14px;
1157
  padding-top: 10px;
1217
  }
1218
  table.odp-table tr.audit-cat-3 td {
1219
  background-color: #fffdfd;
1220
+ }
1221
+
1222
+ .row-sticky td {
1223
+ background-color: #5a5a5a;
1224
+ position: sticky;
1225
+ top: 0;
1226
+ z-index: 1;
1227
+ }
1228
+ .row-sticky td h5 {
1229
+ margin: 0;
1230
+ color: #ffffff;
1231
+ }
1232
+
1233
+ .introjs-helperLayer {
1234
+ background-color: rgba(91, 228, 56, 0.34);
1235
  }
resources/images/pluginlogo_32x32.png ADDED
Binary file
resources/js/bootstrap4.bundle.js CHANGED
@@ -1,5 +1,5 @@
1
  /*!
2
- * Bootstrap v4.3.1 (https://getbootstrap.com/)
3
  * Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
4
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
5
  */
@@ -7,7 +7,7 @@
7
  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('jquery')) :
8
  typeof define === 'function' && define.amd ? define(['exports', 'jquery'], factory) :
9
  (global = global || self, factory(global.bootstrap = {}, global.jQuery));
10
- }(this, function (exports, $) { 'use strict';
11
 
12
  $ = $ && $.hasOwnProperty('default') ? $['default'] : $;
13
 
@@ -42,20 +42,35 @@
42
  return obj;
43
  }
44
 
45
- function _objectSpread(target) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
46
  for (var i = 1; i < arguments.length; i++) {
47
  var source = arguments[i] != null ? arguments[i] : {};
48
- var ownKeys = Object.keys(source);
49
 
50
- if (typeof Object.getOwnPropertySymbols === 'function') {
51
- ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {
52
- return Object.getOwnPropertyDescriptor(source, sym).enumerable;
53
- }));
 
 
 
 
 
 
54
  }
55
-
56
- ownKeys.forEach(function (key) {
57
- _defineProperty(target, key, source[key]);
58
- });
59
  }
60
 
61
  return target;
@@ -69,7 +84,7 @@
69
 
70
  /**
71
  * --------------------------------------------------------------------------
72
- * Bootstrap (v4.3.1): util.js
73
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
74
  * --------------------------------------------------------------------------
75
  */
@@ -218,8 +233,25 @@
218
  }
219
 
220
  return Util.findShadowRoot(element.parentNode);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
221
  }
222
  };
 
223
  setTransitionEndSupport();
224
 
225
  /**
@@ -229,7 +261,7 @@
229
  */
230
 
231
  var NAME = 'alert';
232
- var VERSION = '4.3.1';
233
  var DATA_KEY = 'bs.alert';
234
  var EVENT_KEY = "." + DATA_KEY;
235
  var DATA_API_KEY = '.data-api';
@@ -246,13 +278,12 @@
246
  ALERT: 'alert',
247
  FADE: 'fade',
248
  SHOW: 'show'
249
- /**
250
- * ------------------------------------------------------------------------
251
- * Class Definition
252
- * ------------------------------------------------------------------------
253
- */
254
-
255
  };
 
 
 
 
 
256
 
257
  var Alert =
258
  /*#__PURE__*/
@@ -394,7 +425,7 @@
394
  */
395
 
396
  var NAME$1 = 'button';
397
- var VERSION$1 = '4.3.1';
398
  var DATA_KEY$1 = 'bs.button';
399
  var EVENT_KEY$1 = "." + DATA_KEY$1;
400
  var DATA_API_KEY$1 = '.data-api';
@@ -406,21 +437,23 @@
406
  };
407
  var Selector$1 = {
408
  DATA_TOGGLE_CARROT: '[data-toggle^="button"]',
409
- DATA_TOGGLE: '[data-toggle="buttons"]',
 
 
410
  INPUT: 'input:not([type="hidden"])',
411
  ACTIVE: '.active',
412
  BUTTON: '.btn'
413
  };
414
  var Event$1 = {
415
  CLICK_DATA_API: "click" + EVENT_KEY$1 + DATA_API_KEY$1,
416
- FOCUS_BLUR_DATA_API: "focus" + EVENT_KEY$1 + DATA_API_KEY$1 + " " + ("blur" + EVENT_KEY$1 + DATA_API_KEY$1)
417
- /**
418
- * ------------------------------------------------------------------------
419
- * Class Definition
420
- * ------------------------------------------------------------------------
421
- */
422
-
423
  };
 
 
 
 
 
424
 
425
  var Button =
426
  /*#__PURE__*/
@@ -436,7 +469,7 @@
436
  _proto.toggle = function toggle() {
437
  var triggerChangeEvent = true;
438
  var addAriaPressed = true;
439
- var rootElement = $(this._element).closest(Selector$1.DATA_TOGGLE)[0];
440
 
441
  if (rootElement) {
442
  var input = this._element.querySelector(Selector$1.INPUT);
@@ -452,13 +485,16 @@
452
  $(activeElement).removeClass(ClassName$1.ACTIVE);
453
  }
454
  }
 
 
 
 
 
 
 
455
  }
456
 
457
  if (triggerChangeEvent) {
458
- if (input.hasAttribute('disabled') || rootElement.hasAttribute('disabled') || input.classList.contains('disabled') || rootElement.classList.contains('disabled')) {
459
- return;
460
- }
461
-
462
  input.checked = !this._element.classList.contains(ClassName$1.ACTIVE);
463
  $(input).trigger('change');
464
  }
@@ -468,12 +504,14 @@
468
  }
469
  }
470
 
471
- if (addAriaPressed) {
472
- this._element.setAttribute('aria-pressed', !this._element.classList.contains(ClassName$1.ACTIVE));
473
- }
 
474
 
475
- if (triggerChangeEvent) {
476
- $(this._element).toggleClass(ClassName$1.ACTIVE);
 
477
  }
478
  };
479
 
@@ -515,18 +553,58 @@
515
 
516
 
517
  $(document).on(Event$1.CLICK_DATA_API, Selector$1.DATA_TOGGLE_CARROT, function (event) {
518
- event.preventDefault();
519
  var button = event.target;
520
 
521
  if (!$(button).hasClass(ClassName$1.BUTTON)) {
522
- button = $(button).closest(Selector$1.BUTTON);
523
  }
524
 
525
- Button._jQueryInterface.call($(button), 'toggle');
 
 
 
 
 
 
 
 
 
 
 
 
526
  }).on(Event$1.FOCUS_BLUR_DATA_API, Selector$1.DATA_TOGGLE_CARROT, function (event) {
527
  var button = $(event.target).closest(Selector$1.BUTTON)[0];
528
  $(button).toggleClass(ClassName$1.FOCUS, /^focus(in)?$/.test(event.type));
529
  });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
530
  /**
531
  * ------------------------------------------------------------------------
532
  * jQuery
@@ -548,7 +626,7 @@
548
  */
549
 
550
  var NAME$2 = 'carousel';
551
- var VERSION$2 = '4.3.1';
552
  var DATA_KEY$2 = 'bs.carousel';
553
  var EVENT_KEY$2 = "." + DATA_KEY$2;
554
  var DATA_API_KEY$2 = '.data-api';
@@ -621,13 +699,12 @@
621
  var PointerType = {
622
  TOUCH: 'touch',
623
  PEN: 'pen'
624
- /**
625
- * ------------------------------------------------------------------------
626
- * Class Definition
627
- * ------------------------------------------------------------------------
628
- */
629
-
630
  };
 
 
 
 
 
631
 
632
  var Carousel =
633
  /*#__PURE__*/
@@ -747,7 +824,7 @@
747
  ;
748
 
749
  _proto._getConfig = function _getConfig(config) {
750
- config = _objectSpread({}, Default, config);
751
  Util.typeCheckConfig(NAME$2, config, DefaultType);
752
  return config;
753
  };
@@ -759,7 +836,8 @@
759
  return;
760
  }
761
 
762
- var direction = absDeltax / this.touchDeltaX; // swipe left
 
763
 
764
  if (direction > 0) {
765
  this.prev();
@@ -885,8 +963,6 @@
885
  event.preventDefault();
886
  this.next();
887
  break;
888
-
889
- default:
890
  }
891
  };
892
 
@@ -1038,10 +1114,10 @@
1038
  return this.each(function () {
1039
  var data = $(this).data(DATA_KEY$2);
1040
 
1041
- var _config = _objectSpread({}, Default, $(this).data());
1042
 
1043
  if (typeof config === 'object') {
1044
- _config = _objectSpread({}, _config, config);
1045
  }
1046
 
1047
  var action = typeof config === 'string' ? config : _config.slide;
@@ -1079,7 +1155,7 @@
1079
  return;
1080
  }
1081
 
1082
- var config = _objectSpread({}, $(target).data(), $(this).data());
1083
 
1084
  var slideIndex = this.getAttribute('data-slide-to');
1085
 
@@ -1148,7 +1224,7 @@
1148
  */
1149
 
1150
  var NAME$3 = 'collapse';
1151
- var VERSION$3 = '4.3.1';
1152
  var DATA_KEY$3 = 'bs.collapse';
1153
  var EVENT_KEY$3 = "." + DATA_KEY$3;
1154
  var DATA_API_KEY$3 = '.data-api';
@@ -1181,13 +1257,12 @@
1181
  var Selector$3 = {
1182
  ACTIVES: '.show, .collapsing',
1183
  DATA_TOGGLE: '[data-toggle="collapse"]'
1184
- /**
1185
- * ------------------------------------------------------------------------
1186
- * Class Definition
1187
- * ------------------------------------------------------------------------
1188
- */
1189
-
1190
  };
 
 
 
 
 
1191
 
1192
  var Collapse =
1193
  /*#__PURE__*/
@@ -1374,7 +1449,7 @@
1374
  ;
1375
 
1376
  _proto._getConfig = function _getConfig(config) {
1377
- config = _objectSpread({}, Default$1, config);
1378
  config.toggle = Boolean(config.toggle); // Coerce string values
1379
 
1380
  Util.typeCheckConfig(NAME$3, config, DefaultType$1);
@@ -1428,7 +1503,7 @@
1428
  var $this = $(this);
1429
  var data = $this.data(DATA_KEY$3);
1430
 
1431
- var _config = _objectSpread({}, Default$1, $this.data(), typeof config === 'object' && config ? config : {});
1432
 
1433
  if (!data && _config.toggle && /show|hide/.test(config)) {
1434
  _config.toggle = false;
@@ -1503,7 +1578,7 @@
1503
 
1504
  /**!
1505
  * @fileOverview Kickass library to create and place poppers near their reference elements.
1506
- * @version 1.14.7
1507
  * @license
1508
  * Copyright (c) 2016 Federico Zivolo and contributors
1509
  *
@@ -1525,16 +1600,17 @@
1525
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
1526
  * SOFTWARE.
1527
  */
1528
- var isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined';
1529
-
1530
- var longerTimeoutBrowsers = ['Edge', 'Trident', 'Firefox'];
1531
- var timeoutDuration = 0;
1532
- for (var i = 0; i < longerTimeoutBrowsers.length; i += 1) {
1533
- if (isBrowser && navigator.userAgent.indexOf(longerTimeoutBrowsers[i]) >= 0) {
1534
- timeoutDuration = 1;
1535
- break;
1536
  }
1537
- }
 
1538
 
1539
  function microtaskDebounce(fn) {
1540
  var called = false;
@@ -1654,6 +1730,17 @@
1654
  return getScrollParent(getParentNode(element));
1655
  }
1656
 
 
 
 
 
 
 
 
 
 
 
 
1657
  var isIE11 = isBrowser && !!(window.MSInputMethodContext && document.documentMode);
1658
  var isIE10 = isBrowser && /MSIE 10/.test(navigator.userAgent);
1659
 
@@ -1962,8 +2049,8 @@
1962
 
1963
  // subtract scrollbar size from sizes
1964
  var sizes = element.nodeName === 'HTML' ? getWindowSizes(element.ownerDocument) : {};
1965
- var width = sizes.width || element.clientWidth || result.right - result.left;
1966
- var height = sizes.height || element.clientHeight || result.bottom - result.top;
1967
 
1968
  var horizScrollbar = element.offsetWidth - width;
1969
  var vertScrollbar = element.offsetHeight - height;
@@ -2115,7 +2202,7 @@
2115
  // NOTE: 1 DOM access here
2116
 
2117
  var boundaries = { top: 0, left: 0 };
2118
- var offsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, reference);
2119
 
2120
  // Handle viewport case
2121
  if (boundariesElement === 'viewport') {
@@ -2243,7 +2330,7 @@
2243
  function getReferenceOffsets(state, popper, reference) {
2244
  var fixedPosition = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
2245
 
2246
- var commonOffsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, reference);
2247
  return getOffsetRectRelativeToArbitraryNode(reference, commonOffsetParent, fixedPosition);
2248
  }
2249
 
@@ -2505,7 +2592,7 @@
2505
 
2506
  this.disableEventListeners();
2507
 
2508
- // remove the popper if user explicity asked for the deletion on destroy
2509
  // do not use `remove` because IE11 doesn't support it
2510
  if (this.options.removeOnDestroy) {
2511
  this.popper.parentNode.removeChild(this.popper);
@@ -3107,7 +3194,14 @@
3107
 
3108
  // flip the variation if required
3109
  var isVertical = ['top', 'bottom'].indexOf(placement) !== -1;
3110
- var flippedVariation = !!options.flipVariations && (isVertical && variation === 'start' && overflowsLeft || isVertical && variation === 'end' && overflowsRight || !isVertical && variation === 'start' && overflowsTop || !isVertical && variation === 'end' && overflowsBottom);
 
 
 
 
 
 
 
3111
 
3112
  if (overlapsRef || overflowsBoundaries || flippedVariation) {
3113
  // this boolean to detect any flip loop
@@ -3714,7 +3808,23 @@
3714
  * The popper will never be placed outside of the defined boundaries
3715
  * (except if `keepTogether` is enabled)
3716
  */
3717
- boundariesElement: 'viewport'
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3718
  },
3719
 
3720
  /**
@@ -3931,8 +4041,8 @@
3931
  /**
3932
  * Creates a new Popper.js instance.
3933
  * @class Popper
3934
- * @param {HTMLElement|referenceObject} reference - The reference element used to position the popper
3935
- * @param {HTMLElement} popper - The HTML element used as the popper
3936
  * @param {Object} options - Your custom options to override the ones defined in [Defaults](#defaults)
3937
  * @return {Object} instance - The generated Popper.js instance
3938
  */
@@ -4087,7 +4197,7 @@
4087
  */
4088
 
4089
  var NAME$4 = 'dropdown';
4090
- var VERSION$4 = '4.3.1';
4091
  var DATA_KEY$4 = 'bs.dropdown';
4092
  var EVENT_KEY$4 = "." + DATA_KEY$4;
4093
  var DATA_API_KEY$4 = '.data-api';
@@ -4147,21 +4257,22 @@
4147
  flip: true,
4148
  boundary: 'scrollParent',
4149
  reference: 'toggle',
4150
- display: 'dynamic'
 
4151
  };
4152
  var DefaultType$2 = {
4153
  offset: '(number|string|function)',
4154
  flip: 'boolean',
4155
  boundary: '(string|element)',
4156
  reference: '(string|element)',
4157
- display: 'string'
4158
- /**
4159
- * ------------------------------------------------------------------------
4160
- * Class Definition
4161
- * ------------------------------------------------------------------------
4162
- */
4163
-
4164
  };
 
 
 
 
 
4165
 
4166
  var Dropdown =
4167
  /*#__PURE__*/
@@ -4185,8 +4296,6 @@
4185
  return;
4186
  }
4187
 
4188
- var parent = Dropdown._getParentFromElement(this._element);
4189
-
4190
  var isActive = $(this._menu).hasClass(ClassName$4.SHOW);
4191
 
4192
  Dropdown._clearMenus();
@@ -4195,10 +4304,25 @@
4195
  return;
4196
  }
4197
 
 
 
 
 
 
 
 
 
 
 
 
 
4198
  var relatedTarget = {
4199
  relatedTarget: this._element
4200
  };
4201
  var showEvent = $.Event(Event$4.SHOW, relatedTarget);
 
 
 
4202
  $(parent).trigger(showEvent);
4203
 
4204
  if (showEvent.isDefaultPrevented()) {
@@ -4206,7 +4330,7 @@
4206
  } // Disable totally Popper.js for Dropdown in Navbar
4207
 
4208
 
4209
- if (!this._inNavbar) {
4210
  /**
4211
  * Check for Popper dependency
4212
  * Popper - https://popper.js.org
@@ -4253,28 +4377,6 @@
4253
  $(parent).toggleClass(ClassName$4.SHOW).trigger($.Event(Event$4.SHOWN, relatedTarget));
4254
  };
4255
 
4256
- _proto.show = function show() {
4257
- if (this._element.disabled || $(this._element).hasClass(ClassName$4.DISABLED) || $(this._menu).hasClass(ClassName$4.SHOW)) {
4258
- return;
4259
- }
4260
-
4261
- var relatedTarget = {
4262
- relatedTarget: this._element
4263
- };
4264
- var showEvent = $.Event(Event$4.SHOW, relatedTarget);
4265
-
4266
- var parent = Dropdown._getParentFromElement(this._element);
4267
-
4268
- $(parent).trigger(showEvent);
4269
-
4270
- if (showEvent.isDefaultPrevented()) {
4271
- return;
4272
- }
4273
-
4274
- $(this._menu).toggleClass(ClassName$4.SHOW);
4275
- $(parent).toggleClass(ClassName$4.SHOW).trigger($.Event(Event$4.SHOWN, relatedTarget));
4276
- };
4277
-
4278
  _proto.hide = function hide() {
4279
  if (this._element.disabled || $(this._element).hasClass(ClassName$4.DISABLED) || !$(this._menu).hasClass(ClassName$4.SHOW)) {
4280
  return;
@@ -4293,6 +4395,10 @@
4293
  return;
4294
  }
4295
 
 
 
 
 
4296
  $(this._menu).toggleClass(ClassName$4.SHOW);
4297
  $(parent).toggleClass(ClassName$4.SHOW).trigger($.Event(Event$4.HIDDEN, relatedTarget));
4298
  };
@@ -4331,7 +4437,7 @@
4331
  };
4332
 
4333
  _proto._getConfig = function _getConfig(config) {
4334
- config = _objectSpread({}, this.constructor.Default, $(this._element).data(), config);
4335
  Util.typeCheckConfig(NAME$4, config, this.constructor.DefaultType);
4336
  return config;
4337
  };
@@ -4380,7 +4486,7 @@
4380
 
4381
  if (typeof this._config.offset === 'function') {
4382
  offset.fn = function (data) {
4383
- data.offsets = _objectSpread({}, data.offsets, _this2._config.offset(data.offsets, _this2._element) || {});
4384
  return data;
4385
  };
4386
  } else {
@@ -4401,9 +4507,8 @@
4401
  preventOverflow: {
4402
  boundariesElement: this._config.boundary
4403
  }
4404
- } // Disable Popper.js if we have a static display
4405
-
4406
- };
4407
 
4408
  if (this._config.display === 'static') {
4409
  popperConfig.modifiers.applyStyle = {
@@ -4411,7 +4516,7 @@
4411
  };
4412
  }
4413
 
4414
- return popperConfig;
4415
  } // Static
4416
  ;
4417
 
@@ -4483,6 +4588,11 @@
4483
  }
4484
 
4485
  toggles[i].setAttribute('aria-expanded', 'false');
 
 
 
 
 
4486
  $(dropdownMenu).removeClass(ClassName$4.SHOW);
4487
  $(parent).removeClass(ClassName$4.SHOW).trigger($.Event(Event$4.HIDDEN, relatedTarget));
4488
  }
@@ -4523,6 +4633,10 @@
4523
 
4524
  var isActive = $(parent).hasClass(ClassName$4.SHOW);
4525
 
 
 
 
 
4526
  if (!isActive || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {
4527
  if (event.which === ESCAPE_KEYCODE) {
4528
  var toggle = parent.querySelector(Selector$4.DATA_TOGGLE);
@@ -4533,7 +4647,9 @@
4533
  return;
4534
  }
4535
 
4536
- var items = [].slice.call(parent.querySelectorAll(Selector$4.VISIBLE_ITEMS));
 
 
4537
 
4538
  if (items.length === 0) {
4539
  return;
@@ -4613,7 +4729,7 @@
4613
  */
4614
 
4615
  var NAME$5 = 'modal';
4616
- var VERSION$5 = '4.3.1';
4617
  var DATA_KEY$5 = 'bs.modal';
4618
  var EVENT_KEY$5 = "." + DATA_KEY$5;
4619
  var DATA_API_KEY$5 = '.data-api';
@@ -4634,6 +4750,7 @@
4634
  };
4635
  var Event$5 = {
4636
  HIDE: "hide" + EVENT_KEY$5,
 
4637
  HIDDEN: "hidden" + EVENT_KEY$5,
4638
  SHOW: "show" + EVENT_KEY$5,
4639
  SHOWN: "shown" + EVENT_KEY$5,
@@ -4651,7 +4768,8 @@
4651
  BACKDROP: 'modal-backdrop',
4652
  OPEN: 'modal-open',
4653
  FADE: 'fade',
4654
- SHOW: 'show'
 
4655
  };
4656
  var Selector$5 = {
4657
  DIALOG: '.modal-dialog',
@@ -4660,13 +4778,12 @@
4660
  DATA_DISMISS: '[data-dismiss="modal"]',
4661
  FIXED_CONTENT: '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top',
4662
  STICKY_CONTENT: '.sticky-top'
4663
- /**
4664
- * ------------------------------------------------------------------------
4665
- * Class Definition
4666
- * ------------------------------------------------------------------------
4667
- */
4668
-
4669
  };
 
 
 
 
 
4670
 
4671
  var Modal =
4672
  /*#__PURE__*/
@@ -4812,15 +4929,40 @@
4812
  ;
4813
 
4814
  _proto._getConfig = function _getConfig(config) {
4815
- config = _objectSpread({}, Default$3, config);
4816
  Util.typeCheckConfig(NAME$5, config, DefaultType$3);
4817
  return config;
4818
  };
4819
 
4820
- _proto._showElement = function _showElement(relatedTarget) {
4821
  var _this3 = this;
4822
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4823
  var transition = $(this._element).hasClass(ClassName$5.FADE);
 
4824
 
4825
  if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {
4826
  // Don't move modal's DOM position
@@ -4833,8 +4975,8 @@
4833
 
4834
  this._element.setAttribute('aria-modal', true);
4835
 
4836
- if ($(this._dialog).hasClass(ClassName$5.SCROLLABLE)) {
4837
- this._dialog.querySelector(Selector$5.MODAL_BODY).scrollTop = 0;
4838
  } else {
4839
  this._element.scrollTop = 0;
4840
  }
@@ -4854,12 +4996,12 @@
4854
  });
4855
 
4856
  var transitionComplete = function transitionComplete() {
4857
- if (_this3._config.focus) {
4858
- _this3._element.focus();
4859
  }
4860
 
4861
- _this3._isTransitioning = false;
4862
- $(_this3._element).trigger(shownEvent);
4863
  };
4864
 
4865
  if (transition) {
@@ -4871,25 +5013,23 @@
4871
  };
4872
 
4873
  _proto._enforceFocus = function _enforceFocus() {
4874
- var _this4 = this;
4875
 
4876
  $(document).off(Event$5.FOCUSIN) // Guard against infinite focus loop
4877
  .on(Event$5.FOCUSIN, function (event) {
4878
- if (document !== event.target && _this4._element !== event.target && $(_this4._element).has(event.target).length === 0) {
4879
- _this4._element.focus();
4880
  }
4881
  });
4882
  };
4883
 
4884
  _proto._setEscapeEvent = function _setEscapeEvent() {
4885
- var _this5 = this;
4886
 
4887
  if (this._isShown && this._config.keyboard) {
4888
  $(this._element).on(Event$5.KEYDOWN_DISMISS, function (event) {
4889
  if (event.which === ESCAPE_KEYCODE$1) {
4890
- event.preventDefault();
4891
-
4892
- _this5.hide();
4893
  }
4894
  });
4895
  } else if (!this._isShown) {
@@ -4898,11 +5038,11 @@
4898
  };
4899
 
4900
  _proto._setResizeEvent = function _setResizeEvent() {
4901
- var _this6 = this;
4902
 
4903
  if (this._isShown) {
4904
  $(window).on(Event$5.RESIZE, function (event) {
4905
- return _this6.handleUpdate(event);
4906
  });
4907
  } else {
4908
  $(window).off(Event$5.RESIZE);
@@ -4910,7 +5050,7 @@
4910
  };
4911
 
4912
  _proto._hideModal = function _hideModal() {
4913
- var _this7 = this;
4914
 
4915
  this._element.style.display = 'none';
4916
 
@@ -4923,11 +5063,11 @@
4923
  this._showBackdrop(function () {
4924
  $(document.body).removeClass(ClassName$5.OPEN);
4925
 
4926
- _this7._resetAdjustments();
4927
 
4928
- _this7._resetScrollbar();
4929
 
4930
- $(_this7._element).trigger(Event$5.HIDDEN);
4931
  });
4932
  };
4933
 
@@ -4939,7 +5079,7 @@
4939
  };
4940
 
4941
  _proto._showBackdrop = function _showBackdrop(callback) {
4942
- var _this8 = this;
4943
 
4944
  var animate = $(this._element).hasClass(ClassName$5.FADE) ? ClassName$5.FADE : '';
4945
 
@@ -4953,8 +5093,8 @@
4953
 
4954
  $(this._backdrop).appendTo(document.body);
4955
  $(this._element).on(Event$5.CLICK_DISMISS, function (event) {
4956
- if (_this8._ignoreBackdropClick) {
4957
- _this8._ignoreBackdropClick = false;
4958
  return;
4959
  }
4960
 
@@ -4962,11 +5102,7 @@
4962
  return;
4963
  }
4964
 
4965
- if (_this8._config.backdrop === 'static') {
4966
- _this8._element.focus();
4967
- } else {
4968
- _this8.hide();
4969
- }
4970
  });
4971
 
4972
  if (animate) {
@@ -4990,7 +5126,7 @@
4990
  $(this._backdrop).removeClass(ClassName$5.SHOW);
4991
 
4992
  var callbackRemove = function callbackRemove() {
4993
- _this8._removeBackdrop();
4994
 
4995
  if (callback) {
4996
  callback();
@@ -5037,7 +5173,7 @@
5037
  };
5038
 
5039
  _proto._setScrollbar = function _setScrollbar() {
5040
- var _this9 = this;
5041
 
5042
  if (this._isBodyOverflowing) {
5043
  // Note: DOMNode.style.paddingRight returns the actual value or '' if not set
@@ -5048,13 +5184,13 @@
5048
  $(fixedContent).each(function (index, element) {
5049
  var actualPadding = element.style.paddingRight;
5050
  var calculatedPadding = $(element).css('padding-right');
5051
- $(element).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + _this9._scrollbarWidth + "px");
5052
  }); // Adjust sticky content margin
5053
 
5054
  $(stickyContent).each(function (index, element) {
5055
  var actualMargin = element.style.marginRight;
5056
  var calculatedMargin = $(element).css('margin-right');
5057
- $(element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) - _this9._scrollbarWidth + "px");
5058
  }); // Adjust body padding
5059
 
5060
  var actualPadding = document.body.style.paddingRight;
@@ -5103,7 +5239,7 @@
5103
  return this.each(function () {
5104
  var data = $(this).data(DATA_KEY$5);
5105
 
5106
- var _config = _objectSpread({}, Default$3, $(this).data(), typeof config === 'object' && config ? config : {});
5107
 
5108
  if (!data) {
5109
  data = new Modal(this, _config);
@@ -5144,7 +5280,7 @@
5144
 
5145
 
5146
  $(document).on(Event$5.CLICK_DATA_API, Selector$5.DATA_TOGGLE, function (event) {
5147
- var _this10 = this;
5148
 
5149
  var target;
5150
  var selector = Util.getSelectorFromElement(this);
@@ -5153,7 +5289,7 @@
5153
  target = document.querySelector(selector);
5154
  }
5155
 
5156
- var config = $(target).data(DATA_KEY$5) ? 'toggle' : _objectSpread({}, $(target).data(), $(this).data());
5157
 
5158
  if (this.tagName === 'A' || this.tagName === 'AREA') {
5159
  event.preventDefault();
@@ -5166,8 +5302,8 @@
5166
  }
5167
 
5168
  $target.one(Event$5.HIDDEN, function () {
5169
- if ($(_this10).is(':visible')) {
5170
- _this10.focus();
5171
  }
5172
  });
5173
  });
@@ -5190,7 +5326,7 @@
5190
 
5191
  /**
5192
  * --------------------------------------------------------------------------
5193
- * Bootstrap (v4.3.1): tools/sanitizer.js
5194
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
5195
  * --------------------------------------------------------------------------
5196
  */
@@ -5228,13 +5364,13 @@
5228
  strong: [],
5229
  u: [],
5230
  ul: []
5231
- /**
5232
- * A pattern that recognizes a commonly useful subset of URLs that are safe.
5233
- *
5234
- * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts
5235
- */
5236
-
5237
  };
 
 
 
 
 
 
5238
  var SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi;
5239
  /**
5240
  * A pattern that matches safe data URLs. Only matches image, video and audio types.
@@ -5301,7 +5437,7 @@
5301
  };
5302
 
5303
  for (var i = 0, len = elements.length; i < len; i++) {
5304
- var _ret = _loop(i, len);
5305
 
5306
  if (_ret === "continue") continue;
5307
  }
@@ -5316,7 +5452,7 @@
5316
  */
5317
 
5318
  var NAME$6 = 'tooltip';
5319
- var VERSION$6 = '4.3.1';
5320
  var DATA_KEY$6 = 'bs.tooltip';
5321
  var EVENT_KEY$6 = "." + DATA_KEY$6;
5322
  var JQUERY_NO_CONFLICT$6 = $.fn[NAME$6];
@@ -5338,7 +5474,8 @@
5338
  boundary: '(string|element)',
5339
  sanitize: 'boolean',
5340
  sanitizeFn: '(null|function)',
5341
- whiteList: 'object'
 
5342
  };
5343
  var AttachmentMap$1 = {
5344
  AUTO: 'auto',
@@ -5362,7 +5499,8 @@
5362
  boundary: 'scrollParent',
5363
  sanitize: true,
5364
  sanitizeFn: null,
5365
- whiteList: DefaultWhitelist
 
5366
  };
5367
  var HoverState = {
5368
  SHOW: 'show',
@@ -5394,22 +5532,17 @@
5394
  FOCUS: 'focus',
5395
  CLICK: 'click',
5396
  MANUAL: 'manual'
5397
- /**
5398
- * ------------------------------------------------------------------------
5399
- * Class Definition
5400
- * ------------------------------------------------------------------------
5401
- */
5402
-
5403
  };
 
 
 
 
 
5404
 
5405
  var Tooltip =
5406
  /*#__PURE__*/
5407
  function () {
5408
  function Tooltip(element, config) {
5409
- /**
5410
- * Check for Popper dependency
5411
- * Popper - https://popper.js.org
5412
- */
5413
  if (typeof Popper === 'undefined') {
5414
  throw new TypeError('Bootstrap\'s tooltips require Popper.js (https://popper.js.org/)');
5415
  } // private
@@ -5480,7 +5613,7 @@
5480
  clearTimeout(this._timeout);
5481
  $.removeData(this.element, this.constructor.DATA_KEY);
5482
  $(this.element).off(this.constructor.EVENT_KEY);
5483
- $(this.element).closest('.modal').off('hide.bs.modal');
5484
 
5485
  if (this.tip) {
5486
  $(this.tip).remove();
@@ -5491,7 +5624,7 @@
5491
  this._hoverState = null;
5492
  this._activeTrigger = null;
5493
 
5494
- if (this._popper !== null) {
5495
  this._popper.destroy();
5496
  }
5497
 
@@ -5544,29 +5677,7 @@
5544
  }
5545
 
5546
  $(this.element).trigger(this.constructor.Event.INSERTED);
5547
- this._popper = new Popper(this.element, tip, {
5548
- placement: attachment,
5549
- modifiers: {
5550
- offset: this._getOffset(),
5551
- flip: {
5552
- behavior: this.config.fallbackPlacement
5553
- },
5554
- arrow: {
5555
- element: Selector$6.ARROW
5556
- },
5557
- preventOverflow: {
5558
- boundariesElement: this.config.boundary
5559
- }
5560
- },
5561
- onCreate: function onCreate(data) {
5562
- if (data.originalPlacement !== data.placement) {
5563
- _this._handlePopperPlacementChange(data);
5564
- }
5565
- },
5566
- onUpdate: function onUpdate(data) {
5567
- return _this._handlePopperPlacementChange(data);
5568
- }
5569
- });
5570
  $(tip).addClass(ClassName$6.SHOW); // If this is a touch-enabled device we add extra
5571
  // empty mouseover listeners to the body's immediate children;
5572
  // only needed because of broken event delegation on iOS
@@ -5714,14 +5825,43 @@
5714
  } // Private
5715
  ;
5716
 
5717
- _proto._getOffset = function _getOffset() {
5718
  var _this3 = this;
5719
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5720
  var offset = {};
5721
 
5722
  if (typeof this.config.offset === 'function') {
5723
  offset.fn = function (data) {
5724
- data.offsets = _objectSpread({}, data.offsets, _this3.config.offset(data.offsets, _this3.element) || {});
5725
  return data;
5726
  };
5727
  } else {
@@ -5748,32 +5888,35 @@
5748
  };
5749
 
5750
  _proto._setListeners = function _setListeners() {
5751
- var _this4 = this;
5752
 
5753
  var triggers = this.config.trigger.split(' ');
5754
  triggers.forEach(function (trigger) {
5755
  if (trigger === 'click') {
5756
- $(_this4.element).on(_this4.constructor.Event.CLICK, _this4.config.selector, function (event) {
5757
- return _this4.toggle(event);
5758
  });
5759
  } else if (trigger !== Trigger.MANUAL) {
5760
- var eventIn = trigger === Trigger.HOVER ? _this4.constructor.Event.MOUSEENTER : _this4.constructor.Event.FOCUSIN;
5761
- var eventOut = trigger === Trigger.HOVER ? _this4.constructor.Event.MOUSELEAVE : _this4.constructor.Event.FOCUSOUT;
5762
- $(_this4.element).on(eventIn, _this4.config.selector, function (event) {
5763
- return _this4._enter(event);
5764
- }).on(eventOut, _this4.config.selector, function (event) {
5765
- return _this4._leave(event);
5766
  });
5767
  }
5768
  });
5769
- $(this.element).closest('.modal').on('hide.bs.modal', function () {
5770
- if (_this4.element) {
5771
- _this4.hide();
 
5772
  }
5773
- });
 
 
5774
 
5775
  if (this.config.selector) {
5776
- this.config = _objectSpread({}, this.config, {
5777
  trigger: 'manual',
5778
  selector: ''
5779
  });
@@ -5873,7 +6016,7 @@
5873
  delete dataAttributes[dataAttr];
5874
  }
5875
  });
5876
- config = _objectSpread({}, this.constructor.Default, dataAttributes, typeof config === 'object' && config ? config : {});
5877
 
5878
  if (typeof config.delay === 'number') {
5879
  config.delay = {
@@ -6033,21 +6176,21 @@
6033
  */
6034
 
6035
  var NAME$7 = 'popover';
6036
- var VERSION$7 = '4.3.1';
6037
  var DATA_KEY$7 = 'bs.popover';
6038
  var EVENT_KEY$7 = "." + DATA_KEY$7;
6039
  var JQUERY_NO_CONFLICT$7 = $.fn[NAME$7];
6040
  var CLASS_PREFIX$1 = 'bs-popover';
6041
  var BSCLS_PREFIX_REGEX$1 = new RegExp("(^|\\s)" + CLASS_PREFIX$1 + "\\S+", 'g');
6042
 
6043
- var Default$5 = _objectSpread({}, Tooltip.Default, {
6044
  placement: 'right',
6045
  trigger: 'click',
6046
  content: '',
6047
  template: '<div class="popover" role="tooltip">' + '<div class="arrow"></div>' + '<h3 class="popover-header"></h3>' + '<div class="popover-body"></div></div>'
6048
  });
6049
 
6050
- var DefaultType$5 = _objectSpread({}, Tooltip.DefaultType, {
6051
  content: '(string|element|function)'
6052
  });
6053
 
@@ -6070,13 +6213,12 @@
6070
  FOCUSOUT: "focusout" + EVENT_KEY$7,
6071
  MOUSEENTER: "mouseenter" + EVENT_KEY$7,
6072
  MOUSELEAVE: "mouseleave" + EVENT_KEY$7
6073
- /**
6074
- * ------------------------------------------------------------------------
6075
- * Class Definition
6076
- * ------------------------------------------------------------------------
6077
- */
6078
-
6079
  };
 
 
 
 
 
6080
 
6081
  var Popover =
6082
  /*#__PURE__*/
@@ -6220,7 +6362,7 @@
6220
  */
6221
 
6222
  var NAME$8 = 'scrollspy';
6223
- var VERSION$8 = '4.3.1';
6224
  var DATA_KEY$8 = 'bs.scrollspy';
6225
  var EVENT_KEY$8 = "." + DATA_KEY$8;
6226
  var DATA_API_KEY$6 = '.data-api';
@@ -6259,13 +6401,12 @@
6259
  var OffsetMethod = {
6260
  OFFSET: 'offset',
6261
  POSITION: 'position'
6262
- /**
6263
- * ------------------------------------------------------------------------
6264
- * Class Definition
6265
- * ------------------------------------------------------------------------
6266
- */
6267
-
6268
  };
 
 
 
 
 
6269
 
6270
  var ScrollSpy =
6271
  /*#__PURE__*/
@@ -6347,7 +6488,7 @@
6347
  ;
6348
 
6349
  _proto._getConfig = function _getConfig(config) {
6350
- config = _objectSpread({}, Default$6, typeof config === 'object' && config ? config : {});
6351
 
6352
  if (typeof config.target !== 'string') {
6353
  var id = $(config.target).attr('id');
@@ -6527,7 +6668,7 @@
6527
  */
6528
 
6529
  var NAME$9 = 'tab';
6530
- var VERSION$9 = '4.3.1';
6531
  var DATA_KEY$9 = 'bs.tab';
6532
  var EVENT_KEY$9 = "." + DATA_KEY$9;
6533
  var DATA_API_KEY$7 = '.data-api';
@@ -6554,13 +6695,12 @@
6554
  DATA_TOGGLE: '[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',
6555
  DROPDOWN_TOGGLE: '.dropdown-toggle',
6556
  DROPDOWN_ACTIVE_CHILD: '> .dropdown-menu .active'
6557
- /**
6558
- * ------------------------------------------------------------------------
6559
- * Class Definition
6560
- * ------------------------------------------------------------------------
6561
- */
6562
-
6563
  };
 
 
 
 
 
6564
 
6565
  var Tab =
6566
  /*#__PURE__*/
@@ -6762,7 +6902,7 @@
6762
  */
6763
 
6764
  var NAME$a = 'toast';
6765
- var VERSION$a = '4.3.1';
6766
  var DATA_KEY$a = 'bs.toast';
6767
  var EVENT_KEY$a = "." + DATA_KEY$a;
6768
  var JQUERY_NO_CONFLICT$a = $.fn[NAME$a];
@@ -6791,13 +6931,12 @@
6791
  };
6792
  var Selector$a = {
6793
  DATA_DISMISS: '[data-dismiss="toast"]'
6794
- /**
6795
- * ------------------------------------------------------------------------
6796
- * Class Definition
6797
- * ------------------------------------------------------------------------
6798
- */
6799
-
6800
  };
 
 
 
 
 
6801
 
6802
  var Toast =
6803
  /*#__PURE__*/
@@ -6817,7 +6956,12 @@
6817
  _proto.show = function show() {
6818
  var _this = this;
6819
 
6820
- $(this._element).trigger(Event$a.SHOW);
 
 
 
 
 
6821
 
6822
  if (this._config.animation) {
6823
  this._element.classList.add(ClassName$a.FADE);
@@ -6831,12 +6975,16 @@
6831
  $(_this._element).trigger(Event$a.SHOWN);
6832
 
6833
  if (_this._config.autohide) {
6834
- _this.hide();
 
 
6835
  }
6836
  };
6837
 
6838
  this._element.classList.remove(ClassName$a.HIDE);
6839
 
 
 
6840
  this._element.classList.add(ClassName$a.SHOWING);
6841
 
6842
  if (this._config.animation) {
@@ -6847,22 +6995,19 @@
6847
  }
6848
  };
6849
 
6850
- _proto.hide = function hide(withoutTimeout) {
6851
- var _this2 = this;
6852
-
6853
  if (!this._element.classList.contains(ClassName$a.SHOW)) {
6854
  return;
6855
  }
6856
 
6857
- $(this._element).trigger(Event$a.HIDE);
 
6858
 
6859
- if (withoutTimeout) {
6860
- this._close();
6861
- } else {
6862
- this._timeout = setTimeout(function () {
6863
- _this2._close();
6864
- }, this._config.delay);
6865
  }
 
 
6866
  };
6867
 
6868
  _proto.dispose = function dispose() {
@@ -6881,26 +7026,26 @@
6881
  ;
6882
 
6883
  _proto._getConfig = function _getConfig(config) {
6884
- config = _objectSpread({}, Default$7, $(this._element).data(), typeof config === 'object' && config ? config : {});
6885
  Util.typeCheckConfig(NAME$a, config, this.constructor.DefaultType);
6886
  return config;
6887
  };
6888
 
6889
  _proto._setListeners = function _setListeners() {
6890
- var _this3 = this;
6891
 
6892
  $(this._element).on(Event$a.CLICK_DISMISS, Selector$a.DATA_DISMISS, function () {
6893
- return _this3.hide(true);
6894
  });
6895
  };
6896
 
6897
  _proto._close = function _close() {
6898
- var _this4 = this;
6899
 
6900
  var complete = function complete() {
6901
- _this4._element.classList.add(ClassName$a.HIDE);
6902
 
6903
- $(_this4._element).trigger(Event$a.HIDDEN);
6904
  };
6905
 
6906
  this._element.classList.remove(ClassName$a.SHOW);
@@ -6970,31 +7115,6 @@
6970
  return Toast._jQueryInterface;
6971
  };
6972
 
6973
- /**
6974
- * --------------------------------------------------------------------------
6975
- * Bootstrap (v4.3.1): index.js
6976
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
6977
- * --------------------------------------------------------------------------
6978
- */
6979
-
6980
- (function () {
6981
- if (typeof $ === 'undefined') {
6982
- throw new TypeError('Bootstrap\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\'s JavaScript.');
6983
- }
6984
-
6985
- var version = $.fn.jquery.split(' ')[0].split('.');
6986
- var minMajor = 1;
6987
- var ltMajor = 2;
6988
- var minMinor = 9;
6989
- var minPatch = 1;
6990
- var maxMajor = 4;
6991
-
6992
- if (version[0] < ltMajor && version[1] < minMinor || version[0] === minMajor && version[1] === minMinor && version[2] < minPatch || version[0] >= maxMajor) {
6993
- throw new Error('Bootstrap\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0');
6994
- }
6995
- })();
6996
-
6997
- exports.Util = Util;
6998
  exports.Alert = Alert;
6999
  exports.Button = Button;
7000
  exports.Carousel = Carousel;
@@ -7006,8 +7126,9 @@
7006
  exports.Tab = Tab;
7007
  exports.Toast = Toast;
7008
  exports.Tooltip = Tooltip;
 
7009
 
7010
  Object.defineProperty(exports, '__esModule', { value: true });
7011
 
7012
- }));
7013
  //# sourceMappingURL=bootstrap.bundle.js.map
1
  /*!
2
+ * Bootstrap v4.4.1 (https://getbootstrap.com/)
3
  * Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
4
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
5
  */
7
  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('jquery')) :
8
  typeof define === 'function' && define.amd ? define(['exports', 'jquery'], factory) :
9
  (global = global || self, factory(global.bootstrap = {}, global.jQuery));
10
+ }(this, (function (exports, $) { 'use strict';
11
 
12
  $ = $ && $.hasOwnProperty('default') ? $['default'] : $;
13
 
42
  return obj;
43
  }
44
 
45
+ function ownKeys(object, enumerableOnly) {
46
+ var keys = Object.keys(object);
47
+
48
+ if (Object.getOwnPropertySymbols) {
49
+ var symbols = Object.getOwnPropertySymbols(object);
50
+ if (enumerableOnly) symbols = symbols.filter(function (sym) {
51
+ return Object.getOwnPropertyDescriptor(object, sym).enumerable;
52
+ });
53
+ keys.push.apply(keys, symbols);
54
+ }
55
+
56
+ return keys;
57
+ }
58
+
59
+ function _objectSpread2(target) {
60
  for (var i = 1; i < arguments.length; i++) {
61
  var source = arguments[i] != null ? arguments[i] : {};
 
62
 
63
+ if (i % 2) {
64
+ ownKeys(Object(source), true).forEach(function (key) {
65
+ _defineProperty(target, key, source[key]);
66
+ });
67
+ } else if (Object.getOwnPropertyDescriptors) {
68
+ Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
69
+ } else {
70
+ ownKeys(Object(source)).forEach(function (key) {
71
+ Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
72
+ });
73
  }
 
 
 
 
74
  }
75
 
76
  return target;
84
 
85
  /**
86
  * --------------------------------------------------------------------------
87
+ * Bootstrap (v4.4.1): util.js
88
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
89
  * --------------------------------------------------------------------------
90
  */
233
  }
234
 
235
  return Util.findShadowRoot(element.parentNode);
236
+ },
237
+ jQueryDetection: function jQueryDetection() {
238
+ if (typeof $ === 'undefined') {
239
+ throw new TypeError('Bootstrap\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\'s JavaScript.');
240
+ }
241
+
242
+ var version = $.fn.jquery.split(' ')[0].split('.');
243
+ var minMajor = 1;
244
+ var ltMajor = 2;
245
+ var minMinor = 9;
246
+ var minPatch = 1;
247
+ var maxMajor = 4;
248
+
249
+ if (version[0] < ltMajor && version[1] < minMinor || version[0] === minMajor && version[1] === minMinor && version[2] < minPatch || version[0] >= maxMajor) {
250
+ throw new Error('Bootstrap\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0');
251
+ }
252
  }
253
  };
254
+ Util.jQueryDetection();
255
  setTransitionEndSupport();
256
 
257
  /**
261
  */
262
 
263
  var NAME = 'alert';
264
+ var VERSION = '4.4.1';
265
  var DATA_KEY = 'bs.alert';
266
  var EVENT_KEY = "." + DATA_KEY;
267
  var DATA_API_KEY = '.data-api';
278
  ALERT: 'alert',
279
  FADE: 'fade',
280
  SHOW: 'show'
 
 
 
 
 
 
281
  };
282
+ /**
283
+ * ------------------------------------------------------------------------
284
+ * Class Definition
285
+ * ------------------------------------------------------------------------
286
+ */
287
 
288
  var Alert =
289
  /*#__PURE__*/
425
  */
426
 
427
  var NAME$1 = 'button';
428
+ var VERSION$1 = '4.4.1';
429
  var DATA_KEY$1 = 'bs.button';
430
  var EVENT_KEY$1 = "." + DATA_KEY$1;
431
  var DATA_API_KEY$1 = '.data-api';
437
  };
438
  var Selector$1 = {
439
  DATA_TOGGLE_CARROT: '[data-toggle^="button"]',
440
+ DATA_TOGGLES: '[data-toggle="buttons"]',
441
+ DATA_TOGGLE: '[data-toggle="button"]',
442
+ DATA_TOGGLES_BUTTONS: '[data-toggle="buttons"] .btn',
443
  INPUT: 'input:not([type="hidden"])',
444
  ACTIVE: '.active',
445
  BUTTON: '.btn'
446
  };
447
  var Event$1 = {
448
  CLICK_DATA_API: "click" + EVENT_KEY$1 + DATA_API_KEY$1,
449
+ FOCUS_BLUR_DATA_API: "focus" + EVENT_KEY$1 + DATA_API_KEY$1 + " " + ("blur" + EVENT_KEY$1 + DATA_API_KEY$1),
450
+ LOAD_DATA_API: "load" + EVENT_KEY$1 + DATA_API_KEY$1
 
 
 
 
 
451
  };
452
+ /**
453
+ * ------------------------------------------------------------------------
454
+ * Class Definition
455
+ * ------------------------------------------------------------------------
456
+ */
457
 
458
  var Button =
459
  /*#__PURE__*/
469
  _proto.toggle = function toggle() {
470
  var triggerChangeEvent = true;
471
  var addAriaPressed = true;
472
+ var rootElement = $(this._element).closest(Selector$1.DATA_TOGGLES)[0];
473
 
474
  if (rootElement) {
475
  var input = this._element.querySelector(Selector$1.INPUT);
485
  $(activeElement).removeClass(ClassName$1.ACTIVE);
486
  }
487
  }
488
+ } else if (input.type === 'checkbox') {
489
+ if (this._element.tagName === 'LABEL' && input.checked === this._element.classList.contains(ClassName$1.ACTIVE)) {
490
+ triggerChangeEvent = false;
491
+ }
492
+ } else {
493
+ // if it's not a radio button or checkbox don't add a pointless/invalid checked property to the input
494
+ triggerChangeEvent = false;
495
  }
496
 
497
  if (triggerChangeEvent) {
 
 
 
 
498
  input.checked = !this._element.classList.contains(ClassName$1.ACTIVE);
499
  $(input).trigger('change');
500
  }
504
  }
505
  }
506
 
507
+ if (!(this._element.hasAttribute('disabled') || this._element.classList.contains('disabled'))) {
508
+ if (addAriaPressed) {
509
+ this._element.setAttribute('aria-pressed', !this._element.classList.contains(ClassName$1.ACTIVE));
510
+ }
511
 
512
+ if (triggerChangeEvent) {
513
+ $(this._element).toggleClass(ClassName$1.ACTIVE);
514
+ }
515
  }
516
  };
517
 
553
 
554
 
555
  $(document).on(Event$1.CLICK_DATA_API, Selector$1.DATA_TOGGLE_CARROT, function (event) {
 
556
  var button = event.target;
557
 
558
  if (!$(button).hasClass(ClassName$1.BUTTON)) {
559
+ button = $(button).closest(Selector$1.BUTTON)[0];
560
  }
561
 
562
+ if (!button || button.hasAttribute('disabled') || button.classList.contains('disabled')) {
563
+ event.preventDefault(); // work around Firefox bug #1540995
564
+ } else {
565
+ var inputBtn = button.querySelector(Selector$1.INPUT);
566
+
567
+ if (inputBtn && (inputBtn.hasAttribute('disabled') || inputBtn.classList.contains('disabled'))) {
568
+ event.preventDefault(); // work around Firefox bug #1540995
569
+
570
+ return;
571
+ }
572
+
573
+ Button._jQueryInterface.call($(button), 'toggle');
574
+ }
575
  }).on(Event$1.FOCUS_BLUR_DATA_API, Selector$1.DATA_TOGGLE_CARROT, function (event) {
576
  var button = $(event.target).closest(Selector$1.BUTTON)[0];
577
  $(button).toggleClass(ClassName$1.FOCUS, /^focus(in)?$/.test(event.type));
578
  });
579
+ $(window).on(Event$1.LOAD_DATA_API, function () {
580
+ // ensure correct active class is set to match the controls' actual values/states
581
+ // find all checkboxes/readio buttons inside data-toggle groups
582
+ var buttons = [].slice.call(document.querySelectorAll(Selector$1.DATA_TOGGLES_BUTTONS));
583
+
584
+ for (var i = 0, len = buttons.length; i < len; i++) {
585
+ var button = buttons[i];
586
+ var input = button.querySelector(Selector$1.INPUT);
587
+
588
+ if (input.checked || input.hasAttribute('checked')) {
589
+ button.classList.add(ClassName$1.ACTIVE);
590
+ } else {
591
+ button.classList.remove(ClassName$1.ACTIVE);
592
+ }
593
+ } // find all button toggles
594
+
595
+
596
+ buttons = [].slice.call(document.querySelectorAll(Selector$1.DATA_TOGGLE));
597
+
598
+ for (var _i = 0, _len = buttons.length; _i < _len; _i++) {
599
+ var _button = buttons[_i];
600
+
601
+ if (_button.getAttribute('aria-pressed') === 'true') {
602
+ _button.classList.add(ClassName$1.ACTIVE);
603
+ } else {
604
+ _button.classList.remove(ClassName$1.ACTIVE);
605
+ }
606
+ }
607
+ });
608
  /**
609
  * ------------------------------------------------------------------------
610
  * jQuery
626
  */
627
 
628
  var NAME$2 = 'carousel';
629
+ var VERSION$2 = '4.4.1';
630
  var DATA_KEY$2 = 'bs.carousel';
631
  var EVENT_KEY$2 = "." + DATA_KEY$2;
632
  var DATA_API_KEY$2 = '.data-api';
699
  var PointerType = {
700
  TOUCH: 'touch',
701
  PEN: 'pen'
 
 
 
 
 
 
702
  };
703
+ /**
704
+ * ------------------------------------------------------------------------
705
+ * Class Definition
706
+ * ------------------------------------------------------------------------
707
+ */
708
 
709
  var Carousel =
710
  /*#__PURE__*/
824
  ;
825
 
826
  _proto._getConfig = function _getConfig(config) {
827
+ config = _objectSpread2({}, Default, {}, config);
828
  Util.typeCheckConfig(NAME$2, config, DefaultType);
829
  return config;
830
  };
836
  return;
837
  }
838
 
839
+ var direction = absDeltax / this.touchDeltaX;
840
+ this.touchDeltaX = 0; // swipe left
841
 
842
  if (direction > 0) {
843
  this.prev();
963
  event.preventDefault();
964
  this.next();
965
  break;
 
 
966
  }
967
  };
968
 
1114
  return this.each(function () {
1115
  var data = $(this).data(DATA_KEY$2);
1116
 
1117
+ var _config = _objectSpread2({}, Default, {}, $(this).data());
1118
 
1119
  if (typeof config === 'object') {
1120
+ _config = _objectSpread2({}, _config, {}, config);
1121
  }
1122
 
1123
  var action = typeof config === 'string' ? config : _config.slide;
1155
  return;
1156
  }
1157
 
1158
+ var config = _objectSpread2({}, $(target).data(), {}, $(this).data());
1159
 
1160
  var slideIndex = this.getAttribute('data-slide-to');
1161
 
1224
  */
1225
 
1226
  var NAME$3 = 'collapse';
1227
+ var VERSION$3 = '4.4.1';
1228
  var DATA_KEY$3 = 'bs.collapse';
1229
  var EVENT_KEY$3 = "." + DATA_KEY$3;
1230
  var DATA_API_KEY$3 = '.data-api';
1257
  var Selector$3 = {
1258
  ACTIVES: '.show, .collapsing',
1259
  DATA_TOGGLE: '[data-toggle="collapse"]'
 
 
 
 
 
 
1260
  };
1261
+ /**
1262
+ * ------------------------------------------------------------------------
1263
+ * Class Definition
1264
+ * ------------------------------------------------------------------------
1265
+ */
1266
 
1267
  var Collapse =
1268
  /*#__PURE__*/
1449
  ;
1450
 
1451
  _proto._getConfig = function _getConfig(config) {
1452
+ config = _objectSpread2({}, Default$1, {}, config);
1453
  config.toggle = Boolean(config.toggle); // Coerce string values
1454
 
1455
  Util.typeCheckConfig(NAME$3, config, DefaultType$1);
1503
  var $this = $(this);
1504
  var data = $this.data(DATA_KEY$3);
1505
 
1506
+ var _config = _objectSpread2({}, Default$1, {}, $this.data(), {}, typeof config === 'object' && config ? config : {});
1507
 
1508
  if (!data && _config.toggle && /show|hide/.test(config)) {
1509
  _config.toggle = false;
1578
 
1579
  /**!
1580
  * @fileOverview Kickass library to create and place poppers near their reference elements.
1581
+ * @version 1.16.0
1582
  * @license
1583
  * Copyright (c) 2016 Federico Zivolo and contributors
1584
  *
1600
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
1601
  * SOFTWARE.
1602
  */
1603
+ var isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined' && typeof navigator !== 'undefined';
1604
+
1605
+ var timeoutDuration = function () {
1606
+ var longerTimeoutBrowsers = ['Edge', 'Trident', 'Firefox'];
1607
+ for (var i = 0; i < longerTimeoutBrowsers.length; i += 1) {
1608
+ if (isBrowser && navigator.userAgent.indexOf(longerTimeoutBrowsers[i]) >= 0) {
1609
+ return 1;
1610
+ }
1611
  }
1612
+ return 0;
1613
+ }();
1614
 
1615
  function microtaskDebounce(fn) {
1616
  var called = false;
1730
  return getScrollParent(getParentNode(element));
1731
  }
1732
 
1733
+ /**
1734
+ * Returns the reference node of the reference object, or the reference object itself.
1735
+ * @method
1736
+ * @memberof Popper.Utils
1737
+ * @param {Element|Object} reference - the reference element (the popper will be relative to this)
1738
+ * @returns {Element} parent
1739
+ */
1740
+ function getReferenceNode(reference) {
1741
+ return reference && reference.referenceNode ? reference.referenceNode : reference;
1742
+ }
1743
+
1744
  var isIE11 = isBrowser && !!(window.MSInputMethodContext && document.documentMode);
1745
  var isIE10 = isBrowser && /MSIE 10/.test(navigator.userAgent);
1746
 
2049
 
2050
  // subtract scrollbar size from sizes
2051
  var sizes = element.nodeName === 'HTML' ? getWindowSizes(element.ownerDocument) : {};
2052
+ var width = sizes.width || element.clientWidth || result.width;
2053
+ var height = sizes.height || element.clientHeight || result.height;
2054
 
2055
  var horizScrollbar = element.offsetWidth - width;
2056
  var vertScrollbar = element.offsetHeight - height;
2202
  // NOTE: 1 DOM access here
2203
 
2204
  var boundaries = { top: 0, left: 0 };
2205
+ var offsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, getReferenceNode(reference));
2206
 
2207
  // Handle viewport case
2208
  if (boundariesElement === 'viewport') {
2330
  function getReferenceOffsets(state, popper, reference) {
2331
  var fixedPosition = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
2332
 
2333
+ var commonOffsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, getReferenceNode(reference));
2334
  return getOffsetRectRelativeToArbitraryNode(reference, commonOffsetParent, fixedPosition);
2335
  }
2336
 
2592
 
2593
  this.disableEventListeners();
2594
 
2595
+ // remove the popper if user explicitly asked for the deletion on destroy
2596
  // do not use `remove` because IE11 doesn't support it
2597
  if (this.options.removeOnDestroy) {
2598
  this.popper.parentNode.removeChild(this.popper);
3194
 
3195
  // flip the variation if required
3196
  var isVertical = ['top', 'bottom'].indexOf(placement) !== -1;
3197
+
3198
+ // flips variation if reference element overflows boundaries
3199
+ var flippedVariationByRef = !!options.flipVariations && (isVertical && variation === 'start' && overflowsLeft || isVertical && variation === 'end' && overflowsRight || !isVertical && variation === 'start' && overflowsTop || !isVertical && variation === 'end' && overflowsBottom);
3200
+
3201
+ // flips variation if popper content overflows boundaries
3202
+ var flippedVariationByContent = !!options.flipVariationsByContent && (isVertical && variation === 'start' && overflowsRight || isVertical && variation === 'end' && overflowsLeft || !isVertical && variation === 'start' && overflowsBottom || !isVertical && variation === 'end' && overflowsTop);
3203
+
3204
+ var flippedVariation = flippedVariationByRef || flippedVariationByContent;
3205
 
3206
  if (overlapsRef || overflowsBoundaries || flippedVariation) {
3207
  // this boolean to detect any flip loop
3808
  * The popper will never be placed outside of the defined boundaries
3809
  * (except if `keepTogether` is enabled)
3810
  */
3811
+ boundariesElement: 'viewport',
3812
+ /**
3813
+ * @prop {Boolean} flipVariations=false
3814
+ * The popper will switch placement variation between `-start` and `-end` when
3815
+ * the reference element overlaps its boundaries.
3816
+ *
3817
+ * The original placement should have a set variation.
3818
+ */
3819
+ flipVariations: false,
3820
+ /**
3821
+ * @prop {Boolean} flipVariationsByContent=false
3822
+ * The popper will switch placement variation between `-start` and `-end` when
3823
+ * the popper element overlaps its reference boundaries.
3824
+ *
3825
+ * The original placement should have a set variation.
3826
+ */
3827
+ flipVariationsByContent: false
3828
  },
3829
 
3830
  /**
4041
  /**
4042
  * Creates a new Popper.js instance.
4043
  * @class Popper
4044
+ * @param {Element|referenceObject} reference - The reference element used to position the popper
4045
+ * @param {Element} popper - The HTML / XML element used as the popper
4046
  * @param {Object} options - Your custom options to override the ones defined in [Defaults](#defaults)
4047
  * @return {Object} instance - The generated Popper.js instance
4048
  */
4197
  */
4198
 
4199
  var NAME$4 = 'dropdown';
4200
+ var VERSION$4 = '4.4.1';
4201
  var DATA_KEY$4 = 'bs.dropdown';
4202
  var EVENT_KEY$4 = "." + DATA_KEY$4;
4203
  var DATA_API_KEY$4 = '.data-api';
4257
  flip: true,
4258
  boundary: 'scrollParent',
4259
  reference: 'toggle',
4260
+ display: 'dynamic',
4261
+ popperConfig: null
4262
  };
4263
  var DefaultType$2 = {
4264
  offset: '(number|string|function)',
4265
  flip: 'boolean',
4266
  boundary: '(string|element)',
4267
  reference: '(string|element)',
4268
+ display: 'string',
4269
+ popperConfig: '(null|object)'
 
 
 
 
 
4270
  };
4271
+ /**
4272
+ * ------------------------------------------------------------------------
4273
+ * Class Definition
4274
+ * ------------------------------------------------------------------------
4275
+ */
4276
 
4277
  var Dropdown =
4278
  /*#__PURE__*/
4296
  return;
4297
  }
4298
 
 
 
4299
  var isActive = $(this._menu).hasClass(ClassName$4.SHOW);
4300
 
4301
  Dropdown._clearMenus();
4304
  return;
4305
  }
4306
 
4307
+ this.show(true);
4308
+ };
4309
+
4310
+ _proto.show = function show(usePopper) {
4311
+ if (usePopper === void 0) {
4312
+ usePopper = false;
4313
+ }
4314
+
4315
+ if (this._element.disabled || $(this._element).hasClass(ClassName$4.DISABLED) || $(this._menu).hasClass(ClassName$4.SHOW)) {
4316
+ return;
4317
+ }
4318
+
4319
  var relatedTarget = {
4320
  relatedTarget: this._element
4321
  };
4322
  var showEvent = $.Event(Event$4.SHOW, relatedTarget);
4323
+
4324
+ var parent = Dropdown._getParentFromElement(this._element);
4325
+
4326
  $(parent).trigger(showEvent);
4327
 
4328
  if (showEvent.isDefaultPrevented()) {
4330
  } // Disable totally Popper.js for Dropdown in Navbar
4331
 
4332
 
4333
+ if (!this._inNavbar && usePopper) {
4334
  /**
4335
  * Check for Popper dependency
4336
  * Popper - https://popper.js.org
4377
  $(parent).toggleClass(ClassName$4.SHOW).trigger($.Event(Event$4.SHOWN, relatedTarget));
4378
  };
4379
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4380
  _proto.hide = function hide() {
4381
  if (this._element.disabled || $(this._element).hasClass(ClassName$4.DISABLED) || !$(this._menu).hasClass(ClassName$4.SHOW)) {
4382
  return;
4395
  return;
4396
  }
4397
 
4398
+ if (this._popper) {
4399
+ this._popper.destroy();
4400
+ }
4401
+
4402
  $(this._menu).toggleClass(ClassName$4.SHOW);
4403
  $(parent).toggleClass(ClassName$4.SHOW).trigger($.Event(Event$4.HIDDEN, relatedTarget));
4404
  };
4437
  };
4438
 
4439
  _proto._getConfig = function _getConfig(config) {
4440
+ config = _objectSpread2({}, this.constructor.Default, {}, $(this._element).data(), {}, config);
4441
  Util.typeCheckConfig(NAME$4, config, this.constructor.DefaultType);
4442
  return config;
4443
  };
4486
 
4487
  if (typeof this._config.offset === 'function') {
4488
  offset.fn = function (data) {
4489
+ data.offsets = _objectSpread2({}, data.offsets, {}, _this2._config.offset(data.offsets, _this2._element) || {});
4490
  return data;
4491
  };
4492
  } else {
4507
  preventOverflow: {
4508
  boundariesElement: this._config.boundary
4509
  }
4510
+ }
4511
+ }; // Disable Popper.js if we have a static display
 
4512
 
4513
  if (this._config.display === 'static') {
4514
  popperConfig.modifiers.applyStyle = {
4516
  };
4517
  }
4518
 
4519
+ return _objectSpread2({}, popperConfig, {}, this._config.popperConfig);
4520
  } // Static
4521
  ;
4522
 
4588
  }
4589
 
4590
  toggles[i].setAttribute('aria-expanded', 'false');
4591
+
4592
+ if (context._popper) {
4593
+ context._popper.destroy();
4594
+ }
4595
+
4596
  $(dropdownMenu).removeClass(ClassName$4.SHOW);
4597
  $(parent).removeClass(ClassName$4.SHOW).trigger($.Event(Event$4.HIDDEN, relatedTarget));
4598
  }
4633
 
4634
  var isActive = $(parent).hasClass(ClassName$4.SHOW);
4635
 
4636
+ if (!isActive && event.which === ESCAPE_KEYCODE) {
4637
+ return;
4638
+ }
4639
+
4640
  if (!isActive || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {
4641
  if (event.which === ESCAPE_KEYCODE) {
4642
  var toggle = parent.querySelector(Selector$4.DATA_TOGGLE);
4647
  return;
4648
  }
4649
 
4650
+ var items = [].slice.call(parent.querySelectorAll(Selector$4.VISIBLE_ITEMS)).filter(function (item) {
4651
+ return $(item).is(':visible');
4652
+ });
4653
 
4654
  if (items.length === 0) {
4655
  return;
4729
  */
4730
 
4731
  var NAME$5 = 'modal';
4732
+ var VERSION$5 = '4.4.1';
4733
  var DATA_KEY$5 = 'bs.modal';
4734
  var EVENT_KEY$5 = "." + DATA_KEY$5;
4735
  var DATA_API_KEY$5 = '.data-api';
4750
  };
4751
  var Event$5 = {
4752
  HIDE: "hide" + EVENT_KEY$5,
4753
+ HIDE_PREVENTED: "hidePrevented" + EVENT_KEY$5,
4754
  HIDDEN: "hidden" + EVENT_KEY$5,
4755
  SHOW: "show" + EVENT_KEY$5,
4756
  SHOWN: "shown" + EVENT_KEY$5,
4768
  BACKDROP: 'modal-backdrop',
4769
  OPEN: 'modal-open',
4770
  FADE: 'fade',
4771
+ SHOW: 'show',
4772
+ STATIC: 'modal-static'
4773
  };
4774
  var Selector$5 = {
4775
  DIALOG: '.modal-dialog',
4778
  DATA_DISMISS: '[data-dismiss="modal"]',
4779
  FIXED_CONTENT: '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top',
4780
  STICKY_CONTENT: '.sticky-top'
 
 
 
 
 
 
4781
  };
4782
+ /**
4783
+ * ------------------------------------------------------------------------
4784
+ * Class Definition
4785
+ * ------------------------------------------------------------------------
4786
+ */
4787
 
4788
  var Modal =
4789
  /*#__PURE__*/
4929
  ;
4930
 
4931
  _proto._getConfig = function _getConfig(config) {
4932
+ config = _objectSpread2({}, Default$3, {}, config);
4933
  Util.typeCheckConfig(NAME$5, config, DefaultType$3);
4934
  return config;
4935
  };
4936
 
4937
+ _proto._triggerBackdropTransition = function _triggerBackdropTransition() {
4938
  var _this3 = this;
4939
 
4940
+ if (this._config.backdrop === 'static') {
4941
+ var hideEventPrevented = $.Event(Event$5.HIDE_PREVENTED);
4942
+ $(this._element).trigger(hideEventPrevented);
4943
+
4944
+ if (hideEventPrevented.defaultPrevented) {
4945
+ return;
4946
+ }
4947
+
4948
+ this._element.classList.add(ClassName$5.STATIC);
4949
+
4950
+ var modalTransitionDuration = Util.getTransitionDurationFromElement(this._element);
4951
+ $(this._element).one(Util.TRANSITION_END, function () {
4952
+ _this3._element.classList.remove(ClassName$5.STATIC);
4953
+ }).emulateTransitionEnd(modalTransitionDuration);
4954
+
4955
+ this._element.focus();
4956
+ } else {
4957
+ this.hide();
4958
+ }
4959
+ };
4960
+
4961
+ _proto._showElement = function _showElement(relatedTarget) {
4962
+ var _this4 = this;
4963
+
4964
  var transition = $(this._element).hasClass(ClassName$5.FADE);
4965
+ var modalBody = this._dialog ? this._dialog.querySelector(Selector$5.MODAL_BODY) : null;
4966
 
4967
  if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {
4968
  // Don't move modal's DOM position
4975
 
4976
  this._element.setAttribute('aria-modal', true);
4977
 
4978
+ if ($(this._dialog).hasClass(ClassName$5.SCROLLABLE) && modalBody) {
4979
+ modalBody.scrollTop = 0;
4980
  } else {
4981
  this._element.scrollTop = 0;
4982
  }
4996
  });
4997
 
4998
  var transitionComplete = function transitionComplete() {
4999
+ if (_this4._config.focus) {
5000
+ _this4._element.focus();
5001
  }
5002
 
5003
+ _this4._isTransitioning = false;
5004
+ $(_this4._element).trigger(shownEvent);
5005
  };
5006
 
5007
  if (transition) {
5013
  };
5014
 
5015
  _proto._enforceFocus = function _enforceFocus() {
5016
+ var _this5 = this;
5017
 
5018
  $(document).off(Event$5.FOCUSIN) // Guard against infinite focus loop
5019
  .on(Event$5.FOCUSIN, function (event) {
5020
+ if (document !== event.target && _this5._element !== event.target && $(_this5._element).has(event.target).length === 0) {
5021
+ _this5._element.focus();
5022
  }
5023
  });
5024
  };
5025
 
5026
  _proto._setEscapeEvent = function _setEscapeEvent() {
5027
+ var _this6 = this;
5028
 
5029
  if (this._isShown && this._config.keyboard) {
5030
  $(this._element).on(Event$5.KEYDOWN_DISMISS, function (event) {
5031
  if (event.which === ESCAPE_KEYCODE$1) {
5032
+ _this6._triggerBackdropTransition();
 
 
5033
  }
5034
  });
5035
  } else if (!this._isShown) {
5038
  };
5039
 
5040
  _proto._setResizeEvent = function _setResizeEvent() {
5041
+ var _this7 = this;
5042
 
5043
  if (this._isShown) {
5044
  $(window).on(Event$5.RESIZE, function (event) {
5045
+ return _this7.handleUpdate(event);
5046
  });
5047
  } else {
5048
  $(window).off(Event$5.RESIZE);
5050
  };
5051
 
5052
  _proto._hideModal = function _hideModal() {
5053
+ var _this8 = this;
5054
 
5055
  this._element.style.display = 'none';
5056
 
5063
  this._showBackdrop(function () {
5064
  $(document.body).removeClass(ClassName$5.OPEN);
5065
 
5066
+ _this8._resetAdjustments();
5067
 
5068
+ _this8._resetScrollbar();
5069
 
5070
+ $(_this8._element).trigger(Event$5.HIDDEN);
5071
  });
5072
  };
5073
 
5079
  };
5080
 
5081
  _proto._showBackdrop = function _showBackdrop(callback) {
5082
+ var _this9 = this;
5083
 
5084
  var animate = $(this._element).hasClass(ClassName$5.FADE) ? ClassName$5.FADE : '';
5085
 
5093
 
5094
  $(this._backdrop).appendTo(document.body);
5095
  $(this._element).on(Event$5.CLICK_DISMISS, function (event) {
5096
+ if (_this9._ignoreBackdropClick) {
5097
+ _this9._ignoreBackdropClick = false;
5098
  return;
5099
  }
5100
 
5102
  return;
5103
  }
5104
 
5105
+ _this9._triggerBackdropTransition();
 
 
 
 
5106
  });
5107
 
5108
  if (animate) {
5126
  $(this._backdrop).removeClass(ClassName$5.SHOW);
5127
 
5128
  var callbackRemove = function callbackRemove() {
5129
+ _this9._removeBackdrop();
5130
 
5131
  if (callback) {
5132
  callback();
5173
  };
5174
 
5175
  _proto._setScrollbar = function _setScrollbar() {
5176
+ var _this10 = this;
5177
 
5178
  if (this._isBodyOverflowing) {
5179
  // Note: DOMNode.style.paddingRight returns the actual value or '' if not set
5184
  $(fixedContent).each(function (index, element) {
5185
  var actualPadding = element.style.paddingRight;
5186
  var calculatedPadding = $(element).css('padding-right');
5187
+ $(element).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + _this10._scrollbarWidth + "px");
5188
  }); // Adjust sticky content margin
5189
 
5190
  $(stickyContent).each(function (index, element) {
5191
  var actualMargin = element.style.marginRight;
5192
  var calculatedMargin = $(element).css('margin-right');
5193
+ $(element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) - _this10._scrollbarWidth + "px");
5194
  }); // Adjust body padding
5195
 
5196
  var actualPadding = document.body.style.paddingRight;
5239
  return this.each(function () {
5240
  var data = $(this).data(DATA_KEY$5);
5241
 
5242
+ var _config = _objectSpread2({}, Default$3, {}, $(this).data(), {}, typeof config === 'object' && config ? config : {});
5243
 
5244
  if (!data) {
5245
  data = new Modal(this, _config);
5280
 
5281
 
5282
  $(document).on(Event$5.CLICK_DATA_API, Selector$5.DATA_TOGGLE, function (event) {
5283
+ var _this11 = this;
5284
 
5285
  var target;
5286
  var selector = Util.getSelectorFromElement(this);
5289
  target = document.querySelector(selector);
5290
  }
5291
 
5292
+ var config = $(target).data(DATA_KEY$5) ? 'toggle' : _objectSpread2({}, $(target).data(), {}, $(this).data());
5293
 
5294
  if (this.tagName === 'A' || this.tagName === 'AREA') {
5295
  event.preventDefault();
5302
  }
5303
 
5304
  $target.one(Event$5.HIDDEN, function () {
5305
+ if ($(_this11).is(':visible')) {
5306
+ _this11.focus();
5307
  }
5308
  });
5309
  });
5326
 
5327
  /**
5328
  * --------------------------------------------------------------------------
5329
+ * Bootstrap (v4.4.1): tools/sanitizer.js
5330
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
5331
  * --------------------------------------------------------------------------
5332
  */
5364
  strong: [],
5365
  u: [],
5366
  ul: []
 
 
 
 
 
 
5367
  };
5368
+ /**
5369
+ * A pattern that recognizes a commonly useful subset of URLs that are safe.
5370
+ *
5371
+ * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts
5372
+ */
5373
+
5374
  var SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi;
5375
  /**
5376
  * A pattern that matches safe data URLs. Only matches image, video and audio types.
5437
  };
5438
 
5439
  for (var i = 0, len = elements.length; i < len; i++) {
5440
+ var _ret = _loop(i);
5441
 
5442
  if (_ret === "continue") continue;
5443
  }
5452
  */
5453
 
5454
  var NAME$6 = 'tooltip';
5455
+ var VERSION$6 = '4.4.1';
5456
  var DATA_KEY$6 = 'bs.tooltip';
5457
  var EVENT_KEY$6 = "." + DATA_KEY$6;
5458
  var JQUERY_NO_CONFLICT$6 = $.fn[NAME$6];
5474
  boundary: '(string|element)',
5475
  sanitize: 'boolean',
5476
  sanitizeFn: '(null|function)',
5477
+ whiteList: 'object',
5478
+ popperConfig: '(null|object)'
5479
  };
5480
  var AttachmentMap$1 = {
5481
  AUTO: 'auto',
5499
  boundary: 'scrollParent',
5500
  sanitize: true,
5501
  sanitizeFn: null,
5502
+ whiteList: DefaultWhitelist,
5503
+ popperConfig: null
5504
  };
5505
  var HoverState = {
5506
  SHOW: 'show',
5532
  FOCUS: 'focus',
5533
  CLICK: 'click',
5534
  MANUAL: 'manual'
 
 
 
 
 
 
5535
  };
5536
+ /**
5537
+ * ------------------------------------------------------------------------
5538
+ * Class Definition
5539
+ * ------------------------------------------------------------------------
5540
+ */
5541
 
5542
  var Tooltip =
5543
  /*#__PURE__*/
5544
  function () {
5545
  function Tooltip(element, config) {
 
 
 
 
5546
  if (typeof Popper === 'undefined') {
5547
  throw new TypeError('Bootstrap\'s tooltips require Popper.js (https://popper.js.org/)');
5548
  } // private
5613
  clearTimeout(this._timeout);
5614
  $.removeData(this.element, this.constructor.DATA_KEY);
5615
  $(this.element).off(this.constructor.EVENT_KEY);
5616
+ $(this.element).closest('.modal').off('hide.bs.modal', this._hideModalHandler);
5617
 
5618
  if (this.tip) {
5619
  $(this.tip).remove();
5624
  this._hoverState = null;
5625
  this._activeTrigger = null;
5626
 
5627
+ if (this._popper) {
5628
  this._popper.destroy();
5629
  }
5630
 
5677
  }
5678
 
5679
  $(this.element).trigger(this.constructor.Event.INSERTED);
5680
+ this._popper = new Popper(this.element, tip, this._getPopperConfig(attachment));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5681
  $(tip).addClass(ClassName$6.SHOW); // If this is a touch-enabled device we add extra
5682
  // empty mouseover listeners to the body's immediate children;
5683
  // only needed because of broken event delegation on iOS
5825
  } // Private
5826
  ;
5827
 
5828
+ _proto._getPopperConfig = function _getPopperConfig(attachment) {
5829
  var _this3 = this;
5830
 
5831
+ var defaultBsConfig = {
5832
+ placement: attachment,
5833
+ modifiers: {
5834
+ offset: this._getOffset(),
5835
+ flip: {
5836
+ behavior: this.config.fallbackPlacement
5837
+ },
5838
+ arrow: {
5839
+ element: Selector$6.ARROW
5840
+ },
5841
+ preventOverflow: {
5842
+ boundariesElement: this.config.boundary
5843
+ }
5844
+ },
5845
+ onCreate: function onCreate(data) {
5846
+ if (data.originalPlacement !== data.placement) {
5847
+ _this3._handlePopperPlacementChange(data);
5848
+ }
5849
+ },
5850
+ onUpdate: function onUpdate(data) {
5851
+ return _this3._handlePopperPlacementChange(data);
5852
+ }
5853
+ };
5854
+ return _objectSpread2({}, defaultBsConfig, {}, this.config.popperConfig);
5855
+ };
5856
+
5857
+ _proto._getOffset = function _getOffset() {
5858
+ var _this4 = this;
5859
+
5860
  var offset = {};
5861
 
5862
  if (typeof this.config.offset === 'function') {
5863
  offset.fn = function (data) {
5864
+ data.offsets = _objectSpread2({}, data.offsets, {}, _this4.config.offset(data.offsets, _this4.element) || {});
5865
  return data;
5866
  };
5867
  } else {
5888
  };
5889
 
5890
  _proto._setListeners = function _setListeners() {
5891
+ var _this5 = this;
5892
 
5893
  var triggers = this.config.trigger.split(' ');
5894
  triggers.forEach(function (trigger) {
5895
  if (trigger === 'click') {
5896
+ $(_this5.element).on(_this5.constructor.Event.CLICK, _this5.config.selector, function (event) {
5897
+ return _this5.toggle(event);
5898
  });
5899
  } else if (trigger !== Trigger.MANUAL) {
5900
+ var eventIn = trigger === Trigger.HOVER ? _this5.constructor.Event.MOUSEENTER : _this5.constructor.Event.FOCUSIN;
5901
+ var eventOut = trigger === Trigger.HOVER ? _this5.constructor.Event.MOUSELEAVE : _this5.constructor.Event.FOCUSOUT;
5902
+ $(_this5.element).on(eventIn, _this5.config.selector, function (event) {
5903
+ return _this5._enter(event);
5904
+ }).on(eventOut, _this5.config.selector, function (event) {
5905
+ return _this5._leave(event);
5906
  });
5907
  }
5908
  });
5909
+
5910
+ this._hideModalHandler = function () {
5911
+ if (_this5.element) {
5912
+ _this5.hide();
5913
  }
5914
+ };
5915
+
5916
+ $(this.element).closest('.modal').on('hide.bs.modal', this._hideModalHandler);
5917
 
5918
  if (this.config.selector) {
5919
+ this.config = _objectSpread2({}, this.config, {
5920
  trigger: 'manual',
5921
  selector: ''
5922
  });
6016
  delete dataAttributes[dataAttr];
6017
  }
6018
  });
6019
+ config = _objectSpread2({}, this.constructor.Default, {}, dataAttributes, {}, typeof config === 'object' && config ? config : {});
6020
 
6021
  if (typeof config.delay === 'number') {
6022
  config.delay = {
6176
  */
6177
 
6178
  var NAME$7 = 'popover';
6179
+ var VERSION$7 = '4.4.1';
6180
  var DATA_KEY$7 = 'bs.popover';
6181
  var EVENT_KEY$7 = "." + DATA_KEY$7;
6182
  var JQUERY_NO_CONFLICT$7 = $.fn[NAME$7];
6183
  var CLASS_PREFIX$1 = 'bs-popover';
6184
  var BSCLS_PREFIX_REGEX$1 = new RegExp("(^|\\s)" + CLASS_PREFIX$1 + "\\S+", 'g');
6185
 
6186
+ var Default$5 = _objectSpread2({}, Tooltip.Default, {
6187
  placement: 'right',
6188
  trigger: 'click',
6189
  content: '',
6190
  template: '<div class="popover" role="tooltip">' + '<div class="arrow"></div>' + '<h3 class="popover-header"></h3>' + '<div class="popover-body"></div></div>'
6191
  });
6192
 
6193
+ var DefaultType$5 = _objectSpread2({}, Tooltip.DefaultType, {
6194
  content: '(string|element|function)'
6195
  });
6196
 
6213
  FOCUSOUT: "focusout" + EVENT_KEY$7,
6214
  MOUSEENTER: "mouseenter" + EVENT_KEY$7,
6215
  MOUSELEAVE: "mouseleave" + EVENT_KEY$7
 
 
 
 
 
 
6216
  };
6217
+ /**
6218
+ * ------------------------------------------------------------------------
6219
+ * Class Definition
6220
+ * ------------------------------------------------------------------------
6221
+ */
6222
 
6223
  var Popover =
6224
  /*#__PURE__*/
6362
  */
6363
 
6364
  var NAME$8 = 'scrollspy';
6365
+ var VERSION$8 = '4.4.1';
6366
  var DATA_KEY$8 = 'bs.scrollspy';
6367
  var EVENT_KEY$8 = "." + DATA_KEY$8;
6368
  var DATA_API_KEY$6 = '.data-api';
6401
  var OffsetMethod = {
6402
  OFFSET: 'offset',
6403
  POSITION: 'position'
 
 
 
 
 
 
6404
  };
6405
+ /**
6406
+ * ------------------------------------------------------------------------
6407
+ * Class Definition
6408
+ * ------------------------------------------------------------------------
6409
+ */
6410
 
6411
  var ScrollSpy =
6412
  /*#__PURE__*/
6488
  ;
6489
 
6490
  _proto._getConfig = function _getConfig(config) {
6491
+ config = _objectSpread2({}, Default$6, {}, typeof config === 'object' && config ? config : {});
6492
 
6493
  if (typeof config.target !== 'string') {
6494
  var id = $(config.target).attr('id');
6668
  */
6669
 
6670
  var NAME$9 = 'tab';
6671
+ var VERSION$9 = '4.4.1';
6672
  var DATA_KEY$9 = 'bs.tab';
6673
  var EVENT_KEY$9 = "." + DATA_KEY$9;
6674
  var DATA_API_KEY$7 = '.data-api';
6695
  DATA_TOGGLE: '[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',
6696
  DROPDOWN_TOGGLE: '.dropdown-toggle',
6697
  DROPDOWN_ACTIVE_CHILD: '> .dropdown-menu .active'
 
 
 
 
 
 
6698
  };
6699
+ /**
6700
+ * ------------------------------------------------------------------------
6701
+ * Class Definition
6702
+ * ------------------------------------------------------------------------
6703
+ */
6704
 
6705
  var Tab =
6706
  /*#__PURE__*/
6902
  */
6903
 
6904
  var NAME$a = 'toast';
6905
+ var VERSION$a = '4.4.1';
6906
  var DATA_KEY$a = 'bs.toast';
6907
  var EVENT_KEY$a = "." + DATA_KEY$a;
6908
  var JQUERY_NO_CONFLICT$a = $.fn[NAME$a];
6931
  };
6932
  var Selector$a = {
6933
  DATA_DISMISS: '[data-dismiss="toast"]'
 
 
 
 
 
 
6934
  };
6935
+ /**
6936
+ * ------------------------------------------------------------------------
6937
+ * Class Definition
6938
+ * ------------------------------------------------------------------------
6939
+ */
6940
 
6941
  var Toast =
6942
  /*#__PURE__*/
6956
  _proto.show = function show() {
6957
  var _this = this;
6958
 
6959
+ var showEvent = $.Event(Event$a.SHOW);
6960
+ $(this._element).trigger(showEvent);
6961
+
6962
+ if (showEvent.isDefaultPrevented()) {
6963
+ return;
6964
+ }
6965
 
6966
  if (this._config.animation) {
6967
  this._element.classList.add(ClassName$a.FADE);
6975
  $(_this._element).trigger(Event$a.SHOWN);
6976
 
6977
  if (_this._config.autohide) {
6978
+ _this._timeout = setTimeout(function () {
6979
+ _this.hide();
6980
+ }, _this._config.delay);
6981
  }
6982
  };
6983
 
6984
  this._element.classList.remove(ClassName$a.HIDE);
6985
 
6986
+ Util.reflow(this._element);
6987
+
6988
  this._element.classList.add(ClassName$a.SHOWING);
6989
 
6990
  if (this._config.animation) {
6995
  }
6996
  };
6997
 
6998
+ _proto.hide = function hide() {
 
 
6999
  if (!this._element.classList.contains(ClassName$a.SHOW)) {
7000
  return;
7001
  }
7002
 
7003
+ var hideEvent = $.Event(Event$a.HIDE);
7004
+ $(this._element).trigger(hideEvent);
7005
 
7006
+ if (hideEvent.isDefaultPrevented()) {
7007
+ return;
 
 
 
 
7008
  }
7009
+
7010
+ this._close();
7011
  };
7012
 
7013
  _proto.dispose = function dispose() {
7026
  ;
7027
 
7028
  _proto._getConfig = function _getConfig(config) {
7029
+ config = _objectSpread2({}, Default$7, {}, $(this._element).data(), {}, typeof config === 'object' && config ? config : {});
7030
  Util.typeCheckConfig(NAME$a, config, this.constructor.DefaultType);
7031
  return config;
7032
  };
7033
 
7034
  _proto._setListeners = function _setListeners() {
7035
+ var _this2 = this;
7036
 
7037
  $(this._element).on(Event$a.CLICK_DISMISS, Selector$a.DATA_DISMISS, function () {
7038
+ return _this2.hide();
7039
  });
7040
  };
7041
 
7042
  _proto._close = function _close() {
7043
+ var _this3 = this;
7044
 
7045
  var complete = function complete() {
7046
+ _this3._element.classList.add(ClassName$a.HIDE);
7047
 
7048
+ $(_this3._element).trigger(Event$a.HIDDEN);
7049
  };
7050
 
7051
  this._element.classList.remove(ClassName$a.SHOW);
7115
  return Toast._jQueryInterface;
7116
  };
7117
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7118
  exports.Alert = Alert;
7119
  exports.Button = Button;
7120
  exports.Carousel = Carousel;
7126
  exports.Tab = Tab;
7127
  exports.Toast = Toast;
7128
  exports.Tooltip = Tooltip;
7129
+ exports.Util = Util;
7130
 
7131
  Object.defineProperty(exports, '__esModule', { value: true });
7132
 
7133
+ })));
7134
  //# sourceMappingURL=bootstrap.bundle.js.map
resources/js/bootstrap4.bundle.min.js CHANGED
@@ -1,7 +1,7 @@
1
  /*!
2
- * Bootstrap v4.3.1 (https://getbootstrap.com/)
3
  * Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
4
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
5
  */
6
- !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("jquery")):"function"==typeof define&&define.amd?define(["exports","jquery"],e):e((t=t||self).bootstrap={},t.jQuery)}(this,function(t,p){"use strict";function i(t,e){for(var n=0;n<e.length;n++){var i=e[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}function s(t,e,n){return e&&i(t.prototype,e),n&&i(t,n),t}function l(o){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},e=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(e=e.concat(Object.getOwnPropertySymbols(r).filter(function(t){return Object.getOwnPropertyDescriptor(r,t).enumerable}))),e.forEach(function(t){var e,n,i;e=o,i=r[n=t],n in e?Object.defineProperty(e,n,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[n]=i})}return o}p=p&&p.hasOwnProperty("default")?p.default:p;var e="transitionend";function n(t){var e=this,n=!1;return p(this).one(m.TRANSITION_END,function(){n=!0}),setTimeout(function(){n||m.triggerTransitionEnd(e)},t),this}var m={TRANSITION_END:"bsTransitionEnd",getUID:function(t){for(;t+=~~(1e6*Math.random()),document.getElementById(t););return t},getSelectorFromElement:function(t){var e=t.getAttribute("data-target");if(!e||"#"===e){var n=t.getAttribute("href");e=n&&"#"!==n?n.trim():""}try{return document.querySelector(e)?e:null}catch(t){return null}},getTransitionDurationFromElement:function(t){if(!t)return 0;var e=p(t).css("transition-duration"),n=p(t).css("transition-delay"),i=parseFloat(e),o=parseFloat(n);return i||o?(e=e.split(",")[0],n=n.split(",")[0],1e3*(parseFloat(e)+parseFloat(n))):0},reflow:function(t){return t.offsetHeight},triggerTransitionEnd:function(t){p(t).trigger(e)},supportsTransitionEnd:function(){return Boolean(e)},isElement:function(t){return(t[0]||t).nodeType},typeCheckConfig:function(t,e,n){for(var i in n)if(Object.prototype.hasOwnProperty.call(n,i)){var o=n[i],r=e[i],s=r&&m.isElement(r)?"element":(a=r,{}.toString.call(a).match(/\s([a-z]+)/i)[1].toLowerCase());if(!new RegExp(o).test(s))throw new Error(t.toUpperCase()+': Option "'+i+'" provided type "'+s+'" but expected type "'+o+'".')}var a},findShadowRoot:function(t){if(!document.documentElement.attachShadow)return null;if("function"!=typeof t.getRootNode)return t instanceof ShadowRoot?t:t.parentNode?m.findShadowRoot(t.parentNode):null;var e=t.getRootNode();return e instanceof ShadowRoot?e:null}};p.fn.emulateTransitionEnd=n,p.event.special[m.TRANSITION_END]={bindType:e,delegateType:e,handle:function(t){if(p(t.target).is(this))return t.handleObj.handler.apply(this,arguments)}};var o="alert",r="bs.alert",a="."+r,c=p.fn[o],h={CLOSE:"close"+a,CLOSED:"closed"+a,CLICK_DATA_API:"click"+a+".data-api"},u="alert",f="fade",d="show",g=function(){function i(t){this._element=t}var t=i.prototype;return t.close=function(t){var e=this._element;t&&(e=this._getRootElement(t)),this._triggerCloseEvent(e).isDefaultPrevented()||this._removeElement(e)},t.dispose=function(){p.removeData(this._element,r),this._element=null},t._getRootElement=function(t){var e=m.getSelectorFromElement(t),n=!1;return e&&(n=document.querySelector(e)),n||(n=p(t).closest("."+u)[0]),n},t._triggerCloseEvent=function(t){var e=p.Event(h.CLOSE);return p(t).trigger(e),e},t._removeElement=function(e){var n=this;if(p(e).removeClass(d),p(e).hasClass(f)){var t=m.getTransitionDurationFromElement(e);p(e).one(m.TRANSITION_END,function(t){return n._destroyElement(e,t)}).emulateTransitionEnd(t)}else this._destroyElement(e)},t._destroyElement=function(t){p(t).detach().trigger(h.CLOSED).remove()},i._jQueryInterface=function(n){return this.each(function(){var t=p(this),e=t.data(r);e||(e=new i(this),t.data(r,e)),"close"===n&&e[n](this)})},i._handleDismiss=function(e){return function(t){t&&t.preventDefault(),e.close(this)}},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}}]),i}();p(document).on(h.CLICK_DATA_API,'[data-dismiss="alert"]',g._handleDismiss(new g)),p.fn[o]=g._jQueryInterface,p.fn[o].Constructor=g,p.fn[o].noConflict=function(){return p.fn[o]=c,g._jQueryInterface};var _="button",v="bs.button",y="."+v,E=".data-api",b=p.fn[_],w="active",C="btn",T="focus",S='[data-toggle^="button"]',D='[data-toggle="buttons"]',I='input:not([type="hidden"])',A=".active",O=".btn",N={CLICK_DATA_API:"click"+y+E,FOCUS_BLUR_DATA_API:"focus"+y+E+" blur"+y+E},k=function(){function n(t){this._element=t}var t=n.prototype;return t.toggle=function(){var t=!0,e=!0,n=p(this._element).closest(D)[0];if(n){var i=this._element.querySelector(I);if(i){if("radio"===i.type)if(i.checked&&this._element.classList.contains(w))t=!1;else{var o=n.querySelector(A);o&&p(o).removeClass(w)}if(t){if(i.hasAttribute("disabled")||n.hasAttribute("disabled")||i.classList.contains("disabled")||n.classList.contains("disabled"))return;i.checked=!this._element.classList.contains(w),p(i).trigger("change")}i.focus(),e=!1}}e&&this._element.setAttribute("aria-pressed",!this._element.classList.contains(w)),t&&p(this._element).toggleClass(w)},t.dispose=function(){p.removeData(this._element,v),this._element=null},n._jQueryInterface=function(e){return this.each(function(){var t=p(this).data(v);t||(t=new n(this),p(this).data(v,t)),"toggle"===e&&t[e]()})},s(n,null,[{key:"VERSION",get:function(){return"4.3.1"}}]),n}();p(document).on(N.CLICK_DATA_API,S,function(t){t.preventDefault();var e=t.target;p(e).hasClass(C)||(e=p(e).closest(O)),k._jQueryInterface.call(p(e),"toggle")}).on(N.FOCUS_BLUR_DATA_API,S,function(t){var e=p(t.target).closest(O)[0];p(e).toggleClass(T,/^focus(in)?$/.test(t.type))}),p.fn[_]=k._jQueryInterface,p.fn[_].Constructor=k,p.fn[_].noConflict=function(){return p.fn[_]=b,k._jQueryInterface};var L="carousel",x="bs.carousel",P="."+x,H=".data-api",j=p.fn[L],R={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0,touch:!0},F={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean",touch:"boolean"},M="next",W="prev",U="left",B="right",q={SLIDE:"slide"+P,SLID:"slid"+P,KEYDOWN:"keydown"+P,MOUSEENTER:"mouseenter"+P,MOUSELEAVE:"mouseleave"+P,TOUCHSTART:"touchstart"+P,TOUCHMOVE:"touchmove"+P,TOUCHEND:"touchend"+P,POINTERDOWN:"pointerdown"+P,POINTERUP:"pointerup"+P,DRAG_START:"dragstart"+P,LOAD_DATA_API:"load"+P+H,CLICK_DATA_API:"click"+P+H},K="carousel",Q="active",V="slide",Y="carousel-item-right",z="carousel-item-left",X="carousel-item-next",G="carousel-item-prev",$="pointer-event",J=".active",Z=".active.carousel-item",tt=".carousel-item",et=".carousel-item img",nt=".carousel-item-next, .carousel-item-prev",it=".carousel-indicators",ot="[data-slide], [data-slide-to]",rt='[data-ride="carousel"]',st={TOUCH:"touch",PEN:"pen"},at=function(){function r(t,e){this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this.touchStartX=0,this.touchDeltaX=0,this._config=this._getConfig(e),this._element=t,this._indicatorsElement=this._element.querySelector(it),this._touchSupported="ontouchstart"in document.documentElement||0<navigator.maxTouchPoints,this._pointerEvent=Boolean(window.PointerEvent||window.MSPointerEvent),this._addEventListeners()}var t=r.prototype;return t.next=function(){this._isSliding||this._slide(M)},t.nextWhenVisible=function(){!document.hidden&&p(this._element).is(":visible")&&"hidden"!==p(this._element).css("visibility")&&this.next()},t.prev=function(){this._isSliding||this._slide(W)},t.pause=function(t){t||(this._isPaused=!0),this._element.querySelector(nt)&&(m.triggerTransitionEnd(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},t.cycle=function(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config.interval&&!this._isPaused&&(this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},t.to=function(t){var e=this;this._activeElement=this._element.querySelector(Z);var n=this._getItemIndex(this._activeElement);if(!(t>this._items.length-1||t<0))if(this._isSliding)p(this._element).one(q.SLID,function(){return e.to(t)});else{if(n===t)return this.pause(),void this.cycle();var i=n<t?M:W;this._slide(i,this._items[t])}},t.dispose=function(){p(this._element).off(P),p.removeData(this._element,x),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},t._getConfig=function(t){return t=l({},R,t),m.typeCheckConfig(L,t,F),t},t._handleSwipe=function(){var t=Math.abs(this.touchDeltaX);if(!(t<=40)){var e=t/this.touchDeltaX;0<e&&this.prev(),e<0&&this.next()}},t._addEventListeners=function(){var e=this;this._config.keyboard&&p(this._element).on(q.KEYDOWN,function(t){return e._keydown(t)}),"hover"===this._config.pause&&p(this._element).on(q.MOUSEENTER,function(t){return e.pause(t)}).on(q.MOUSELEAVE,function(t){return e.cycle(t)}),this._config.touch&&this._addTouchEventListeners()},t._addTouchEventListeners=function(){var n=this;if(this._touchSupported){var e=function(t){n._pointerEvent&&st[t.originalEvent.pointerType.toUpperCase()]?n.touchStartX=t.originalEvent.clientX:n._pointerEvent||(n.touchStartX=t.originalEvent.touches[0].clientX)},i=function(t){n._pointerEvent&&st[t.originalEvent.pointerType.toUpperCase()]&&(n.touchDeltaX=t.originalEvent.clientX-n.touchStartX),n._handleSwipe(),"hover"===n._config.pause&&(n.pause(),n.touchTimeout&&clearTimeout(n.touchTimeout),n.touchTimeout=setTimeout(function(t){return n.cycle(t)},500+n._config.interval))};p(this._element.querySelectorAll(et)).on(q.DRAG_START,function(t){return t.preventDefault()}),this._pointerEvent?(p(this._element).on(q.POINTERDOWN,function(t){return e(t)}),p(this._element).on(q.POINTERUP,function(t){return i(t)}),this._element.classList.add($)):(p(this._element).on(q.TOUCHSTART,function(t){return e(t)}),p(this._element).on(q.TOUCHMOVE,function(t){var e;(e=t).originalEvent.touches&&1<e.originalEvent.touches.length?n.touchDeltaX=0:n.touchDeltaX=e.originalEvent.touches[0].clientX-n.touchStartX}),p(this._element).on(q.TOUCHEND,function(t){return i(t)}))}},t._keydown=function(t){if(!/input|textarea/i.test(t.target.tagName))switch(t.which){case 37:t.preventDefault(),this.prev();break;case 39:t.preventDefault(),this.next()}},t._getItemIndex=function(t){return this._items=t&&t.parentNode?[].slice.call(t.parentNode.querySelectorAll(tt)):[],this._items.indexOf(t)},t._getItemByDirection=function(t,e){var n=t===M,i=t===W,o=this._getItemIndex(e),r=this._items.length-1;if((i&&0===o||n&&o===r)&&!this._config.wrap)return e;var s=(o+(t===W?-1:1))%this._items.length;return-1===s?this._items[this._items.length-1]:this._items[s]},t._triggerSlideEvent=function(t,e){var n=this._getItemIndex(t),i=this._getItemIndex(this._element.querySelector(Z)),o=p.Event(q.SLIDE,{relatedTarget:t,direction:e,from:i,to:n});return p(this._element).trigger(o),o},t._setActiveIndicatorElement=function(t){if(this._indicatorsElement){var e=[].slice.call(this._indicatorsElement.querySelectorAll(J));p(e).removeClass(Q);var n=this._indicatorsElement.children[this._getItemIndex(t)];n&&p(n).addClass(Q)}},t._slide=function(t,e){var n,i,o,r=this,s=this._element.querySelector(Z),a=this._getItemIndex(s),l=e||s&&this._getItemByDirection(t,s),c=this._getItemIndex(l),h=Boolean(this._interval);if(o=t===M?(n=z,i=X,U):(n=Y,i=G,B),l&&p(l).hasClass(Q))this._isSliding=!1;else if(!this._triggerSlideEvent(l,o).isDefaultPrevented()&&s&&l){this._isSliding=!0,h&&this.pause(),this._setActiveIndicatorElement(l);var u=p.Event(q.SLID,{relatedTarget:l,direction:o,from:a,to:c});if(p(this._element).hasClass(V)){p(l).addClass(i),m.reflow(l),p(s).addClass(n),p(l).addClass(n);var f=parseInt(l.getAttribute("data-interval"),10);this._config.interval=f?(this._config.defaultInterval=this._config.defaultInterval||this._config.interval,f):this._config.defaultInterval||this._config.interval;var d=m.getTransitionDurationFromElement(s);p(s).one(m.TRANSITION_END,function(){p(l).removeClass(n+" "+i).addClass(Q),p(s).removeClass(Q+" "+i+" "+n),r._isSliding=!1,setTimeout(function(){return p(r._element).trigger(u)},0)}).emulateTransitionEnd(d)}else p(s).removeClass(Q),p(l).addClass(Q),this._isSliding=!1,p(this._element).trigger(u);h&&this.cycle()}},r._jQueryInterface=function(i){return this.each(function(){var t=p(this).data(x),e=l({},R,p(this).data());"object"==typeof i&&(e=l({},e,i));var n="string"==typeof i?i:e.slide;if(t||(t=new r(this,e),p(this).data(x,t)),"number"==typeof i)t.to(i);else if("string"==typeof n){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n]()}else e.interval&&e.ride&&(t.pause(),t.cycle())})},r._dataApiClickHandler=function(t){var e=m.getSelectorFromElement(this);if(e){var n=p(e)[0];if(n&&p(n).hasClass(K)){var i=l({},p(n).data(),p(this).data()),o=this.getAttribute("data-slide-to");o&&(i.interval=!1),r._jQueryInterface.call(p(n),i),o&&p(n).data(x).to(o),t.preventDefault()}}},s(r,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return R}}]),r}();p(document).on(q.CLICK_DATA_API,ot,at._dataApiClickHandler),p(window).on(q.LOAD_DATA_API,function(){for(var t=[].slice.call(document.querySelectorAll(rt)),e=0,n=t.length;e<n;e++){var i=p(t[e]);at._jQueryInterface.call(i,i.data())}}),p.fn[L]=at._jQueryInterface,p.fn[L].Constructor=at,p.fn[L].noConflict=function(){return p.fn[L]=j,at._jQueryInterface};var lt="collapse",ct="bs.collapse",ht="."+ct,ut=p.fn[lt],ft={toggle:!0,parent:""},dt={toggle:"boolean",parent:"(string|element)"},pt={SHOW:"show"+ht,SHOWN:"shown"+ht,HIDE:"hide"+ht,HIDDEN:"hidden"+ht,CLICK_DATA_API:"click"+ht+".data-api"},mt="show",gt="collapse",_t="collapsing",vt="collapsed",yt="width",Et="height",bt=".show, .collapsing",wt='[data-toggle="collapse"]',Ct=function(){function a(e,t){this._isTransitioning=!1,this._element=e,this._config=this._getConfig(t),this._triggerArray=[].slice.call(document.querySelectorAll('[data-toggle="collapse"][href="#'+e.id+'"],[data-toggle="collapse"][data-target="#'+e.id+'"]'));for(var n=[].slice.call(document.querySelectorAll(wt)),i=0,o=n.length;i<o;i++){var r=n[i],s=m.getSelectorFromElement(r),a=[].slice.call(document.querySelectorAll(s)).filter(function(t){return t===e});null!==s&&0<a.length&&(this._selector=s,this._triggerArray.push(r))}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}var t=a.prototype;return t.toggle=function(){p(this._element).hasClass(mt)?this.hide():this.show()},t.show=function(){var t,e,n=this;if(!this._isTransitioning&&!p(this._element).hasClass(mt)&&(this._parent&&0===(t=[].slice.call(this._parent.querySelectorAll(bt)).filter(function(t){return"string"==typeof n._config.parent?t.getAttribute("data-parent")===n._config.parent:t.classList.contains(gt)})).length&&(t=null),!(t&&(e=p(t).not(this._selector).data(ct))&&e._isTransitioning))){var i=p.Event(pt.SHOW);if(p(this._element).trigger(i),!i.isDefaultPrevented()){t&&(a._jQueryInterface.call(p(t).not(this._selector),"hide"),e||p(t).data(ct,null));var o=this._getDimension();p(this._element).removeClass(gt).addClass(_t),this._element.style[o]=0,this._triggerArray.length&&p(this._triggerArray).removeClass(vt).attr("aria-expanded",!0),this.setTransitioning(!0);var r="scroll"+(o[0].toUpperCase()+o.slice(1)),s=m.getTransitionDurationFromElement(this._element);p(this._element).one(m.TRANSITION_END,function(){p(n._element).removeClass(_t).addClass(gt).addClass(mt),n._element.style[o]="",n.setTransitioning(!1),p(n._element).trigger(pt.SHOWN)}).emulateTransitionEnd(s),this._element.style[o]=this._element[r]+"px"}}},t.hide=function(){var t=this;if(!this._isTransitioning&&p(this._element).hasClass(mt)){var e=p.Event(pt.HIDE);if(p(this._element).trigger(e),!e.isDefaultPrevented()){var n=this._getDimension();this._element.style[n]=this._element.getBoundingClientRect()[n]+"px",m.reflow(this._element),p(this._element).addClass(_t).removeClass(gt).removeClass(mt);var i=this._triggerArray.length;if(0<i)for(var o=0;o<i;o++){var r=this._triggerArray[o],s=m.getSelectorFromElement(r);if(null!==s)p([].slice.call(document.querySelectorAll(s))).hasClass(mt)||p(r).addClass(vt).attr("aria-expanded",!1)}this.setTransitioning(!0);this._element.style[n]="";var a=m.getTransitionDurationFromElement(this._element);p(this._element).one(m.TRANSITION_END,function(){t.setTransitioning(!1),p(t._element).removeClass(_t).addClass(gt).trigger(pt.HIDDEN)}).emulateTransitionEnd(a)}}},t.setTransitioning=function(t){this._isTransitioning=t},t.dispose=function(){p.removeData(this._element,ct),this._config=null,this._parent=null,this._element=null,this._triggerArray=null,this._isTransitioning=null},t._getConfig=function(t){return(t=l({},ft,t)).toggle=Boolean(t.toggle),m.typeCheckConfig(lt,t,dt),t},t._getDimension=function(){return p(this._element).hasClass(yt)?yt:Et},t._getParent=function(){var t,n=this;m.isElement(this._config.parent)?(t=this._config.parent,"undefined"!=typeof this._config.parent.jquery&&(t=this._config.parent[0])):t=document.querySelector(this._config.parent);var e='[data-toggle="collapse"][data-parent="'+this._config.parent+'"]',i=[].slice.call(t.querySelectorAll(e));return p(i).each(function(t,e){n._addAriaAndCollapsedClass(a._getTargetFromElement(e),[e])}),t},t._addAriaAndCollapsedClass=function(t,e){var n=p(t).hasClass(mt);e.length&&p(e).toggleClass(vt,!n).attr("aria-expanded",n)},a._getTargetFromElement=function(t){var e=m.getSelectorFromElement(t);return e?document.querySelector(e):null},a._jQueryInterface=function(i){return this.each(function(){var t=p(this),e=t.data(ct),n=l({},ft,t.data(),"object"==typeof i&&i?i:{});if(!e&&n.toggle&&/show|hide/.test(i)&&(n.toggle=!1),e||(e=new a(this,n),t.data(ct,e)),"string"==typeof i){if("undefined"==typeof e[i])throw new TypeError('No method named "'+i+'"');e[i]()}})},s(a,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return ft}}]),a}();p(document).on(pt.CLICK_DATA_API,wt,function(t){"A"===t.currentTarget.tagName&&t.preventDefault();var n=p(this),e=m.getSelectorFromElement(this),i=[].slice.call(document.querySelectorAll(e));p(i).each(function(){var t=p(this),e=t.data(ct)?"toggle":n.data();Ct._jQueryInterface.call(t,e)})}),p.fn[lt]=Ct._jQueryInterface,p.fn[lt].Constructor=Ct,p.fn[lt].noConflict=function(){return p.fn[lt]=ut,Ct._jQueryInterface};for(var Tt="undefined"!=typeof window&&"undefined"!=typeof document,St=["Edge","Trident","Firefox"],Dt=0,It=0;It<St.length;It+=1)if(Tt&&0<=navigator.userAgent.indexOf(St[It])){Dt=1;break}var At=Tt&&window.Promise?function(t){var e=!1;return function(){e||(e=!0,window.Promise.resolve().then(function(){e=!1,t()}))}}:function(t){var e=!1;return function(){e||(e=!0,setTimeout(function(){e=!1,t()},Dt))}};function Ot(t){return t&&"[object Function]"==={}.toString.call(t)}function Nt(t,e){if(1!==t.nodeType)return[];var n=t.ownerDocument.defaultView.getComputedStyle(t,null);return e?n[e]:n}function kt(t){return"HTML"===t.nodeName?t:t.parentNode||t.host}function Lt(t){if(!t)return document.body;switch(t.nodeName){case"HTML":case"BODY":return t.ownerDocument.body;case"#document":return t.body}var e=Nt(t),n=e.overflow,i=e.overflowX,o=e.overflowY;return/(auto|scroll|overlay)/.test(n+o+i)?t:Lt(kt(t))}var xt=Tt&&!(!window.MSInputMethodContext||!document.documentMode),Pt=Tt&&/MSIE 10/.test(navigator.userAgent);function Ht(t){return 11===t?xt:10===t?Pt:xt||Pt}function jt(t){if(!t)return document.documentElement;for(var e=Ht(10)?document.body:null,n=t.offsetParent||null;n===e&&t.nextElementSibling;)n=(t=t.nextElementSibling).offsetParent;var i=n&&n.nodeName;return i&&"BODY"!==i&&"HTML"!==i?-1!==["TH","TD","TABLE"].indexOf(n.nodeName)&&"static"===Nt(n,"position")?jt(n):n:t?t.ownerDocument.documentElement:document.documentElement}function Rt(t){return null!==t.parentNode?Rt(t.parentNode):t}function Ft(t,e){if(!(t&&t.nodeType&&e&&e.nodeType))return document.documentElement;var n=t.compareDocumentPosition(e)&Node.DOCUMENT_POSITION_FOLLOWING,i=n?t:e,o=n?e:t,r=document.createRange();r.setStart(i,0),r.setEnd(o,0);var s,a,l=r.commonAncestorContainer;if(t!==l&&e!==l||i.contains(o))return"BODY"===(a=(s=l).nodeName)||"HTML"!==a&&jt(s.firstElementChild)!==s?jt(l):l;var c=Rt(t);return c.host?Ft(c.host,e):Ft(t,Rt(e).host)}function Mt(t){var e="top"===(1<arguments.length&&void 0!==arguments[1]?arguments[1]:"top")?"scrollTop":"scrollLeft",n=t.nodeName;if("BODY"!==n&&"HTML"!==n)return t[e];var i=t.ownerDocument.documentElement;return(t.ownerDocument.scrollingElement||i)[e]}function Wt(t,e){var n="x"===e?"Left":"Top",i="Left"===n?"Right":"Bottom";return parseFloat(t["border"+n+"Width"],10)+parseFloat(t["border"+i+"Width"],10)}function Ut(t,e,n,i){return Math.max(e["offset"+t],e["scroll"+t],n["client"+t],n["offset"+t],n["scroll"+t],Ht(10)?parseInt(n["offset"+t])+parseInt(i["margin"+("Height"===t?"Top":"Left")])+parseInt(i["margin"+("Height"===t?"Bottom":"Right")]):0)}function Bt(t){var e=t.body,n=t.documentElement,i=Ht(10)&&getComputedStyle(n);return{height:Ut("Height",e,n,i),width:Ut("Width",e,n,i)}}var qt=function(){function i(t,e){for(var n=0;n<e.length;n++){var i=e[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}return function(t,e,n){return e&&i(t.prototype,e),n&&i(t,n),t}}(),Kt=function(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t},Qt=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var i in n)Object.prototype.hasOwnProperty.call(n,i)&&(t[i]=n[i])}return t};function Vt(t){return Qt({},t,{right:t.left+t.width,bottom:t.top+t.height})}function Yt(t){var e={};try{if(Ht(10)){e=t.getBoundingClientRect();var n=Mt(t,"top"),i=Mt(t,"left");e.top+=n,e.left+=i,e.bottom+=n,e.right+=i}else e=t.getBoundingClientRect()}catch(t){}var o={left:e.left,top:e.top,width:e.right-e.left,height:e.bottom-e.top},r="HTML"===t.nodeName?Bt(t.ownerDocument):{},s=r.width||t.clientWidth||o.right-o.left,a=r.height||t.clientHeight||o.bottom-o.top,l=t.offsetWidth-s,c=t.offsetHeight-a;if(l||c){var h=Nt(t);l-=Wt(h,"x"),c-=Wt(h,"y"),o.width-=l,o.height-=c}return Vt(o)}function zt(t,e){var n=2<arguments.length&&void 0!==arguments[2]&&arguments[2],i=Ht(10),o="HTML"===e.nodeName,r=Yt(t),s=Yt(e),a=Lt(t),l=Nt(e),c=parseFloat(l.borderTopWidth,10),h=parseFloat(l.borderLeftWidth,10);n&&o&&(s.top=Math.max(s.top,0),s.left=Math.max(s.left,0));var u=Vt({top:r.top-s.top-c,left:r.left-s.left-h,width:r.width,height:r.height});if(u.marginTop=0,u.marginLeft=0,!i&&o){var f=parseFloat(l.marginTop,10),d=parseFloat(l.marginLeft,10);u.top-=c-f,u.bottom-=c-f,u.left-=h-d,u.right-=h-d,u.marginTop=f,u.marginLeft=d}return(i&&!n?e.contains(a):e===a&&"BODY"!==a.nodeName)&&(u=function(t,e){var n=2<arguments.length&&void 0!==arguments[2]&&arguments[2],i=Mt(e,"top"),o=Mt(e,"left"),r=n?-1:1;return t.top+=i*r,t.bottom+=i*r,t.left+=o*r,t.right+=o*r,t}(u,e)),u}function Xt(t){if(!t||!t.parentElement||Ht())return document.documentElement;for(var e=t.parentElement;e&&"none"===Nt(e,"transform");)e=e.parentElement;return e||document.documentElement}function Gt(t,e,n,i){var o=4<arguments.length&&void 0!==arguments[4]&&arguments[4],r={top:0,left:0},s=o?Xt(t):Ft(t,e);if("viewport"===i)r=function(t){var e=1<arguments.length&&void 0!==arguments[1]&&arguments[1],n=t.ownerDocument.documentElement,i=zt(t,n),o=Math.max(n.clientWidth,window.innerWidth||0),r=Math.max(n.clientHeight,window.innerHeight||0),s=e?0:Mt(n),a=e?0:Mt(n,"left");return Vt({top:s-i.top+i.marginTop,left:a-i.left+i.marginLeft,width:o,height:r})}(s,o);else{var a=void 0;"scrollParent"===i?"BODY"===(a=Lt(kt(e))).nodeName&&(a=t.ownerDocument.documentElement):a="window"===i?t.ownerDocument.documentElement:i;var l=zt(a,s,o);if("HTML"!==a.nodeName||function t(e){var n=e.nodeName;if("BODY"===n||"HTML"===n)return!1;if("fixed"===Nt(e,"position"))return!0;var i=kt(e);return!!i&&t(i)}(s))r=l;else{var c=Bt(t.ownerDocument),h=c.height,u=c.width;r.top+=l.top-l.marginTop,r.bottom=h+l.top,r.left+=l.left-l.marginLeft,r.right=u+l.left}}var f="number"==typeof(n=n||0);return r.left+=f?n:n.left||0,r.top+=f?n:n.top||0,r.right-=f?n:n.right||0,r.bottom-=f?n:n.bottom||0,r}function $t(t,e,i,n,o){var r=5<arguments.length&&void 0!==arguments[5]?arguments[5]:0;if(-1===t.indexOf("auto"))return t;var s=Gt(i,n,r,o),a={top:{width:s.width,height:e.top-s.top},right:{width:s.right-e.right,height:s.height},bottom:{width:s.width,height:s.bottom-e.bottom},left:{width:e.left-s.left,height:s.height}},l=Object.keys(a).map(function(t){return Qt({key:t},a[t],{area:(e=a[t],e.width*e.height)});var e}).sort(function(t,e){return e.area-t.area}),c=l.filter(function(t){var e=t.width,n=t.height;return e>=i.clientWidth&&n>=i.clientHeight}),h=0<c.length?c[0].key:l[0].key,u=t.split("-")[1];return h+(u?"-"+u:"")}function Jt(t,e,n){var i=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return zt(n,i?Xt(e):Ft(e,n),i)}function Zt(t){var e=t.ownerDocument.defaultView.getComputedStyle(t),n=parseFloat(e.marginTop||0)+parseFloat(e.marginBottom||0),i=parseFloat(e.marginLeft||0)+parseFloat(e.marginRight||0);return{width:t.offsetWidth+i,height:t.offsetHeight+n}}function te(t){var e={left:"right",right:"left",bottom:"top",top:"bottom"};return t.replace(/left|right|bottom|top/g,function(t){return e[t]})}function ee(t,e,n){n=n.split("-")[0];var i=Zt(t),o={width:i.width,height:i.height},r=-1!==["right","left"].indexOf(n),s=r?"top":"left",a=r?"left":"top",l=r?"height":"width",c=r?"width":"height";return o[s]=e[s]+e[l]/2-i[l]/2,o[a]=n===a?e[a]-i[c]:e[te(a)],o}function ne(t,e){return Array.prototype.find?t.find(e):t.filter(e)[0]}function ie(t,n,e){return(void 0===e?t:t.slice(0,function(t,e,n){if(Array.prototype.findIndex)return t.findIndex(function(t){return t[e]===n});var i=ne(t,function(t){return t[e]===n});return t.indexOf(i)}(t,"name",e))).forEach(function(t){t.function&&console.warn("`modifier.function` is deprecated, use `modifier.fn`!");var e=t.function||t.fn;t.enabled&&Ot(e)&&(n.offsets.popper=Vt(n.offsets.popper),n.offsets.reference=Vt(n.offsets.reference),n=e(n,t))}),n}function oe(t,n){return t.some(function(t){var e=t.name;return t.enabled&&e===n})}function re(t){for(var e=[!1,"ms","Webkit","Moz","O"],n=t.charAt(0).toUpperCase()+t.slice(1),i=0;i<e.length;i++){var o=e[i],r=o?""+o+n:t;if("undefined"!=typeof document.body.style[r])return r}return null}function se(t){var e=t.ownerDocument;return e?e.defaultView:window}function ae(t,e,n,i){n.updateBound=i,se(t).addEventListener("resize",n.updateBound,{passive:!0});var o=Lt(t);return function t(e,n,i,o){var r="BODY"===e.nodeName,s=r?e.ownerDocument.defaultView:e;s.addEventListener(n,i,{passive:!0}),r||t(Lt(s.parentNode),n,i,o),o.push(s)}(o,"scroll",n.updateBound,n.scrollParents),n.scrollElement=o,n.eventsEnabled=!0,n}function le(){var t,e;this.state.eventsEnabled&&(cancelAnimationFrame(this.scheduleUpdate),this.state=(t=this.reference,e=this.state,se(t).removeEventListener("resize",e.updateBound),e.scrollParents.forEach(function(t){t.removeEventListener("scroll",e.updateBound)}),e.updateBound=null,e.scrollParents=[],e.scrollElement=null,e.eventsEnabled=!1,e))}function ce(t){return""!==t&&!isNaN(parseFloat(t))&&isFinite(t)}function he(n,i){Object.keys(i).forEach(function(t){var e="";-1!==["width","height","top","right","bottom","left"].indexOf(t)&&ce(i[t])&&(e="px"),n.style[t]=i[t]+e})}var ue=Tt&&/Firefox/i.test(navigator.userAgent);function fe(t,e,n){var i=ne(t,function(t){return t.name===e}),o=!!i&&t.some(function(t){return t.name===n&&t.enabled&&t.order<i.order});if(!o){var r="`"+e+"`",s="`"+n+"`";console.warn(s+" modifier is required by "+r+" modifier in order to work, be sure to include it before "+r+"!")}return o}var de=["auto-start","auto","auto-end","top-start","top","top-end","right-start","right","right-end","bottom-end","bottom","bottom-start","left-end","left","left-start"],pe=de.slice(3);function me(t){var e=1<arguments.length&&void 0!==arguments[1]&&arguments[1],n=pe.indexOf(t),i=pe.slice(n+1).concat(pe.slice(0,n));return e?i.reverse():i}var ge="flip",_e="clockwise",ve="counterclockwise";function ye(t,o,r,e){var s=[0,0],a=-1!==["right","left"].indexOf(e),n=t.split(/(\+|\-)/).map(function(t){return t.trim()}),i=n.indexOf(ne(n,function(t){return-1!==t.search(/,|\s/)}));n[i]&&-1===n[i].indexOf(",")&&console.warn("Offsets separated by white space(s) are deprecated, use a comma (,) instead.");var l=/\s*,\s*|\s+/,c=-1!==i?[n.slice(0,i).concat([n[i].split(l)[0]]),[n[i].split(l)[1]].concat(n.slice(i+1))]:[n];return(c=c.map(function(t,e){var n=(1===e?!a:a)?"height":"width",i=!1;return t.reduce(function(t,e){return""===t[t.length-1]&&-1!==["+","-"].indexOf(e)?(t[t.length-1]=e,i=!0,t):i?(t[t.length-1]+=e,i=!1,t):t.concat(e)},[]).map(function(t){return function(t,e,n,i){var o=t.match(/((?:\-|\+)?\d*\.?\d*)(.*)/),r=+o[1],s=o[2];if(!r)return t;if(0!==s.indexOf("%"))return"vh"!==s&&"vw"!==s?r:("vh"===s?Math.max(document.documentElement.clientHeight,window.innerHeight||0):Math.max(document.documentElement.clientWidth,window.innerWidth||0))/100*r;var a=void 0;switch(s){case"%p":a=n;break;case"%":case"%r":default:a=i}return Vt(a)[e]/100*r}(t,n,o,r)})})).forEach(function(n,i){n.forEach(function(t,e){ce(t)&&(s[i]+=t*("-"===n[e-1]?-1:1))})}),s}var Ee={placement:"bottom",positionFixed:!1,eventsEnabled:!0,removeOnDestroy:!1,onCreate:function(){},onUpdate:function(){},modifiers:{shift:{order:100,enabled:!0,fn:function(t){var e=t.placement,n=e.split("-")[0],i=e.split("-")[1];if(i){var o=t.offsets,r=o.reference,s=o.popper,a=-1!==["bottom","top"].indexOf(n),l=a?"left":"top",c=a?"width":"height",h={start:Kt({},l,r[l]),end:Kt({},l,r[l]+r[c]-s[c])};t.offsets.popper=Qt({},s,h[i])}return t}},offset:{order:200,enabled:!0,fn:function(t,e){var n=e.offset,i=t.placement,o=t.offsets,r=o.popper,s=o.reference,a=i.split("-")[0],l=void 0;return l=ce(+n)?[+n,0]:ye(n,r,s,a),"left"===a?(r.top+=l[0],r.left-=l[1]):"right"===a?(r.top+=l[0],r.left+=l[1]):"top"===a?(r.left+=l[0],r.top-=l[1]):"bottom"===a&&(r.left+=l[0],r.top+=l[1]),t.popper=r,t},offset:0},preventOverflow:{order:300,enabled:!0,fn:function(t,i){var e=i.boundariesElement||jt(t.instance.popper);t.instance.reference===e&&(e=jt(e));var n=re("transform"),o=t.instance.popper.style,r=o.top,s=o.left,a=o[n];o.top="",o.left="",o[n]="";var l=Gt(t.instance.popper,t.instance.reference,i.padding,e,t.positionFixed);o.top=r,o.left=s,o[n]=a,i.boundaries=l;var c=i.priority,h=t.offsets.popper,u={primary:function(t){var e=h[t];return h[t]<l[t]&&!i.escapeWithReference&&(e=Math.max(h[t],l[t])),Kt({},t,e)},secondary:function(t){var e="right"===t?"left":"top",n=h[e];return h[t]>l[t]&&!i.escapeWithReference&&(n=Math.min(h[e],l[t]-("right"===t?h.width:h.height))),Kt({},e,n)}};return c.forEach(function(t){var e=-1!==["left","top"].indexOf(t)?"primary":"secondary";h=Qt({},h,u[e](t))}),t.offsets.popper=h,t},priority:["left","right","top","bottom"],padding:5,boundariesElement:"scrollParent"},keepTogether:{order:400,enabled:!0,fn:function(t){var e=t.offsets,n=e.popper,i=e.reference,o=t.placement.split("-")[0],r=Math.floor,s=-1!==["top","bottom"].indexOf(o),a=s?"right":"bottom",l=s?"left":"top",c=s?"width":"height";return n[a]<r(i[l])&&(t.offsets.popper[l]=r(i[l])-n[c]),n[l]>r(i[a])&&(t.offsets.popper[l]=r(i[a])),t}},arrow:{order:500,enabled:!0,fn:function(t,e){var n;if(!fe(t.instance.modifiers,"arrow","keepTogether"))return t;var i=e.element;if("string"==typeof i){if(!(i=t.instance.popper.querySelector(i)))return t}else if(!t.instance.popper.contains(i))return console.warn("WARNING: `arrow.element` must be child of its popper element!"),t;var o=t.placement.split("-")[0],r=t.offsets,s=r.popper,a=r.reference,l=-1!==["left","right"].indexOf(o),c=l?"height":"width",h=l?"Top":"Left",u=h.toLowerCase(),f=l?"left":"top",d=l?"bottom":"right",p=Zt(i)[c];a[d]-p<s[u]&&(t.offsets.popper[u]-=s[u]-(a[d]-p)),a[u]+p>s[d]&&(t.offsets.popper[u]+=a[u]+p-s[d]),t.offsets.popper=Vt(t.offsets.popper);var m=a[u]+a[c]/2-p/2,g=Nt(t.instance.popper),_=parseFloat(g["margin"+h],10),v=parseFloat(g["border"+h+"Width"],10),y=m-t.offsets.popper[u]-_-v;return y=Math.max(Math.min(s[c]-p,y),0),t.arrowElement=i,t.offsets.arrow=(Kt(n={},u,Math.round(y)),Kt(n,f,""),n),t},element:"[x-arrow]"},flip:{order:600,enabled:!0,fn:function(p,m){if(oe(p.instance.modifiers,"inner"))return p;if(p.flipped&&p.placement===p.originalPlacement)return p;var g=Gt(p.instance.popper,p.instance.reference,m.padding,m.boundariesElement,p.positionFixed),_=p.placement.split("-")[0],v=te(_),y=p.placement.split("-")[1]||"",E=[];switch(m.behavior){case ge:E=[_,v];break;case _e:E=me(_);break;case ve:E=me(_,!0);break;default:E=m.behavior}return E.forEach(function(t,e){if(_!==t||E.length===e+1)return p;_=p.placement.split("-")[0],v=te(_);var n,i=p.offsets.popper,o=p.offsets.reference,r=Math.floor,s="left"===_&&r(i.right)>r(o.left)||"right"===_&&r(i.left)<r(o.right)||"top"===_&&r(i.bottom)>r(o.top)||"bottom"===_&&r(i.top)<r(o.bottom),a=r(i.left)<r(g.left),l=r(i.right)>r(g.right),c=r(i.top)<r(g.top),h=r(i.bottom)>r(g.bottom),u="left"===_&&a||"right"===_&&l||"top"===_&&c||"bottom"===_&&h,f=-1!==["top","bottom"].indexOf(_),d=!!m.flipVariations&&(f&&"start"===y&&a||f&&"end"===y&&l||!f&&"start"===y&&c||!f&&"end"===y&&h);(s||u||d)&&(p.flipped=!0,(s||u)&&(_=E[e+1]),d&&(y="end"===(n=y)?"start":"start"===n?"end":n),p.placement=_+(y?"-"+y:""),p.offsets.popper=Qt({},p.offsets.popper,ee(p.instance.popper,p.offsets.reference,p.placement)),p=ie(p.instance.modifiers,p,"flip"))}),p},behavior:"flip",padding:5,boundariesElement:"viewport"},inner:{order:700,enabled:!1,fn:function(t){var e=t.placement,n=e.split("-")[0],i=t.offsets,o=i.popper,r=i.reference,s=-1!==["left","right"].indexOf(n),a=-1===["top","left"].indexOf(n);return o[s?"left":"top"]=r[n]-(a?o[s?"width":"height"]:0),t.placement=te(e),t.offsets.popper=Vt(o),t}},hide:{order:800,enabled:!0,fn:function(t){if(!fe(t.instance.modifiers,"hide","preventOverflow"))return t;var e=t.offsets.reference,n=ne(t.instance.modifiers,function(t){return"preventOverflow"===t.name}).boundaries;if(e.bottom<n.top||e.left>n.right||e.top>n.bottom||e.right<n.left){if(!0===t.hide)return t;t.hide=!0,t.attributes["x-out-of-boundaries"]=""}else{if(!1===t.hide)return t;t.hide=!1,t.attributes["x-out-of-boundaries"]=!1}return t}},computeStyle:{order:850,enabled:!0,fn:function(t,e){var n=e.x,i=e.y,o=t.offsets.popper,r=ne(t.instance.modifiers,function(t){return"applyStyle"===t.name}).gpuAcceleration;void 0!==r&&console.warn("WARNING: `gpuAcceleration` option moved to `computeStyle` modifier and will not be supported in future versions of Popper.js!");var s,a,l,c,h,u,f,d,p,m,g,_,v,y,E=void 0!==r?r:e.gpuAcceleration,b=jt(t.instance.popper),w=Yt(b),C={position:o.position},T=(s=t,a=window.devicePixelRatio<2||!ue,l=s.offsets,c=l.popper,h=l.reference,u=Math.round,f=Math.floor,d=function(t){return t},p=u(h.width),m=u(c.width),g=-1!==["left","right"].indexOf(s.placement),_=-1!==s.placement.indexOf("-"),y=a?u:d,{left:(v=a?g||_||p%2==m%2?u:f:d)(p%2==1&&m%2==1&&!_&&a?c.left-1:c.left),top:y(c.top),bottom:y(c.bottom),right:v(c.right)}),S="bottom"===n?"top":"bottom",D="right"===i?"left":"right",I=re("transform"),A=void 0,O=void 0;if(O="bottom"===S?"HTML"===b.nodeName?-b.clientHeight+T.bottom:-w.height+T.bottom:T.top,A="right"===D?"HTML"===b.nodeName?-b.clientWidth+T.right:-w.width+T.right:T.left,E&&I)C[I]="translate3d("+A+"px, "+O+"px, 0)",C[S]=0,C[D]=0,C.willChange="transform";else{var N="bottom"===S?-1:1,k="right"===D?-1:1;C[S]=O*N,C[D]=A*k,C.willChange=S+", "+D}var L={"x-placement":t.placement};return t.attributes=Qt({},L,t.attributes),t.styles=Qt({},C,t.styles),t.arrowStyles=Qt({},t.offsets.arrow,t.arrowStyles),t},gpuAcceleration:!0,x:"bottom",y:"right"},applyStyle:{order:900,enabled:!0,fn:function(t){var e,n;return he(t.instance.popper,t.styles),e=t.instance.popper,n=t.attributes,Object.keys(n).forEach(function(t){!1!==n[t]?e.setAttribute(t,n[t]):e.removeAttribute(t)}),t.arrowElement&&Object.keys(t.arrowStyles).length&&he(t.arrowElement,t.arrowStyles),t},onLoad:function(t,e,n,i,o){var r=Jt(o,e,t,n.positionFixed),s=$t(n.placement,r,e,t,n.modifiers.flip.boundariesElement,n.modifiers.flip.padding);return e.setAttribute("x-placement",s),he(e,{position:n.positionFixed?"fixed":"absolute"}),n},gpuAcceleration:void 0}}},be=function(){function r(t,e){var n=this,i=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{};!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,r),this.scheduleUpdate=function(){return requestAnimationFrame(n.update)},this.update=At(this.update.bind(this)),this.options=Qt({},r.Defaults,i),this.state={isDestroyed:!1,isCreated:!1,scrollParents:[]},this.reference=t&&t.jquery?t[0]:t,this.popper=e&&e.jquery?e[0]:e,this.options.modifiers={},Object.keys(Qt({},r.Defaults.modifiers,i.modifiers)).forEach(function(t){n.options.modifiers[t]=Qt({},r.Defaults.modifiers[t]||{},i.modifiers?i.modifiers[t]:{})}),this.modifiers=Object.keys(this.options.modifiers).map(function(t){return Qt({name:t},n.options.modifiers[t])}).sort(function(t,e){return t.order-e.order}),this.modifiers.forEach(function(t){t.enabled&&Ot(t.onLoad)&&t.onLoad(n.reference,n.popper,n.options,t,n.state)}),this.update();var o=this.options.eventsEnabled;o&&this.enableEventListeners(),this.state.eventsEnabled=o}return qt(r,[{key:"update",value:function(){return function(){if(!this.state.isDestroyed){var t={instance:this,styles:{},arrowStyles:{},attributes:{},flipped:!1,offsets:{}};t.offsets.reference=Jt(this.state,this.popper,this.reference,this.options.positionFixed),t.placement=$t(this.options.placement,t.offsets.reference,this.popper,this.reference,this.options.modifiers.flip.boundariesElement,this.options.modifiers.flip.padding),t.originalPlacement=t.placement,t.positionFixed=this.options.positionFixed,t.offsets.popper=ee(this.popper,t.offsets.reference,t.placement),t.offsets.popper.position=this.options.positionFixed?"fixed":"absolute",t=ie(this.modifiers,t),this.state.isCreated?this.options.onUpdate(t):(this.state.isCreated=!0,this.options.onCreate(t))}}.call(this)}},{key:"destroy",value:function(){return function(){return this.state.isDestroyed=!0,oe(this.modifiers,"applyStyle")&&(this.popper.removeAttribute("x-placement"),this.popper.style.position="",this.popper.style.top="",this.popper.style.left="",this.popper.style.right="",this.popper.style.bottom="",this.popper.style.willChange="",this.popper.style[re("transform")]=""),this.disableEventListeners(),this.options.removeOnDestroy&&this.popper.parentNode.removeChild(this.popper),this}.call(this)}},{key:"enableEventListeners",value:function(){return function(){this.state.eventsEnabled||(this.state=ae(this.reference,this.options,this.state,this.scheduleUpdate))}.call(this)}},{key:"disableEventListeners",value:function(){return le.call(this)}}]),r}();be.Utils=("undefined"!=typeof window?window:global).PopperUtils,be.placements=de,be.Defaults=Ee;var we="dropdown",Ce="bs.dropdown",Te="."+Ce,Se=".data-api",De=p.fn[we],Ie=new RegExp("38|40|27"),Ae={HIDE:"hide"+Te,HIDDEN:"hidden"+Te,SHOW:"show"+Te,SHOWN:"shown"+Te,CLICK:"click"+Te,CLICK_DATA_API:"click"+Te+Se,KEYDOWN_DATA_API:"keydown"+Te+Se,KEYUP_DATA_API:"keyup"+Te+Se},Oe="disabled",Ne="show",ke="dropup",Le="dropright",xe="dropleft",Pe="dropdown-menu-right",He="position-static",je='[data-toggle="dropdown"]',Re=".dropdown form",Fe=".dropdown-menu",Me=".navbar-nav",We=".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",Ue="top-start",Be="top-end",qe="bottom-start",Ke="bottom-end",Qe="right-start",Ve="left-start",Ye={offset:0,flip:!0,boundary:"scrollParent",reference:"toggle",display:"dynamic"},ze={offset:"(number|string|function)",flip:"boolean",boundary:"(string|element)",reference:"(string|element)",display:"string"},Xe=function(){function c(t,e){this._element=t,this._popper=null,this._config=this._getConfig(e),this._menu=this._getMenuElement(),this._inNavbar=this._detectNavbar(),this._addEventListeners()}var t=c.prototype;return t.toggle=function(){if(!this._element.disabled&&!p(this._element).hasClass(Oe)){var t=c._getParentFromElement(this._element),e=p(this._menu).hasClass(Ne);if(c._clearMenus(),!e){var n={relatedTarget:this._element},i=p.Event(Ae.SHOW,n);if(p(t).trigger(i),!i.isDefaultPrevented()){if(!this._inNavbar){if("undefined"==typeof be)throw new TypeError("Bootstrap's dropdowns require Popper.js (https://popper.js.org/)");var o=this._element;"parent"===this._config.reference?o=t:m.isElement(this._config.reference)&&(o=this._config.reference,"undefined"!=typeof this._config.reference.jquery&&(o=this._config.reference[0])),"scrollParent"!==this._config.boundary&&p(t).addClass(He),this._popper=new be(o,this._menu,this._getPopperConfig())}"ontouchstart"in document.documentElement&&0===p(t).closest(Me).length&&p(document.body).children().on("mouseover",null,p.noop),this._element.focus(),this._element.setAttribute("aria-expanded",!0),p(this._menu).toggleClass(Ne),p(t).toggleClass(Ne).trigger(p.Event(Ae.SHOWN,n))}}}},t.show=function(){if(!(this._element.disabled||p(this._element).hasClass(Oe)||p(this._menu).hasClass(Ne))){var t={relatedTarget:this._element},e=p.Event(Ae.SHOW,t),n=c._getParentFromElement(this._element);p(n).trigger(e),e.isDefaultPrevented()||(p(this._menu).toggleClass(Ne),p(n).toggleClass(Ne).trigger(p.Event(Ae.SHOWN,t)))}},t.hide=function(){if(!this._element.disabled&&!p(this._element).hasClass(Oe)&&p(this._menu).hasClass(Ne)){var t={relatedTarget:this._element},e=p.Event(Ae.HIDE,t),n=c._getParentFromElement(this._element);p(n).trigger(e),e.isDefaultPrevented()||(p(this._menu).toggleClass(Ne),p(n).toggleClass(Ne).trigger(p.Event(Ae.HIDDEN,t)))}},t.dispose=function(){p.removeData(this._element,Ce),p(this._element).off(Te),this._element=null,(this._menu=null)!==this._popper&&(this._popper.destroy(),this._popper=null)},t.update=function(){this._inNavbar=this._detectNavbar(),null!==this._popper&&this._popper.scheduleUpdate()},t._addEventListeners=function(){var e=this;p(this._element).on(Ae.CLICK,function(t){t.preventDefault(),t.stopPropagation(),e.toggle()})},t._getConfig=function(t){return t=l({},this.constructor.Default,p(this._element).data(),t),m.typeCheckConfig(we,t,this.constructor.DefaultType),t},t._getMenuElement=function(){if(!this._menu){var t=c._getParentFromElement(this._element);t&&(this._menu=t.querySelector(Fe))}return this._menu},t._getPlacement=function(){var t=p(this._element.parentNode),e=qe;return t.hasClass(ke)?(e=Ue,p(this._menu).hasClass(Pe)&&(e=Be)):t.hasClass(Le)?e=Qe:t.hasClass(xe)?e=Ve:p(this._menu).hasClass(Pe)&&(e=Ke),e},t._detectNavbar=function(){return 0<p(this._element).closest(".navbar").length},t._getOffset=function(){var e=this,t={};return"function"==typeof this._config.offset?t.fn=function(t){return t.offsets=l({},t.offsets,e._config.offset(t.offsets,e._element)||{}),t}:t.offset=this._config.offset,t},t._getPopperConfig=function(){var t={placement:this._getPlacement(),modifiers:{offset:this._getOffset(),flip:{enabled:this._config.flip},preventOverflow:{boundariesElement:this._config.boundary}}};return"static"===this._config.display&&(t.modifiers.applyStyle={enabled:!1}),t},c._jQueryInterface=function(e){return this.each(function(){var t=p(this).data(Ce);if(t||(t=new c(this,"object"==typeof e?e:null),p(this).data(Ce,t)),"string"==typeof e){if("undefined"==typeof t[e])throw new TypeError('No method named "'+e+'"');t[e]()}})},c._clearMenus=function(t){if(!t||3!==t.which&&("keyup"!==t.type||9===t.which))for(var e=[].slice.call(document.querySelectorAll(je)),n=0,i=e.length;n<i;n++){var o=c._getParentFromElement(e[n]),r=p(e[n]).data(Ce),s={relatedTarget:e[n]};if(t&&"click"===t.type&&(s.clickEvent=t),r){var a=r._menu;if(p(o).hasClass(Ne)&&!(t&&("click"===t.type&&/input|textarea/i.test(t.target.tagName)||"keyup"===t.type&&9===t.which)&&p.contains(o,t.target))){var l=p.Event(Ae.HIDE,s);p(o).trigger(l),l.isDefaultPrevented()||("ontouchstart"in document.documentElement&&p(document.body).children().off("mouseover",null,p.noop),e[n].setAttribute("aria-expanded","false"),p(a).removeClass(Ne),p(o).removeClass(Ne).trigger(p.Event(Ae.HIDDEN,s)))}}}},c._getParentFromElement=function(t){var e,n=m.getSelectorFromElement(t);return n&&(e=document.querySelector(n)),e||t.parentNode},c._dataApiKeydownHandler=function(t){if((/input|textarea/i.test(t.target.tagName)?!(32===t.which||27!==t.which&&(40!==t.which&&38!==t.which||p(t.target).closest(Fe).length)):Ie.test(t.which))&&(t.preventDefault(),t.stopPropagation(),!this.disabled&&!p(this).hasClass(Oe))){var e=c._getParentFromElement(this),n=p(e).hasClass(Ne);if(n&&(!n||27!==t.which&&32!==t.which)){var i=[].slice.call(e.querySelectorAll(We));if(0!==i.length){var o=i.indexOf(t.target);38===t.which&&0<o&&o--,40===t.which&&o<i.length-1&&o++,o<0&&(o=0),i[o].focus()}}else{if(27===t.which){var r=e.querySelector(je);p(r).trigger("focus")}p(this).trigger("click")}}},s(c,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return Ye}},{key:"DefaultType",get:function(){return ze}}]),c}();p(document).on(Ae.KEYDOWN_DATA_API,je,Xe._dataApiKeydownHandler).on(Ae.KEYDOWN_DATA_API,Fe,Xe._dataApiKeydownHandler).on(Ae.CLICK_DATA_API+" "+Ae.KEYUP_DATA_API,Xe._clearMenus).on(Ae.CLICK_DATA_API,je,function(t){t.preventDefault(),t.stopPropagation(),Xe._jQueryInterface.call(p(this),"toggle")}).on(Ae.CLICK_DATA_API,Re,function(t){t.stopPropagation()}),p.fn[we]=Xe._jQueryInterface,p.fn[we].Constructor=Xe,p.fn[we].noConflict=function(){return p.fn[we]=De,Xe._jQueryInterface};var Ge="modal",$e="bs.modal",Je="."+$e,Ze=p.fn[Ge],tn={backdrop:!0,keyboard:!0,focus:!0,show:!0},en={backdrop:"(boolean|string)",keyboard:"boolean",focus:"boolean",show:"boolean"},nn={HIDE:"hide"+Je,HIDDEN:"hidden"+Je,SHOW:"show"+Je,SHOWN:"shown"+Je,FOCUSIN:"focusin"+Je,RESIZE:"resize"+Je,CLICK_DISMISS:"click.dismiss"+Je,KEYDOWN_DISMISS:"keydown.dismiss"+Je,MOUSEUP_DISMISS:"mouseup.dismiss"+Je,MOUSEDOWN_DISMISS:"mousedown.dismiss"+Je,CLICK_DATA_API:"click"+Je+".data-api"},on="modal-dialog-scrollable",rn="modal-scrollbar-measure",sn="modal-backdrop",an="modal-open",ln="fade",cn="show",hn=".modal-dialog",un=".modal-body",fn='[data-toggle="modal"]',dn='[data-dismiss="modal"]',pn=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",mn=".sticky-top",gn=function(){function o(t,e){this._config=this._getConfig(e),this._element=t,this._dialog=t.querySelector(hn),this._backdrop=null,this._isShown=!1,this._isBodyOverflowing=!1,this._ignoreBackdropClick=!1,this._isTransitioning=!1,this._scrollbarWidth=0}var t=o.prototype;return t.toggle=function(t){return this._isShown?this.hide():this.show(t)},t.show=function(t){var e=this;if(!this._isShown&&!this._isTransitioning){p(this._element).hasClass(ln)&&(this._isTransitioning=!0);var n=p.Event(nn.SHOW,{relatedTarget:t});p(this._element).trigger(n),this._isShown||n.isDefaultPrevented()||(this._isShown=!0,this._checkScrollbar(),this._setScrollbar(),this._adjustDialog(),this._setEscapeEvent(),this._setResizeEvent(),p(this._element).on(nn.CLICK_DISMISS,dn,function(t){return e.hide(t)}),p(this._dialog).on(nn.MOUSEDOWN_DISMISS,function(){p(e._element).one(nn.MOUSEUP_DISMISS,function(t){p(t.target).is(e._element)&&(e._ignoreBackdropClick=!0)})}),this._showBackdrop(function(){return e._showElement(t)}))}},t.hide=function(t){var e=this;if(t&&t.preventDefault(),this._isShown&&!this._isTransitioning){var n=p.Event(nn.HIDE);if(p(this._element).trigger(n),this._isShown&&!n.isDefaultPrevented()){this._isShown=!1;var i=p(this._element).hasClass(ln);if(i&&(this._isTransitioning=!0),this._setEscapeEvent(),this._setResizeEvent(),p(document).off(nn.FOCUSIN),p(this._element).removeClass(cn),p(this._element).off(nn.CLICK_DISMISS),p(this._dialog).off(nn.MOUSEDOWN_DISMISS),i){var o=m.getTransitionDurationFromElement(this._element);p(this._element).one(m.TRANSITION_END,function(t){return e._hideModal(t)}).emulateTransitionEnd(o)}else this._hideModal()}}},t.dispose=function(){[window,this._element,this._dialog].forEach(function(t){return p(t).off(Je)}),p(document).off(nn.FOCUSIN),p.removeData(this._element,$e),this._config=null,this._element=null,this._dialog=null,this._backdrop=null,this._isShown=null,this._isBodyOverflowing=null,this._ignoreBackdropClick=null,this._isTransitioning=null,this._scrollbarWidth=null},t.handleUpdate=function(){this._adjustDialog()},t._getConfig=function(t){return t=l({},tn,t),m.typeCheckConfig(Ge,t,en),t},t._showElement=function(t){var e=this,n=p(this._element).hasClass(ln);this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||document.body.appendChild(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),p(this._dialog).hasClass(on)?this._dialog.querySelector(un).scrollTop=0:this._element.scrollTop=0,n&&m.reflow(this._element),p(this._element).addClass(cn),this._config.focus&&this._enforceFocus();var i=p.Event(nn.SHOWN,{relatedTarget:t}),o=function(){e._config.focus&&e._element.focus(),e._isTransitioning=!1,p(e._element).trigger(i)};if(n){var r=m.getTransitionDurationFromElement(this._dialog);p(this._dialog).one(m.TRANSITION_END,o).emulateTransitionEnd(r)}else o()},t._enforceFocus=function(){var e=this;p(document).off(nn.FOCUSIN).on(nn.FOCUSIN,function(t){document!==t.target&&e._element!==t.target&&0===p(e._element).has(t.target).length&&e._element.focus()})},t._setEscapeEvent=function(){var e=this;this._isShown&&this._config.keyboard?p(this._element).on(nn.KEYDOWN_DISMISS,function(t){27===t.which&&(t.preventDefault(),e.hide())}):this._isShown||p(this._element).off(nn.KEYDOWN_DISMISS)},t._setResizeEvent=function(){var e=this;this._isShown?p(window).on(nn.RESIZE,function(t){return e.handleUpdate(t)}):p(window).off(nn.RESIZE)},t._hideModal=function(){var t=this;this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._isTransitioning=!1,this._showBackdrop(function(){p(document.body).removeClass(an),t._resetAdjustments(),t._resetScrollbar(),p(t._element).trigger(nn.HIDDEN)})},t._removeBackdrop=function(){this._backdrop&&(p(this._backdrop).remove(),this._backdrop=null)},t._showBackdrop=function(t){var e=this,n=p(this._element).hasClass(ln)?ln:"";if(this._isShown&&this._config.backdrop){if(this._backdrop=document.createElement("div"),this._backdrop.className=sn,n&&this._backdrop.classList.add(n),p(this._backdrop).appendTo(document.body),p(this._element).on(nn.CLICK_DISMISS,function(t){e._ignoreBackdropClick?e._ignoreBackdropClick=!1:t.target===t.currentTarget&&("static"===e._config.backdrop?e._element.focus():e.hide())}),n&&m.reflow(this._backdrop),p(this._backdrop).addClass(cn),!t)return;if(!n)return void t();var i=m.getTransitionDurationFromElement(this._backdrop);p(this._backdrop).one(m.TRANSITION_END,t).emulateTransitionEnd(i)}else if(!this._isShown&&this._backdrop){p(this._backdrop).removeClass(cn);var o=function(){e._removeBackdrop(),t&&t()};if(p(this._element).hasClass(ln)){var r=m.getTransitionDurationFromElement(this._backdrop);p(this._backdrop).one(m.TRANSITION_END,o).emulateTransitionEnd(r)}else o()}else t&&t()},t._adjustDialog=function(){var t=this._element.scrollHeight>document.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},t._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},t._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=t.left+t.right<window.innerWidth,this._scrollbarWidth=this._getScrollbarWidth()},t._setScrollbar=function(){var o=this;if(this._isBodyOverflowing){var t=[].slice.call(document.querySelectorAll(pn)),e=[].slice.call(document.querySelectorAll(mn));p(t).each(function(t,e){var n=e.style.paddingRight,i=p(e).css("padding-right");p(e).data("padding-right",n).css("padding-right",parseFloat(i)+o._scrollbarWidth+"px")}),p(e).each(function(t,e){var n=e.style.marginRight,i=p(e).css("margin-right");p(e).data("margin-right",n).css("margin-right",parseFloat(i)-o._scrollbarWidth+"px")});var n=document.body.style.paddingRight,i=p(document.body).css("padding-right");p(document.body).data("padding-right",n).css("padding-right",parseFloat(i)+this._scrollbarWidth+"px")}p(document.body).addClass(an)},t._resetScrollbar=function(){var t=[].slice.call(document.querySelectorAll(pn));p(t).each(function(t,e){var n=p(e).data("padding-right");p(e).removeData("padding-right"),e.style.paddingRight=n||""});var e=[].slice.call(document.querySelectorAll(""+mn));p(e).each(function(t,e){var n=p(e).data("margin-right");"undefined"!=typeof n&&p(e).css("margin-right",n).removeData("margin-right")});var n=p(document.body).data("padding-right");p(document.body).removeData("padding-right"),document.body.style.paddingRight=n||""},t._getScrollbarWidth=function(){var t=document.createElement("div");t.className=rn,document.body.appendChild(t);var e=t.getBoundingClientRect().width-t.clientWidth;return document.body.removeChild(t),e},o._jQueryInterface=function(n,i){return this.each(function(){var t=p(this).data($e),e=l({},tn,p(this).data(),"object"==typeof n&&n?n:{});if(t||(t=new o(this,e),p(this).data($e,t)),"string"==typeof n){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n](i)}else e.show&&t.show(i)})},s(o,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return tn}}]),o}();p(document).on(nn.CLICK_DATA_API,fn,function(t){var e,n=this,i=m.getSelectorFromElement(this);i&&(e=document.querySelector(i));var o=p(e).data($e)?"toggle":l({},p(e).data(),p(this).data());"A"!==this.tagName&&"AREA"!==this.tagName||t.preventDefault();var r=p(e).one(nn.SHOW,function(t){t.isDefaultPrevented()||r.one(nn.HIDDEN,function(){p(n).is(":visible")&&n.focus()})});gn._jQueryInterface.call(p(e),o,this)}),p.fn[Ge]=gn._jQueryInterface,p.fn[Ge].Constructor=gn,p.fn[Ge].noConflict=function(){return p.fn[Ge]=Ze,gn._jQueryInterface};var _n=["background","cite","href","itemtype","longdesc","poster","src","xlink:href"],vn={"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},yn=/^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi,En=/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i;function bn(t,s,e){if(0===t.length)return t;if(e&&"function"==typeof e)return e(t);for(var n=(new window.DOMParser).parseFromString(t,"text/html"),a=Object.keys(s),l=[].slice.call(n.body.querySelectorAll("*")),i=function(t,e){var n=l[t],i=n.nodeName.toLowerCase();if(-1===a.indexOf(n.nodeName.toLowerCase()))return n.parentNode.removeChild(n),"continue";var o=[].slice.call(n.attributes),r=[].concat(s["*"]||[],s[i]||[]);o.forEach(function(t){(function(t,e){var n=t.nodeName.toLowerCase();if(-1!==e.indexOf(n))return-1===_n.indexOf(n)||Boolean(t.nodeValue.match(yn)||t.nodeValue.match(En));for(var i=e.filter(function(t){return t instanceof RegExp}),o=0,r=i.length;o<r;o++)if(n.match(i[o]))return!0;return!1})(t,r)||n.removeAttribute(t.nodeName)})},o=0,r=l.length;o<r;o++)i(o);return n.body.innerHTML}var wn="tooltip",Cn="bs.tooltip",Tn="."+Cn,Sn=p.fn[wn],Dn="bs-tooltip",In=new RegExp("(^|\\s)"+Dn+"\\S+","g"),An=["sanitize","whiteList","sanitizeFn"],On={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"(number|string|function)",container:"(string|element|boolean)",fallbackPlacement:"(string|array)",boundary:"(string|element)",sanitize:"boolean",sanitizeFn:"(null|function)",whiteList:"object"},Nn={AUTO:"auto",TOP:"top",RIGHT:"right",BOTTOM:"bottom",LEFT:"left"},kn={animation:!0,template:'<div class="tooltip" role="tooltip"><div class="arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent",sanitize:!0,sanitizeFn:null,whiteList:vn},Ln="show",xn="out",Pn={HIDE:"hide"+Tn,HIDDEN:"hidden"+Tn,SHOW:"show"+Tn,SHOWN:"shown"+Tn,INSERTED:"inserted"+Tn,CLICK:"click"+Tn,FOCUSIN:"focusin"+Tn,FOCUSOUT:"focusout"+Tn,MOUSEENTER:"mouseenter"+Tn,MOUSELEAVE:"mouseleave"+Tn},Hn="fade",jn="show",Rn=".tooltip-inner",Fn=".arrow",Mn="hover",Wn="focus",Un="click",Bn="manual",qn=function(){function i(t,e){if("undefined"==typeof be)throw new TypeError("Bootstrap's tooltips require Popper.js (https://popper.js.org/)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var t=i.prototype;return t.enable=function(){this._isEnabled=!0},t.disable=function(){this._isEnabled=!1},t.toggleEnabled=function(){this._isEnabled=!this._isEnabled},t.toggle=function(t){if(this._isEnabled)if(t){var e=this.constructor.DATA_KEY,n=p(t.currentTarget).data(e);n||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),p(t.currentTarget).data(e,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(p(this.getTipElement()).hasClass(jn))return void this._leave(null,this);this._enter(null,this)}},t.dispose=function(){clearTimeout(this._timeout),p.removeData(this.element,this.constructor.DATA_KEY),p(this.element).off(this.constructor.EVENT_KEY),p(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&p(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,(this._activeTrigger=null)!==this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},t.show=function(){var e=this;if("none"===p(this.element).css("display"))throw new Error("Please use show on visible elements");var t=p.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){p(this.element).trigger(t);var n=m.findShadowRoot(this.element),i=p.contains(null!==n?n:this.element.ownerDocument.documentElement,this.element);if(t.isDefaultPrevented()||!i)return;var o=this.getTipElement(),r=m.getUID(this.constructor.NAME);o.setAttribute("id",r),this.element.setAttribute("aria-describedby",r),this.setContent(),this.config.animation&&p(o).addClass(Hn);var s="function"==typeof this.config.placement?this.config.placement.call(this,o,this.element):this.config.placement,a=this._getAttachment(s);this.addAttachmentClass(a);var l=this._getContainer();p(o).data(this.constructor.DATA_KEY,this),p.contains(this.element.ownerDocument.documentElement,this.tip)||p(o).appendTo(l),p(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new be(this.element,o,{placement:a,modifiers:{offset:this._getOffset(),flip:{behavior:this.config.fallbackPlacement},arrow:{element:Fn},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){return e._handlePopperPlacementChange(t)}}),p(o).addClass(jn),"ontouchstart"in document.documentElement&&p(document.body).children().on("mouseover",null,p.noop);var c=function(){e.config.animation&&e._fixTransition();var t=e._hoverState;e._hoverState=null,p(e.element).trigger(e.constructor.Event.SHOWN),t===xn&&e._leave(null,e)};if(p(this.tip).hasClass(Hn)){var h=m.getTransitionDurationFromElement(this.tip);p(this.tip).one(m.TRANSITION_END,c).emulateTransitionEnd(h)}else c()}},t.hide=function(t){var e=this,n=this.getTipElement(),i=p.Event(this.constructor.Event.HIDE),o=function(){e._hoverState!==Ln&&n.parentNode&&n.parentNode.removeChild(n),e._cleanTipClass(),e.element.removeAttribute("aria-describedby"),p(e.element).trigger(e.constructor.Event.HIDDEN),null!==e._popper&&e._popper.destroy(),t&&t()};if(p(this.element).trigger(i),!i.isDefaultPrevented()){if(p(n).removeClass(jn),"ontouchstart"in document.documentElement&&p(document.body).children().off("mouseover",null,p.noop),this._activeTrigger[Un]=!1,this._activeTrigger[Wn]=!1,this._activeTrigger[Mn]=!1,p(this.tip).hasClass(Hn)){var r=m.getTransitionDurationFromElement(n);p(n).one(m.TRANSITION_END,o).emulateTransitionEnd(r)}else o();this._hoverState=""}},t.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},t.isWithContent=function(){return Boolean(this.getTitle())},t.addAttachmentClass=function(t){p(this.getTipElement()).addClass(Dn+"-"+t)},t.getTipElement=function(){return this.tip=this.tip||p(this.config.template)[0],this.tip},t.setContent=function(){var t=this.getTipElement();this.setElementContent(p(t.querySelectorAll(Rn)),this.getTitle()),p(t).removeClass(Hn+" "+jn)},t.setElementContent=function(t,e){"object"!=typeof e||!e.nodeType&&!e.jquery?this.config.html?(this.config.sanitize&&(e=bn(e,this.config.whiteList,this.config.sanitizeFn)),t.html(e)):t.text(e):this.config.html?p(e).parent().is(t)||t.empty().append(e):t.text(p(e).text())},t.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},t._getOffset=function(){var e=this,t={};return"function"==typeof this.config.offset?t.fn=function(t){return t.offsets=l({},t.offsets,e.config.offset(t.offsets,e.element)||{}),t}:t.offset=this.config.offset,t},t._getContainer=function(){return!1===this.config.container?document.body:m.isElement(this.config.container)?p(this.config.container):p(document).find(this.config.container)},t._getAttachment=function(t){return Nn[t.toUpperCase()]},t._setListeners=function(){var i=this;this.config.trigger.split(" ").forEach(function(t){if("click"===t)p(i.element).on(i.constructor.Event.CLICK,i.config.selector,function(t){return i.toggle(t)});else if(t!==Bn){var e=t===Mn?i.constructor.Event.MOUSEENTER:i.constructor.Event.FOCUSIN,n=t===Mn?i.constructor.Event.MOUSELEAVE:i.constructor.Event.FOCUSOUT;p(i.element).on(e,i.config.selector,function(t){return i._enter(t)}).on(n,i.config.selector,function(t){return i._leave(t)})}}),p(this.element).closest(".modal").on("hide.bs.modal",function(){i.element&&i.hide()}),this.config.selector?this.config=l({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},t._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},t._enter=function(t,e){var n=this.constructor.DATA_KEY;(e=e||p(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),p(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusin"===t.type?Wn:Mn]=!0),p(e.getTipElement()).hasClass(jn)||e._hoverState===Ln?e._hoverState=Ln:(clearTimeout(e._timeout),e._hoverState=Ln,e.config.delay&&e.config.delay.show?e._timeout=setTimeout(function(){e._hoverState===Ln&&e.show()},e.config.delay.show):e.show())},t._leave=function(t,e){var n=this.constructor.DATA_KEY;(e=e||p(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),p(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusout"===t.type?Wn:Mn]=!1),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState=xn,e.config.delay&&e.config.delay.hide?e._timeout=setTimeout(function(){e._hoverState===xn&&e.hide()},e.config.delay.hide):e.hide())},t._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},t._getConfig=function(t){var e=p(this.element).data();return Object.keys(e).forEach(function(t){-1!==An.indexOf(t)&&delete e[t]}),"number"==typeof(t=l({},this.constructor.Default,e,"object"==typeof t&&t?t:{})).delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),m.typeCheckConfig(wn,t,this.constructor.DefaultType),t.sanitize&&(t.template=bn(t.template,t.whiteList,t.sanitizeFn)),t},t._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},t._cleanTipClass=function(){var t=p(this.getTipElement()),e=t.attr("class").match(In);null!==e&&e.length&&t.removeClass(e.join(""))},t._handlePopperPlacementChange=function(t){var e=t.instance;this.tip=e.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},t._fixTransition=function(){var t=this.getTipElement(),e=this.config.animation;null===t.getAttribute("x-placement")&&(p(t).removeClass(Hn),this.config.animation=!1,this.hide(),this.show(),this.config.animation=e)},i._jQueryInterface=function(n){return this.each(function(){var t=p(this).data(Cn),e="object"==typeof n&&n;if((t||!/dispose|hide/.test(n))&&(t||(t=new i(this,e),p(this).data(Cn,t)),"string"==typeof n)){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return kn}},{key:"NAME",get:function(){return wn}},{key:"DATA_KEY",get:function(){return Cn}},{key:"Event",get:function(){return Pn}},{key:"EVENT_KEY",get:function(){return Tn}},{key:"DefaultType",get:function(){return On}}]),i}();p.fn[wn]=qn._jQueryInterface,p.fn[wn].Constructor=qn,p.fn[wn].noConflict=function(){return p.fn[wn]=Sn,qn._jQueryInterface};var Kn="popover",Qn="bs.popover",Vn="."+Qn,Yn=p.fn[Kn],zn="bs-popover",Xn=new RegExp("(^|\\s)"+zn+"\\S+","g"),Gn=l({},qn.Default,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>'}),$n=l({},qn.DefaultType,{content:"(string|element|function)"}),Jn="fade",Zn="show",ti=".popover-header",ei=".popover-body",ni={HIDE:"hide"+Vn,HIDDEN:"hidden"+Vn,SHOW:"show"+Vn,SHOWN:"shown"+Vn,INSERTED:"inserted"+Vn,CLICK:"click"+Vn,FOCUSIN:"focusin"+Vn,FOCUSOUT:"focusout"+Vn,MOUSEENTER:"mouseenter"+Vn,MOUSELEAVE:"mouseleave"+Vn},ii=function(t){var e,n;function i(){return t.apply(this,arguments)||this}n=t,(e=i).prototype=Object.create(n.prototype),(e.prototype.constructor=e).__proto__=n;var o=i.prototype;return o.isWithContent=function(){return this.getTitle()||this._getContent()},o.addAttachmentClass=function(t){p(this.getTipElement()).addClass(zn+"-"+t)},o.getTipElement=function(){return this.tip=this.tip||p(this.config.template)[0],this.tip},o.setContent=function(){var t=p(this.getTipElement());this.setElementContent(t.find(ti),this.getTitle());var e=this._getContent();"function"==typeof e&&(e=e.call(this.element)),this.setElementContent(t.find(ei),e),t.removeClass(Jn+" "+Zn)},o._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},o._cleanTipClass=function(){var t=p(this.getTipElement()),e=t.attr("class").match(Xn);null!==e&&0<e.length&&t.removeClass(e.join(""))},i._jQueryInterface=function(n){return this.each(function(){var t=p(this).data(Qn),e="object"==typeof n?n:null;if((t||!/dispose|hide/.test(n))&&(t||(t=new i(this,e),p(this).data(Qn,t)),"string"==typeof n)){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return Gn}},{key:"NAME",get:function(){return Kn}},{key:"DATA_KEY",get:function(){return Qn}},{key:"Event",get:function(){return ni}},{key:"EVENT_KEY",get:function(){return Vn}},{key:"DefaultType",get:function(){return $n}}]),i}(qn);p.fn[Kn]=ii._jQueryInterface,p.fn[Kn].Constructor=ii,p.fn[Kn].noConflict=function(){return p.fn[Kn]=Yn,ii._jQueryInterface};var oi="scrollspy",ri="bs.scrollspy",si="."+ri,ai=p.fn[oi],li={offset:10,method:"auto",target:""},ci={offset:"number",method:"string",target:"(string|element)"},hi={ACTIVATE:"activate"+si,SCROLL:"scroll"+si,LOAD_DATA_API:"load"+si+".data-api"},ui="dropdown-item",fi="active",di='[data-spy="scroll"]',pi=".nav, .list-group",mi=".nav-link",gi=".nav-item",_i=".list-group-item",vi=".dropdown",yi=".dropdown-item",Ei=".dropdown-toggle",bi="offset",wi="position",Ci=function(){function n(t,e){var n=this;this._element=t,this._scrollElement="BODY"===t.tagName?window:t,this._config=this._getConfig(e),this._selector=this._config.target+" "+mi+","+this._config.target+" "+_i+","+this._config.target+" "+yi,this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,p(this._scrollElement).on(hi.SCROLL,function(t){return n._process(t)}),this.refresh(),this._process()}var t=n.prototype;return t.refresh=function(){var e=this,t=this._scrollElement===this._scrollElement.window?bi:wi,o="auto"===this._config.method?t:this._config.method,r=o===wi?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),[].slice.call(document.querySelectorAll(this._selector)).map(function(t){var e,n=m.getSelectorFromElement(t);if(n&&(e=document.querySelector(n)),e){var i=e.getBoundingClientRect();if(i.width||i.height)return[p(e)[o]().top+r,n]}return null}).filter(function(t){return t}).sort(function(t,e){return t[0]-e[0]}).forEach(function(t){e._offsets.push(t[0]),e._targets.push(t[1])})},t.dispose=function(){p.removeData(this._element,ri),p(this._scrollElement).off(si),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},t._getConfig=function(t){if("string"!=typeof(t=l({},li,"object"==typeof t&&t?t:{})).target){var e=p(t.target).attr("id");e||(e=m.getUID(oi),p(t.target).attr("id",e)),t.target="#"+e}return m.typeCheckConfig(oi,t,ci),t},t._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},t._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},t._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},t._process=function(){var t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),n=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),n<=t){var i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&t<this._offsets[0]&&0<this._offsets[0])return this._activeTarget=null,void this._clear();for(var o=this._offsets.length;o--;){this._activeTarget!==this._targets[o]&&t>=this._offsets[o]&&("undefined"==typeof this._offsets[o+1]||t<this._offsets[o+1])&&this._activate(this._targets[o])}}},t._activate=function(e){this._activeTarget=e,this._clear();var t=this._selector.split(",").map(function(t){return t+'[data-target="'+e+'"],'+t+'[href="'+e+'"]'}),n=p([].slice.call(document.querySelectorAll(t.join(","))));n.hasClass(ui)?(n.closest(vi).find(Ei).addClass(fi),n.addClass(fi)):(n.addClass(fi),n.parents(pi).prev(mi+", "+_i).addClass(fi),n.parents(pi).prev(gi).children(mi).addClass(fi)),p(this._scrollElement).trigger(hi.ACTIVATE,{relatedTarget:e})},t._clear=function(){[].slice.call(document.querySelectorAll(this._selector)).filter(function(t){return t.classList.contains(fi)}).forEach(function(t){return t.classList.remove(fi)})},n._jQueryInterface=function(e){return this.each(function(){var t=p(this).data(ri);if(t||(t=new n(this,"object"==typeof e&&e),p(this).data(ri,t)),"string"==typeof e){if("undefined"==typeof t[e])throw new TypeError('No method named "'+e+'"');t[e]()}})},s(n,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return li}}]),n}();p(window).on(hi.LOAD_DATA_API,function(){for(var t=[].slice.call(document.querySelectorAll(di)),e=t.length;e--;){var n=p(t[e]);Ci._jQueryInterface.call(n,n.data())}}),p.fn[oi]=Ci._jQueryInterface,p.fn[oi].Constructor=Ci,p.fn[oi].noConflict=function(){return p.fn[oi]=ai,Ci._jQueryInterface};var Ti="bs.tab",Si="."+Ti,Di=p.fn.tab,Ii={HIDE:"hide"+Si,HIDDEN:"hidden"+Si,SHOW:"show"+Si,SHOWN:"shown"+Si,CLICK_DATA_API:"click"+Si+".data-api"},Ai="dropdown-menu",Oi="active",Ni="disabled",ki="fade",Li="show",xi=".dropdown",Pi=".nav, .list-group",Hi=".active",ji="> li > .active",Ri='[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',Fi=".dropdown-toggle",Mi="> .dropdown-menu .active",Wi=function(){function i(t){this._element=t}var t=i.prototype;return t.show=function(){var n=this;if(!(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&p(this._element).hasClass(Oi)||p(this._element).hasClass(Ni))){var t,i,e=p(this._element).closest(Pi)[0],o=m.getSelectorFromElement(this._element);if(e){var r="UL"===e.nodeName||"OL"===e.nodeName?ji:Hi;i=(i=p.makeArray(p(e).find(r)))[i.length-1]}var s=p.Event(Ii.HIDE,{relatedTarget:this._element}),a=p.Event(Ii.SHOW,{relatedTarget:i});if(i&&p(i).trigger(s),p(this._element).trigger(a),!a.isDefaultPrevented()&&!s.isDefaultPrevented()){o&&(t=document.querySelector(o)),this._activate(this._element,e);var l=function(){var t=p.Event(Ii.HIDDEN,{relatedTarget:n._element}),e=p.Event(Ii.SHOWN,{relatedTarget:i});p(i).trigger(t),p(n._element).trigger(e)};t?this._activate(t,t.parentNode,l):l()}}},t.dispose=function(){p.removeData(this._element,Ti),this._element=null},t._activate=function(t,e,n){var i=this,o=(!e||"UL"!==e.nodeName&&"OL"!==e.nodeName?p(e).children(Hi):p(e).find(ji))[0],r=n&&o&&p(o).hasClass(ki),s=function(){return i._transitionComplete(t,o,n)};if(o&&r){var a=m.getTransitionDurationFromElement(o);p(o).removeClass(Li).one(m.TRANSITION_END,s).emulateTransitionEnd(a)}else s()},t._transitionComplete=function(t,e,n){if(e){p(e).removeClass(Oi);var i=p(e.parentNode).find(Mi)[0];i&&p(i).removeClass(Oi),"tab"===e.getAttribute("role")&&e.setAttribute("aria-selected",!1)}if(p(t).addClass(Oi),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!0),m.reflow(t),t.classList.contains(ki)&&t.classList.add(Li),t.parentNode&&p(t.parentNode).hasClass(Ai)){var o=p(t).closest(xi)[0];if(o){var r=[].slice.call(o.querySelectorAll(Fi));p(r).addClass(Oi)}t.setAttribute("aria-expanded",!0)}n&&n()},i._jQueryInterface=function(n){return this.each(function(){var t=p(this),e=t.data(Ti);if(e||(e=new i(this),t.data(Ti,e)),"string"==typeof n){if("undefined"==typeof e[n])throw new TypeError('No method named "'+n+'"');e[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}}]),i}();p(document).on(Ii.CLICK_DATA_API,Ri,function(t){t.preventDefault(),Wi._jQueryInterface.call(p(this),"show")}),p.fn.tab=Wi._jQueryInterface,p.fn.tab.Constructor=Wi,p.fn.tab.noConflict=function(){return p.fn.tab=Di,Wi._jQueryInterface};var Ui="toast",Bi="bs.toast",qi="."+Bi,Ki=p.fn[Ui],Qi={CLICK_DISMISS:"click.dismiss"+qi,HIDE:"hide"+qi,HIDDEN:"hidden"+qi,SHOW:"show"+qi,SHOWN:"shown"+qi},Vi="fade",Yi="hide",zi="show",Xi="showing",Gi={animation:"boolean",autohide:"boolean",delay:"number"},$i={animation:!0,autohide:!0,delay:500},Ji='[data-dismiss="toast"]',Zi=function(){function i(t,e){this._element=t,this._config=this._getConfig(e),this._timeout=null,this._setListeners()}var t=i.prototype;return t.show=function(){var t=this;p(this._element).trigger(Qi.SHOW),this._config.animation&&this._element.classList.add(Vi);var e=function(){t._element.classList.remove(Xi),t._element.classList.add(zi),p(t._element).trigger(Qi.SHOWN),t._config.autohide&&t.hide()};if(this._element.classList.remove(Yi),this._element.classList.add(Xi),this._config.animation){var n=m.getTransitionDurationFromElement(this._element);p(this._element).one(m.TRANSITION_END,e).emulateTransitionEnd(n)}else e()},t.hide=function(t){var e=this;this._element.classList.contains(zi)&&(p(this._element).trigger(Qi.HIDE),t?this._close():this._timeout=setTimeout(function(){e._close()},this._config.delay))},t.dispose=function(){clearTimeout(this._timeout),this._timeout=null,this._element.classList.contains(zi)&&this._element.classList.remove(zi),p(this._element).off(Qi.CLICK_DISMISS),p.removeData(this._element,Bi),this._element=null,this._config=null},t._getConfig=function(t){return t=l({},$i,p(this._element).data(),"object"==typeof t&&t?t:{}),m.typeCheckConfig(Ui,t,this.constructor.DefaultType),t},t._setListeners=function(){var t=this;p(this._element).on(Qi.CLICK_DISMISS,Ji,function(){return t.hide(!0)})},t._close=function(){var t=this,e=function(){t._element.classList.add(Yi),p(t._element).trigger(Qi.HIDDEN)};if(this._element.classList.remove(zi),this._config.animation){var n=m.getTransitionDurationFromElement(this._element);p(this._element).one(m.TRANSITION_END,e).emulateTransitionEnd(n)}else e()},i._jQueryInterface=function(n){return this.each(function(){var t=p(this),e=t.data(Bi);if(e||(e=new i(this,"object"==typeof n&&n),t.data(Bi,e)),"string"==typeof n){if("undefined"==typeof e[n])throw new TypeError('No method named "'+n+'"');e[n](this)}})},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"DefaultType",get:function(){return Gi}},{key:"Default",get:function(){return $i}}]),i}();p.fn[Ui]=Zi._jQueryInterface,p.fn[Ui].Constructor=Zi,p.fn[Ui].noConflict=function(){return p.fn[Ui]=Ki,Zi._jQueryInterface},function(){if("undefined"==typeof p)throw new TypeError("Bootstrap's JavaScript requires jQuery. jQuery must be included before Bootstrap's JavaScript.");var t=p.fn.jquery.split(" ")[0].split(".");if(t[0]<2&&t[1]<9||1===t[0]&&9===t[1]&&t[2]<1||4<=t[0])throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}(),t.Util=m,t.Alert=g,t.Button=k,t.Carousel=at,t.Collapse=Ct,t.Dropdown=Xe,t.Modal=gn,t.Popover=ii,t.Scrollspy=Ci,t.Tab=Wi,t.Toast=Zi,t.Tooltip=qn,Object.defineProperty(t,"__esModule",{value:!0})});
7
  //# sourceMappingURL=bootstrap.bundle.min.js.map
1
  /*!
2
+ * Bootstrap v4.4.1 (https://getbootstrap.com/)
3
  * Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
4
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
5
  */
6
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("jquery")):"function"==typeof define&&define.amd?define(["exports","jquery"],t):t((e=e||self).bootstrap={},e.jQuery)}(this,function(e,p){"use strict";function i(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}function s(e,t,n){return t&&i(e.prototype,t),n&&i(e,n),e}function t(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n.push.apply(n,i)}return n}function l(o){for(var e=1;e<arguments.length;e++){var r=null!=arguments[e]?arguments[e]:{};e%2?t(Object(r),!0).forEach(function(e){var t,n,i;t=o,i=r[n=e],n in t?Object.defineProperty(t,n,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[n]=i}):Object.getOwnPropertyDescriptors?Object.defineProperties(o,Object.getOwnPropertyDescriptors(r)):t(Object(r)).forEach(function(e){Object.defineProperty(o,e,Object.getOwnPropertyDescriptor(r,e))})}return o}p=p&&p.hasOwnProperty("default")?p.default:p;var n="transitionend";function o(e){var t=this,n=!1;return p(this).one(m.TRANSITION_END,function(){n=!0}),setTimeout(function(){n||m.triggerTransitionEnd(t)},e),this}var m={TRANSITION_END:"bsTransitionEnd",getUID:function(e){for(;e+=~~(1e6*Math.random()),document.getElementById(e););return e},getSelectorFromElement:function(e){var t=e.getAttribute("data-target");if(!t||"#"===t){var n=e.getAttribute("href");t=n&&"#"!==n?n.trim():""}try{return document.querySelector(t)?t:null}catch(e){return null}},getTransitionDurationFromElement:function(e){if(!e)return 0;var t=p(e).css("transition-duration"),n=p(e).css("transition-delay"),i=parseFloat(t),o=parseFloat(n);return i||o?(t=t.split(",")[0],n=n.split(",")[0],1e3*(parseFloat(t)+parseFloat(n))):0},reflow:function(e){return e.offsetHeight},triggerTransitionEnd:function(e){p(e).trigger(n)},supportsTransitionEnd:function(){return Boolean(n)},isElement:function(e){return(e[0]||e).nodeType},typeCheckConfig:function(e,t,n){for(var i in n)if(Object.prototype.hasOwnProperty.call(n,i)){var o=n[i],r=t[i],s=r&&m.isElement(r)?"element":(a=r,{}.toString.call(a).match(/\s([a-z]+)/i)[1].toLowerCase());if(!new RegExp(o).test(s))throw new Error(e.toUpperCase()+': Option "'+i+'" provided type "'+s+'" but expected type "'+o+'".')}var a},findShadowRoot:function(e){if(!document.documentElement.attachShadow)return null;if("function"!=typeof e.getRootNode)return e instanceof ShadowRoot?e:e.parentNode?m.findShadowRoot(e.parentNode):null;var t=e.getRootNode();return t instanceof ShadowRoot?t:null},jQueryDetection:function(){if("undefined"==typeof p)throw new TypeError("Bootstrap's JavaScript requires jQuery. jQuery must be included before Bootstrap's JavaScript.");var e=p.fn.jquery.split(" ")[0].split(".");if(e[0]<2&&e[1]<9||1===e[0]&&9===e[1]&&e[2]<1||4<=e[0])throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}};m.jQueryDetection(),p.fn.emulateTransitionEnd=o,p.event.special[m.TRANSITION_END]={bindType:n,delegateType:n,handle:function(e){if(p(e.target).is(this))return e.handleObj.handler.apply(this,arguments)}};var r="alert",a="bs.alert",c="."+a,h=p.fn[r],u={CLOSE:"close"+c,CLOSED:"closed"+c,CLICK_DATA_API:"click"+c+".data-api"},f="alert",d="fade",g="show",_=function(){function i(e){this._element=e}var e=i.prototype;return e.close=function(e){var t=this._element;e&&(t=this._getRootElement(e)),this._triggerCloseEvent(t).isDefaultPrevented()||this._removeElement(t)},e.dispose=function(){p.removeData(this._element,a),this._element=null},e._getRootElement=function(e){var t=m.getSelectorFromElement(e),n=!1;return t&&(n=document.querySelector(t)),n=n||p(e).closest("."+f)[0]},e._triggerCloseEvent=function(e){var t=p.Event(u.CLOSE);return p(e).trigger(t),t},e._removeElement=function(t){var n=this;if(p(t).removeClass(g),p(t).hasClass(d)){var e=m.getTransitionDurationFromElement(t);p(t).one(m.TRANSITION_END,function(e){return n._destroyElement(t,e)}).emulateTransitionEnd(e)}else this._destroyElement(t)},e._destroyElement=function(e){p(e).detach().trigger(u.CLOSED).remove()},i._jQueryInterface=function(n){return this.each(function(){var e=p(this),t=e.data(a);t||(t=new i(this),e.data(a,t)),"close"===n&&t[n](this)})},i._handleDismiss=function(t){return function(e){e&&e.preventDefault(),t.close(this)}},s(i,null,[{key:"VERSION",get:function(){return"4.4.1"}}]),i}();p(document).on(u.CLICK_DATA_API,'[data-dismiss="alert"]',_._handleDismiss(new _)),p.fn[r]=_._jQueryInterface,p.fn[r].Constructor=_,p.fn[r].noConflict=function(){return p.fn[r]=h,_._jQueryInterface};var v="button",y="bs.button",E="."+y,b=".data-api",w=p.fn[v],T="active",C="btn",S="focus",D='[data-toggle^="button"]',I='[data-toggle="buttons"]',A='[data-toggle="button"]',O='[data-toggle="buttons"] .btn',N='input:not([type="hidden"])',k=".active",L=".btn",P={CLICK_DATA_API:"click"+E+b,FOCUS_BLUR_DATA_API:"focus"+E+b+" blur"+E+b,LOAD_DATA_API:"load"+E+b},x=function(){function n(e){this._element=e}var e=n.prototype;return e.toggle=function(){var e=!0,t=!0,n=p(this._element).closest(I)[0];if(n){var i=this._element.querySelector(N);if(i){if("radio"===i.type)if(i.checked&&this._element.classList.contains(T))e=!1;else{var o=n.querySelector(k);o&&p(o).removeClass(T)}else"checkbox"===i.type?"LABEL"===this._element.tagName&&i.checked===this._element.classList.contains(T)&&(e=!1):e=!1;e&&(i.checked=!this._element.classList.contains(T),p(i).trigger("change")),i.focus(),t=!1}}this._element.hasAttribute("disabled")||this._element.classList.contains("disabled")||(t&&this._element.setAttribute("aria-pressed",!this._element.classList.contains(T)),e&&p(this._element).toggleClass(T))},e.dispose=function(){p.removeData(this._element,y),this._element=null},n._jQueryInterface=function(t){return this.each(function(){var e=p(this).data(y);e||(e=new n(this),p(this).data(y,e)),"toggle"===t&&e[t]()})},s(n,null,[{key:"VERSION",get:function(){return"4.4.1"}}]),n}();p(document).on(P.CLICK_DATA_API,D,function(e){var t=e.target;if(p(t).hasClass(C)||(t=p(t).closest(L)[0]),!t||t.hasAttribute("disabled")||t.classList.contains("disabled"))e.preventDefault();else{var n=t.querySelector(N);if(n&&(n.hasAttribute("disabled")||n.classList.contains("disabled")))return void e.preventDefault();x._jQueryInterface.call(p(t),"toggle")}}).on(P.FOCUS_BLUR_DATA_API,D,function(e){var t=p(e.target).closest(L)[0];p(t).toggleClass(S,/^focus(in)?$/.test(e.type))}),p(window).on(P.LOAD_DATA_API,function(){for(var e=[].slice.call(document.querySelectorAll(O)),t=0,n=e.length;t<n;t++){var i=e[t],o=i.querySelector(N);o.checked||o.hasAttribute("checked")?i.classList.add(T):i.classList.remove(T)}for(var r=0,s=(e=[].slice.call(document.querySelectorAll(A))).length;r<s;r++){var a=e[r];"true"===a.getAttribute("aria-pressed")?a.classList.add(T):a.classList.remove(T)}}),p.fn[v]=x._jQueryInterface,p.fn[v].Constructor=x,p.fn[v].noConflict=function(){return p.fn[v]=w,x._jQueryInterface};var j="carousel",H="bs.carousel",R="."+H,F=".data-api",M=p.fn[j],W={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0,touch:!0},U={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean",touch:"boolean"},B="next",q="prev",K="left",Q="right",V={SLIDE:"slide"+R,SLID:"slid"+R,KEYDOWN:"keydown"+R,MOUSEENTER:"mouseenter"+R,MOUSELEAVE:"mouseleave"+R,TOUCHSTART:"touchstart"+R,TOUCHMOVE:"touchmove"+R,TOUCHEND:"touchend"+R,POINTERDOWN:"pointerdown"+R,POINTERUP:"pointerup"+R,DRAG_START:"dragstart"+R,LOAD_DATA_API:"load"+R+F,CLICK_DATA_API:"click"+R+F},Y="carousel",z="active",X="slide",G="carousel-item-right",$="carousel-item-left",J="carousel-item-next",Z="carousel-item-prev",ee="pointer-event",te=".active",ne=".active.carousel-item",ie=".carousel-item",oe=".carousel-item img",re=".carousel-item-next, .carousel-item-prev",se=".carousel-indicators",ae="[data-slide], [data-slide-to]",le='[data-ride="carousel"]',ce={TOUCH:"touch",PEN:"pen"},he=function(){function r(e,t){this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this.touchStartX=0,this.touchDeltaX=0,this._config=this._getConfig(t),this._element=e,this._indicatorsElement=this._element.querySelector(se),this._touchSupported="ontouchstart"in document.documentElement||0<navigator.maxTouchPoints,this._pointerEvent=Boolean(window.PointerEvent||window.MSPointerEvent),this._addEventListeners()}var e=r.prototype;return e.next=function(){this._isSliding||this._slide(B)},e.nextWhenVisible=function(){!document.hidden&&p(this._element).is(":visible")&&"hidden"!==p(this._element).css("visibility")&&this.next()},e.prev=function(){this._isSliding||this._slide(q)},e.pause=function(e){e||(this._isPaused=!0),this._element.querySelector(re)&&(m.triggerTransitionEnd(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},e.cycle=function(e){e||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config.interval&&!this._isPaused&&(this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},e.to=function(e){var t=this;this._activeElement=this._element.querySelector(ne);var n=this._getItemIndex(this._activeElement);if(!(e>this._items.length-1||e<0))if(this._isSliding)p(this._element).one(V.SLID,function(){return t.to(e)});else{if(n===e)return this.pause(),void this.cycle();var i=n<e?B:q;this._slide(i,this._items[e])}},e.dispose=function(){p(this._element).off(R),p.removeData(this._element,H),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},e._getConfig=function(e){return e=l({},W,{},e),m.typeCheckConfig(j,e,U),e},e._handleSwipe=function(){var e=Math.abs(this.touchDeltaX);if(!(e<=40)){var t=e/this.touchDeltaX;(this.touchDeltaX=0)<t&&this.prev(),t<0&&this.next()}},e._addEventListeners=function(){var t=this;this._config.keyboard&&p(this._element).on(V.KEYDOWN,function(e){return t._keydown(e)}),"hover"===this._config.pause&&p(this._element).on(V.MOUSEENTER,function(e){return t.pause(e)}).on(V.MOUSELEAVE,function(e){return t.cycle(e)}),this._config.touch&&this._addTouchEventListeners()},e._addTouchEventListeners=function(){var t=this;if(this._touchSupported){var n=function(e){t._pointerEvent&&ce[e.originalEvent.pointerType.toUpperCase()]?t.touchStartX=e.originalEvent.clientX:t._pointerEvent||(t.touchStartX=e.originalEvent.touches[0].clientX)},i=function(e){t._pointerEvent&&ce[e.originalEvent.pointerType.toUpperCase()]&&(t.touchDeltaX=e.originalEvent.clientX-t.touchStartX),t._handleSwipe(),"hover"===t._config.pause&&(t.pause(),t.touchTimeout&&clearTimeout(t.touchTimeout),t.touchTimeout=setTimeout(function(e){return t.cycle(e)},500+t._config.interval))};p(this._element.querySelectorAll(oe)).on(V.DRAG_START,function(e){return e.preventDefault()}),this._pointerEvent?(p(this._element).on(V.POINTERDOWN,function(e){return n(e)}),p(this._element).on(V.POINTERUP,function(e){return i(e)}),this._element.classList.add(ee)):(p(this._element).on(V.TOUCHSTART,function(e){return n(e)}),p(this._element).on(V.TOUCHMOVE,function(e){return function(e){e.originalEvent.touches&&1<e.originalEvent.touches.length?t.touchDeltaX=0:t.touchDeltaX=e.originalEvent.touches[0].clientX-t.touchStartX}(e)}),p(this._element).on(V.TOUCHEND,function(e){return i(e)}))}},e._keydown=function(e){if(!/input|textarea/i.test(e.target.tagName))switch(e.which){case 37:e.preventDefault(),this.prev();break;case 39:e.preventDefault(),this.next()}},e._getItemIndex=function(e){return this._items=e&&e.parentNode?[].slice.call(e.parentNode.querySelectorAll(ie)):[],this._items.indexOf(e)},e._getItemByDirection=function(e,t){var n=e===B,i=e===q,o=this._getItemIndex(t),r=this._items.length-1;if((i&&0===o||n&&o===r)&&!this._config.wrap)return t;var s=(o+(e===q?-1:1))%this._items.length;return-1==s?this._items[this._items.length-1]:this._items[s]},e._triggerSlideEvent=function(e,t){var n=this._getItemIndex(e),i=this._getItemIndex(this._element.querySelector(ne)),o=p.Event(V.SLIDE,{relatedTarget:e,direction:t,from:i,to:n});return p(this._element).trigger(o),o},e._setActiveIndicatorElement=function(e){if(this._indicatorsElement){var t=[].slice.call(this._indicatorsElement.querySelectorAll(te));p(t).removeClass(z);var n=this._indicatorsElement.children[this._getItemIndex(e)];n&&p(n).addClass(z)}},e._slide=function(e,t){var n,i,o,r=this,s=this._element.querySelector(ne),a=this._getItemIndex(s),l=t||s&&this._getItemByDirection(e,s),c=this._getItemIndex(l),h=Boolean(this._interval);if(o=e===B?(n=$,i=J,K):(n=G,i=Z,Q),l&&p(l).hasClass(z))this._isSliding=!1;else if(!this._triggerSlideEvent(l,o).isDefaultPrevented()&&s&&l){this._isSliding=!0,h&&this.pause(),this._setActiveIndicatorElement(l);var u=p.Event(V.SLID,{relatedTarget:l,direction:o,from:a,to:c});if(p(this._element).hasClass(X)){p(l).addClass(i),m.reflow(l),p(s).addClass(n),p(l).addClass(n);var f=parseInt(l.getAttribute("data-interval"),10);f?(this._config.defaultInterval=this._config.defaultInterval||this._config.interval,this._config.interval=f):this._config.interval=this._config.defaultInterval||this._config.interval;var d=m.getTransitionDurationFromElement(s);p(s).one(m.TRANSITION_END,function(){p(l).removeClass(n+" "+i).addClass(z),p(s).removeClass(z+" "+i+" "+n),r._isSliding=!1,setTimeout(function(){return p(r._element).trigger(u)},0)}).emulateTransitionEnd(d)}else p(s).removeClass(z),p(l).addClass(z),this._isSliding=!1,p(this._element).trigger(u);h&&this.cycle()}},r._jQueryInterface=function(i){return this.each(function(){var e=p(this).data(H),t=l({},W,{},p(this).data());"object"==typeof i&&(t=l({},t,{},i));var n="string"==typeof i?i:t.slide;if(e||(e=new r(this,t),p(this).data(H,e)),"number"==typeof i)e.to(i);else if("string"==typeof n){if("undefined"==typeof e[n])throw new TypeError('No method named "'+n+'"');e[n]()}else t.interval&&t.ride&&(e.pause(),e.cycle())})},r._dataApiClickHandler=function(e){var t=m.getSelectorFromElement(this);if(t){var n=p(t)[0];if(n&&p(n).hasClass(Y)){var i=l({},p(n).data(),{},p(this).data()),o=this.getAttribute("data-slide-to");o&&(i.interval=!1),r._jQueryInterface.call(p(n),i),o&&p(n).data(H).to(o),e.preventDefault()}}},s(r,null,[{key:"VERSION",get:function(){return"4.4.1"}},{key:"Default",get:function(){return W}}]),r}();p(document).on(V.CLICK_DATA_API,ae,he._dataApiClickHandler),p(window).on(V.LOAD_DATA_API,function(){for(var e=[].slice.call(document.querySelectorAll(le)),t=0,n=e.length;t<n;t++){var i=p(e[t]);he._jQueryInterface.call(i,i.data())}}),p.fn[j]=he._jQueryInterface,p.fn[j].Constructor=he,p.fn[j].noConflict=function(){return p.fn[j]=M,he._jQueryInterface};var ue="collapse",fe="bs.collapse",de="."+fe,pe=p.fn[ue],me={toggle:!0,parent:""},ge={toggle:"boolean",parent:"(string|element)"},_e={SHOW:"show"+de,SHOWN:"shown"+de,HIDE:"hide"+de,HIDDEN:"hidden"+de,CLICK_DATA_API:"click"+de+".data-api"},ve="show",ye="collapse",Ee="collapsing",be="collapsed",we="width",Te="height",Ce=".show, .collapsing",Se='[data-toggle="collapse"]',De=function(){function a(t,e){this._isTransitioning=!1,this._element=t,this._config=this._getConfig(e),this._triggerArray=[].slice.call(document.querySelectorAll('[data-toggle="collapse"][href="#'+t.id+'"],[data-toggle="collapse"][data-target="#'+t.id+'"]'));for(var n=[].slice.call(document.querySelectorAll(Se)),i=0,o=n.length;i<o;i++){var r=n[i],s=m.getSelectorFromElement(r),a=[].slice.call(document.querySelectorAll(s)).filter(function(e){return e===t});null!==s&&0<a.length&&(this._selector=s,this._triggerArray.push(r))}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}var e=a.prototype;return e.toggle=function(){p(this._element).hasClass(ve)?this.hide():this.show()},e.show=function(){var e,t,n=this;if(!this._isTransitioning&&!p(this._element).hasClass(ve)&&(this._parent&&0===(e=[].slice.call(this._parent.querySelectorAll(Ce)).filter(function(e){return"string"==typeof n._config.parent?e.getAttribute("data-parent")===n._config.parent:e.classList.contains(ye)})).length&&(e=null),!(e&&(t=p(e).not(this._selector).data(fe))&&t._isTransitioning))){var i=p.Event(_e.SHOW);if(p(this._element).trigger(i),!i.isDefaultPrevented()){e&&(a._jQueryInterface.call(p(e).not(this._selector),"hide"),t||p(e).data(fe,null));var o=this._getDimension();p(this._element).removeClass(ye).addClass(Ee),this._element.style[o]=0,this._triggerArray.length&&p(this._triggerArray).removeClass(be).attr("aria-expanded",!0),this.setTransitioning(!0);var r="scroll"+(o[0].toUpperCase()+o.slice(1)),s=m.getTransitionDurationFromElement(this._element);p(this._element).one(m.TRANSITION_END,function(){p(n._element).removeClass(Ee).addClass(ye).addClass(ve),n._element.style[o]="",n.setTransitioning(!1),p(n._element).trigger(_e.SHOWN)}).emulateTransitionEnd(s),this._element.style[o]=this._element[r]+"px"}}},e.hide=function(){var e=this;if(!this._isTransitioning&&p(this._element).hasClass(ve)){var t=p.Event(_e.HIDE);if(p(this._element).trigger(t),!t.isDefaultPrevented()){var n=this._getDimension();this._element.style[n]=this._element.getBoundingClientRect()[n]+"px",m.reflow(this._element),p(this._element).addClass(Ee).removeClass(ye).removeClass(ve);var i=this._triggerArray.length;if(0<i)for(var o=0;o<i;o++){var r=this._triggerArray[o],s=m.getSelectorFromElement(r);if(null!==s)p([].slice.call(document.querySelectorAll(s))).hasClass(ve)||p(r).addClass(be).attr("aria-expanded",!1)}this.setTransitioning(!0);this._element.style[n]="";var a=m.getTransitionDurationFromElement(this._element);p(this._element).one(m.TRANSITION_END,function(){e.setTransitioning(!1),p(e._element).removeClass(Ee).addClass(ye).trigger(_e.HIDDEN)}).emulateTransitionEnd(a)}}},e.setTransitioning=function(e){this._isTransitioning=e},e.dispose=function(){p.removeData(this._element,fe),this._config=null,this._parent=null,this._element=null,this._triggerArray=null,this._isTransitioning=null},e._getConfig=function(e){return(e=l({},me,{},e)).toggle=Boolean(e.toggle),m.typeCheckConfig(ue,e,ge),e},e._getDimension=function(){return p(this._element).hasClass(we)?we:Te},e._getParent=function(){var e,n=this;m.isElement(this._config.parent)?(e=this._config.parent,"undefined"!=typeof this._config.parent.jquery&&(e=this._config.parent[0])):e=document.querySelector(this._config.parent);var t='[data-toggle="collapse"][data-parent="'+this._config.parent+'"]',i=[].slice.call(e.querySelectorAll(t));return p(i).each(function(e,t){n._addAriaAndCollapsedClass(a._getTargetFromElement(t),[t])}),e},e._addAriaAndCollapsedClass=function(e,t){var n=p(e).hasClass(ve);t.length&&p(t).toggleClass(be,!n).attr("aria-expanded",n)},a._getTargetFromElement=function(e){var t=m.getSelectorFromElement(e);return t?document.querySelector(t):null},a._jQueryInterface=function(i){return this.each(function(){var e=p(this),t=e.data(fe),n=l({},me,{},e.data(),{},"object"==typeof i&&i?i:{});if(!t&&n.toggle&&/show|hide/.test(i)&&(n.toggle=!1),t||(t=new a(this,n),e.data(fe,t)),"string"==typeof i){if("undefined"==typeof t[i])throw new TypeError('No method named "'+i+'"');t[i]()}})},s(a,null,[{key:"VERSION",get:function(){return"4.4.1"}},{key:"Default",get:function(){return me}}]),a}();p(document).on(_e.CLICK_DATA_API,Se,function(e){"A"===e.currentTarget.tagName&&e.preventDefault();var n=p(this),t=m.getSelectorFromElement(this),i=[].slice.call(document.querySelectorAll(t));p(i).each(function(){var e=p(this),t=e.data(fe)?"toggle":n.data();De._jQueryInterface.call(e,t)})}),p.fn[ue]=De._jQueryInterface,p.fn[ue].Constructor=De,p.fn[ue].noConflict=function(){return p.fn[ue]=pe,De._jQueryInterface};var Ie="undefined"!=typeof window&&"undefined"!=typeof document&&"undefined"!=typeof navigator,Ae=function(){for(var e=["Edge","Trident","Firefox"],t=0;t<e.length;t+=1)if(Ie&&0<=navigator.userAgent.indexOf(e[t]))return 1;return 0}();var Oe=Ie&&window.Promise?function(e){var t=!1;return function(){t||(t=!0,window.Promise.resolve().then(function(){t=!1,e()}))}}:function(e){var t=!1;return function(){t||(t=!0,setTimeout(function(){t=!1,e()},Ae))}};function Ne(e){return e&&"[object Function]"==={}.toString.call(e)}function ke(e,t){if(1!==e.nodeType)return[];var n=e.ownerDocument.defaultView.getComputedStyle(e,null);return t?n[t]:n}function Le(e){return"HTML"===e.nodeName?e:e.parentNode||e.host}function Pe(e){if(!e)return document.body;switch(e.nodeName){case"HTML":case"BODY":return e.ownerDocument.body;case"#document":return e.body}var t=ke(e),n=t.overflow,i=t.overflowX,o=t.overflowY;return/(auto|scroll|overlay)/.test(n+o+i)?e:Pe(Le(e))}function xe(e){return e&&e.referenceNode?e.referenceNode:e}var je=Ie&&!(!window.MSInputMethodContext||!document.documentMode),He=Ie&&/MSIE 10/.test(navigator.userAgent);function Re(e){return 11===e?je:10===e?He:je||He}function Fe(e){if(!e)return document.documentElement;for(var t=Re(10)?document.body:null,n=e.offsetParent||null;n===t&&e.nextElementSibling;)n=(e=e.nextElementSibling).offsetParent;var i=n&&n.nodeName;return i&&"BODY"!==i&&"HTML"!==i?-1!==["TH","TD","TABLE"].indexOf(n.nodeName)&&"static"===ke(n,"position")?Fe(n):n:e?e.ownerDocument.documentElement:document.documentElement}function Me(e){return null!==e.parentNode?Me(e.parentNode):e}function We(e,t){if(!(e&&e.nodeType&&t&&t.nodeType))return document.documentElement;var n=e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_FOLLOWING,i=n?e:t,o=n?t:e,r=document.createRange();r.setStart(i,0),r.setEnd(o,0);var s=r.commonAncestorContainer;if(e!==s&&t!==s||i.contains(o))return function(e){var t=e.nodeName;return"BODY"!==t&&("HTML"===t||Fe(e.firstElementChild)===e)}(s)?s:Fe(s);var a=Me(e);return a.host?We(a.host,t):We(e,Me(t).host)}function Ue(e,t){var n="top"===(1<arguments.length&&void 0!==t?t:"top")?"scrollTop":"scrollLeft",i=e.nodeName;if("BODY"!==i&&"HTML"!==i)return e[n];var o=e.ownerDocument.documentElement;return(e.ownerDocument.scrollingElement||o)[n]}function Be(e,t){var n="x"===t?"Left":"Top",i="Left"==n?"Right":"Bottom";return parseFloat(e["border"+n+"Width"],10)+parseFloat(e["border"+i+"Width"],10)}function qe(e,t,n,i){return Math.max(t["offset"+e],t["scroll"+e],n["client"+e],n["offset"+e],n["scroll"+e],Re(10)?parseInt(n["offset"+e])+parseInt(i["margin"+("Height"===e?"Top":"Left")])+parseInt(i["margin"+("Height"===e?"Bottom":"Right")]):0)}function Ke(e){var t=e.body,n=e.documentElement,i=Re(10)&&getComputedStyle(n);return{height:qe("Height",t,n,i),width:qe("Width",t,n,i)}}var Qe=function(e,t,n){return t&&Ve(e.prototype,t),n&&Ve(e,n),e};function Ve(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}function Ye(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var ze=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var i in n)Object.prototype.hasOwnProperty.call(n,i)&&(e[i]=n[i])}return e};function Xe(e){return ze({},e,{right:e.left+e.width,bottom:e.top+e.height})}function Ge(e){var t={};try{if(Re(10)){t=e.getBoundingClientRect();var n=Ue(e,"top"),i=Ue(e,"left");t.top+=n,t.left+=i,t.bottom+=n,t.right+=i}else t=e.getBoundingClientRect()}catch(e){}var o={left:t.left,top:t.top,width:t.right-t.left,height:t.bottom-t.top},r="HTML"===e.nodeName?Ke(e.ownerDocument):{},s=r.width||e.clientWidth||o.width,a=r.height||e.clientHeight||o.height,l=e.offsetWidth-s,c=e.offsetHeight-a;if(l||c){var h=ke(e);l-=Be(h,"x"),c-=Be(h,"y"),o.width-=l,o.height-=c}return Xe(o)}function $e(e,t,n){var i=2<arguments.length&&void 0!==n&&n,o=Re(10),r="HTML"===t.nodeName,s=Ge(e),a=Ge(t),l=Pe(e),c=ke(t),h=parseFloat(c.borderTopWidth,10),u=parseFloat(c.borderLeftWidth,10);i&&r&&(a.top=Math.max(a.top,0),a.left=Math.max(a.left,0));var f=Xe({top:s.top-a.top-h,left:s.left-a.left-u,width:s.width,height:s.height});if(f.marginTop=0,f.marginLeft=0,!o&&r){var d=parseFloat(c.marginTop,10),p=parseFloat(c.marginLeft,10);f.top-=h-d,f.bottom-=h-d,f.left-=u-p,f.right-=u-p,f.marginTop=d,f.marginLeft=p}return(o&&!i?t.contains(l):t===l&&"BODY"!==l.nodeName)&&(f=function(e,t,n){var i=2<arguments.length&&void 0!==n&&n,o=Ue(t,"top"),r=Ue(t,"left"),s=i?-1:1;return e.top+=o*s,e.bottom+=o*s,e.left+=r*s,e.right+=r*s,e}(f,t)),f}function Je(e){if(!e||!e.parentElement||Re())return document.documentElement;for(var t=e.parentElement;t&&"none"===ke(t,"transform");)t=t.parentElement;return t||document.documentElement}function Ze(e,t,n,i,o){var r=4<arguments.length&&void 0!==o&&o,s={top:0,left:0},a=r?Je(e):We(e,xe(t));if("viewport"===i)s=function(e,t){var n=1<arguments.length&&void 0!==t&&t,i=e.ownerDocument.documentElement,o=$e(e,i),r=Math.max(i.clientWidth,window.innerWidth||0),s=Math.max(i.clientHeight,window.innerHeight||0),a=n?0:Ue(i),l=n?0:Ue(i,"left");return Xe({top:a-o.top+o.marginTop,left:l-o.left+o.marginLeft,width:r,height:s})}(a,r);else{var l=void 0;"scrollParent"===i?"BODY"===(l=Pe(Le(t))).nodeName&&(l=e.ownerDocument.documentElement):l="window"===i?e.ownerDocument.documentElement:i;var c=$e(l,a,r);if("HTML"!==l.nodeName||function e(t){var n=t.nodeName;if("BODY"===n||"HTML"===n)return!1;if("fixed"===ke(t,"position"))return!0;var i=Le(t);return!!i&&e(i)}(a))s=c;else{var h=Ke(e.ownerDocument),u=h.height,f=h.width;s.top+=c.top-c.marginTop,s.bottom=u+c.top,s.left+=c.left-c.marginLeft,s.right=f+c.left}}var d="number"==typeof(n=n||0);return s.left+=d?n:n.left||0,s.top+=d?n:n.top||0,s.right-=d?n:n.right||0,s.bottom-=d?n:n.bottom||0,s}function et(e,t,i,n,o,r){var s=5<arguments.length&&void 0!==r?r:0;if(-1===e.indexOf("auto"))return e;var a=Ze(i,n,s,o),l={top:{width:a.width,height:t.top-a.top},right:{width:a.right-t.right,height:a.height},bottom:{width:a.width,height:a.bottom-t.bottom},left:{width:t.left-a.left,height:a.height}},c=Object.keys(l).map(function(e){return ze({key:e},l[e],{area:function(e){return e.width*e.height}(l[e])})}).sort(function(e,t){return t.area-e.area}),h=c.filter(function(e){var t=e.width,n=e.height;return t>=i.clientWidth&&n>=i.clientHeight}),u=0<h.length?h[0].key:c[0].key,f=e.split("-")[1];return u+(f?"-"+f:"")}function tt(e,t,n,i){var o=3<arguments.length&&void 0!==i?i:null;return $e(n,o?Je(t):We(t,xe(n)),o)}function nt(e){var t=e.ownerDocument.defaultView.getComputedStyle(e),n=parseFloat(t.marginTop||0)+parseFloat(t.marginBottom||0),i=parseFloat(t.marginLeft||0)+parseFloat(t.marginRight||0);return{width:e.offsetWidth+i,height:e.offsetHeight+n}}function it(e){var t={left:"right",right:"left",bottom:"top",top:"bottom"};return e.replace(/left|right|bottom|top/g,function(e){return t[e]})}function ot(e,t,n){n=n.split("-")[0];var i=nt(e),o={width:i.width,height:i.height},r=-1!==["right","left"].indexOf(n),s=r?"top":"left",a=r?"left":"top",l=r?"height":"width",c=r?"width":"height";return o[s]=t[s]+t[l]/2-i[l]/2,o[a]=n===a?t[a]-i[c]:t[it(a)],o}function rt(e,t){return Array.prototype.find?e.find(t):e.filter(t)[0]}function st(e,n,t){return(void 0===t?e:e.slice(0,function(e,t,n){if(Array.prototype.findIndex)return e.findIndex(function(e){return e[t]===n});var i=rt(e,function(e){return e[t]===n});return e.indexOf(i)}(e,"name",t))).forEach(function(e){e.function&&console.warn("`modifier.function` is deprecated, use `modifier.fn`!");var t=e.function||e.fn;e.enabled&&Ne(t)&&(n.offsets.popper=Xe(n.offsets.popper),n.offsets.reference=Xe(n.offsets.reference),n=t(n,e))}),n}function at(e,n){return e.some(function(e){var t=e.name;return e.enabled&&t===n})}function lt(e){for(var t=[!1,"ms","Webkit","Moz","O"],n=e.charAt(0).toUpperCase()+e.slice(1),i=0;i<t.length;i++){var o=t[i],r=o?""+o+n:e;if("undefined"!=typeof document.body.style[r])return r}return null}function ct(e){var t=e.ownerDocument;return t?t.defaultView:window}function ht(e,t,n,i){n.updateBound=i,ct(e).addEventListener("resize",n.updateBound,{passive:!0});var o=Pe(e);return function e(t,n,i,o){var r="BODY"===t.nodeName,s=r?t.ownerDocument.defaultView:t;s.addEventListener(n,i,{passive:!0}),r||e(Pe(s.parentNode),n,i,o),o.push(s)}(o,"scroll",n.updateBound,n.scrollParents),n.scrollElement=o,n.eventsEnabled=!0,n}function ut(){this.state.eventsEnabled&&(cancelAnimationFrame(this.scheduleUpdate),this.state=function(e,t){return ct(e).removeEventListener("resize",t.updateBound),t.scrollParents.forEach(function(e){e.removeEventListener("scroll",t.updateBound)}),t.updateBound=null,t.scrollParents=[],t.scrollElement=null,t.eventsEnabled=!1,t}(this.reference,this.state))}function ft(e){return""!==e&&!isNaN(parseFloat(e))&&isFinite(e)}function dt(n,i){Object.keys(i).forEach(function(e){var t="";-1!==["width","height","top","right","bottom","left"].indexOf(e)&&ft(i[e])&&(t="px"),n.style[e]=i[e]+t})}function pt(e,t){function n(e){return e}var i=e.offsets,o=i.popper,r=i.reference,s=Math.round,a=Math.floor,l=s(r.width),c=s(o.width),h=-1!==["left","right"].indexOf(e.placement),u=-1!==e.placement.indexOf("-"),f=t?h||u||l%2==c%2?s:a:n,d=t?s:n;return{left:f(l%2==1&&c%2==1&&!u&&t?o.left-1:o.left),top:d(o.top),bottom:d(o.bottom),right:f(o.right)}}var mt=Ie&&/Firefox/i.test(navigator.userAgent);function gt(e,t,n){var i=rt(e,function(e){return e.name===t}),o=!!i&&e.some(function(e){return e.name===n&&e.enabled&&e.order<i.order});if(!o){var r="`"+t+"`",s="`"+n+"`";console.warn(s+" modifier is required by "+r+" modifier in order to work, be sure to include it before "+r+"!")}return o}var _t=["auto-start","auto","auto-end","top-start","top","top-end","right-start","right","right-end","bottom-end","bottom","bottom-start","left-end","left","left-start"],vt=_t.slice(3);function yt(e,t){var n=1<arguments.length&&void 0!==t&&t,i=vt.indexOf(e),o=vt.slice(i+1).concat(vt.slice(0,i));return n?o.reverse():o}var Et="flip",bt="clockwise",wt="counterclockwise";function Tt(e,o,r,t){var s=[0,0],a=-1!==["right","left"].indexOf(t),n=e.split(/(\+|\-)/).map(function(e){return e.trim()}),i=n.indexOf(rt(n,function(e){return-1!==e.search(/,|\s/)}));n[i]&&-1===n[i].indexOf(",")&&console.warn("Offsets separated by white space(s) are deprecated, use a comma (,) instead.");var l=/\s*,\s*|\s+/,c=-1!==i?[n.slice(0,i).concat([n[i].split(l)[0]]),[n[i].split(l)[1]].concat(n.slice(i+1))]:[n];return(c=c.map(function(e,t){var n=(1===t?!a:a)?"height":"width",i=!1;return e.reduce(function(e,t){return""===e[e.length-1]&&-1!==["+","-"].indexOf(t)?(e[e.length-1]=t,i=!0,e):i?(e[e.length-1]+=t,i=!1,e):e.concat(t)},[]).map(function(e){return function(e,t,n,i){var o=e.match(/((?:\-|\+)?\d*\.?\d*)(.*)/),r=+o[1],s=o[2];if(!r)return e;if(0!==s.indexOf("%"))return"vh"!==s&&"vw"!==s?r:("vh"===s?Math.max(document.documentElement.clientHeight,window.innerHeight||0):Math.max(document.documentElement.clientWidth,window.innerWidth||0))/100*r;var a=void 0;switch(s){case"%p":a=n;break;case"%":case"%r":default:a=i}return Xe(a)[t]/100*r}(e,n,o,r)})})).forEach(function(n,i){n.forEach(function(e,t){ft(e)&&(s[i]+=e*("-"===n[t-1]?-1:1))})}),s}var Ct={placement:"bottom",positionFixed:!1,eventsEnabled:!0,removeOnDestroy:!1,onCreate:function(){},onUpdate:function(){},modifiers:{shift:{order:100,enabled:!0,fn:function(e){var t=e.placement,n=t.split("-")[0],i=t.split("-")[1];if(i){var o=e.offsets,r=o.reference,s=o.popper,a=-1!==["bottom","top"].indexOf(n),l=a?"left":"top",c=a?"width":"height",h={start:Ye({},l,r[l]),end:Ye({},l,r[l]+r[c]-s[c])};e.offsets.popper=ze({},s,h[i])}return e}},offset:{order:200,enabled:!0,fn:function(e,t){var n=t.offset,i=e.placement,o=e.offsets,r=o.popper,s=o.reference,a=i.split("-")[0],l=void 0;return l=ft(+n)?[+n,0]:Tt(n,r,s,a),"left"===a?(r.top+=l[0],r.left-=l[1]):"right"===a?(r.top+=l[0],r.left+=l[1]):"top"===a?(r.left+=l[0],r.top-=l[1]):"bottom"===a&&(r.left+=l[0],r.top+=l[1]),e.popper=r,e},offset:0},preventOverflow:{order:300,enabled:!0,fn:function(e,i){var t=i.boundariesElement||Fe(e.instance.popper);e.instance.reference===t&&(t=Fe(t));var n=lt("transform"),o=e.instance.popper.style,r=o.top,s=o.left,a=o[n];o.top="",o.left="",o[n]="";var l=Ze(e.instance.popper,e.instance.reference,i.padding,t,e.positionFixed);o.top=r,o.left=s,o[n]=a,i.boundaries=l;var c=i.priority,h=e.offsets.popper,u={primary:function(e){var t=h[e];return h[e]<l[e]&&!i.escapeWithReference&&(t=Math.max(h[e],l[e])),Ye({},e,t)},secondary:function(e){var t="right"===e?"left":"top",n=h[t];return h[e]>l[e]&&!i.escapeWithReference&&(n=Math.min(h[t],l[e]-("right"===e?h.width:h.height))),Ye({},t,n)}};return c.forEach(function(e){var t=-1!==["left","top"].indexOf(e)?"primary":"secondary";h=ze({},h,u[t](e))}),e.offsets.popper=h,e},priority:["left","right","top","bottom"],padding:5,boundariesElement:"scrollParent"},keepTogether:{order:400,enabled:!0,fn:function(e){var t=e.offsets,n=t.popper,i=t.reference,o=e.placement.split("-")[0],r=Math.floor,s=-1!==["top","bottom"].indexOf(o),a=s?"right":"bottom",l=s?"left":"top",c=s?"width":"height";return n[a]<r(i[l])&&(e.offsets.popper[l]=r(i[l])-n[c]),n[l]>r(i[a])&&(e.offsets.popper[l]=r(i[a])),e}},arrow:{order:500,enabled:!0,fn:function(e,t){var n;if(!gt(e.instance.modifiers,"arrow","keepTogether"))return e;var i=t.element;if("string"==typeof i){if(!(i=e.instance.popper.querySelector(i)))return e}else if(!e.instance.popper.contains(i))return console.warn("WARNING: `arrow.element` must be child of its popper element!"),e;var o=e.placement.split("-")[0],r=e.offsets,s=r.popper,a=r.reference,l=-1!==["left","right"].indexOf(o),c=l?"height":"width",h=l?"Top":"Left",u=h.toLowerCase(),f=l?"left":"top",d=l?"bottom":"right",p=nt(i)[c];a[d]-p<s[u]&&(e.offsets.popper[u]-=s[u]-(a[d]-p)),a[u]+p>s[d]&&(e.offsets.popper[u]+=a[u]+p-s[d]),e.offsets.popper=Xe(e.offsets.popper);var m=a[u]+a[c]/2-p/2,g=ke(e.instance.popper),_=parseFloat(g["margin"+h],10),v=parseFloat(g["border"+h+"Width"],10),y=m-e.offsets.popper[u]-_-v;return y=Math.max(Math.min(s[c]-p,y),0),e.arrowElement=i,e.offsets.arrow=(Ye(n={},u,Math.round(y)),Ye(n,f,""),n),e},element:"[x-arrow]"},flip:{order:600,enabled:!0,fn:function(m,g){if(at(m.instance.modifiers,"inner"))return m;if(m.flipped&&m.placement===m.originalPlacement)return m;var _=Ze(m.instance.popper,m.instance.reference,g.padding,g.boundariesElement,m.positionFixed),v=m.placement.split("-")[0],y=it(v),E=m.placement.split("-")[1]||"",b=[];switch(g.behavior){case Et:b=[v,y];break;case bt:b=yt(v);break;case wt:b=yt(v,!0);break;default:b=g.behavior}return b.forEach(function(e,t){if(v!==e||b.length===t+1)return m;v=m.placement.split("-")[0],y=it(v);var n=m.offsets.popper,i=m.offsets.reference,o=Math.floor,r="left"===v&&o(n.right)>o(i.left)||"right"===v&&o(n.left)<o(i.right)||"top"===v&&o(n.bottom)>o(i.top)||"bottom"===v&&o(n.top)<o(i.bottom),s=o(n.left)<o(_.left),a=o(n.right)>o(_.right),l=o(n.top)<o(_.top),c=o(n.bottom)>o(_.bottom),h="left"===v&&s||"right"===v&&a||"top"===v&&l||"bottom"===v&&c,u=-1!==["top","bottom"].indexOf(v),f=!!g.flipVariations&&(u&&"start"===E&&s||u&&"end"===E&&a||!u&&"start"===E&&l||!u&&"end"===E&&c),d=!!g.flipVariationsByContent&&(u&&"start"===E&&a||u&&"end"===E&&s||!u&&"start"===E&&c||!u&&"end"===E&&l),p=f||d;(r||h||p)&&(m.flipped=!0,(r||h)&&(v=b[t+1]),p&&(E=function(e){return"end"===e?"start":"start"===e?"end":e}(E)),m.placement=v+(E?"-"+E:""),m.offsets.popper=ze({},m.offsets.popper,ot(m.instance.popper,m.offsets.reference,m.placement)),m=st(m.instance.modifiers,m,"flip"))}),m},behavior:"flip",padding:5,boundariesElement:"viewport",flipVariations:!1,flipVariationsByContent:!1},inner:{order:700,enabled:!1,fn:function(e){var t=e.placement,n=t.split("-")[0],i=e.offsets,o=i.popper,r=i.reference,s=-1!==["left","right"].indexOf(n),a=-1===["top","left"].indexOf(n);return o[s?"left":"top"]=r[n]-(a?o[s?"width":"height"]:0),e.placement=it(t),e.offsets.popper=Xe(o),e}},hide:{order:800,enabled:!0,fn:function(e){if(!gt(e.instance.modifiers,"hide","preventOverflow"))return e;var t=e.offsets.reference,n=rt(e.instance.modifiers,function(e){return"preventOverflow"===e.name}).boundaries;if(t.bottom<n.top||t.left>n.right||t.top>n.bottom||t.right<n.left){if(!0===e.hide)return e;e.hide=!0,e.attributes["x-out-of-boundaries"]=""}else{if(!1===e.hide)return e;e.hide=!1,e.attributes["x-out-of-boundaries"]=!1}return e}},computeStyle:{order:850,enabled:!0,fn:function(e,t){var n=t.x,i=t.y,o=e.offsets.popper,r=rt(e.instance.modifiers,function(e){return"applyStyle"===e.name}).gpuAcceleration;void 0!==r&&console.warn("WARNING: `gpuAcceleration` option moved to `computeStyle` modifier and will not be supported in future versions of Popper.js!");var s=void 0!==r?r:t.gpuAcceleration,a=Fe(e.instance.popper),l=Ge(a),c={position:o.position},h=pt(e,window.devicePixelRatio<2||!mt),u="bottom"===n?"top":"bottom",f="right"===i?"left":"right",d=lt("transform"),p=void 0,m=void 0;if(m="bottom"==u?"HTML"===a.nodeName?-a.clientHeight+h.bottom:-l.height+h.bottom:h.top,p="right"==f?"HTML"===a.nodeName?-a.clientWidth+h.right:-l.width+h.right:h.left,s&&d)c[d]="translate3d("+p+"px, "+m+"px, 0)",c[u]=0,c[f]=0,c.willChange="transform";else{var g="bottom"==u?-1:1,_="right"==f?-1:1;c[u]=m*g,c[f]=p*_,c.willChange=u+", "+f}var v={"x-placement":e.placement};return e.attributes=ze({},v,e.attributes),e.styles=ze({},c,e.styles),e.arrowStyles=ze({},e.offsets.arrow,e.arrowStyles),e},gpuAcceleration:!0,x:"bottom",y:"right"},applyStyle:{order:900,enabled:!0,fn:function(e){return dt(e.instance.popper,e.styles),function(t,n){Object.keys(n).forEach(function(e){!1!==n[e]?t.setAttribute(e,n[e]):t.removeAttribute(e)})}(e.instance.popper,e.attributes),e.arrowElement&&Object.keys(e.arrowStyles).length&&dt(e.arrowElement,e.arrowStyles),e},onLoad:function(e,t,n,i,o){var r=tt(o,t,e,n.positionFixed),s=et(n.placement,r,t,e,n.modifiers.flip.boundariesElement,n.modifiers.flip.padding);return t.setAttribute("x-placement",s),dt(t,{position:n.positionFixed?"fixed":"absolute"}),n},gpuAcceleration:void 0}}},St=(Qe(Dt,[{key:"update",value:function(){return function(){if(!this.state.isDestroyed){var e={instance:this,styles:{},arrowStyles:{},attributes:{},flipped:!1,offsets:{}};e.offsets.reference=tt(this.state,this.popper,this.reference,this.options.positionFixed),e.placement=et(this.options.placement,e.offsets.reference,this.popper,this.reference,this.options.modifiers.flip.boundariesElement,this.options.modifiers.flip.padding),e.originalPlacement=e.placement,e.positionFixed=this.options.positionFixed,e.offsets.popper=ot(this.popper,e.offsets.reference,e.placement),e.offsets.popper.position=this.options.positionFixed?"fixed":"absolute",e=st(this.modifiers,e),this.state.isCreated?this.options.onUpdate(e):(this.state.isCreated=!0,this.options.onCreate(e))}}.call(this)}},{key:"destroy",value:function(){return function(){return this.state.isDestroyed=!0,at(this.modifiers,"applyStyle")&&(this.popper.removeAttribute("x-placement"),this.popper.style.position="",this.popper.style.top="",this.popper.style.left="",this.popper.style.right="",this.popper.style.bottom="",this.popper.style.willChange="",this.popper.style[lt("transform")]=""),this.disableEventListeners(),this.options.removeOnDestroy&&this.popper.parentNode.removeChild(this.popper),this}.call(this)}},{key:"enableEventListeners",value:function(){return function(){this.state.eventsEnabled||(this.state=ht(this.reference,this.options,this.state,this.scheduleUpdate))}.call(this)}},{key:"disableEventListeners",value:function(){return ut.call(this)}}]),Dt);function Dt(e,t){var n=this,i=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{};!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,Dt),this.scheduleUpdate=function(){return requestAnimationFrame(n.update)},this.update=Oe(this.update.bind(this)),this.options=ze({},Dt.Defaults,i),this.state={isDestroyed:!1,isCreated:!1,scrollParents:[]},this.reference=e&&e.jquery?e[0]:e,this.popper=t&&t.jquery?t[0]:t,this.options.modifiers={},Object.keys(ze({},Dt.Defaults.modifiers,i.modifiers)).forEach(function(e){n.options.modifiers[e]=ze({},Dt.Defaults.modifiers[e]||{},i.modifiers?i.modifiers[e]:{})}),this.modifiers=Object.keys(this.options.modifiers).map(function(e){return ze({name:e},n.options.modifiers[e])}).sort(function(e,t){return e.order-t.order}),this.modifiers.forEach(function(e){e.enabled&&Ne(e.onLoad)&&e.onLoad(n.reference,n.popper,n.options,e,n.state)}),this.update();var o=this.options.eventsEnabled;o&&this.enableEventListeners(),this.state.eventsEnabled=o}St.Utils=("undefined"!=typeof window?window:global).PopperUtils,St.placements=_t,St.Defaults=Ct;var It="dropdown",At="bs.dropdown",Ot="."+At,Nt=".data-api",kt=p.fn[It],Lt=new RegExp("38|40|27"),Pt={HIDE:"hide"+Ot,HIDDEN:"hidden"+Ot,SHOW:"show"+Ot,SHOWN:"shown"+Ot,CLICK:"click"+Ot,CLICK_DATA_API:"click"+Ot+Nt,KEYDOWN_DATA_API:"keydown"+Ot+Nt,KEYUP_DATA_API:"keyup"+Ot+Nt},xt="disabled",jt="show",Ht="dropup",Rt="dropright",Ft="dropleft",Mt="dropdown-menu-right",Wt="position-static",Ut='[data-toggle="dropdown"]',Bt=".dropdown form",qt=".dropdown-menu",Kt=".navbar-nav",Qt=".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",Vt="top-start",Yt="top-end",zt="bottom-start",Xt="bottom-end",Gt="right-start",$t="left-start",Jt={offset:0,flip:!0,boundary:"scrollParent",reference:"toggle",display:"dynamic",popperConfig:null},Zt={offset:"(number|string|function)",flip:"boolean",boundary:"(string|element)",reference:"(string|element)",display:"string",popperConfig:"(null|object)"},en=function(){function c(e,t){this._element=e,this._popper=null,this._config=this._getConfig(t),this._menu=this._getMenuElement(),this._inNavbar=this._detectNavbar(),this._addEventListeners()}var e=c.prototype;return e.toggle=function(){if(!this._element.disabled&&!p(this._element).hasClass(xt)){var e=p(this._menu).hasClass(jt);c._clearMenus(),e||this.show(!0)}},e.show=function(e){if(void 0===e&&(e=!1),!(this._element.disabled||p(this._element).hasClass(xt)||p(this._menu).hasClass(jt))){var t={relatedTarget:this._element},n=p.Event(Pt.SHOW,t),i=c._getParentFromElement(this._element);if(p(i).trigger(n),!n.isDefaultPrevented()){if(!this._inNavbar&&e){if("undefined"==typeof St)throw new TypeError("Bootstrap's dropdowns require Popper.js (https://popper.js.org/)");var o=this._element;"parent"===this._config.reference?o=i:m.isElement(this._config.reference)&&(o=this._config.reference,"undefined"!=typeof this._config.reference.jquery&&(o=this._config.reference[0])),"scrollParent"!==this._config.boundary&&p(i).addClass(Wt),this._popper=new St(o,this._menu,this._getPopperConfig())}"ontouchstart"in document.documentElement&&0===p(i).closest(Kt).length&&p(document.body).children().on("mouseover",null,p.noop),this._element.focus(),this._element.setAttribute("aria-expanded",!0),p(this._menu).toggleClass(jt),p(i).toggleClass(jt).trigger(p.Event(Pt.SHOWN,t))}}},e.hide=function(){if(!this._element.disabled&&!p(this._element).hasClass(xt)&&p(this._menu).hasClass(jt)){var e={relatedTarget:this._element},t=p.Event(Pt.HIDE,e),n=c._getParentFromElement(this._element);p(n).trigger(t),t.isDefaultPrevented()||(this._popper&&this._popper.destroy(),p(this._menu).toggleClass(jt),p(n).toggleClass(jt).trigger(p.Event(Pt.HIDDEN,e)))}},e.dispose=function(){p.removeData(this._element,At),p(this._element).off(Ot),this._element=null,(this._menu=null)!==this._popper&&(this._popper.destroy(),this._popper=null)},e.update=function(){this._inNavbar=this._detectNavbar(),null!==this._popper&&this._popper.scheduleUpdate()},e._addEventListeners=function(){var t=this;p(this._element).on(Pt.CLICK,function(e){e.preventDefault(),e.stopPropagation(),t.toggle()})},e._getConfig=function(e){return e=l({},this.constructor.Default,{},p(this._element).data(),{},e),m.typeCheckConfig(It,e,this.constructor.DefaultType),e},e._getMenuElement=function(){if(!this._menu){var e=c._getParentFromElement(this._element);e&&(this._menu=e.querySelector(qt))}return this._menu},e._getPlacement=function(){var e=p(this._element.parentNode),t=zt;return e.hasClass(Ht)?(t=Vt,p(this._menu).hasClass(Mt)&&(t=Yt)):e.hasClass(Rt)?t=Gt:e.hasClass(Ft)?t=$t:p(this._menu).hasClass(Mt)&&(t=Xt),t},e._detectNavbar=function(){return 0<p(this._element).closest(".navbar").length},e._getOffset=function(){var t=this,e={};return"function"==typeof this._config.offset?e.fn=function(e){return e.offsets=l({},e.offsets,{},t._config.offset(e.offsets,t._element)||{}),e}:e.offset=this._config.offset,e},e._getPopperConfig=function(){var e={placement:this._getPlacement(),modifiers:{offset:this._getOffset(),flip:{enabled:this._config.flip},preventOverflow:{boundariesElement:this._config.boundary}}};return"static"===this._config.display&&(e.modifiers.applyStyle={enabled:!1}),l({},e,{},this._config.popperConfig)},c._jQueryInterface=function(t){return this.each(function(){var e=p(this).data(At);if(e||(e=new c(this,"object"==typeof t?t:null),p(this).data(At,e)),"string"==typeof t){if("undefined"==typeof e[t])throw new TypeError('No method named "'+t+'"');e[t]()}})},c._clearMenus=function(e){if(!e||3!==e.which&&("keyup"!==e.type||9===e.which))for(var t=[].slice.call(document.querySelectorAll(Ut)),n=0,i=t.length;n<i;n++){var o=c._getParentFromElement(t[n]),r=p(t[n]).data(At),s={relatedTarget:t[n]};if(e&&"click"===e.type&&(s.clickEvent=e),r){var a=r._menu;if(p(o).hasClass(jt)&&!(e&&("click"===e.type&&/input|textarea/i.test(e.target.tagName)||"keyup"===e.type&&9===e.which)&&p.contains(o,e.target))){var l=p.Event(Pt.HIDE,s);p(o).trigger(l),l.isDefaultPrevented()||("ontouchstart"in document.documentElement&&p(document.body).children().off("mouseover",null,p.noop),t[n].setAttribute("aria-expanded","false"),r._popper&&r._popper.destroy(),p(a).removeClass(jt),p(o).removeClass(jt).trigger(p.Event(Pt.HIDDEN,s)))}}}},c._getParentFromElement=function(e){var t,n=m.getSelectorFromElement(e);return n&&(t=document.querySelector(n)),t||e.parentNode},c._dataApiKeydownHandler=function(e){if((/input|textarea/i.test(e.target.tagName)?!(32===e.which||27!==e.which&&(40!==e.which&&38!==e.which||p(e.target).closest(qt).length)):Lt.test(e.which))&&(e.preventDefault(),e.stopPropagation(),!this.disabled&&!p(this).hasClass(xt))){var t=c._getParentFromElement(this),n=p(t).hasClass(jt);if(n||27!==e.which)if(n&&(!n||27!==e.which&&32!==e.which)){var i=[].slice.call(t.querySelectorAll(Qt)).filter(function(e){return p(e).is(":visible")});if(0!==i.length){var o=i.indexOf(e.target);38===e.which&&0<o&&o--,40===e.which&&o<i.length-1&&o++,o<0&&(o=0),i[o].focus()}}else{if(27===e.which){var r=t.querySelector(Ut);p(r).trigger("focus")}p(this).trigger("click")}}},s(c,null,[{key:"VERSION",get:function(){return"4.4.1"}},{key:"Default",get:function(){return Jt}},{key:"DefaultType",get:function(){return Zt}}]),c}();p(document).on(Pt.KEYDOWN_DATA_API,Ut,en._dataApiKeydownHandler).on(Pt.KEYDOWN_DATA_API,qt,en._dataApiKeydownHandler).on(Pt.CLICK_DATA_API+" "+Pt.KEYUP_DATA_API,en._clearMenus).on(Pt.CLICK_DATA_API,Ut,function(e){e.preventDefault(),e.stopPropagation(),en._jQueryInterface.call(p(this),"toggle")}).on(Pt.CLICK_DATA_API,Bt,function(e){e.stopPropagation()}),p.fn[It]=en._jQueryInterface,p.fn[It].Constructor=en,p.fn[It].noConflict=function(){return p.fn[It]=kt,en._jQueryInterface};var tn="modal",nn="bs.modal",on="."+nn,rn=p.fn[tn],sn={backdrop:!0,keyboard:!0,focus:!0,show:!0},an={backdrop:"(boolean|string)",keyboard:"boolean",focus:"boolean",show:"boolean"},ln={HIDE:"hide"+on,HIDE_PREVENTED:"hidePrevented"+on,HIDDEN:"hidden"+on,SHOW:"show"+on,SHOWN:"shown"+on,FOCUSIN:"focusin"+on,RESIZE:"resize"+on,CLICK_DISMISS:"click.dismiss"+on,KEYDOWN_DISMISS:"keydown.dismiss"+on,MOUSEUP_DISMISS:"mouseup.dismiss"+on,MOUSEDOWN_DISMISS:"mousedown.dismiss"+on,CLICK_DATA_API:"click"+on+".data-api"},cn="modal-dialog-scrollable",hn="modal-scrollbar-measure",un="modal-backdrop",fn="modal-open",dn="fade",pn="show",mn="modal-static",gn=".modal-dialog",_n=".modal-body",vn='[data-toggle="modal"]',yn='[data-dismiss="modal"]',En=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",bn=".sticky-top",wn=function(){function o(e,t){this._config=this._getConfig(t),this._element=e,this._dialog=e.querySelector(gn),this._backdrop=null,this._isShown=!1,this._isBodyOverflowing=!1,this._ignoreBackdropClick=!1,this._isTransitioning=!1,this._scrollbarWidth=0}var e=o.prototype;return e.toggle=function(e){return this._isShown?this.hide():this.show(e)},e.show=function(e){var t=this;if(!this._isShown&&!this._isTransitioning){p(this._element).hasClass(dn)&&(this._isTransitioning=!0);var n=p.Event(ln.SHOW,{relatedTarget:e});p(this._element).trigger(n),this._isShown||n.isDefaultPrevented()||(this._isShown=!0,this._checkScrollbar(),this._setScrollbar(),this._adjustDialog(),this._setEscapeEvent(),this._setResizeEvent(),p(this._element).on(ln.CLICK_DISMISS,yn,function(e){return t.hide(e)}),p(this._dialog).on(ln.MOUSEDOWN_DISMISS,function(){p(t._element).one(ln.MOUSEUP_DISMISS,function(e){p(e.target).is(t._element)&&(t._ignoreBackdropClick=!0)})}),this._showBackdrop(function(){return t._showElement(e)}))}},e.hide=function(e){var t=this;if(e&&e.preventDefault(),this._isShown&&!this._isTransitioning){var n=p.Event(ln.HIDE);if(p(this._element).trigger(n),this._isShown&&!n.isDefaultPrevented()){this._isShown=!1;var i=p(this._element).hasClass(dn);if(i&&(this._isTransitioning=!0),this._setEscapeEvent(),this._setResizeEvent(),p(document).off(ln.FOCUSIN),p(this._element).removeClass(pn),p(this._element).off(ln.CLICK_DISMISS),p(this._dialog).off(ln.MOUSEDOWN_DISMISS),i){var o=m.getTransitionDurationFromElement(this._element);p(this._element).one(m.TRANSITION_END,function(e){return t._hideModal(e)}).emulateTransitionEnd(o)}else this._hideModal()}}},e.dispose=function(){[window,this._element,this._dialog].forEach(function(e){return p(e).off(on)}),p(document).off(ln.FOCUSIN),p.removeData(this._element,nn),this._config=null,this._element=null,this._dialog=null,this._backdrop=null,this._isShown=null,this._isBodyOverflowing=null,this._ignoreBackdropClick=null,this._isTransitioning=null,this._scrollbarWidth=null},e.handleUpdate=function(){this._adjustDialog()},e._getConfig=function(e){return e=l({},sn,{},e),m.typeCheckConfig(tn,e,an),e},e._triggerBackdropTransition=function(){var e=this;if("static"===this._config.backdrop){var t=p.Event(ln.HIDE_PREVENTED);if(p(this._element).trigger(t),t.defaultPrevented)return;this._element.classList.add(mn);var n=m.getTransitionDurationFromElement(this._element);p(this._element).one(m.TRANSITION_END,function(){e._element.classList.remove(mn)}).emulateTransitionEnd(n),this._element.focus()}else this.hide()},e._showElement=function(e){var t=this,n=p(this._element).hasClass(dn),i=this._dialog?this._dialog.querySelector(_n):null;this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||document.body.appendChild(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),p(this._dialog).hasClass(cn)&&i?i.scrollTop=0:this._element.scrollTop=0,n&&m.reflow(this._element),p(this._element).addClass(pn),this._config.focus&&this._enforceFocus();function o(){t._config.focus&&t._element.focus(),t._isTransitioning=!1,p(t._element).trigger(r)}var r=p.Event(ln.SHOWN,{relatedTarget:e});if(n){var s=m.getTransitionDurationFromElement(this._dialog);p(this._dialog).one(m.TRANSITION_END,o).emulateTransitionEnd(s)}else o()},e._enforceFocus=function(){var t=this;p(document).off(ln.FOCUSIN).on(ln.FOCUSIN,function(e){document!==e.target&&t._element!==e.target&&0===p(t._element).has(e.target).length&&t._element.focus()})},e._setEscapeEvent=function(){var t=this;this._isShown&&this._config.keyboard?p(this._element).on(ln.KEYDOWN_DISMISS,function(e){27===e.which&&t._triggerBackdropTransition()}):this._isShown||p(this._element).off(ln.KEYDOWN_DISMISS)},e._setResizeEvent=function(){var t=this;this._isShown?p(window).on(ln.RESIZE,function(e){return t.handleUpdate(e)}):p(window).off(ln.RESIZE)},e._hideModal=function(){var e=this;this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._isTransitioning=!1,this._showBackdrop(function(){p(document.body).removeClass(fn),e._resetAdjustments(),e._resetScrollbar(),p(e._element).trigger(ln.HIDDEN)})},e._removeBackdrop=function(){this._backdrop&&(p(this._backdrop).remove(),this._backdrop=null)},e._showBackdrop=function(e){var t=this,n=p(this._element).hasClass(dn)?dn:"";if(this._isShown&&this._config.backdrop){if(this._backdrop=document.createElement("div"),this._backdrop.className=un,n&&this._backdrop.classList.add(n),p(this._backdrop).appendTo(document.body),p(this._element).on(ln.CLICK_DISMISS,function(e){t._ignoreBackdropClick?t._ignoreBackdropClick=!1:e.target===e.currentTarget&&t._triggerBackdropTransition()}),n&&m.reflow(this._backdrop),p(this._backdrop).addClass(pn),!e)return;if(!n)return void e();var i=m.getTransitionDurationFromElement(this._backdrop);p(this._backdrop).one(m.TRANSITION_END,e).emulateTransitionEnd(i)}else if(!this._isShown&&this._backdrop){p(this._backdrop).removeClass(pn);var o=function(){t._removeBackdrop(),e&&e()};if(p(this._element).hasClass(dn)){var r=m.getTransitionDurationFromElement(this._backdrop);p(this._backdrop).one(m.TRANSITION_END,o).emulateTransitionEnd(r)}else o()}else e&&e()},e._adjustDialog=function(){var e=this._element.scrollHeight>document.documentElement.clientHeight;!this._isBodyOverflowing&&e&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!e&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},e._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},e._checkScrollbar=function(){var e=document.body.getBoundingClientRect();this._isBodyOverflowing=e.left+e.right<window.innerWidth,this._scrollbarWidth=this._getScrollbarWidth()},e._setScrollbar=function(){var o=this;if(this._isBodyOverflowing){var e=[].slice.call(document.querySelectorAll(En)),t=[].slice.call(document.querySelectorAll(bn));p(e).each(function(e,t){var n=t.style.paddingRight,i=p(t).css("padding-right");p(t).data("padding-right",n).css("padding-right",parseFloat(i)+o._scrollbarWidth+"px")}),p(t).each(function(e,t){var n=t.style.marginRight,i=p(t).css("margin-right");p(t).data("margin-right",n).css("margin-right",parseFloat(i)-o._scrollbarWidth+"px")});var n=document.body.style.paddingRight,i=p(document.body).css("padding-right");p(document.body).data("padding-right",n).css("padding-right",parseFloat(i)+this._scrollbarWidth+"px")}p(document.body).addClass(fn)},e._resetScrollbar=function(){var e=[].slice.call(document.querySelectorAll(En));p(e).each(function(e,t){var n=p(t).data("padding-right");p(t).removeData("padding-right"),t.style.paddingRight=n||""});var t=[].slice.call(document.querySelectorAll(""+bn));p(t).each(function(e,t){var n=p(t).data("margin-right");"undefined"!=typeof n&&p(t).css("margin-right",n).removeData("margin-right")});var n=p(document.body).data("padding-right");p(document.body).removeData("padding-right"),document.body.style.paddingRight=n||""},e._getScrollbarWidth=function(){var e=document.createElement("div");e.className=hn,document.body.appendChild(e);var t=e.getBoundingClientRect().width-e.clientWidth;return document.body.removeChild(e),t},o._jQueryInterface=function(n,i){return this.each(function(){var e=p(this).data(nn),t=l({},sn,{},p(this).data(),{},"object"==typeof n&&n?n:{});if(e||(e=new o(this,t),p(this).data(nn,e)),"string"==typeof n){if("undefined"==typeof e[n])throw new TypeError('No method named "'+n+'"');e[n](i)}else t.show&&e.show(i)})},s(o,null,[{key:"VERSION",get:function(){return"4.4.1"}},{key:"Default",get:function(){return sn}}]),o}();p(document).on(ln.CLICK_DATA_API,vn,function(e){var t,n=this,i=m.getSelectorFromElement(this);i&&(t=document.querySelector(i));var o=p(t).data(nn)?"toggle":l({},p(t).data(),{},p(this).data());"A"!==this.tagName&&"AREA"!==this.tagName||e.preventDefault();var r=p(t).one(ln.SHOW,function(e){e.isDefaultPrevented()||r.one(ln.HIDDEN,function(){p(n).is(":visible")&&n.focus()})});wn._jQueryInterface.call(p(t),o,this)}),p.fn[tn]=wn._jQueryInterface,p.fn[tn].Constructor=wn,p.fn[tn].noConflict=function(){return p.fn[tn]=rn,wn._jQueryInterface};var Tn=["background","cite","href","itemtype","longdesc","poster","src","xlink:href"],Cn={"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},Sn=/^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi,Dn=/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i;function In(e,r,t){if(0===e.length)return e;if(t&&"function"==typeof t)return t(e);for(var n=(new window.DOMParser).parseFromString(e,"text/html"),s=Object.keys(r),a=[].slice.call(n.body.querySelectorAll("*")),i=function(e){var t=a[e],n=t.nodeName.toLowerCase();if(-1===s.indexOf(t.nodeName.toLowerCase()))return t.parentNode.removeChild(t),"continue";var i=[].slice.call(t.attributes),o=[].concat(r["*"]||[],r[n]||[]);i.forEach(function(e){!function(e,t){var n=e.nodeName.toLowerCase();if(-1!==t.indexOf(n))return-1===Tn.indexOf(n)||Boolean(e.nodeValue.match(Sn)||e.nodeValue.match(Dn));for(var i=t.filter(function(e){return e instanceof RegExp}),o=0,r=i.length;o<r;o++)if(n.match(i[o]))return!0;return!1}(e,o)&&t.removeAttribute(e.nodeName)})},o=0,l=a.length;o<l;o++)i(o);return n.body.innerHTML}var An="tooltip",On="bs.tooltip",Nn="."+On,kn=p.fn[An],Ln="bs-tooltip",Pn=new RegExp("(^|\\s)"+Ln+"\\S+","g"),xn=["sanitize","whiteList","sanitizeFn"],jn={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"(number|string|function)",container:"(string|element|boolean)",fallbackPlacement:"(string|array)",boundary:"(string|element)",sanitize:"boolean",sanitizeFn:"(null|function)",whiteList:"object",popperConfig:"(null|object)"},Hn={AUTO:"auto",TOP:"top",RIGHT:"right",BOTTOM:"bottom",LEFT:"left"},Rn={animation:!0,template:'<div class="tooltip" role="tooltip"><div class="arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent",sanitize:!0,sanitizeFn:null,whiteList:Cn,popperConfig:null},Fn="show",Mn="out",Wn={HIDE:"hide"+Nn,HIDDEN:"hidden"+Nn,SHOW:"show"+Nn,SHOWN:"shown"+Nn,INSERTED:"inserted"+Nn,CLICK:"click"+Nn,FOCUSIN:"focusin"+Nn,FOCUSOUT:"focusout"+Nn,MOUSEENTER:"mouseenter"+Nn,MOUSELEAVE:"mouseleave"+Nn},Un="fade",Bn="show",qn=".tooltip-inner",Kn=".arrow",Qn="hover",Vn="focus",Yn="click",zn="manual",Xn=function(){function i(e,t){if("undefined"==typeof St)throw new TypeError("Bootstrap's tooltips require Popper.js (https://popper.js.org/)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=e,this.config=this._getConfig(t),this.tip=null,this._setListeners()}var e=i.prototype;return e.enable=function(){this._isEnabled=!0},e.disable=function(){this._isEnabled=!1},e.toggleEnabled=function(){this._isEnabled=!this._isEnabled},e.toggle=function(e){if(this._isEnabled)if(e){var t=this.constructor.DATA_KEY,n=p(e.currentTarget).data(t);n||(n=new this.constructor(e.currentTarget,this._getDelegateConfig()),p(e.currentTarget).data(t,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(p(this.getTipElement()).hasClass(Bn))return void this._leave(null,this);this._enter(null,this)}},e.dispose=function(){clearTimeout(this._timeout),p.removeData(this.element,this.constructor.DATA_KEY),p(this.element).off(this.constructor.EVENT_KEY),p(this.element).closest(".modal").off("hide.bs.modal",this._hideModalHandler),this.tip&&p(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},e.show=function(){var t=this;if("none"===p(this.element).css("display"))throw new Error("Please use show on visible elements");var e=p.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){p(this.element).trigger(e);var n=m.findShadowRoot(this.element),i=p.contains(null!==n?n:this.element.ownerDocument.documentElement,this.element);if(e.isDefaultPrevented()||!i)return;var o=this.getTipElement(),r=m.getUID(this.constructor.NAME);o.setAttribute("id",r),this.element.setAttribute("aria-describedby",r),this.setContent(),this.config.animation&&p(o).addClass(Un);var s="function"==typeof this.config.placement?this.config.placement.call(this,o,this.element):this.config.placement,a=this._getAttachment(s);this.addAttachmentClass(a);var l=this._getContainer();p(o).data(this.constructor.DATA_KEY,this),p.contains(this.element.ownerDocument.documentElement,this.tip)||p(o).appendTo(l),p(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new St(this.element,o,this._getPopperConfig(a)),p(o).addClass(Bn),"ontouchstart"in document.documentElement&&p(document.body).children().on("mouseover",null,p.noop);var c=function(){t.config.animation&&t._fixTransition();var e=t._hoverState;t._hoverState=null,p(t.element).trigger(t.constructor.Event.SHOWN),e===Mn&&t._leave(null,t)};if(p(this.tip).hasClass(Un)){var h=m.getTransitionDurationFromElement(this.tip);p(this.tip).one(m.TRANSITION_END,c).emulateTransitionEnd(h)}else c()}},e.hide=function(e){function t(){n._hoverState!==Fn&&i.parentNode&&i.parentNode.removeChild(i),n._cleanTipClass(),n.element.removeAttribute("aria-describedby"),p(n.element).trigger(n.constructor.Event.HIDDEN),null!==n._popper&&n._popper.destroy(),e&&e()}var n=this,i=this.getTipElement(),o=p.Event(this.constructor.Event.HIDE);if(p(this.element).trigger(o),!o.isDefaultPrevented()){if(p(i).removeClass(Bn),"ontouchstart"in document.documentElement&&p(document.body).children().off("mouseover",null,p.noop),this._activeTrigger[Yn]=!1,this._activeTrigger[Vn]=!1,this._activeTrigger[Qn]=!1,p(this.tip).hasClass(Un)){var r=m.getTransitionDurationFromElement(i);p(i).one(m.TRANSITION_END,t).emulateTransitionEnd(r)}else t();this._hoverState=""}},e.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},e.isWithContent=function(){return Boolean(this.getTitle())},e.addAttachmentClass=function(e){p(this.getTipElement()).addClass(Ln+"-"+e)},e.getTipElement=function(){return this.tip=this.tip||p(this.config.template)[0],this.tip},e.setContent=function(){var e=this.getTipElement();this.setElementContent(p(e.querySelectorAll(qn)),this.getTitle()),p(e).removeClass(Un+" "+Bn)},e.setElementContent=function(e,t){"object"!=typeof t||!t.nodeType&&!t.jquery?this.config.html?(this.config.sanitize&&(t=In(t,this.config.whiteList,this.config.sanitizeFn)),e.html(t)):e.text(t):this.config.html?p(t).parent().is(e)||e.empty().append(t):e.text(p(t).text())},e.getTitle=function(){var e=this.element.getAttribute("data-original-title");return e=e||("function"==typeof this.config.title?this.config.title.call(this.element):this.config.title)},e._getPopperConfig=function(e){var t=this;return l({},{placement:e,modifiers:{offset:this._getOffset(),flip:{behavior:this.config.fallbackPlacement},arrow:{element:Kn},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(e){e.originalPlacement!==e.placement&&t._handlePopperPlacementChange(e)},onUpdate:function(e){return t._handlePopperPlacementChange(e)}},{},this.config.popperConfig)},e._getOffset=function(){var t=this,e={};return"function"==typeof this.config.offset?e.fn=function(e){return e.offsets=l({},e.offsets,{},t.config.offset(e.offsets,t.element)||{}),e}:e.offset=this.config.offset,e},e._getContainer=function(){return!1===this.config.container?document.body:m.isElement(this.config.container)?p(this.config.container):p(document).find(this.config.container)},e._getAttachment=function(e){return Hn[e.toUpperCase()]},e._setListeners=function(){var i=this;this.config.trigger.split(" ").forEach(function(e){if("click"===e)p(i.element).on(i.constructor.Event.CLICK,i.config.selector,function(e){return i.toggle(e)});else if(e!==zn){var t=e===Qn?i.constructor.Event.MOUSEENTER:i.constructor.Event.FOCUSIN,n=e===Qn?i.constructor.Event.MOUSELEAVE:i.constructor.Event.FOCUSOUT;p(i.element).on(t,i.config.selector,function(e){return i._enter(e)}).on(n,i.config.selector,function(e){return i._leave(e)})}}),this._hideModalHandler=function(){i.element&&i.hide()},p(this.element).closest(".modal").on("hide.bs.modal",this._hideModalHandler),this.config.selector?this.config=l({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},e._fixTitle=function(){var e=typeof this.element.getAttribute("data-original-title");!this.element.getAttribute("title")&&"string"==e||(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},e._enter=function(e,t){var n=this.constructor.DATA_KEY;(t=t||p(e.currentTarget).data(n))||(t=new this.constructor(e.currentTarget,this._getDelegateConfig()),p(e.currentTarget).data(n,t)),e&&(t._activeTrigger["focusin"===e.type?Vn:Qn]=!0),p(t.getTipElement()).hasClass(Bn)||t._hoverState===Fn?t._hoverState=Fn:(clearTimeout(t._timeout),t._hoverState=Fn,t.config.delay&&t.config.delay.show?t._timeout=setTimeout(function(){t._hoverState===Fn&&t.show()},t.config.delay.show):t.show())},e._leave=function(e,t){var n=this.constructor.DATA_KEY;(t=t||p(e.currentTarget).data(n))||(t=new this.constructor(e.currentTarget,this._getDelegateConfig()),p(e.currentTarget).data(n,t)),e&&(t._activeTrigger["focusout"===e.type?Vn:Qn]=!1),t._isWithActiveTrigger()||(clearTimeout(t._timeout),t._hoverState=Mn,t.config.delay&&t.config.delay.hide?t._timeout=setTimeout(function(){t._hoverState===Mn&&t.hide()},t.config.delay.hide):t.hide())},e._isWithActiveTrigger=function(){for(var e in this._activeTrigger)if(this._activeTrigger[e])return!0;return!1},e._getConfig=function(e){var t=p(this.element).data();return Object.keys(t).forEach(function(e){-1!==xn.indexOf(e)&&delete t[e]}),"number"==typeof(e=l({},this.constructor.Default,{},t,{},"object"==typeof e&&e?e:{})).delay&&(e.delay={show:e.delay,hide:e.delay}),"number"==typeof e.title&&(e.title=e.title.toString()),"number"==typeof e.content&&(e.content=e.content.toString()),m.typeCheckConfig(An,e,this.constructor.DefaultType),e.sanitize&&(e.template=In(e.template,e.whiteList,e.sanitizeFn)),e},e._getDelegateConfig=function(){var e={};if(this.config)for(var t in this.config)this.constructor.Default[t]!==this.config[t]&&(e[t]=this.config[t]);return e},e._cleanTipClass=function(){var e=p(this.getTipElement()),t=e.attr("class").match(Pn);null!==t&&t.length&&e.removeClass(t.join(""))},e._handlePopperPlacementChange=function(e){var t=e.instance;this.tip=t.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(e.placement))},e._fixTransition=function(){var e=this.getTipElement(),t=this.config.animation;null===e.getAttribute("x-placement")&&(p(e).removeClass(Un),this.config.animation=!1,this.hide(),this.show(),this.config.animation=t)},i._jQueryInterface=function(n){return this.each(function(){var e=p(this).data(On),t="object"==typeof n&&n;if((e||!/dispose|hide/.test(n))&&(e||(e=new i(this,t),p(this).data(On,e)),"string"==typeof n)){if("undefined"==typeof e[n])throw new TypeError('No method named "'+n+'"');e[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.4.1"}},{key:"Default",get:function(){return Rn}},{key:"NAME",get:function(){return An}},{key:"DATA_KEY",get:function(){return On}},{key:"Event",get:function(){return Wn}},{key:"EVENT_KEY",get:function(){return Nn}},{key:"DefaultType",get:function(){return jn}}]),i}();p.fn[An]=Xn._jQueryInterface,p.fn[An].Constructor=Xn,p.fn[An].noConflict=function(){return p.fn[An]=kn,Xn._jQueryInterface};var Gn="popover",$n="bs.popover",Jn="."+$n,Zn=p.fn[Gn],ei="bs-popover",ti=new RegExp("(^|\\s)"+ei+"\\S+","g"),ni=l({},Xn.Default,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>'}),ii=l({},Xn.DefaultType,{content:"(string|element|function)"}),oi="fade",ri="show",si=".popover-header",ai=".popover-body",li={HIDE:"hide"+Jn,HIDDEN:"hidden"+Jn,SHOW:"show"+Jn,SHOWN:"shown"+Jn,INSERTED:"inserted"+Jn,CLICK:"click"+Jn,FOCUSIN:"focusin"+Jn,FOCUSOUT:"focusout"+Jn,MOUSEENTER:"mouseenter"+Jn,MOUSELEAVE:"mouseleave"+Jn},ci=function(e){function i(){return e.apply(this,arguments)||this}!function(e,t){e.prototype=Object.create(t.prototype),(e.prototype.constructor=e).__proto__=t}(i,e);var t=i.prototype;return t.isWithContent=function(){return this.getTitle()||this._getContent()},t.addAttachmentClass=function(e){p(this.getTipElement()).addClass(ei+"-"+e)},t.getTipElement=function(){return this.tip=this.tip||p(this.config.template)[0],this.tip},t.setContent=function(){var e=p(this.getTipElement());this.setElementContent(e.find(si),this.getTitle());var t=this._getContent();"function"==typeof t&&(t=t.call(this.element)),this.setElementContent(e.find(ai),t),e.removeClass(oi+" "+ri)},t._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},t._cleanTipClass=function(){var e=p(this.getTipElement()),t=e.attr("class").match(ti);null!==t&&0<t.length&&e.removeClass(t.join(""))},i._jQueryInterface=function(n){return this.each(function(){var e=p(this).data($n),t="object"==typeof n?n:null;if((e||!/dispose|hide/.test(n))&&(e||(e=new i(this,t),p(this).data($n,e)),"string"==typeof n)){if("undefined"==typeof e[n])throw new TypeError('No method named "'+n+'"');e[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.4.1"}},{key:"Default",get:function(){return ni}},{key:"NAME",get:function(){return Gn}},{key:"DATA_KEY",get:function(){return $n}},{key:"Event",get:function(){return li}},{key:"EVENT_KEY",get:function(){return Jn}},{key:"DefaultType",get:function(){return ii}}]),i}(Xn);p.fn[Gn]=ci._jQueryInterface,p.fn[Gn].Constructor=ci,p.fn[Gn].noConflict=function(){return p.fn[Gn]=Zn,ci._jQueryInterface};var hi="scrollspy",ui="bs.scrollspy",fi="."+ui,di=p.fn[hi],pi={offset:10,method:"auto",target:""},mi={offset:"number",method:"string",target:"(string|element)"},gi={ACTIVATE:"activate"+fi,SCROLL:"scroll"+fi,LOAD_DATA_API:"load"+fi+".data-api"},_i="dropdown-item",vi="active",yi='[data-spy="scroll"]',Ei=".nav, .list-group",bi=".nav-link",wi=".nav-item",Ti=".list-group-item",Ci=".dropdown",Si=".dropdown-item",Di=".dropdown-toggle",Ii="offset",Ai="position",Oi=function(){function n(e,t){var n=this;this._element=e,this._scrollElement="BODY"===e.tagName?window:e,this._config=this._getConfig(t),this._selector=this._config.target+" "+bi+","+this._config.target+" "+Ti+","+this._config.target+" "+Si,this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,p(this._scrollElement).on(gi.SCROLL,function(e){return n._process(e)}),this.refresh(),this._process()}var e=n.prototype;return e.refresh=function(){var t=this,e=this._scrollElement===this._scrollElement.window?Ii:Ai,o="auto"===this._config.method?e:this._config.method,r=o===Ai?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),[].slice.call(document.querySelectorAll(this._selector)).map(function(e){var t,n=m.getSelectorFromElement(e);if(n&&(t=document.querySelector(n)),t){var i=t.getBoundingClientRect();if(i.width||i.height)return[p(t)[o]().top+r,n]}return null}).filter(function(e){return e}).sort(function(e,t){return e[0]-t[0]}).forEach(function(e){t._offsets.push(e[0]),t._targets.push(e[1])})},e.dispose=function(){p.removeData(this._element,ui),p(this._scrollElement).off(fi),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},e._getConfig=function(e){if("string"!=typeof(e=l({},pi,{},"object"==typeof e&&e?e:{})).target){var t=p(e.target).attr("id");t||(t=m.getUID(hi),p(e.target).attr("id",t)),e.target="#"+t}return m.typeCheckConfig(hi,e,mi),e},e._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},e._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},e._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},e._process=function(){var e=this._getScrollTop()+this._config.offset,t=this._getScrollHeight(),n=this._config.offset+t-this._getOffsetHeight();if(this._scrollHeight!==t&&this.refresh(),n<=e){var i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&e<this._offsets[0]&&0<this._offsets[0])return this._activeTarget=null,void this._clear();for(var o=this._offsets.length;o--;){this._activeTarget!==this._targets[o]&&e>=this._offsets[o]&&("undefined"==typeof this._offsets[o+1]||e<this._offsets[o+1])&&this._activate(this._targets[o])}}},e._activate=function(t){this._activeTarget=t,this._clear();var e=this._selector.split(",").map(function(e){return e+'[data-target="'+t+'"],'+e+'[href="'+t+'"]'}),n=p([].slice.call(document.querySelectorAll(e.join(","))));n.hasClass(_i)?(n.closest(Ci).find(Di).addClass(vi),n.addClass(vi)):(n.addClass(vi),n.parents(Ei).prev(bi+", "+Ti).addClass(vi),n.parents(Ei).prev(wi).children(bi).addClass(vi)),p(this._scrollElement).trigger(gi.ACTIVATE,{relatedTarget:t})},e._clear=function(){[].slice.call(document.querySelectorAll(this._selector)).filter(function(e){return e.classList.contains(vi)}).forEach(function(e){return e.classList.remove(vi)})},n._jQueryInterface=function(t){return this.each(function(){var e=p(this).data(ui);if(e||(e=new n(this,"object"==typeof t&&t),p(this).data(ui,e)),"string"==typeof t){if("undefined"==typeof e[t])throw new TypeError('No method named "'+t+'"');e[t]()}})},s(n,null,[{key:"VERSION",get:function(){return"4.4.1"}},{key:"Default",get:function(){return pi}}]),n}();p(window).on(gi.LOAD_DATA_API,function(){for(var e=[].slice.call(document.querySelectorAll(yi)),t=e.length;t--;){var n=p(e[t]);Oi._jQueryInterface.call(n,n.data())}}),p.fn[hi]=Oi._jQueryInterface,p.fn[hi].Constructor=Oi,p.fn[hi].noConflict=function(){return p.fn[hi]=di,Oi._jQueryInterface};var Ni="bs.tab",ki="."+Ni,Li=p.fn.tab,Pi={HIDE:"hide"+ki,HIDDEN:"hidden"+ki,SHOW:"show"+ki,SHOWN:"shown"+ki,CLICK_DATA_API:"click"+ki+".data-api"},xi="dropdown-menu",ji="active",Hi="disabled",Ri="fade",Fi="show",Mi=".dropdown",Wi=".nav, .list-group",Ui=".active",Bi="> li > .active",qi='[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',Ki=".dropdown-toggle",Qi="> .dropdown-menu .active",Vi=function(){function i(e){this._element=e}var e=i.prototype;return e.show=function(){var n=this;if(!(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&p(this._element).hasClass(ji)||p(this._element).hasClass(Hi))){var e,i,t=p(this._element).closest(Wi)[0],o=m.getSelectorFromElement(this._element);if(t){var r="UL"===t.nodeName||"OL"===t.nodeName?Bi:Ui;i=(i=p.makeArray(p(t).find(r)))[i.length-1]}var s=p.Event(Pi.HIDE,{relatedTarget:this._element}),a=p.Event(Pi.SHOW,{relatedTarget:i});if(i&&p(i).trigger(s),p(this._element).trigger(a),!a.isDefaultPrevented()&&!s.isDefaultPrevented()){o&&(e=document.querySelector(o)),this._activate(this._element,t);var l=function(){var e=p.Event(Pi.HIDDEN,{relatedTarget:n._element}),t=p.Event(Pi.SHOWN,{relatedTarget:i});p(i).trigger(e),p(n._element).trigger(t)};e?this._activate(e,e.parentNode,l):l()}}},e.dispose=function(){p.removeData(this._element,Ni),this._element=null},e._activate=function(e,t,n){function i(){return o._transitionComplete(e,r,n)}var o=this,r=(!t||"UL"!==t.nodeName&&"OL"!==t.nodeName?p(t).children(Ui):p(t).find(Bi))[0],s=n&&r&&p(r).hasClass(Ri);if(r&&s){var a=m.getTransitionDurationFromElement(r);p(r).removeClass(Fi).one(m.TRANSITION_END,i).emulateTransitionEnd(a)}else i()},e._transitionComplete=function(e,t,n){if(t){p(t).removeClass(ji);var i=p(t.parentNode).find(Qi)[0];i&&p(i).removeClass(ji),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!1)}if(p(e).addClass(ji),"tab"===e.getAttribute("role")&&e.setAttribute("aria-selected",!0),m.reflow(e),e.classList.contains(Ri)&&e.classList.add(Fi),e.parentNode&&p(e.parentNode).hasClass(xi)){var o=p(e).closest(Mi)[0];if(o){var r=[].slice.call(o.querySelectorAll(Ki));p(r).addClass(ji)}e.setAttribute("aria-expanded",!0)}n&&n()},i._jQueryInterface=function(n){return this.each(function(){var e=p(this),t=e.data(Ni);if(t||(t=new i(this),e.data(Ni,t)),"string"==typeof n){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.4.1"}}]),i}();p(document).on(Pi.CLICK_DATA_API,qi,function(e){e.preventDefault(),Vi._jQueryInterface.call(p(this),"show")}),p.fn.tab=Vi._jQueryInterface,p.fn.tab.Constructor=Vi,p.fn.tab.noConflict=function(){return p.fn.tab=Li,Vi._jQueryInterface};var Yi="toast",zi="bs.toast",Xi="."+zi,Gi=p.fn[Yi],$i={CLICK_DISMISS:"click.dismiss"+Xi,HIDE:"hide"+Xi,HIDDEN:"hidden"+Xi,SHOW:"show"+Xi,SHOWN:"shown"+Xi},Ji="fade",Zi="hide",eo="show",to="showing",no={animation:"boolean",autohide:"boolean",delay:"number"},io={animation:!0,autohide:!0,delay:500},oo='[data-dismiss="toast"]',ro=function(){function i(e,t){this._element=e,this._config=this._getConfig(t),this._timeout=null,this._setListeners()}var e=i.prototype;return e.show=function(){var e=this,t=p.Event($i.SHOW);if(p(this._element).trigger(t),!t.isDefaultPrevented()){this._config.animation&&this._element.classList.add(Ji);var n=function(){e._element.classList.remove(to),e._element.classList.add(eo),p(e._element).trigger($i.SHOWN),e._config.autohide&&(e._timeout=setTimeout(function(){e.hide()},e._config.delay))};if(this._element.classList.remove(Zi),m.reflow(this._element),this._element.classList.add(to),this._config.animation){var i=m.getTransitionDurationFromElement(this._element);p(this._element).one(m.TRANSITION_END,n).emulateTransitionEnd(i)}else n()}},e.hide=function(){if(this._element.classList.contains(eo)){var e=p.Event($i.HIDE);p(this._element).trigger(e),e.isDefaultPrevented()||this._close()}},e.dispose=function(){clearTimeout(this._timeout),this._timeout=null,this._element.classList.contains(eo)&&this._element.classList.remove(eo),p(this._element).off($i.CLICK_DISMISS),p.removeData(this._element,zi),this._element=null,this._config=null},e._getConfig=function(e){return e=l({},io,{},p(this._element).data(),{},"object"==typeof e&&e?e:{}),m.typeCheckConfig(Yi,e,this.constructor.DefaultType),e},e._setListeners=function(){var e=this;p(this._element).on($i.CLICK_DISMISS,oo,function(){return e.hide()})},e._close=function(){function e(){t._element.classList.add(Zi),p(t._element).trigger($i.HIDDEN)}var t=this;if(this._element.classList.remove(eo),this._config.animation){var n=m.getTransitionDurationFromElement(this._element);p(this._element).one(m.TRANSITION_END,e).emulateTransitionEnd(n)}else e()},i._jQueryInterface=function(n){return this.each(function(){var e=p(this),t=e.data(zi);if(t||(t=new i(this,"object"==typeof n&&n),e.data(zi,t)),"string"==typeof n){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n](this)}})},s(i,null,[{key:"VERSION",get:function(){return"4.4.1"}},{key:"DefaultType",get:function(){return no}},{key:"Default",get:function(){return io}}]),i}();p.fn[Yi]=ro._jQueryInterface,p.fn[Yi].Constructor=ro,p.fn[Yi].noConflict=function(){return p.fn[Yi]=Gi,ro._jQueryInterface},e.Alert=_,e.Button=x,e.Carousel=he,e.Collapse=De,e.Dropdown=en,e.Modal=wn,e.Popover=ci,e.Scrollspy=Oi,e.Tab=Vi,e.Toast=ro,e.Tooltip=Xn,e.Util=m,Object.defineProperty(e,"__esModule",{value:!0})});
7
  //# sourceMappingURL=bootstrap.bundle.min.js.map
resources/js/bootstrap4.js CHANGED
@@ -1,5 +1,5 @@
1
  /*!
2
- * Bootstrap v4.3.1 (https://getbootstrap.com/)
3
  * Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
4
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
5
  */
@@ -7,7 +7,7 @@
7
  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('jquery'), require('popper.js')) :
8
  typeof define === 'function' && define.amd ? define(['exports', 'jquery', 'popper.js'], factory) :
9
  (global = global || self, factory(global.bootstrap = {}, global.jQuery, global.Popper));
10
- }(this, function (exports, $, Popper) { 'use strict';
11
 
12
  $ = $ && $.hasOwnProperty('default') ? $['default'] : $;
13
  Popper = Popper && Popper.hasOwnProperty('default') ? Popper['default'] : Popper;
@@ -43,20 +43,35 @@
43
  return obj;
44
  }
45
 
46
- function _objectSpread(target) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
47
  for (var i = 1; i < arguments.length; i++) {
48
  var source = arguments[i] != null ? arguments[i] : {};
49
- var ownKeys = Object.keys(source);
50
 
51
- if (typeof Object.getOwnPropertySymbols === 'function') {
52
- ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {
53
- return Object.getOwnPropertyDescriptor(source, sym).enumerable;
54
- }));
 
 
 
 
 
 
55
  }
56
-
57
- ownKeys.forEach(function (key) {
58
- _defineProperty(target, key, source[key]);
59
- });
60
  }
61
 
62
  return target;
@@ -70,7 +85,7 @@
70
 
71
  /**
72
  * --------------------------------------------------------------------------
73
- * Bootstrap (v4.3.1): util.js
74
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
75
  * --------------------------------------------------------------------------
76
  */
@@ -219,8 +234,25 @@
219
  }
220
 
221
  return Util.findShadowRoot(element.parentNode);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
222
  }
223
  };
 
224
  setTransitionEndSupport();
225
 
226
  /**
@@ -230,7 +262,7 @@
230
  */
231
 
232
  var NAME = 'alert';
233
- var VERSION = '4.3.1';
234
  var DATA_KEY = 'bs.alert';
235
  var EVENT_KEY = "." + DATA_KEY;
236
  var DATA_API_KEY = '.data-api';
@@ -247,13 +279,12 @@
247
  ALERT: 'alert',
248
  FADE: 'fade',
249
  SHOW: 'show'
250
- /**
251
- * ------------------------------------------------------------------------
252
- * Class Definition
253
- * ------------------------------------------------------------------------
254
- */
255
-
256
  };
 
 
 
 
 
257
 
258
  var Alert =
259
  /*#__PURE__*/
@@ -395,7 +426,7 @@
395
  */
396
 
397
  var NAME$1 = 'button';
398
- var VERSION$1 = '4.3.1';
399
  var DATA_KEY$1 = 'bs.button';
400
  var EVENT_KEY$1 = "." + DATA_KEY$1;
401
  var DATA_API_KEY$1 = '.data-api';
@@ -407,21 +438,23 @@
407
  };
408
  var Selector$1 = {
409
  DATA_TOGGLE_CARROT: '[data-toggle^="button"]',
410
- DATA_TOGGLE: '[data-toggle="buttons"]',
 
 
411
  INPUT: 'input:not([type="hidden"])',
412
  ACTIVE: '.active',
413
  BUTTON: '.btn'
414
  };
415
  var Event$1 = {
416
  CLICK_DATA_API: "click" + EVENT_KEY$1 + DATA_API_KEY$1,
417
- FOCUS_BLUR_DATA_API: "focus" + EVENT_KEY$1 + DATA_API_KEY$1 + " " + ("blur" + EVENT_KEY$1 + DATA_API_KEY$1)
418
- /**
419
- * ------------------------------------------------------------------------
420
- * Class Definition
421
- * ------------------------------------------------------------------------
422
- */
423
-
424
  };
 
 
 
 
 
425
 
426
  var Button =
427
  /*#__PURE__*/
@@ -437,7 +470,7 @@
437
  _proto.toggle = function toggle() {
438
  var triggerChangeEvent = true;
439
  var addAriaPressed = true;
440
- var rootElement = $(this._element).closest(Selector$1.DATA_TOGGLE)[0];
441
 
442
  if (rootElement) {
443
  var input = this._element.querySelector(Selector$1.INPUT);
@@ -453,13 +486,16 @@
453
  $(activeElement).removeClass(ClassName$1.ACTIVE);
454
  }
455
  }
 
 
 
 
 
 
 
456
  }
457
 
458
  if (triggerChangeEvent) {
459
- if (input.hasAttribute('disabled') || rootElement.hasAttribute('disabled') || input.classList.contains('disabled') || rootElement.classList.contains('disabled')) {
460
- return;
461
- }
462
-
463
  input.checked = !this._element.classList.contains(ClassName$1.ACTIVE);
464
  $(input).trigger('change');
465
  }
@@ -469,12 +505,14 @@
469
  }
470
  }
471
 
472
- if (addAriaPressed) {
473
- this._element.setAttribute('aria-pressed', !this._element.classList.contains(ClassName$1.ACTIVE));
474
- }
 
475
 
476
- if (triggerChangeEvent) {
477
- $(this._element).toggleClass(ClassName$1.ACTIVE);
 
478
  }
479
  };
480
 
@@ -516,18 +554,58 @@
516
 
517
 
518
  $(document).on(Event$1.CLICK_DATA_API, Selector$1.DATA_TOGGLE_CARROT, function (event) {
519
- event.preventDefault();
520
  var button = event.target;
521
 
522
  if (!$(button).hasClass(ClassName$1.BUTTON)) {
523
- button = $(button).closest(Selector$1.BUTTON);
524
  }
525
 
526
- Button._jQueryInterface.call($(button), 'toggle');
 
 
 
 
 
 
 
 
 
 
 
 
527
  }).on(Event$1.FOCUS_BLUR_DATA_API, Selector$1.DATA_TOGGLE_CARROT, function (event) {
528
  var button = $(event.target).closest(Selector$1.BUTTON)[0];
529
  $(button).toggleClass(ClassName$1.FOCUS, /^focus(in)?$/.test(event.type));
530
  });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
531
  /**
532
  * ------------------------------------------------------------------------
533
  * jQuery
@@ -549,7 +627,7 @@
549
  */
550
 
551
  var NAME$2 = 'carousel';
552
- var VERSION$2 = '4.3.1';
553
  var DATA_KEY$2 = 'bs.carousel';
554
  var EVENT_KEY$2 = "." + DATA_KEY$2;
555
  var DATA_API_KEY$2 = '.data-api';
@@ -622,13 +700,12 @@
622
  var PointerType = {
623
  TOUCH: 'touch',
624
  PEN: 'pen'
625
- /**
626
- * ------------------------------------------------------------------------
627
- * Class Definition
628
- * ------------------------------------------------------------------------
629
- */
630
-
631
  };
 
 
 
 
 
632
 
633
  var Carousel =
634
  /*#__PURE__*/
@@ -748,7 +825,7 @@
748
  ;
749
 
750
  _proto._getConfig = function _getConfig(config) {
751
- config = _objectSpread({}, Default, config);
752
  Util.typeCheckConfig(NAME$2, config, DefaultType);
753
  return config;
754
  };
@@ -760,7 +837,8 @@
760
  return;
761
  }
762
 
763
- var direction = absDeltax / this.touchDeltaX; // swipe left
 
764
 
765
  if (direction > 0) {
766
  this.prev();
@@ -886,8 +964,6 @@
886
  event.preventDefault();
887
  this.next();
888
  break;
889
-
890
- default:
891
  }
892
  };
893
 
@@ -1039,10 +1115,10 @@
1039
  return this.each(function () {
1040
  var data = $(this).data(DATA_KEY$2);
1041
 
1042
- var _config = _objectSpread({}, Default, $(this).data());
1043
 
1044
  if (typeof config === 'object') {
1045
- _config = _objectSpread({}, _config, config);
1046
  }
1047
 
1048
  var action = typeof config === 'string' ? config : _config.slide;
@@ -1080,7 +1156,7 @@
1080
  return;
1081
  }
1082
 
1083
- var config = _objectSpread({}, $(target).data(), $(this).data());
1084
 
1085
  var slideIndex = this.getAttribute('data-slide-to');
1086
 
@@ -1149,7 +1225,7 @@
1149
  */
1150
 
1151
  var NAME$3 = 'collapse';
1152
- var VERSION$3 = '4.3.1';
1153
  var DATA_KEY$3 = 'bs.collapse';
1154
  var EVENT_KEY$3 = "." + DATA_KEY$3;
1155
  var DATA_API_KEY$3 = '.data-api';
@@ -1182,13 +1258,12 @@
1182
  var Selector$3 = {
1183
  ACTIVES: '.show, .collapsing',
1184
  DATA_TOGGLE: '[data-toggle="collapse"]'
1185
- /**
1186
- * ------------------------------------------------------------------------
1187
- * Class Definition
1188
- * ------------------------------------------------------------------------
1189
- */
1190
-
1191
  };
 
 
 
 
 
1192
 
1193
  var Collapse =
1194
  /*#__PURE__*/
@@ -1375,7 +1450,7 @@
1375
  ;
1376
 
1377
  _proto._getConfig = function _getConfig(config) {
1378
- config = _objectSpread({}, Default$1, config);
1379
  config.toggle = Boolean(config.toggle); // Coerce string values
1380
 
1381
  Util.typeCheckConfig(NAME$3, config, DefaultType$1);
@@ -1429,7 +1504,7 @@
1429
  var $this = $(this);
1430
  var data = $this.data(DATA_KEY$3);
1431
 
1432
- var _config = _objectSpread({}, Default$1, $this.data(), typeof config === 'object' && config ? config : {});
1433
 
1434
  if (!data && _config.toggle && /show|hide/.test(config)) {
1435
  _config.toggle = false;
@@ -1509,7 +1584,7 @@
1509
  */
1510
 
1511
  var NAME$4 = 'dropdown';
1512
- var VERSION$4 = '4.3.1';
1513
  var DATA_KEY$4 = 'bs.dropdown';
1514
  var EVENT_KEY$4 = "." + DATA_KEY$4;
1515
  var DATA_API_KEY$4 = '.data-api';
@@ -1569,21 +1644,22 @@
1569
  flip: true,
1570
  boundary: 'scrollParent',
1571
  reference: 'toggle',
1572
- display: 'dynamic'
 
1573
  };
1574
  var DefaultType$2 = {
1575
  offset: '(number|string|function)',
1576
  flip: 'boolean',
1577
  boundary: '(string|element)',
1578
  reference: '(string|element)',
1579
- display: 'string'
1580
- /**
1581
- * ------------------------------------------------------------------------
1582
- * Class Definition
1583
- * ------------------------------------------------------------------------
1584
- */
1585
-
1586
  };
 
 
 
 
 
1587
 
1588
  var Dropdown =
1589
  /*#__PURE__*/
@@ -1607,8 +1683,6 @@
1607
  return;
1608
  }
1609
 
1610
- var parent = Dropdown._getParentFromElement(this._element);
1611
-
1612
  var isActive = $(this._menu).hasClass(ClassName$4.SHOW);
1613
 
1614
  Dropdown._clearMenus();
@@ -1617,10 +1691,25 @@
1617
  return;
1618
  }
1619
 
 
 
 
 
 
 
 
 
 
 
 
 
1620
  var relatedTarget = {
1621
  relatedTarget: this._element
1622
  };
1623
  var showEvent = $.Event(Event$4.SHOW, relatedTarget);
 
 
 
1624
  $(parent).trigger(showEvent);
1625
 
1626
  if (showEvent.isDefaultPrevented()) {
@@ -1628,7 +1717,7 @@
1628
  } // Disable totally Popper.js for Dropdown in Navbar
1629
 
1630
 
1631
- if (!this._inNavbar) {
1632
  /**
1633
  * Check for Popper dependency
1634
  * Popper - https://popper.js.org
@@ -1675,28 +1764,6 @@
1675
  $(parent).toggleClass(ClassName$4.SHOW).trigger($.Event(Event$4.SHOWN, relatedTarget));
1676
  };
1677
 
1678
- _proto.show = function show() {
1679
- if (this._element.disabled || $(this._element).hasClass(ClassName$4.DISABLED) || $(this._menu).hasClass(ClassName$4.SHOW)) {
1680
- return;
1681
- }
1682
-
1683
- var relatedTarget = {
1684
- relatedTarget: this._element
1685
- };
1686
- var showEvent = $.Event(Event$4.SHOW, relatedTarget);
1687
-
1688
- var parent = Dropdown._getParentFromElement(this._element);
1689
-
1690
- $(parent).trigger(showEvent);
1691
-
1692
- if (showEvent.isDefaultPrevented()) {
1693
- return;
1694
- }
1695
-
1696
- $(this._menu).toggleClass(ClassName$4.SHOW);
1697
- $(parent).toggleClass(ClassName$4.SHOW).trigger($.Event(Event$4.SHOWN, relatedTarget));
1698
- };
1699
-
1700
  _proto.hide = function hide() {
1701
  if (this._element.disabled || $(this._element).hasClass(ClassName$4.DISABLED) || !$(this._menu).hasClass(ClassName$4.SHOW)) {
1702
  return;
@@ -1715,6 +1782,10 @@
1715
  return;
1716
  }
1717
 
 
 
 
 
1718
  $(this._menu).toggleClass(ClassName$4.SHOW);
1719
  $(parent).toggleClass(ClassName$4.SHOW).trigger($.Event(Event$4.HIDDEN, relatedTarget));
1720
  };
@@ -1753,7 +1824,7 @@
1753
  };
1754
 
1755
  _proto._getConfig = function _getConfig(config) {
1756
- config = _objectSpread({}, this.constructor.Default, $(this._element).data(), config);
1757
  Util.typeCheckConfig(NAME$4, config, this.constructor.DefaultType);
1758
  return config;
1759
  };
@@ -1802,7 +1873,7 @@
1802
 
1803
  if (typeof this._config.offset === 'function') {
1804
  offset.fn = function (data) {
1805
- data.offsets = _objectSpread({}, data.offsets, _this2._config.offset(data.offsets, _this2._element) || {});
1806
  return data;
1807
  };
1808
  } else {
@@ -1823,9 +1894,8 @@
1823
  preventOverflow: {
1824
  boundariesElement: this._config.boundary
1825
  }
1826
- } // Disable Popper.js if we have a static display
1827
-
1828
- };
1829
 
1830
  if (this._config.display === 'static') {
1831
  popperConfig.modifiers.applyStyle = {
@@ -1833,7 +1903,7 @@
1833
  };
1834
  }
1835
 
1836
- return popperConfig;
1837
  } // Static
1838
  ;
1839
 
@@ -1905,6 +1975,11 @@
1905
  }
1906
 
1907
  toggles[i].setAttribute('aria-expanded', 'false');
 
 
 
 
 
1908
  $(dropdownMenu).removeClass(ClassName$4.SHOW);
1909
  $(parent).removeClass(ClassName$4.SHOW).trigger($.Event(Event$4.HIDDEN, relatedTarget));
1910
  }
@@ -1945,6 +2020,10 @@
1945
 
1946
  var isActive = $(parent).hasClass(ClassName$4.SHOW);
1947
 
 
 
 
 
1948
  if (!isActive || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {
1949
  if (event.which === ESCAPE_KEYCODE) {
1950
  var toggle = parent.querySelector(Selector$4.DATA_TOGGLE);
@@ -1955,7 +2034,9 @@
1955
  return;
1956
  }
1957
 
1958
- var items = [].slice.call(parent.querySelectorAll(Selector$4.VISIBLE_ITEMS));
 
 
1959
 
1960
  if (items.length === 0) {
1961
  return;
@@ -2035,7 +2116,7 @@
2035
  */
2036
 
2037
  var NAME$5 = 'modal';
2038
- var VERSION$5 = '4.3.1';
2039
  var DATA_KEY$5 = 'bs.modal';
2040
  var EVENT_KEY$5 = "." + DATA_KEY$5;
2041
  var DATA_API_KEY$5 = '.data-api';
@@ -2056,6 +2137,7 @@
2056
  };
2057
  var Event$5 = {
2058
  HIDE: "hide" + EVENT_KEY$5,
 
2059
  HIDDEN: "hidden" + EVENT_KEY$5,
2060
  SHOW: "show" + EVENT_KEY$5,
2061
  SHOWN: "shown" + EVENT_KEY$5,
@@ -2073,7 +2155,8 @@
2073
  BACKDROP: 'modal-backdrop',
2074
  OPEN: 'modal-open',
2075
  FADE: 'fade',
2076
- SHOW: 'show'
 
2077
  };
2078
  var Selector$5 = {
2079
  DIALOG: '.modal-dialog',
@@ -2082,13 +2165,12 @@
2082
  DATA_DISMISS: '[data-dismiss="modal"]',
2083
  FIXED_CONTENT: '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top',
2084
  STICKY_CONTENT: '.sticky-top'
2085
- /**
2086
- * ------------------------------------------------------------------------
2087
- * Class Definition
2088
- * ------------------------------------------------------------------------
2089
- */
2090
-
2091
  };
 
 
 
 
 
2092
 
2093
  var Modal =
2094
  /*#__PURE__*/
@@ -2234,15 +2316,40 @@
2234
  ;
2235
 
2236
  _proto._getConfig = function _getConfig(config) {
2237
- config = _objectSpread({}, Default$3, config);
2238
  Util.typeCheckConfig(NAME$5, config, DefaultType$3);
2239
  return config;
2240
  };
2241
 
2242
- _proto._showElement = function _showElement(relatedTarget) {
2243
  var _this3 = this;
2244
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2245
  var transition = $(this._element).hasClass(ClassName$5.FADE);
 
2246
 
2247
  if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {
2248
  // Don't move modal's DOM position
@@ -2255,8 +2362,8 @@
2255
 
2256
  this._element.setAttribute('aria-modal', true);
2257
 
2258
- if ($(this._dialog).hasClass(ClassName$5.SCROLLABLE)) {
2259
- this._dialog.querySelector(Selector$5.MODAL_BODY).scrollTop = 0;
2260
  } else {
2261
  this._element.scrollTop = 0;
2262
  }
@@ -2276,12 +2383,12 @@
2276
  });
2277
 
2278
  var transitionComplete = function transitionComplete() {
2279
- if (_this3._config.focus) {
2280
- _this3._element.focus();
2281
  }
2282
 
2283
- _this3._isTransitioning = false;
2284
- $(_this3._element).trigger(shownEvent);
2285
  };
2286
 
2287
  if (transition) {
@@ -2293,25 +2400,23 @@
2293
  };
2294
 
2295
  _proto._enforceFocus = function _enforceFocus() {
2296
- var _this4 = this;
2297
 
2298
  $(document).off(Event$5.FOCUSIN) // Guard against infinite focus loop
2299
  .on(Event$5.FOCUSIN, function (event) {
2300
- if (document !== event.target && _this4._element !== event.target && $(_this4._element).has(event.target).length === 0) {
2301
- _this4._element.focus();
2302
  }
2303
  });
2304
  };
2305
 
2306
  _proto._setEscapeEvent = function _setEscapeEvent() {
2307
- var _this5 = this;
2308
 
2309
  if (this._isShown && this._config.keyboard) {
2310
  $(this._element).on(Event$5.KEYDOWN_DISMISS, function (event) {
2311
  if (event.which === ESCAPE_KEYCODE$1) {
2312
- event.preventDefault();
2313
-
2314
- _this5.hide();
2315
  }
2316
  });
2317
  } else if (!this._isShown) {
@@ -2320,11 +2425,11 @@
2320
  };
2321
 
2322
  _proto._setResizeEvent = function _setResizeEvent() {
2323
- var _this6 = this;
2324
 
2325
  if (this._isShown) {
2326
  $(window).on(Event$5.RESIZE, function (event) {
2327
- return _this6.handleUpdate(event);
2328
  });
2329
  } else {
2330
  $(window).off(Event$5.RESIZE);
@@ -2332,7 +2437,7 @@
2332
  };
2333
 
2334
  _proto._hideModal = function _hideModal() {
2335
- var _this7 = this;
2336
 
2337
  this._element.style.display = 'none';
2338
 
@@ -2345,11 +2450,11 @@
2345
  this._showBackdrop(function () {
2346
  $(document.body).removeClass(ClassName$5.OPEN);
2347
 
2348
- _this7._resetAdjustments();
2349
 
2350
- _this7._resetScrollbar();
2351
 
2352
- $(_this7._element).trigger(Event$5.HIDDEN);
2353
  });
2354
  };
2355
 
@@ -2361,7 +2466,7 @@
2361
  };
2362
 
2363
  _proto._showBackdrop = function _showBackdrop(callback) {
2364
- var _this8 = this;
2365
 
2366
  var animate = $(this._element).hasClass(ClassName$5.FADE) ? ClassName$5.FADE : '';
2367
 
@@ -2375,8 +2480,8 @@
2375
 
2376
  $(this._backdrop).appendTo(document.body);
2377
  $(this._element).on(Event$5.CLICK_DISMISS, function (event) {
2378
- if (_this8._ignoreBackdropClick) {
2379
- _this8._ignoreBackdropClick = false;
2380
  return;
2381
  }
2382
 
@@ -2384,11 +2489,7 @@
2384
  return;
2385
  }
2386
 
2387
- if (_this8._config.backdrop === 'static') {
2388
- _this8._element.focus();
2389
- } else {
2390
- _this8.hide();
2391
- }
2392
  });
2393
 
2394
  if (animate) {
@@ -2412,7 +2513,7 @@
2412
  $(this._backdrop).removeClass(ClassName$5.SHOW);
2413
 
2414
  var callbackRemove = function callbackRemove() {
2415
- _this8._removeBackdrop();
2416
 
2417
  if (callback) {
2418
  callback();
@@ -2459,7 +2560,7 @@
2459
  };
2460
 
2461
  _proto._setScrollbar = function _setScrollbar() {
2462
- var _this9 = this;
2463
 
2464
  if (this._isBodyOverflowing) {
2465
  // Note: DOMNode.style.paddingRight returns the actual value or '' if not set
@@ -2470,13 +2571,13 @@
2470
  $(fixedContent).each(function (index, element) {
2471
  var actualPadding = element.style.paddingRight;
2472
  var calculatedPadding = $(element).css('padding-right');
2473
- $(element).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + _this9._scrollbarWidth + "px");
2474
  }); // Adjust sticky content margin
2475
 
2476
  $(stickyContent).each(function (index, element) {
2477
  var actualMargin = element.style.marginRight;
2478
  var calculatedMargin = $(element).css('margin-right');
2479
- $(element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) - _this9._scrollbarWidth + "px");
2480
  }); // Adjust body padding
2481
 
2482
  var actualPadding = document.body.style.paddingRight;
@@ -2525,7 +2626,7 @@
2525
  return this.each(function () {
2526
  var data = $(this).data(DATA_KEY$5);
2527
 
2528
- var _config = _objectSpread({}, Default$3, $(this).data(), typeof config === 'object' && config ? config : {});
2529
 
2530
  if (!data) {
2531
  data = new Modal(this, _config);
@@ -2566,7 +2667,7 @@
2566
 
2567
 
2568
  $(document).on(Event$5.CLICK_DATA_API, Selector$5.DATA_TOGGLE, function (event) {
2569
- var _this10 = this;
2570
 
2571
  var target;
2572
  var selector = Util.getSelectorFromElement(this);
@@ -2575,7 +2676,7 @@
2575
  target = document.querySelector(selector);
2576
  }
2577
 
2578
- var config = $(target).data(DATA_KEY$5) ? 'toggle' : _objectSpread({}, $(target).data(), $(this).data());
2579
 
2580
  if (this.tagName === 'A' || this.tagName === 'AREA') {
2581
  event.preventDefault();
@@ -2588,8 +2689,8 @@
2588
  }
2589
 
2590
  $target.one(Event$5.HIDDEN, function () {
2591
- if ($(_this10).is(':visible')) {
2592
- _this10.focus();
2593
  }
2594
  });
2595
  });
@@ -2612,7 +2713,7 @@
2612
 
2613
  /**
2614
  * --------------------------------------------------------------------------
2615
- * Bootstrap (v4.3.1): tools/sanitizer.js
2616
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
2617
  * --------------------------------------------------------------------------
2618
  */
@@ -2650,13 +2751,13 @@
2650
  strong: [],
2651
  u: [],
2652
  ul: []
2653
- /**
2654
- * A pattern that recognizes a commonly useful subset of URLs that are safe.
2655
- *
2656
- * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts
2657
- */
2658
-
2659
  };
 
 
 
 
 
 
2660
  var SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi;
2661
  /**
2662
  * A pattern that matches safe data URLs. Only matches image, video and audio types.
@@ -2723,7 +2824,7 @@
2723
  };
2724
 
2725
  for (var i = 0, len = elements.length; i < len; i++) {
2726
- var _ret = _loop(i, len);
2727
 
2728
  if (_ret === "continue") continue;
2729
  }
@@ -2738,7 +2839,7 @@
2738
  */
2739
 
2740
  var NAME$6 = 'tooltip';
2741
- var VERSION$6 = '4.3.1';
2742
  var DATA_KEY$6 = 'bs.tooltip';
2743
  var EVENT_KEY$6 = "." + DATA_KEY$6;
2744
  var JQUERY_NO_CONFLICT$6 = $.fn[NAME$6];
@@ -2760,7 +2861,8 @@
2760
  boundary: '(string|element)',
2761
  sanitize: 'boolean',
2762
  sanitizeFn: '(null|function)',
2763
- whiteList: 'object'
 
2764
  };
2765
  var AttachmentMap$1 = {
2766
  AUTO: 'auto',
@@ -2784,7 +2886,8 @@
2784
  boundary: 'scrollParent',
2785
  sanitize: true,
2786
  sanitizeFn: null,
2787
- whiteList: DefaultWhitelist
 
2788
  };
2789
  var HoverState = {
2790
  SHOW: 'show',
@@ -2816,22 +2919,17 @@
2816
  FOCUS: 'focus',
2817
  CLICK: 'click',
2818
  MANUAL: 'manual'
2819
- /**
2820
- * ------------------------------------------------------------------------
2821
- * Class Definition
2822
- * ------------------------------------------------------------------------
2823
- */
2824
-
2825
  };
 
 
 
 
 
2826
 
2827
  var Tooltip =
2828
  /*#__PURE__*/
2829
  function () {
2830
  function Tooltip(element, config) {
2831
- /**
2832
- * Check for Popper dependency
2833
- * Popper - https://popper.js.org
2834
- */
2835
  if (typeof Popper === 'undefined') {
2836
  throw new TypeError('Bootstrap\'s tooltips require Popper.js (https://popper.js.org/)');
2837
  } // private
@@ -2902,7 +3000,7 @@
2902
  clearTimeout(this._timeout);
2903
  $.removeData(this.element, this.constructor.DATA_KEY);
2904
  $(this.element).off(this.constructor.EVENT_KEY);
2905
- $(this.element).closest('.modal').off('hide.bs.modal');
2906
 
2907
  if (this.tip) {
2908
  $(this.tip).remove();
@@ -2913,7 +3011,7 @@
2913
  this._hoverState = null;
2914
  this._activeTrigger = null;
2915
 
2916
- if (this._popper !== null) {
2917
  this._popper.destroy();
2918
  }
2919
 
@@ -2966,29 +3064,7 @@
2966
  }
2967
 
2968
  $(this.element).trigger(this.constructor.Event.INSERTED);
2969
- this._popper = new Popper(this.element, tip, {
2970
- placement: attachment,
2971
- modifiers: {
2972
- offset: this._getOffset(),
2973
- flip: {
2974
- behavior: this.config.fallbackPlacement
2975
- },
2976
- arrow: {
2977
- element: Selector$6.ARROW
2978
- },
2979
- preventOverflow: {
2980
- boundariesElement: this.config.boundary
2981
- }
2982
- },
2983
- onCreate: function onCreate(data) {
2984
- if (data.originalPlacement !== data.placement) {
2985
- _this._handlePopperPlacementChange(data);
2986
- }
2987
- },
2988
- onUpdate: function onUpdate(data) {
2989
- return _this._handlePopperPlacementChange(data);
2990
- }
2991
- });
2992
  $(tip).addClass(ClassName$6.SHOW); // If this is a touch-enabled device we add extra
2993
  // empty mouseover listeners to the body's immediate children;
2994
  // only needed because of broken event delegation on iOS
@@ -3136,14 +3212,43 @@
3136
  } // Private
3137
  ;
3138
 
3139
- _proto._getOffset = function _getOffset() {
3140
  var _this3 = this;
3141
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3142
  var offset = {};
3143
 
3144
  if (typeof this.config.offset === 'function') {
3145
  offset.fn = function (data) {
3146
- data.offsets = _objectSpread({}, data.offsets, _this3.config.offset(data.offsets, _this3.element) || {});
3147
  return data;
3148
  };
3149
  } else {
@@ -3170,32 +3275,35 @@
3170
  };
3171
 
3172
  _proto._setListeners = function _setListeners() {
3173
- var _this4 = this;
3174
 
3175
  var triggers = this.config.trigger.split(' ');
3176
  triggers.forEach(function (trigger) {
3177
  if (trigger === 'click') {
3178
- $(_this4.element).on(_this4.constructor.Event.CLICK, _this4.config.selector, function (event) {
3179
- return _this4.toggle(event);
3180
  });
3181
  } else if (trigger !== Trigger.MANUAL) {
3182
- var eventIn = trigger === Trigger.HOVER ? _this4.constructor.Event.MOUSEENTER : _this4.constructor.Event.FOCUSIN;
3183
- var eventOut = trigger === Trigger.HOVER ? _this4.constructor.Event.MOUSELEAVE : _this4.constructor.Event.FOCUSOUT;
3184
- $(_this4.element).on(eventIn, _this4.config.selector, function (event) {
3185
- return _this4._enter(event);
3186
- }).on(eventOut, _this4.config.selector, function (event) {
3187
- return _this4._leave(event);
3188
  });
3189
  }
3190
  });
3191
- $(this.element).closest('.modal').on('hide.bs.modal', function () {
3192
- if (_this4.element) {
3193
- _this4.hide();
 
3194
  }
3195
- });
 
 
3196
 
3197
  if (this.config.selector) {
3198
- this.config = _objectSpread({}, this.config, {
3199
  trigger: 'manual',
3200
  selector: ''
3201
  });
@@ -3295,7 +3403,7 @@
3295
  delete dataAttributes[dataAttr];
3296
  }
3297
  });
3298
- config = _objectSpread({}, this.constructor.Default, dataAttributes, typeof config === 'object' && config ? config : {});
3299
 
3300
  if (typeof config.delay === 'number') {
3301
  config.delay = {
@@ -3455,21 +3563,21 @@
3455
  */
3456
 
3457
  var NAME$7 = 'popover';
3458
- var VERSION$7 = '4.3.1';
3459
  var DATA_KEY$7 = 'bs.popover';
3460
  var EVENT_KEY$7 = "." + DATA_KEY$7;
3461
  var JQUERY_NO_CONFLICT$7 = $.fn[NAME$7];
3462
  var CLASS_PREFIX$1 = 'bs-popover';
3463
  var BSCLS_PREFIX_REGEX$1 = new RegExp("(^|\\s)" + CLASS_PREFIX$1 + "\\S+", 'g');
3464
 
3465
- var Default$5 = _objectSpread({}, Tooltip.Default, {
3466
  placement: 'right',
3467
  trigger: 'click',
3468
  content: '',
3469
  template: '<div class="popover" role="tooltip">' + '<div class="arrow"></div>' + '<h3 class="popover-header"></h3>' + '<div class="popover-body"></div></div>'
3470
  });
3471
 
3472
- var DefaultType$5 = _objectSpread({}, Tooltip.DefaultType, {
3473
  content: '(string|element|function)'
3474
  });
3475
 
@@ -3492,13 +3600,12 @@
3492
  FOCUSOUT: "focusout" + EVENT_KEY$7,
3493
  MOUSEENTER: "mouseenter" + EVENT_KEY$7,
3494
  MOUSELEAVE: "mouseleave" + EVENT_KEY$7
3495
- /**
3496
- * ------------------------------------------------------------------------
3497
- * Class Definition
3498
- * ------------------------------------------------------------------------
3499
- */
3500
-
3501
  };
 
 
 
 
 
3502
 
3503
  var Popover =
3504
  /*#__PURE__*/
@@ -3642,7 +3749,7 @@
3642
  */
3643
 
3644
  var NAME$8 = 'scrollspy';
3645
- var VERSION$8 = '4.3.1';
3646
  var DATA_KEY$8 = 'bs.scrollspy';
3647
  var EVENT_KEY$8 = "." + DATA_KEY$8;
3648
  var DATA_API_KEY$6 = '.data-api';
@@ -3681,13 +3788,12 @@
3681
  var OffsetMethod = {
3682
  OFFSET: 'offset',
3683
  POSITION: 'position'
3684
- /**
3685
- * ------------------------------------------------------------------------
3686
- * Class Definition
3687
- * ------------------------------------------------------------------------
3688
- */
3689
-
3690
  };
 
 
 
 
 
3691
 
3692
  var ScrollSpy =
3693
  /*#__PURE__*/
@@ -3769,7 +3875,7 @@
3769
  ;
3770
 
3771
  _proto._getConfig = function _getConfig(config) {
3772
- config = _objectSpread({}, Default$6, typeof config === 'object' && config ? config : {});
3773
 
3774
  if (typeof config.target !== 'string') {
3775
  var id = $(config.target).attr('id');
@@ -3949,7 +4055,7 @@
3949
  */
3950
 
3951
  var NAME$9 = 'tab';
3952
- var VERSION$9 = '4.3.1';
3953
  var DATA_KEY$9 = 'bs.tab';
3954
  var EVENT_KEY$9 = "." + DATA_KEY$9;
3955
  var DATA_API_KEY$7 = '.data-api';
@@ -3976,13 +4082,12 @@
3976
  DATA_TOGGLE: '[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',
3977
  DROPDOWN_TOGGLE: '.dropdown-toggle',
3978
  DROPDOWN_ACTIVE_CHILD: '> .dropdown-menu .active'
3979
- /**
3980
- * ------------------------------------------------------------------------
3981
- * Class Definition
3982
- * ------------------------------------------------------------------------
3983
- */
3984
-
3985
  };
 
 
 
 
 
3986
 
3987
  var Tab =
3988
  /*#__PURE__*/
@@ -4184,7 +4289,7 @@
4184
  */
4185
 
4186
  var NAME$a = 'toast';
4187
- var VERSION$a = '4.3.1';
4188
  var DATA_KEY$a = 'bs.toast';
4189
  var EVENT_KEY$a = "." + DATA_KEY$a;
4190
  var JQUERY_NO_CONFLICT$a = $.fn[NAME$a];
@@ -4213,13 +4318,12 @@
4213
  };
4214
  var Selector$a = {
4215
  DATA_DISMISS: '[data-dismiss="toast"]'
4216
- /**
4217
- * ------------------------------------------------------------------------
4218
- * Class Definition
4219
- * ------------------------------------------------------------------------
4220
- */
4221
-
4222
  };
 
 
 
 
 
4223
 
4224
  var Toast =
4225
  /*#__PURE__*/
@@ -4239,7 +4343,12 @@
4239
  _proto.show = function show() {
4240
  var _this = this;
4241
 
4242
- $(this._element).trigger(Event$a.SHOW);
 
 
 
 
 
4243
 
4244
  if (this._config.animation) {
4245
  this._element.classList.add(ClassName$a.FADE);
@@ -4253,12 +4362,16 @@
4253
  $(_this._element).trigger(Event$a.SHOWN);
4254
 
4255
  if (_this._config.autohide) {
4256
- _this.hide();
 
 
4257
  }
4258
  };
4259
 
4260
  this._element.classList.remove(ClassName$a.HIDE);
4261
 
 
 
4262
  this._element.classList.add(ClassName$a.SHOWING);
4263
 
4264
  if (this._config.animation) {
@@ -4269,22 +4382,19 @@
4269
  }
4270
  };
4271
 
4272
- _proto.hide = function hide(withoutTimeout) {
4273
- var _this2 = this;
4274
-
4275
  if (!this._element.classList.contains(ClassName$a.SHOW)) {
4276
  return;
4277
  }
4278
 
4279
- $(this._element).trigger(Event$a.HIDE);
 
4280
 
4281
- if (withoutTimeout) {
4282
- this._close();
4283
- } else {
4284
- this._timeout = setTimeout(function () {
4285
- _this2._close();
4286
- }, this._config.delay);
4287
  }
 
 
4288
  };
4289
 
4290
  _proto.dispose = function dispose() {
@@ -4303,26 +4413,26 @@
4303
  ;
4304
 
4305
  _proto._getConfig = function _getConfig(config) {
4306
- config = _objectSpread({}, Default$7, $(this._element).data(), typeof config === 'object' && config ? config : {});
4307
  Util.typeCheckConfig(NAME$a, config, this.constructor.DefaultType);
4308
  return config;
4309
  };
4310
 
4311
  _proto._setListeners = function _setListeners() {
4312
- var _this3 = this;
4313
 
4314
  $(this._element).on(Event$a.CLICK_DISMISS, Selector$a.DATA_DISMISS, function () {
4315
- return _this3.hide(true);
4316
  });
4317
  };
4318
 
4319
  _proto._close = function _close() {
4320
- var _this4 = this;
4321
 
4322
  var complete = function complete() {
4323
- _this4._element.classList.add(ClassName$a.HIDE);
4324
 
4325
- $(_this4._element).trigger(Event$a.HIDDEN);
4326
  };
4327
 
4328
  this._element.classList.remove(ClassName$a.SHOW);
@@ -4392,31 +4502,6 @@
4392
  return Toast._jQueryInterface;
4393
  };
4394
 
4395
- /**
4396
- * --------------------------------------------------------------------------
4397
- * Bootstrap (v4.3.1): index.js
4398
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
4399
- * --------------------------------------------------------------------------
4400
- */
4401
-
4402
- (function () {
4403
- if (typeof $ === 'undefined') {
4404
- throw new TypeError('Bootstrap\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\'s JavaScript.');
4405
- }
4406
-
4407
- var version = $.fn.jquery.split(' ')[0].split('.');
4408
- var minMajor = 1;
4409
- var ltMajor = 2;
4410
- var minMinor = 9;
4411
- var minPatch = 1;
4412
- var maxMajor = 4;
4413
-
4414
- if (version[0] < ltMajor && version[1] < minMinor || version[0] === minMajor && version[1] === minMinor && version[2] < minPatch || version[0] >= maxMajor) {
4415
- throw new Error('Bootstrap\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0');
4416
- }
4417
- })();
4418
-
4419
- exports.Util = Util;
4420
  exports.Alert = Alert;
4421
  exports.Button = Button;
4422
  exports.Carousel = Carousel;
@@ -4428,8 +4513,9 @@
4428
  exports.Tab = Tab;
4429
  exports.Toast = Toast;
4430
  exports.Tooltip = Tooltip;
 
4431
 
4432
  Object.defineProperty(exports, '__esModule', { value: true });
4433
 
4434
- }));
4435
  //# sourceMappingURL=bootstrap.js.map
1
  /*!
2
+ * Bootstrap v4.4.1 (https://getbootstrap.com/)
3
  * Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
4
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
5
  */
7
  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('jquery'), require('popper.js')) :
8
  typeof define === 'function' && define.amd ? define(['exports', 'jquery', 'popper.js'], factory) :
9
  (global = global || self, factory(global.bootstrap = {}, global.jQuery, global.Popper));
10
+ }(this, (function (exports, $, Popper) { 'use strict';
11
 
12
  $ = $ && $.hasOwnProperty('default') ? $['default'] : $;
13
  Popper = Popper && Popper.hasOwnProperty('default') ? Popper['default'] : Popper;
43
  return obj;
44
  }
45
 
46
+ function ownKeys(object, enumerableOnly) {
47
+ var keys = Object.keys(object);
48
+
49
+ if (Object.getOwnPropertySymbols) {
50
+ var symbols = Object.getOwnPropertySymbols(object);
51
+ if (enumerableOnly) symbols = symbols.filter(function (sym) {
52
+ return Object.getOwnPropertyDescriptor(object, sym).enumerable;
53
+ });
54
+ keys.push.apply(keys, symbols);
55
+ }
56
+
57
+ return keys;
58
+ }
59
+
60
+ function _objectSpread2(target) {
61
  for (var i = 1; i < arguments.length; i++) {
62
  var source = arguments[i] != null ? arguments[i] : {};
 
63
 
64
+ if (i % 2) {
65
+ ownKeys(Object(source), true).forEach(function (key) {
66
+ _defineProperty(target, key, source[key]);
67
+ });
68
+ } else if (Object.getOwnPropertyDescriptors) {
69
+ Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
70
+ } else {
71
+ ownKeys(Object(source)).forEach(function (key) {
72
+ Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
73
+ });
74
  }
 
 
 
 
75
  }
76
 
77
  return target;
85
 
86
  /**
87
  * --------------------------------------------------------------------------
88
+ * Bootstrap (v4.4.1): util.js
89
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
90
  * --------------------------------------------------------------------------
91
  */
234
  }
235
 
236
  return Util.findShadowRoot(element.parentNode);
237
+ },
238
+ jQueryDetection: function jQueryDetection() {
239
+ if (typeof $ === 'undefined') {
240
+ throw new TypeError('Bootstrap\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\'s JavaScript.');
241
+ }
242
+
243
+ var version = $.fn.jquery.split(' ')[0].split('.');
244
+ var minMajor = 1;
245
+ var ltMajor = 2;
246
+ var minMinor = 9;
247
+ var minPatch = 1;
248
+ var maxMajor = 4;
249
+
250
+ if (version[0] < ltMajor && version[1] < minMinor || version[0] === minMajor && version[1] === minMinor && version[2] < minPatch || version[0] >= maxMajor) {
251
+ throw new Error('Bootstrap\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0');
252
+ }
253
  }
254
  };
255
+ Util.jQueryDetection();
256
  setTransitionEndSupport();
257
 
258
  /**
262
  */
263
 
264
  var NAME = 'alert';
265
+ var VERSION = '4.4.1';
266
  var DATA_KEY = 'bs.alert';
267
  var EVENT_KEY = "." + DATA_KEY;
268
  var DATA_API_KEY = '.data-api';
279
  ALERT: 'alert',
280
  FADE: 'fade',
281
  SHOW: 'show'
 
 
 
 
 
 
282
  };
283
+ /**
284
+ * ------------------------------------------------------------------------
285
+ * Class Definition
286
+ * ------------------------------------------------------------------------
287
+ */
288
 
289
  var Alert =
290
  /*#__PURE__*/
426
  */
427
 
428
  var NAME$1 = 'button';
429
+ var VERSION$1 = '4.4.1';
430
  var DATA_KEY$1 = 'bs.button';
431
  var EVENT_KEY$1 = "." + DATA_KEY$1;
432
  var DATA_API_KEY$1 = '.data-api';
438
  };
439
  var Selector$1 = {
440
  DATA_TOGGLE_CARROT: '[data-toggle^="button"]',
441
+ DATA_TOGGLES: '[data-toggle="buttons"]',
442
+ DATA_TOGGLE: '[data-toggle="button"]',
443
+ DATA_TOGGLES_BUTTONS: '[data-toggle="buttons"] .btn',
444
  INPUT: 'input:not([type="hidden"])',
445
  ACTIVE: '.active',
446
  BUTTON: '.btn'
447
  };
448
  var Event$1 = {
449
  CLICK_DATA_API: "click" + EVENT_KEY$1 + DATA_API_KEY$1,
450
+ FOCUS_BLUR_DATA_API: "focus" + EVENT_KEY$1 + DATA_API_KEY$1 + " " + ("blur" + EVENT_KEY$1 + DATA_API_KEY$1),
451
+ LOAD_DATA_API: "load" + EVENT_KEY$1 + DATA_API_KEY$1
 
 
 
 
 
452
  };
453
+ /**
454
+ * ------------------------------------------------------------------------
455
+ * Class Definition
456
+ * ------------------------------------------------------------------------
457
+ */
458
 
459
  var Button =
460
  /*#__PURE__*/
470
  _proto.toggle = function toggle() {
471
  var triggerChangeEvent = true;
472
  var addAriaPressed = true;
473
+ var rootElement = $(this._element).closest(Selector$1.DATA_TOGGLES)[0];
474
 
475
  if (rootElement) {
476
  var input = this._element.querySelector(Selector$1.INPUT);
486
  $(activeElement).removeClass(ClassName$1.ACTIVE);
487
  }
488
  }
489
+ } else if (input.type === 'checkbox') {
490
+ if (this._element.tagName === 'LABEL' && input.checked === this._element.classList.contains(ClassName$1.ACTIVE)) {
491
+ triggerChangeEvent = false;
492
+ }
493
+ } else {
494
+ // if it's not a radio button or checkbox don't add a pointless/invalid checked property to the input
495
+ triggerChangeEvent = false;
496
  }
497
 
498
  if (triggerChangeEvent) {
 
 
 
 
499
  input.checked = !this._element.classList.contains(ClassName$1.ACTIVE);
500
  $(input).trigger('change');
501
  }
505
  }
506
  }
507
 
508
+ if (!(this._element.hasAttribute('disabled') || this._element.classList.contains('disabled'))) {
509
+ if (addAriaPressed) {
510
+ this._element.setAttribute('aria-pressed', !this._element.classList.contains(ClassName$1.ACTIVE));
511
+ }
512
 
513
+ if (triggerChangeEvent) {
514
+ $(this._element).toggleClass(ClassName$1.ACTIVE);
515
+ }
516
  }
517
  };
518
 
554
 
555
 
556
  $(document).on(Event$1.CLICK_DATA_API, Selector$1.DATA_TOGGLE_CARROT, function (event) {
 
557
  var button = event.target;
558
 
559
  if (!$(button).hasClass(ClassName$1.BUTTON)) {
560
+ button = $(button).closest(Selector$1.BUTTON)[0];
561
  }
562
 
563
+ if (!button || button.hasAttribute('disabled') || button.classList.contains('disabled')) {
564
+ event.preventDefault(); // work around Firefox bug #1540995
565
+ } else {
566
+ var inputBtn = button.querySelector(Selector$1.INPUT);
567
+
568
+ if (inputBtn && (inputBtn.hasAttribute('disabled') || inputBtn.classList.contains('disabled'))) {
569
+ event.preventDefault(); // work around Firefox bug #1540995
570
+
571
+ return;
572
+ }
573
+
574
+ Button._jQueryInterface.call($(button), 'toggle');
575
+ }
576
  }).on(Event$1.FOCUS_BLUR_DATA_API, Selector$1.DATA_TOGGLE_CARROT, function (event) {
577
  var button = $(event.target).closest(Selector$1.BUTTON)[0];
578
  $(button).toggleClass(ClassName$1.FOCUS, /^focus(in)?$/.test(event.type));
579
  });
580
+ $(window).on(Event$1.LOAD_DATA_API, function () {
581
+ // ensure correct active class is set to match the controls' actual values/states
582
+ // find all checkboxes/readio buttons inside data-toggle groups
583
+ var buttons = [].slice.call(document.querySelectorAll(Selector$1.DATA_TOGGLES_BUTTONS));
584
+
585
+ for (var i = 0, len = buttons.length; i < len; i++) {
586
+ var button = buttons[i];
587
+ var input = button.querySelector(Selector$1.INPUT);
588
+
589
+ if (input.checked || input.hasAttribute('checked')) {
590
+ button.classList.add(ClassName$1.ACTIVE);
591
+ } else {
592
+ button.classList.remove(ClassName$1.ACTIVE);
593
+ }
594
+ } // find all button toggles
595
+
596
+
597
+ buttons = [].slice.call(document.querySelectorAll(Selector$1.DATA_TOGGLE));
598
+
599
+ for (var _i = 0, _len = buttons.length; _i < _len; _i++) {
600
+ var _button = buttons[_i];
601
+
602
+ if (_button.getAttribute('aria-pressed') === 'true') {
603
+ _button.classList.add(ClassName$1.ACTIVE);
604
+ } else {
605
+ _button.classList.remove(ClassName$1.ACTIVE);
606
+ }
607
+ }
608
+ });
609
  /**
610
  * ------------------------------------------------------------------------
611
  * jQuery
627
  */
628
 
629
  var NAME$2 = 'carousel';
630
+ var VERSION$2 = '4.4.1';
631
  var DATA_KEY$2 = 'bs.carousel';
632
  var EVENT_KEY$2 = "." + DATA_KEY$2;
633
  var DATA_API_KEY$2 = '.data-api';
700
  var PointerType = {
701
  TOUCH: 'touch',
702
  PEN: 'pen'
 
 
 
 
 
 
703
  };
704
+ /**
705
+ * ------------------------------------------------------------------------
706
+ * Class Definition
707
+ * ------------------------------------------------------------------------
708
+ */
709
 
710
  var Carousel =
711
  /*#__PURE__*/
825
  ;
826
 
827
  _proto._getConfig = function _getConfig(config) {
828
+ config = _objectSpread2({}, Default, {}, config);
829
  Util.typeCheckConfig(NAME$2, config, DefaultType);
830
  return config;
831
  };
837
  return;
838
  }
839
 
840
+ var direction = absDeltax / this.touchDeltaX;
841
+ this.touchDeltaX = 0; // swipe left
842
 
843
  if (direction > 0) {
844
  this.prev();
964
  event.preventDefault();
965
  this.next();
966
  break;
 
 
967
  }
968
  };
969
 
1115
  return this.each(function () {
1116
  var data = $(this).data(DATA_KEY$2);
1117
 
1118
+ var _config = _objectSpread2({}, Default, {}, $(this).data());
1119
 
1120
  if (typeof config === 'object') {
1121
+ _config = _objectSpread2({}, _config, {}, config);
1122
  }
1123
 
1124
  var action = typeof config === 'string' ? config : _config.slide;
1156
  return;
1157
  }
1158
 
1159
+ var config = _objectSpread2({}, $(target).data(), {}, $(this).data());
1160
 
1161
  var slideIndex = this.getAttribute('data-slide-to');
1162
 
1225
  */
1226
 
1227
  var NAME$3 = 'collapse';
1228
+ var VERSION$3 = '4.4.1';
1229
  var DATA_KEY$3 = 'bs.collapse';
1230
  var EVENT_KEY$3 = "." + DATA_KEY$3;
1231
  var DATA_API_KEY$3 = '.data-api';
1258
  var Selector$3 = {
1259
  ACTIVES: '.show, .collapsing',
1260
  DATA_TOGGLE: '[data-toggle="collapse"]'
 
 
 
 
 
 
1261
  };
1262
+ /**
1263
+ * ------------------------------------------------------------------------
1264
+ * Class Definition
1265
+ * ------------------------------------------------------------------------
1266
+ */
1267
 
1268
  var Collapse =
1269
  /*#__PURE__*/
1450
  ;
1451
 
1452
  _proto._getConfig = function _getConfig(config) {
1453
+ config = _objectSpread2({}, Default$1, {}, config);
1454
  config.toggle = Boolean(config.toggle); // Coerce string values
1455
 
1456
  Util.typeCheckConfig(NAME$3, config, DefaultType$1);
1504
  var $this = $(this);
1505
  var data = $this.data(DATA_KEY$3);
1506
 
1507
+ var _config = _objectSpread2({}, Default$1, {}, $this.data(), {}, typeof config === 'object' && config ? config : {});
1508
 
1509
  if (!data && _config.toggle && /show|hide/.test(config)) {
1510
  _config.toggle = false;
1584
  */
1585
 
1586
  var NAME$4 = 'dropdown';
1587
+ var VERSION$4 = '4.4.1';
1588
  var DATA_KEY$4 = 'bs.dropdown';
1589
  var EVENT_KEY$4 = "." + DATA_KEY$4;
1590
  var DATA_API_KEY$4 = '.data-api';
1644
  flip: true,
1645
  boundary: 'scrollParent',
1646
  reference: 'toggle',
1647
+ display: 'dynamic',
1648
+ popperConfig: null
1649
  };
1650
  var DefaultType$2 = {
1651
  offset: '(number|string|function)',
1652
  flip: 'boolean',
1653
  boundary: '(string|element)',
1654
  reference: '(string|element)',
1655
+ display: 'string',
1656
+ popperConfig: '(null|object)'
 
 
 
 
 
1657
  };
1658
+ /**
1659
+ * ------------------------------------------------------------------------
1660
+ * Class Definition
1661
+ * ------------------------------------------------------------------------
1662
+ */
1663
 
1664
  var Dropdown =
1665
  /*#__PURE__*/
1683
  return;
1684
  }
1685
 
 
 
1686
  var isActive = $(this._menu).hasClass(ClassName$4.SHOW);
1687
 
1688
  Dropdown._clearMenus();
1691
  return;
1692
  }
1693
 
1694
+ this.show(true);
1695
+ };
1696
+
1697
+ _proto.show = function show(usePopper) {
1698
+ if (usePopper === void 0) {
1699
+ usePopper = false;
1700
+ }
1701
+
1702
+ if (this._element.disabled || $(this._element).hasClass(ClassName$4.DISABLED) || $(this._menu).hasClass(ClassName$4.SHOW)) {
1703
+ return;
1704
+ }
1705
+
1706
  var relatedTarget = {
1707
  relatedTarget: this._element
1708
  };
1709
  var showEvent = $.Event(Event$4.SHOW, relatedTarget);
1710
+
1711
+ var parent = Dropdown._getParentFromElement(this._element);
1712
+
1713
  $(parent).trigger(showEvent);
1714
 
1715
  if (showEvent.isDefaultPrevented()) {
1717
  } // Disable totally Popper.js for Dropdown in Navbar
1718
 
1719
 
1720
+ if (!this._inNavbar && usePopper) {
1721
  /**
1722
  * Check for Popper dependency
1723
  * Popper - https://popper.js.org
1764
  $(parent).toggleClass(ClassName$4.SHOW).trigger($.Event(Event$4.SHOWN, relatedTarget));
1765
  };
1766
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1767
  _proto.hide = function hide() {
1768
  if (this._element.disabled || $(this._element).hasClass(ClassName$4.DISABLED) || !$(this._menu).hasClass(ClassName$4.SHOW)) {
1769
  return;
1782
  return;
1783
  }
1784
 
1785
+ if (this._popper) {
1786
+ this._popper.destroy();
1787
+ }
1788
+
1789
  $(this._menu).toggleClass(ClassName$4.SHOW);
1790
  $(parent).toggleClass(ClassName$4.SHOW).trigger($.Event(Event$4.HIDDEN, relatedTarget));
1791
  };
1824
  };
1825
 
1826
  _proto._getConfig = function _getConfig(config) {
1827
+ config = _objectSpread2({}, this.constructor.Default, {}, $(this._element).data(), {}, config);
1828
  Util.typeCheckConfig(NAME$4, config, this.constructor.DefaultType);
1829
  return config;
1830
  };
1873
 
1874
  if (typeof this._config.offset === 'function') {
1875
  offset.fn = function (data) {
1876
+ data.offsets = _objectSpread2({}, data.offsets, {}, _this2._config.offset(data.offsets, _this2._element) || {});
1877
  return data;
1878
  };
1879
  } else {
1894
  preventOverflow: {
1895
  boundariesElement: this._config.boundary
1896
  }
1897
+ }
1898
+ }; // Disable Popper.js if we have a static display
 
1899
 
1900
  if (this._config.display === 'static') {
1901
  popperConfig.modifiers.applyStyle = {
1903
  };
1904
  }
1905
 
1906
+ return _objectSpread2({}, popperConfig, {}, this._config.popperConfig);
1907
  } // Static
1908
  ;
1909
 
1975
  }
1976
 
1977
  toggles[i].setAttribute('aria-expanded', 'false');
1978
+
1979
+ if (context._popper) {
1980
+ context._popper.destroy();
1981
+ }
1982
+
1983
  $(dropdownMenu).removeClass(ClassName$4.SHOW);
1984
  $(parent).removeClass(ClassName$4.SHOW).trigger($.Event(Event$4.HIDDEN, relatedTarget));
1985
  }
2020
 
2021
  var isActive = $(parent).hasClass(ClassName$4.SHOW);
2022
 
2023
+ if (!isActive && event.which === ESCAPE_KEYCODE) {
2024
+ return;
2025
+ }
2026
+
2027
  if (!isActive || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {
2028
  if (event.which === ESCAPE_KEYCODE) {
2029
  var toggle = parent.querySelector(Selector$4.DATA_TOGGLE);
2034
  return;
2035
  }
2036
 
2037
+ var items = [].slice.call(parent.querySelectorAll(Selector$4.VISIBLE_ITEMS)).filter(function (item) {
2038
+ return $(item).is(':visible');
2039
+ });
2040
 
2041
  if (items.length === 0) {
2042
  return;
2116
  */
2117
 
2118
  var NAME$5 = 'modal';
2119
+ var VERSION$5 = '4.4.1';
2120
  var DATA_KEY$5 = 'bs.modal';
2121
  var EVENT_KEY$5 = "." + DATA_KEY$5;
2122
  var DATA_API_KEY$5 = '.data-api';
2137
  };
2138
  var Event$5 = {
2139
  HIDE: "hide" + EVENT_KEY$5,
2140
+ HIDE_PREVENTED: "hidePrevented" + EVENT_KEY$5,
2141
  HIDDEN: "hidden" + EVENT_KEY$5,
2142
  SHOW: "show" + EVENT_KEY$5,
2143
  SHOWN: "shown" + EVENT_KEY$5,
2155
  BACKDROP: 'modal-backdrop',
2156
  OPEN: 'modal-open',
2157
  FADE: 'fade',
2158
+ SHOW: 'show',
2159
+ STATIC: 'modal-static'
2160
  };
2161
  var Selector$5 = {
2162
  DIALOG: '.modal-dialog',
2165
  DATA_DISMISS: '[data-dismiss="modal"]',
2166
  FIXED_CONTENT: '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top',
2167
  STICKY_CONTENT: '.sticky-top'
 
 
 
 
 
 
2168
  };
2169
+ /**
2170
+ * ------------------------------------------------------------------------
2171
+ * Class Definition
2172
+ * ------------------------------------------------------------------------
2173
+ */
2174
 
2175
  var Modal =
2176
  /*#__PURE__*/
2316
  ;
2317
 
2318
  _proto._getConfig = function _getConfig(config) {
2319
+ config = _objectSpread2({}, Default$3, {}, config);
2320
  Util.typeCheckConfig(NAME$5, config, DefaultType$3);
2321
  return config;
2322
  };
2323
 
2324
+ _proto._triggerBackdropTransition = function _triggerBackdropTransition() {
2325
  var _this3 = this;
2326
 
2327
+ if (this._config.backdrop === 'static') {
2328
+ var hideEventPrevented = $.Event(Event$5.HIDE_PREVENTED);
2329
+ $(this._element).trigger(hideEventPrevented);
2330
+
2331
+ if (hideEventPrevented.defaultPrevented) {
2332
+ return;
2333
+ }
2334
+
2335
+ this._element.classList.add(ClassName$5.STATIC);
2336
+
2337
+ var modalTransitionDuration = Util.getTransitionDurationFromElement(this._element);
2338
+ $(this._element).one(Util.TRANSITION_END, function () {
2339
+ _this3._element.classList.remove(ClassName$5.STATIC);
2340
+ }).emulateTransitionEnd(modalTransitionDuration);
2341
+
2342
+ this._element.focus();
2343
+ } else {
2344
+ this.hide();
2345
+ }
2346
+ };
2347
+
2348
+ _proto._showElement = function _showElement(relatedTarget) {
2349
+ var _this4 = this;
2350
+
2351
  var transition = $(this._element).hasClass(ClassName$5.FADE);
2352
+ var modalBody = this._dialog ? this._dialog.querySelector(Selector$5.MODAL_BODY) : null;
2353
 
2354
  if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {
2355
  // Don't move modal's DOM position
2362
 
2363
  this._element.setAttribute('aria-modal', true);
2364
 
2365
+ if ($(this._dialog).hasClass(ClassName$5.SCROLLABLE) && modalBody) {
2366
+ modalBody.scrollTop = 0;
2367
  } else {
2368
  this._element.scrollTop = 0;
2369
  }
2383
  });
2384
 
2385
  var transitionComplete = function transitionComplete() {
2386
+ if (_this4._config.focus) {
2387
+ _this4._element.focus();
2388
  }
2389
 
2390
+ _this4._isTransitioning = false;
2391
+ $(_this4._element).trigger(shownEvent);
2392
  };
2393
 
2394
  if (transition) {
2400
  };
2401
 
2402
  _proto._enforceFocus = function _enforceFocus() {
2403
+ var _this5 = this;
2404
 
2405
  $(document).off(Event$5.FOCUSIN) // Guard against infinite focus loop
2406
  .on(Event$5.FOCUSIN, function (event) {
2407
+ if (document !== event.target && _this5._element !== event.target && $(_this5._element).has(event.target).length === 0) {
2408
+ _this5._element.focus();
2409
  }
2410
  });
2411
  };
2412
 
2413
  _proto._setEscapeEvent = function _setEscapeEvent() {
2414
+ var _this6 = this;
2415
 
2416
  if (this._isShown && this._config.keyboard) {
2417
  $(this._element).on(Event$5.KEYDOWN_DISMISS, function (event) {
2418
  if (event.which === ESCAPE_KEYCODE$1) {
2419
+ _this6._triggerBackdropTransition();
 
 
2420
  }
2421
  });
2422
  } else if (!this._isShown) {
2425
  };
2426
 
2427
  _proto._setResizeEvent = function _setResizeEvent() {
2428
+ var _this7 = this;
2429
 
2430
  if (this._isShown) {
2431
  $(window).on(Event$5.RESIZE, function (event) {
2432
+ return _this7.handleUpdate(event);
2433
  });
2434
  } else {
2435
  $(window).off(Event$5.RESIZE);
2437
  };
2438
 
2439
  _proto._hideModal = function _hideModal() {
2440
+ var _this8 = this;
2441
 
2442
  this._element.style.display = 'none';
2443
 
2450
  this._showBackdrop(function () {
2451
  $(document.body).removeClass(ClassName$5.OPEN);
2452
 
2453
+ _this8._resetAdjustments();
2454
 
2455
+ _this8._resetScrollbar();
2456
 
2457
+ $(_this8._element).trigger(Event$5.HIDDEN);
2458
  });
2459
  };
2460
 
2466
  };
2467
 
2468
  _proto._showBackdrop = function _showBackdrop(callback) {
2469
+ var _this9 = this;
2470
 
2471
  var animate = $(this._element).hasClass(ClassName$5.FADE) ? ClassName$5.FADE : '';
2472
 
2480
 
2481
  $(this._backdrop).appendTo(document.body);
2482
  $(this._element).on(Event$5.CLICK_DISMISS, function (event) {
2483
+ if (_this9._ignoreBackdropClick) {
2484
+ _this9._ignoreBackdropClick = false;
2485
  return;
2486
  }
2487
 
2489
  return;
2490
  }
2491
 
2492
+ _this9._triggerBackdropTransition();
 
 
 
 
2493
  });
2494
 
2495
  if (animate) {
2513
  $(this._backdrop).removeClass(ClassName$5.SHOW);
2514
 
2515
  var callbackRemove = function callbackRemove() {
2516
+ _this9._removeBackdrop();
2517
 
2518
  if (callback) {
2519
  callback();
2560
  };
2561
 
2562
  _proto._setScrollbar = function _setScrollbar() {
2563
+ var _this10 = this;
2564
 
2565
  if (this._isBodyOverflowing) {
2566
  // Note: DOMNode.style.paddingRight returns the actual value or '' if not set
2571
  $(fixedContent).each(function (index, element) {
2572
  var actualPadding = element.style.paddingRight;
2573
  var calculatedPadding = $(element).css('padding-right');
2574
+ $(element).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + _this10._scrollbarWidth + "px");
2575
  }); // Adjust sticky content margin
2576
 
2577
  $(stickyContent).each(function (index, element) {
2578
  var actualMargin = element.style.marginRight;
2579
  var calculatedMargin = $(element).css('margin-right');
2580
+ $(element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) - _this10._scrollbarWidth + "px");
2581
  }); // Adjust body padding
2582
 
2583
  var actualPadding = document.body.style.paddingRight;
2626
  return this.each(function () {
2627
  var data = $(this).data(DATA_KEY$5);
2628
 
2629
+ var _config = _objectSpread2({}, Default$3, {}, $(this).data(), {}, typeof config === 'object' && config ? config : {});
2630
 
2631
  if (!data) {
2632
  data = new Modal(this, _config);
2667
 
2668
 
2669
  $(document).on(Event$5.CLICK_DATA_API, Selector$5.DATA_TOGGLE, function (event) {
2670
+ var _this11 = this;
2671
 
2672
  var target;
2673
  var selector = Util.getSelectorFromElement(this);
2676
  target = document.querySelector(selector);
2677
  }
2678
 
2679
+ var config = $(target).data(DATA_KEY$5) ? 'toggle' : _objectSpread2({}, $(target).data(), {}, $(this).data());
2680
 
2681
  if (this.tagName === 'A' || this.tagName === 'AREA') {
2682
  event.preventDefault();
2689
  }
2690
 
2691
  $target.one(Event$5.HIDDEN, function () {
2692
+ if ($(_this11).is(':visible')) {
2693
+ _this11.focus();
2694
  }
2695
  });
2696
  });
2713
 
2714
  /**
2715
  * --------------------------------------------------------------------------
2716
+ * Bootstrap (v4.4.1): tools/sanitizer.js
2717
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
2718
  * --------------------------------------------------------------------------
2719
  */
2751
  strong: [],
2752
  u: [],
2753
  ul: []
 
 
 
 
 
 
2754
  };
2755
+ /**
2756
+ * A pattern that recognizes a commonly useful subset of URLs that are safe.
2757
+ *
2758
+ * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts
2759
+ */
2760
+
2761
  var SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi;
2762
  /**
2763
  * A pattern that matches safe data URLs. Only matches image, video and audio types.
2824
  };
2825
 
2826
  for (var i = 0, len = elements.length; i < len; i++) {
2827
+ var _ret = _loop(i);
2828
 
2829
  if (_ret === "continue") continue;
2830
  }
2839
  */
2840
 
2841
  var NAME$6 = 'tooltip';
2842
+ var VERSION$6 = '4.4.1';
2843
  var DATA_KEY$6 = 'bs.tooltip';
2844
  var EVENT_KEY$6 = "." + DATA_KEY$6;
2845
  var JQUERY_NO_CONFLICT$6 = $.fn[NAME$6];
2861
  boundary: '(string|element)',
2862
  sanitize: 'boolean',
2863
  sanitizeFn: '(null|function)',
2864
+ whiteList: 'object',
2865
+ popperConfig: '(null|object)'
2866
  };
2867
  var AttachmentMap$1 = {
2868
  AUTO: 'auto',
2886
  boundary: 'scrollParent',
2887
  sanitize: true,
2888
  sanitizeFn: null,
2889
+ whiteList: DefaultWhitelist,
2890
+ popperConfig: null
2891
  };
2892
  var HoverState = {
2893
  SHOW: 'show',
2919
  FOCUS: 'focus',
2920
  CLICK: 'click',
2921
  MANUAL: 'manual'
 
 
 
 
 
 
2922
  };
2923
+ /**
2924
+ * ------------------------------------------------------------------------
2925
+ * Class Definition
2926
+ * ------------------------------------------------------------------------
2927
+ */
2928
 
2929
  var Tooltip =
2930
  /*#__PURE__*/
2931
  function () {
2932
  function Tooltip(element, config) {
 
 
 
 
2933
  if (typeof Popper === 'undefined') {
2934
  throw new TypeError('Bootstrap\'s tooltips require Popper.js (https://popper.js.org/)');
2935
  } // private
3000
  clearTimeout(this._timeout);
3001
  $.removeData(this.element, this.constructor.DATA_KEY);
3002
  $(this.element).off(this.constructor.EVENT_KEY);
3003
+ $(this.element).closest('.modal').off('hide.bs.modal', this._hideModalHandler);
3004
 
3005
  if (this.tip) {
3006
  $(this.tip).remove();
3011
  this._hoverState = null;
3012
  this._activeTrigger = null;
3013
 
3014
+ if (this._popper) {
3015
  this._popper.destroy();
3016
  }
3017
 
3064
  }
3065
 
3066
  $(this.element).trigger(this.constructor.Event.INSERTED);
3067
+ this._popper = new Popper(this.element, tip, this._getPopperConfig(attachment));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3068
  $(tip).addClass(ClassName$6.SHOW); // If this is a touch-enabled device we add extra
3069
  // empty mouseover listeners to the body's immediate children;
3070
  // only needed because of broken event delegation on iOS
3212
  } // Private
3213
  ;
3214
 
3215
+ _proto._getPopperConfig = function _getPopperConfig(attachment) {
3216
  var _this3 = this;
3217
 
3218
+ var defaultBsConfig = {
3219
+ placement: attachment,
3220
+ modifiers: {
3221
+ offset: this._getOffset(),
3222
+ flip: {
3223
+ behavior: this.config.fallbackPlacement
3224
+ },
3225
+ arrow: {
3226
+ element: Selector$6.ARROW
3227
+ },
3228
+ preventOverflow: {
3229
+ boundariesElement: this.config.boundary
3230
+ }
3231
+ },
3232
+ onCreate: function onCreate(data) {
3233
+ if (data.originalPlacement !== data.placement) {
3234
+ _this3._handlePopperPlacementChange(data);
3235
+ }
3236
+ },
3237
+ onUpdate: function onUpdate(data) {
3238
+ return _this3._handlePopperPlacementChange(data);
3239
+ }
3240
+ };
3241
+ return _objectSpread2({}, defaultBsConfig, {}, this.config.popperConfig);
3242
+ };
3243
+
3244
+ _proto._getOffset = function _getOffset() {
3245
+ var _this4 = this;
3246
+
3247
  var offset = {};
3248
 
3249
  if (typeof this.config.offset === 'function') {
3250
  offset.fn = function (data) {
3251
+ data.offsets = _objectSpread2({}, data.offsets, {}, _this4.config.offset(data.offsets, _this4.element) || {});
3252
  return data;
3253
  };
3254
  } else {
3275
  };
3276
 
3277
  _proto._setListeners = function _setListeners() {
3278
+ var _this5 = this;
3279
 
3280
  var triggers = this.config.trigger.split(' ');
3281
  triggers.forEach(function (trigger) {
3282
  if (trigger === 'click') {
3283
+ $(_this5.element).on(_this5.constructor.Event.CLICK, _this5.config.selector, function (event) {
3284
+ return _this5.toggle(event);
3285
  });
3286
  } else if (trigger !== Trigger.MANUAL) {
3287
+ var eventIn = trigger === Trigger.HOVER ? _this5.constructor.Event.MOUSEENTER : _this5.constructor.Event.FOCUSIN;
3288
+ var eventOut = trigger === Trigger.HOVER ? _this5.constructor.Event.MOUSELEAVE : _this5.constructor.Event.FOCUSOUT;
3289
+ $(_this5.element).on(eventIn, _this5.config.selector, function (event) {
3290
+ return _this5._enter(event);
3291
+ }).on(eventOut, _this5.config.selector, function (event) {
3292
+ return _this5._leave(event);
3293
  });
3294
  }
3295
  });
3296
+
3297
+ this._hideModalHandler = function () {
3298
+ if (_this5.element) {
3299
+ _this5.hide();
3300
  }
3301
+ };
3302
+
3303
+ $(this.element).closest('.modal').on('hide.bs.modal', this._hideModalHandler);
3304
 
3305
  if (this.config.selector) {
3306
+ this.config = _objectSpread2({}, this.config, {
3307
  trigger: 'manual',
3308
  selector: ''
3309
  });
3403
  delete dataAttributes[dataAttr];
3404
  }
3405
  });
3406
+ config = _objectSpread2({}, this.constructor.Default, {}, dataAttributes, {}, typeof config === 'object' && config ? config : {});
3407
 
3408
  if (typeof config.delay === 'number') {
3409
  config.delay = {
3563
  */
3564
 
3565
  var NAME$7 = 'popover';
3566
+ var VERSION$7 = '4.4.1';
3567
  var DATA_KEY$7 = 'bs.popover';
3568
  var EVENT_KEY$7 = "." + DATA_KEY$7;
3569
  var JQUERY_NO_CONFLICT$7 = $.fn[NAME$7];
3570
  var CLASS_PREFIX$1 = 'bs-popover';
3571
  var BSCLS_PREFIX_REGEX$1 = new RegExp("(^|\\s)" + CLASS_PREFIX$1 + "\\S+", 'g');
3572
 
3573
+ var Default$5 = _objectSpread2({}, Tooltip.Default, {
3574
  placement: 'right',
3575
  trigger: 'click',
3576
  content: '',
3577
  template: '<div class="popover" role="tooltip">' + '<div class="arrow"></div>' + '<h3 class="popover-header"></h3>' + '<div class="popover-body"></div></div>'
3578
  });
3579
 
3580
+ var DefaultType$5 = _objectSpread2({}, Tooltip.DefaultType, {
3581
  content: '(string|element|function)'
3582
  });
3583
 
3600
  FOCUSOUT: "focusout" + EVENT_KEY$7,
3601
  MOUSEENTER: "mouseenter" + EVENT_KEY$7,
3602
  MOUSELEAVE: "mouseleave" + EVENT_KEY$7
 
 
 
 
 
 
3603
  };
3604
+ /**
3605
+ * ------------------------------------------------------------------------
3606
+ * Class Definition
3607
+ * ------------------------------------------------------------------------
3608
+ */
3609
 
3610
  var Popover =
3611
  /*#__PURE__*/
3749
  */
3750
 
3751
  var NAME$8 = 'scrollspy';
3752
+ var VERSION$8 = '4.4.1';
3753
  var DATA_KEY$8 = 'bs.scrollspy';
3754
  var EVENT_KEY$8 = "." + DATA_KEY$8;
3755
  var DATA_API_KEY$6 = '.data-api';
3788
  var OffsetMethod = {
3789
  OFFSET: 'offset',
3790
  POSITION: 'position'
 
 
 
 
 
 
3791
  };
3792
+ /**
3793
+ * ------------------------------------------------------------------------
3794
+ * Class Definition
3795
+ * ------------------------------------------------------------------------
3796
+ */
3797
 
3798
  var ScrollSpy =
3799
  /*#__PURE__*/
3875
  ;
3876
 
3877
  _proto._getConfig = function _getConfig(config) {
3878
+ config = _objectSpread2({}, Default$6, {}, typeof config === 'object' && config ? config : {});
3879
 
3880
  if (typeof config.target !== 'string') {
3881
  var id = $(config.target).attr('id');
4055
  */
4056
 
4057
  var NAME$9 = 'tab';
4058
+ var VERSION$9 = '4.4.1';
4059
  var DATA_KEY$9 = 'bs.tab';
4060
  var EVENT_KEY$9 = "." + DATA_KEY$9;
4061
  var DATA_API_KEY$7 = '.data-api';
4082
  DATA_TOGGLE: '[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',
4083
  DROPDOWN_TOGGLE: '.dropdown-toggle',
4084
  DROPDOWN_ACTIVE_CHILD: '> .dropdown-menu .active'
 
 
 
 
 
 
4085
  };
4086
+ /**
4087
+ * ------------------------------------------------------------------------
4088
+ * Class Definition
4089
+ * ------------------------------------------------------------------------
4090
+ */
4091
 
4092
  var Tab =
4093
  /*#__PURE__*/
4289
  */
4290
 
4291
  var NAME$a = 'toast';
4292
+ var VERSION$a = '4.4.1';
4293
  var DATA_KEY$a = 'bs.toast';
4294
  var EVENT_KEY$a = "." + DATA_KEY$a;
4295
  var JQUERY_NO_CONFLICT$a = $.fn[NAME$a];
4318
  };
4319
  var Selector$a = {
4320
  DATA_DISMISS: '[data-dismiss="toast"]'
 
 
 
 
 
 
4321
  };
4322
+ /**
4323
+ * ------------------------------------------------------------------------
4324
+ * Class Definition
4325
+ * ------------------------------------------------------------------------
4326
+ */
4327
 
4328
  var Toast =
4329
  /*#__PURE__*/
4343
  _proto.show = function show() {
4344
  var _this = this;
4345
 
4346
+ var showEvent = $.Event(Event$a.SHOW);
4347
+ $(this._element).trigger(showEvent);
4348
+
4349
+ if (showEvent.isDefaultPrevented()) {
4350
+ return;
4351
+ }
4352
 
4353
  if (this._config.animation) {
4354
  this._element.classList.add(ClassName$a.FADE);
4362
  $(_this._element).trigger(Event$a.SHOWN);
4363
 
4364
  if (_this._config.autohide) {
4365
+ _this._timeout = setTimeout(function () {
4366
+ _this.hide();
4367
+ }, _this._config.delay);
4368
  }
4369
  };
4370
 
4371
  this._element.classList.remove(ClassName$a.HIDE);
4372
 
4373
+ Util.reflow(this._element);
4374
+
4375
  this._element.classList.add(ClassName$a.SHOWING);
4376
 
4377
  if (this._config.animation) {
4382
  }
4383
  };
4384
 
4385
+ _proto.hide = function hide() {
 
 
4386
  if (!this._element.classList.contains(ClassName$a.SHOW)) {
4387
  return;
4388
  }
4389
 
4390
+ var hideEvent = $.Event(Event$a.HIDE);
4391
+ $(this._element).trigger(hideEvent);
4392
 
4393
+ if (hideEvent.isDefaultPrevented()) {
4394
+ return;
 
 
 
 
4395
  }
4396
+
4397
+ this._close();
4398
  };
4399
 
4400
  _proto.dispose = function dispose() {
4413
  ;
4414
 
4415
  _proto._getConfig = function _getConfig(config) {
4416
+ config = _objectSpread2({}, Default$7, {}, $(this._element).data(), {}, typeof config === 'object' && config ? config : {});
4417
  Util.typeCheckConfig(NAME$a, config, this.constructor.DefaultType);
4418
  return config;
4419
  };
4420
 
4421
  _proto._setListeners = function _setListeners() {
4422
+ var _this2 = this;
4423
 
4424
  $(this._element).on(Event$a.CLICK_DISMISS, Selector$a.DATA_DISMISS, function () {
4425
+ return _this2.hide();
4426
  });
4427
  };
4428
 
4429
  _proto._close = function _close() {
4430
+ var _this3 = this;
4431
 
4432
  var complete = function complete() {
4433
+ _this3._element.classList.add(ClassName$a.HIDE);
4434
 
4435
+ $(_this3._element).trigger(Event$a.HIDDEN);
4436
  };
4437
 
4438
  this._element.classList.remove(ClassName$a.SHOW);
4502
  return Toast._jQueryInterface;
4503
  };
4504
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4505
  exports.Alert = Alert;
4506
  exports.Button = Button;
4507
  exports.Carousel = Carousel;
4513
  exports.Tab = Tab;
4514
  exports.Toast = Toast;
4515
  exports.Tooltip = Tooltip;
4516
+ exports.Util = Util;
4517
 
4518
  Object.defineProperty(exports, '__esModule', { value: true });
4519
 
4520
+ })));
4521
  //# sourceMappingURL=bootstrap.js.map
resources/js/bootstrap4.min.js CHANGED
@@ -1,7 +1,7 @@
1
  /*!
2
- * Bootstrap v4.3.1 (https://getbootstrap.com/)
3
  * Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
4
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
5
  */
6
- !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("jquery"),require("popper.js")):"function"==typeof define&&define.amd?define(["exports","jquery","popper.js"],e):e((t=t||self).bootstrap={},t.jQuery,t.Popper)}(this,function(t,g,u){"use strict";function i(t,e){for(var n=0;n<e.length;n++){var i=e[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}function s(t,e,n){return e&&i(t.prototype,e),n&&i(t,n),t}function l(o){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},e=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(e=e.concat(Object.getOwnPropertySymbols(r).filter(function(t){return Object.getOwnPropertyDescriptor(r,t).enumerable}))),e.forEach(function(t){var e,n,i;e=o,i=r[n=t],n in e?Object.defineProperty(e,n,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[n]=i})}return o}g=g&&g.hasOwnProperty("default")?g.default:g,u=u&&u.hasOwnProperty("default")?u.default:u;var e="transitionend";function n(t){var e=this,n=!1;return g(this).one(_.TRANSITION_END,function(){n=!0}),setTimeout(function(){n||_.triggerTransitionEnd(e)},t),this}var _={TRANSITION_END:"bsTransitionEnd",getUID:function(t){for(;t+=~~(1e6*Math.random()),document.getElementById(t););return t},getSelectorFromElement:function(t){var e=t.getAttribute("data-target");if(!e||"#"===e){var n=t.getAttribute("href");e=n&&"#"!==n?n.trim():""}try{return document.querySelector(e)?e:null}catch(t){return null}},getTransitionDurationFromElement:function(t){if(!t)return 0;var e=g(t).css("transition-duration"),n=g(t).css("transition-delay"),i=parseFloat(e),o=parseFloat(n);return i||o?(e=e.split(",")[0],n=n.split(",")[0],1e3*(parseFloat(e)+parseFloat(n))):0},reflow:function(t){return t.offsetHeight},triggerTransitionEnd:function(t){g(t).trigger(e)},supportsTransitionEnd:function(){return Boolean(e)},isElement:function(t){return(t[0]||t).nodeType},typeCheckConfig:function(t,e,n){for(var i in n)if(Object.prototype.hasOwnProperty.call(n,i)){var o=n[i],r=e[i],s=r&&_.isElement(r)?"element":(a=r,{}.toString.call(a).match(/\s([a-z]+)/i)[1].toLowerCase());if(!new RegExp(o).test(s))throw new Error(t.toUpperCase()+': Option "'+i+'" provided type "'+s+'" but expected type "'+o+'".')}var a},findShadowRoot:function(t){if(!document.documentElement.attachShadow)return null;if("function"!=typeof t.getRootNode)return t instanceof ShadowRoot?t:t.parentNode?_.findShadowRoot(t.parentNode):null;var e=t.getRootNode();return e instanceof ShadowRoot?e:null}};g.fn.emulateTransitionEnd=n,g.event.special[_.TRANSITION_END]={bindType:e,delegateType:e,handle:function(t){if(g(t.target).is(this))return t.handleObj.handler.apply(this,arguments)}};var o="alert",r="bs.alert",a="."+r,c=g.fn[o],h={CLOSE:"close"+a,CLOSED:"closed"+a,CLICK_DATA_API:"click"+a+".data-api"},f="alert",d="fade",m="show",p=function(){function i(t){this._element=t}var t=i.prototype;return t.close=function(t){var e=this._element;t&&(e=this._getRootElement(t)),this._triggerCloseEvent(e).isDefaultPrevented()||this._removeElement(e)},t.dispose=function(){g.removeData(this._element,r),this._element=null},t._getRootElement=function(t){var e=_.getSelectorFromElement(t),n=!1;return e&&(n=document.querySelector(e)),n||(n=g(t).closest("."+f)[0]),n},t._triggerCloseEvent=function(t){var e=g.Event(h.CLOSE);return g(t).trigger(e),e},t._removeElement=function(e){var n=this;if(g(e).removeClass(m),g(e).hasClass(d)){var t=_.getTransitionDurationFromElement(e);g(e).one(_.TRANSITION_END,function(t){return n._destroyElement(e,t)}).emulateTransitionEnd(t)}else this._destroyElement(e)},t._destroyElement=function(t){g(t).detach().trigger(h.CLOSED).remove()},i._jQueryInterface=function(n){return this.each(function(){var t=g(this),e=t.data(r);e||(e=new i(this),t.data(r,e)),"close"===n&&e[n](this)})},i._handleDismiss=function(e){return function(t){t&&t.preventDefault(),e.close(this)}},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}}]),i}();g(document).on(h.CLICK_DATA_API,'[data-dismiss="alert"]',p._handleDismiss(new p)),g.fn[o]=p._jQueryInterface,g.fn[o].Constructor=p,g.fn[o].noConflict=function(){return g.fn[o]=c,p._jQueryInterface};var v="button",y="bs.button",E="."+y,C=".data-api",T=g.fn[v],S="active",b="btn",I="focus",D='[data-toggle^="button"]',w='[data-toggle="buttons"]',A='input:not([type="hidden"])',N=".active",O=".btn",k={CLICK_DATA_API:"click"+E+C,FOCUS_BLUR_DATA_API:"focus"+E+C+" blur"+E+C},P=function(){function n(t){this._element=t}var t=n.prototype;return t.toggle=function(){var t=!0,e=!0,n=g(this._element).closest(w)[0];if(n){var i=this._element.querySelector(A);if(i){if("radio"===i.type)if(i.checked&&this._element.classList.contains(S))t=!1;else{var o=n.querySelector(N);o&&g(o).removeClass(S)}if(t){if(i.hasAttribute("disabled")||n.hasAttribute("disabled")||i.classList.contains("disabled")||n.classList.contains("disabled"))return;i.checked=!this._element.classList.contains(S),g(i).trigger("change")}i.focus(),e=!1}}e&&this._element.setAttribute("aria-pressed",!this._element.classList.contains(S)),t&&g(this._element).toggleClass(S)},t.dispose=function(){g.removeData(this._element,y),this._element=null},n._jQueryInterface=function(e){return this.each(function(){var t=g(this).data(y);t||(t=new n(this),g(this).data(y,t)),"toggle"===e&&t[e]()})},s(n,null,[{key:"VERSION",get:function(){return"4.3.1"}}]),n}();g(document).on(k.CLICK_DATA_API,D,function(t){t.preventDefault();var e=t.target;g(e).hasClass(b)||(e=g(e).closest(O)),P._jQueryInterface.call(g(e),"toggle")}).on(k.FOCUS_BLUR_DATA_API,D,function(t){var e=g(t.target).closest(O)[0];g(e).toggleClass(I,/^focus(in)?$/.test(t.type))}),g.fn[v]=P._jQueryInterface,g.fn[v].Constructor=P,g.fn[v].noConflict=function(){return g.fn[v]=T,P._jQueryInterface};var L="carousel",j="bs.carousel",H="."+j,R=".data-api",x=g.fn[L],F={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0,touch:!0},U={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean",touch:"boolean"},W="next",q="prev",M="left",K="right",Q={SLIDE:"slide"+H,SLID:"slid"+H,KEYDOWN:"keydown"+H,MOUSEENTER:"mouseenter"+H,MOUSELEAVE:"mouseleave"+H,TOUCHSTART:"touchstart"+H,TOUCHMOVE:"touchmove"+H,TOUCHEND:"touchend"+H,POINTERDOWN:"pointerdown"+H,POINTERUP:"pointerup"+H,DRAG_START:"dragstart"+H,LOAD_DATA_API:"load"+H+R,CLICK_DATA_API:"click"+H+R},B="carousel",V="active",Y="slide",z="carousel-item-right",X="carousel-item-left",$="carousel-item-next",G="carousel-item-prev",J="pointer-event",Z=".active",tt=".active.carousel-item",et=".carousel-item",nt=".carousel-item img",it=".carousel-item-next, .carousel-item-prev",ot=".carousel-indicators",rt="[data-slide], [data-slide-to]",st='[data-ride="carousel"]',at={TOUCH:"touch",PEN:"pen"},lt=function(){function r(t,e){this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this.touchStartX=0,this.touchDeltaX=0,this._config=this._getConfig(e),this._element=t,this._indicatorsElement=this._element.querySelector(ot),this._touchSupported="ontouchstart"in document.documentElement||0<navigator.maxTouchPoints,this._pointerEvent=Boolean(window.PointerEvent||window.MSPointerEvent),this._addEventListeners()}var t=r.prototype;return t.next=function(){this._isSliding||this._slide(W)},t.nextWhenVisible=function(){!document.hidden&&g(this._element).is(":visible")&&"hidden"!==g(this._element).css("visibility")&&this.next()},t.prev=function(){this._isSliding||this._slide(q)},t.pause=function(t){t||(this._isPaused=!0),this._element.querySelector(it)&&(_.triggerTransitionEnd(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},t.cycle=function(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config.interval&&!this._isPaused&&(this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},t.to=function(t){var e=this;this._activeElement=this._element.querySelector(tt);var n=this._getItemIndex(this._activeElement);if(!(t>this._items.length-1||t<0))if(this._isSliding)g(this._element).one(Q.SLID,function(){return e.to(t)});else{if(n===t)return this.pause(),void this.cycle();var i=n<t?W:q;this._slide(i,this._items[t])}},t.dispose=function(){g(this._element).off(H),g.removeData(this._element,j),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},t._getConfig=function(t){return t=l({},F,t),_.typeCheckConfig(L,t,U),t},t._handleSwipe=function(){var t=Math.abs(this.touchDeltaX);if(!(t<=40)){var e=t/this.touchDeltaX;0<e&&this.prev(),e<0&&this.next()}},t._addEventListeners=function(){var e=this;this._config.keyboard&&g(this._element).on(Q.KEYDOWN,function(t){return e._keydown(t)}),"hover"===this._config.pause&&g(this._element).on(Q.MOUSEENTER,function(t){return e.pause(t)}).on(Q.MOUSELEAVE,function(t){return e.cycle(t)}),this._config.touch&&this._addTouchEventListeners()},t._addTouchEventListeners=function(){var n=this;if(this._touchSupported){var e=function(t){n._pointerEvent&&at[t.originalEvent.pointerType.toUpperCase()]?n.touchStartX=t.originalEvent.clientX:n._pointerEvent||(n.touchStartX=t.originalEvent.touches[0].clientX)},i=function(t){n._pointerEvent&&at[t.originalEvent.pointerType.toUpperCase()]&&(n.touchDeltaX=t.originalEvent.clientX-n.touchStartX),n._handleSwipe(),"hover"===n._config.pause&&(n.pause(),n.touchTimeout&&clearTimeout(n.touchTimeout),n.touchTimeout=setTimeout(function(t){return n.cycle(t)},500+n._config.interval))};g(this._element.querySelectorAll(nt)).on(Q.DRAG_START,function(t){return t.preventDefault()}),this._pointerEvent?(g(this._element).on(Q.POINTERDOWN,function(t){return e(t)}),g(this._element).on(Q.POINTERUP,function(t){return i(t)}),this._element.classList.add(J)):(g(this._element).on(Q.TOUCHSTART,function(t){return e(t)}),g(this._element).on(Q.TOUCHMOVE,function(t){var e;(e=t).originalEvent.touches&&1<e.originalEvent.touches.length?n.touchDeltaX=0:n.touchDeltaX=e.originalEvent.touches[0].clientX-n.touchStartX}),g(this._element).on(Q.TOUCHEND,function(t){return i(t)}))}},t._keydown=function(t){if(!/input|textarea/i.test(t.target.tagName))switch(t.which){case 37:t.preventDefault(),this.prev();break;case 39:t.preventDefault(),this.next()}},t._getItemIndex=function(t){return this._items=t&&t.parentNode?[].slice.call(t.parentNode.querySelectorAll(et)):[],this._items.indexOf(t)},t._getItemByDirection=function(t,e){var n=t===W,i=t===q,o=this._getItemIndex(e),r=this._items.length-1;if((i&&0===o||n&&o===r)&&!this._config.wrap)return e;var s=(o+(t===q?-1:1))%this._items.length;return-1===s?this._items[this._items.length-1]:this._items[s]},t._triggerSlideEvent=function(t,e){var n=this._getItemIndex(t),i=this._getItemIndex(this._element.querySelector(tt)),o=g.Event(Q.SLIDE,{relatedTarget:t,direction:e,from:i,to:n});return g(this._element).trigger(o),o},t._setActiveIndicatorElement=function(t){if(this._indicatorsElement){var e=[].slice.call(this._indicatorsElement.querySelectorAll(Z));g(e).removeClass(V);var n=this._indicatorsElement.children[this._getItemIndex(t)];n&&g(n).addClass(V)}},t._slide=function(t,e){var n,i,o,r=this,s=this._element.querySelector(tt),a=this._getItemIndex(s),l=e||s&&this._getItemByDirection(t,s),c=this._getItemIndex(l),h=Boolean(this._interval);if(o=t===W?(n=X,i=$,M):(n=z,i=G,K),l&&g(l).hasClass(V))this._isSliding=!1;else if(!this._triggerSlideEvent(l,o).isDefaultPrevented()&&s&&l){this._isSliding=!0,h&&this.pause(),this._setActiveIndicatorElement(l);var u=g.Event(Q.SLID,{relatedTarget:l,direction:o,from:a,to:c});if(g(this._element).hasClass(Y)){g(l).addClass(i),_.reflow(l),g(s).addClass(n),g(l).addClass(n);var f=parseInt(l.getAttribute("data-interval"),10);this._config.interval=f?(this._config.defaultInterval=this._config.defaultInterval||this._config.interval,f):this._config.defaultInterval||this._config.interval;var d=_.getTransitionDurationFromElement(s);g(s).one(_.TRANSITION_END,function(){g(l).removeClass(n+" "+i).addClass(V),g(s).removeClass(V+" "+i+" "+n),r._isSliding=!1,setTimeout(function(){return g(r._element).trigger(u)},0)}).emulateTransitionEnd(d)}else g(s).removeClass(V),g(l).addClass(V),this._isSliding=!1,g(this._element).trigger(u);h&&this.cycle()}},r._jQueryInterface=function(i){return this.each(function(){var t=g(this).data(j),e=l({},F,g(this).data());"object"==typeof i&&(e=l({},e,i));var n="string"==typeof i?i:e.slide;if(t||(t=new r(this,e),g(this).data(j,t)),"number"==typeof i)t.to(i);else if("string"==typeof n){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n]()}else e.interval&&e.ride&&(t.pause(),t.cycle())})},r._dataApiClickHandler=function(t){var e=_.getSelectorFromElement(this);if(e){var n=g(e)[0];if(n&&g(n).hasClass(B)){var i=l({},g(n).data(),g(this).data()),o=this.getAttribute("data-slide-to");o&&(i.interval=!1),r._jQueryInterface.call(g(n),i),o&&g(n).data(j).to(o),t.preventDefault()}}},s(r,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return F}}]),r}();g(document).on(Q.CLICK_DATA_API,rt,lt._dataApiClickHandler),g(window).on(Q.LOAD_DATA_API,function(){for(var t=[].slice.call(document.querySelectorAll(st)),e=0,n=t.length;e<n;e++){var i=g(t[e]);lt._jQueryInterface.call(i,i.data())}}),g.fn[L]=lt._jQueryInterface,g.fn[L].Constructor=lt,g.fn[L].noConflict=function(){return g.fn[L]=x,lt._jQueryInterface};var ct="collapse",ht="bs.collapse",ut="."+ht,ft=g.fn[ct],dt={toggle:!0,parent:""},gt={toggle:"boolean",parent:"(string|element)"},_t={SHOW:"show"+ut,SHOWN:"shown"+ut,HIDE:"hide"+ut,HIDDEN:"hidden"+ut,CLICK_DATA_API:"click"+ut+".data-api"},mt="show",pt="collapse",vt="collapsing",yt="collapsed",Et="width",Ct="height",Tt=".show, .collapsing",St='[data-toggle="collapse"]',bt=function(){function a(e,t){this._isTransitioning=!1,this._element=e,this._config=this._getConfig(t),this._triggerArray=[].slice.call(document.querySelectorAll('[data-toggle="collapse"][href="#'+e.id+'"],[data-toggle="collapse"][data-target="#'+e.id+'"]'));for(var n=[].slice.call(document.querySelectorAll(St)),i=0,o=n.length;i<o;i++){var r=n[i],s=_.getSelectorFromElement(r),a=[].slice.call(document.querySelectorAll(s)).filter(function(t){return t===e});null!==s&&0<a.length&&(this._selector=s,this._triggerArray.push(r))}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}var t=a.prototype;return t.toggle=function(){g(this._element).hasClass(mt)?this.hide():this.show()},t.show=function(){var t,e,n=this;if(!this._isTransitioning&&!g(this._element).hasClass(mt)&&(this._parent&&0===(t=[].slice.call(this._parent.querySelectorAll(Tt)).filter(function(t){return"string"==typeof n._config.parent?t.getAttribute("data-parent")===n._config.parent:t.classList.contains(pt)})).length&&(t=null),!(t&&(e=g(t).not(this._selector).data(ht))&&e._isTransitioning))){var i=g.Event(_t.SHOW);if(g(this._element).trigger(i),!i.isDefaultPrevented()){t&&(a._jQueryInterface.call(g(t).not(this._selector),"hide"),e||g(t).data(ht,null));var o=this._getDimension();g(this._element).removeClass(pt).addClass(vt),this._element.style[o]=0,this._triggerArray.length&&g(this._triggerArray).removeClass(yt).attr("aria-expanded",!0),this.setTransitioning(!0);var r="scroll"+(o[0].toUpperCase()+o.slice(1)),s=_.getTransitionDurationFromElement(this._element);g(this._element).one(_.TRANSITION_END,function(){g(n._element).removeClass(vt).addClass(pt).addClass(mt),n._element.style[o]="",n.setTransitioning(!1),g(n._element).trigger(_t.SHOWN)}).emulateTransitionEnd(s),this._element.style[o]=this._element[r]+"px"}}},t.hide=function(){var t=this;if(!this._isTransitioning&&g(this._element).hasClass(mt)){var e=g.Event(_t.HIDE);if(g(this._element).trigger(e),!e.isDefaultPrevented()){var n=this._getDimension();this._element.style[n]=this._element.getBoundingClientRect()[n]+"px",_.reflow(this._element),g(this._element).addClass(vt).removeClass(pt).removeClass(mt);var i=this._triggerArray.length;if(0<i)for(var o=0;o<i;o++){var r=this._triggerArray[o],s=_.getSelectorFromElement(r);if(null!==s)g([].slice.call(document.querySelectorAll(s))).hasClass(mt)||g(r).addClass(yt).attr("aria-expanded",!1)}this.setTransitioning(!0);this._element.style[n]="";var a=_.getTransitionDurationFromElement(this._element);g(this._element).one(_.TRANSITION_END,function(){t.setTransitioning(!1),g(t._element).removeClass(vt).addClass(pt).trigger(_t.HIDDEN)}).emulateTransitionEnd(a)}}},t.setTransitioning=function(t){this._isTransitioning=t},t.dispose=function(){g.removeData(this._element,ht),this._config=null,this._parent=null,this._element=null,this._triggerArray=null,this._isTransitioning=null},t._getConfig=function(t){return(t=l({},dt,t)).toggle=Boolean(t.toggle),_.typeCheckConfig(ct,t,gt),t},t._getDimension=function(){return g(this._element).hasClass(Et)?Et:Ct},t._getParent=function(){var t,n=this;_.isElement(this._config.parent)?(t=this._config.parent,"undefined"!=typeof this._config.parent.jquery&&(t=this._config.parent[0])):t=document.querySelector(this._config.parent);var e='[data-toggle="collapse"][data-parent="'+this._config.parent+'"]',i=[].slice.call(t.querySelectorAll(e));return g(i).each(function(t,e){n._addAriaAndCollapsedClass(a._getTargetFromElement(e),[e])}),t},t._addAriaAndCollapsedClass=function(t,e){var n=g(t).hasClass(mt);e.length&&g(e).toggleClass(yt,!n).attr("aria-expanded",n)},a._getTargetFromElement=function(t){var e=_.getSelectorFromElement(t);return e?document.querySelector(e):null},a._jQueryInterface=function(i){return this.each(function(){var t=g(this),e=t.data(ht),n=l({},dt,t.data(),"object"==typeof i&&i?i:{});if(!e&&n.toggle&&/show|hide/.test(i)&&(n.toggle=!1),e||(e=new a(this,n),t.data(ht,e)),"string"==typeof i){if("undefined"==typeof e[i])throw new TypeError('No method named "'+i+'"');e[i]()}})},s(a,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return dt}}]),a}();g(document).on(_t.CLICK_DATA_API,St,function(t){"A"===t.currentTarget.tagName&&t.preventDefault();var n=g(this),e=_.getSelectorFromElement(this),i=[].slice.call(document.querySelectorAll(e));g(i).each(function(){var t=g(this),e=t.data(ht)?"toggle":n.data();bt._jQueryInterface.call(t,e)})}),g.fn[ct]=bt._jQueryInterface,g.fn[ct].Constructor=bt,g.fn[ct].noConflict=function(){return g.fn[ct]=ft,bt._jQueryInterface};var It="dropdown",Dt="bs.dropdown",wt="."+Dt,At=".data-api",Nt=g.fn[It],Ot=new RegExp("38|40|27"),kt={HIDE:"hide"+wt,HIDDEN:"hidden"+wt,SHOW:"show"+wt,SHOWN:"shown"+wt,CLICK:"click"+wt,CLICK_DATA_API:"click"+wt+At,KEYDOWN_DATA_API:"keydown"+wt+At,KEYUP_DATA_API:"keyup"+wt+At},Pt="disabled",Lt="show",jt="dropup",Ht="dropright",Rt="dropleft",xt="dropdown-menu-right",Ft="position-static",Ut='[data-toggle="dropdown"]',Wt=".dropdown form",qt=".dropdown-menu",Mt=".navbar-nav",Kt=".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",Qt="top-start",Bt="top-end",Vt="bottom-start",Yt="bottom-end",zt="right-start",Xt="left-start",$t={offset:0,flip:!0,boundary:"scrollParent",reference:"toggle",display:"dynamic"},Gt={offset:"(number|string|function)",flip:"boolean",boundary:"(string|element)",reference:"(string|element)",display:"string"},Jt=function(){function c(t,e){this._element=t,this._popper=null,this._config=this._getConfig(e),this._menu=this._getMenuElement(),this._inNavbar=this._detectNavbar(),this._addEventListeners()}var t=c.prototype;return t.toggle=function(){if(!this._element.disabled&&!g(this._element).hasClass(Pt)){var t=c._getParentFromElement(this._element),e=g(this._menu).hasClass(Lt);if(c._clearMenus(),!e){var n={relatedTarget:this._element},i=g.Event(kt.SHOW,n);if(g(t).trigger(i),!i.isDefaultPrevented()){if(!this._inNavbar){if("undefined"==typeof u)throw new TypeError("Bootstrap's dropdowns require Popper.js (https://popper.js.org/)");var o=this._element;"parent"===this._config.reference?o=t:_.isElement(this._config.reference)&&(o=this._config.reference,"undefined"!=typeof this._config.reference.jquery&&(o=this._config.reference[0])),"scrollParent"!==this._config.boundary&&g(t).addClass(Ft),this._popper=new u(o,this._menu,this._getPopperConfig())}"ontouchstart"in document.documentElement&&0===g(t).closest(Mt).length&&g(document.body).children().on("mouseover",null,g.noop),this._element.focus(),this._element.setAttribute("aria-expanded",!0),g(this._menu).toggleClass(Lt),g(t).toggleClass(Lt).trigger(g.Event(kt.SHOWN,n))}}}},t.show=function(){if(!(this._element.disabled||g(this._element).hasClass(Pt)||g(this._menu).hasClass(Lt))){var t={relatedTarget:this._element},e=g.Event(kt.SHOW,t),n=c._getParentFromElement(this._element);g(n).trigger(e),e.isDefaultPrevented()||(g(this._menu).toggleClass(Lt),g(n).toggleClass(Lt).trigger(g.Event(kt.SHOWN,t)))}},t.hide=function(){if(!this._element.disabled&&!g(this._element).hasClass(Pt)&&g(this._menu).hasClass(Lt)){var t={relatedTarget:this._element},e=g.Event(kt.HIDE,t),n=c._getParentFromElement(this._element);g(n).trigger(e),e.isDefaultPrevented()||(g(this._menu).toggleClass(Lt),g(n).toggleClass(Lt).trigger(g.Event(kt.HIDDEN,t)))}},t.dispose=function(){g.removeData(this._element,Dt),g(this._element).off(wt),this._element=null,(this._menu=null)!==this._popper&&(this._popper.destroy(),this._popper=null)},t.update=function(){this._inNavbar=this._detectNavbar(),null!==this._popper&&this._popper.scheduleUpdate()},t._addEventListeners=function(){var e=this;g(this._element).on(kt.CLICK,function(t){t.preventDefault(),t.stopPropagation(),e.toggle()})},t._getConfig=function(t){return t=l({},this.constructor.Default,g(this._element).data(),t),_.typeCheckConfig(It,t,this.constructor.DefaultType),t},t._getMenuElement=function(){if(!this._menu){var t=c._getParentFromElement(this._element);t&&(this._menu=t.querySelector(qt))}return this._menu},t._getPlacement=function(){var t=g(this._element.parentNode),e=Vt;return t.hasClass(jt)?(e=Qt,g(this._menu).hasClass(xt)&&(e=Bt)):t.hasClass(Ht)?e=zt:t.hasClass(Rt)?e=Xt:g(this._menu).hasClass(xt)&&(e=Yt),e},t._detectNavbar=function(){return 0<g(this._element).closest(".navbar").length},t._getOffset=function(){var e=this,t={};return"function"==typeof this._config.offset?t.fn=function(t){return t.offsets=l({},t.offsets,e._config.offset(t.offsets,e._element)||{}),t}:t.offset=this._config.offset,t},t._getPopperConfig=function(){var t={placement:this._getPlacement(),modifiers:{offset:this._getOffset(),flip:{enabled:this._config.flip},preventOverflow:{boundariesElement:this._config.boundary}}};return"static"===this._config.display&&(t.modifiers.applyStyle={enabled:!1}),t},c._jQueryInterface=function(e){return this.each(function(){var t=g(this).data(Dt);if(t||(t=new c(this,"object"==typeof e?e:null),g(this).data(Dt,t)),"string"==typeof e){if("undefined"==typeof t[e])throw new TypeError('No method named "'+e+'"');t[e]()}})},c._clearMenus=function(t){if(!t||3!==t.which&&("keyup"!==t.type||9===t.which))for(var e=[].slice.call(document.querySelectorAll(Ut)),n=0,i=e.length;n<i;n++){var o=c._getParentFromElement(e[n]),r=g(e[n]).data(Dt),s={relatedTarget:e[n]};if(t&&"click"===t.type&&(s.clickEvent=t),r){var a=r._menu;if(g(o).hasClass(Lt)&&!(t&&("click"===t.type&&/input|textarea/i.test(t.target.tagName)||"keyup"===t.type&&9===t.which)&&g.contains(o,t.target))){var l=g.Event(kt.HIDE,s);g(o).trigger(l),l.isDefaultPrevented()||("ontouchstart"in document.documentElement&&g(document.body).children().off("mouseover",null,g.noop),e[n].setAttribute("aria-expanded","false"),g(a).removeClass(Lt),g(o).removeClass(Lt).trigger(g.Event(kt.HIDDEN,s)))}}}},c._getParentFromElement=function(t){var e,n=_.getSelectorFromElement(t);return n&&(e=document.querySelector(n)),e||t.parentNode},c._dataApiKeydownHandler=function(t){if((/input|textarea/i.test(t.target.tagName)?!(32===t.which||27!==t.which&&(40!==t.which&&38!==t.which||g(t.target).closest(qt).length)):Ot.test(t.which))&&(t.preventDefault(),t.stopPropagation(),!this.disabled&&!g(this).hasClass(Pt))){var e=c._getParentFromElement(this),n=g(e).hasClass(Lt);if(n&&(!n||27!==t.which&&32!==t.which)){var i=[].slice.call(e.querySelectorAll(Kt));if(0!==i.length){var o=i.indexOf(t.target);38===t.which&&0<o&&o--,40===t.which&&o<i.length-1&&o++,o<0&&(o=0),i[o].focus()}}else{if(27===t.which){var r=e.querySelector(Ut);g(r).trigger("focus")}g(this).trigger("click")}}},s(c,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return $t}},{key:"DefaultType",get:function(){return Gt}}]),c}();g(document).on(kt.KEYDOWN_DATA_API,Ut,Jt._dataApiKeydownHandler).on(kt.KEYDOWN_DATA_API,qt,Jt._dataApiKeydownHandler).on(kt.CLICK_DATA_API+" "+kt.KEYUP_DATA_API,Jt._clearMenus).on(kt.CLICK_DATA_API,Ut,function(t){t.preventDefault(),t.stopPropagation(),Jt._jQueryInterface.call(g(this),"toggle")}).on(kt.CLICK_DATA_API,Wt,function(t){t.stopPropagation()}),g.fn[It]=Jt._jQueryInterface,g.fn[It].Constructor=Jt,g.fn[It].noConflict=function(){return g.fn[It]=Nt,Jt._jQueryInterface};var Zt="modal",te="bs.modal",ee="."+te,ne=g.fn[Zt],ie={backdrop:!0,keyboard:!0,focus:!0,show:!0},oe={backdrop:"(boolean|string)",keyboard:"boolean",focus:"boolean",show:"boolean"},re={HIDE:"hide"+ee,HIDDEN:"hidden"+ee,SHOW:"show"+ee,SHOWN:"shown"+ee,FOCUSIN:"focusin"+ee,RESIZE:"resize"+ee,CLICK_DISMISS:"click.dismiss"+ee,KEYDOWN_DISMISS:"keydown.dismiss"+ee,MOUSEUP_DISMISS:"mouseup.dismiss"+ee,MOUSEDOWN_DISMISS:"mousedown.dismiss"+ee,CLICK_DATA_API:"click"+ee+".data-api"},se="modal-dialog-scrollable",ae="modal-scrollbar-measure",le="modal-backdrop",ce="modal-open",he="fade",ue="show",fe=".modal-dialog",de=".modal-body",ge='[data-toggle="modal"]',_e='[data-dismiss="modal"]',me=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",pe=".sticky-top",ve=function(){function o(t,e){this._config=this._getConfig(e),this._element=t,this._dialog=t.querySelector(fe),this._backdrop=null,this._isShown=!1,this._isBodyOverflowing=!1,this._ignoreBackdropClick=!1,this._isTransitioning=!1,this._scrollbarWidth=0}var t=o.prototype;return t.toggle=function(t){return this._isShown?this.hide():this.show(t)},t.show=function(t){var e=this;if(!this._isShown&&!this._isTransitioning){g(this._element).hasClass(he)&&(this._isTransitioning=!0);var n=g.Event(re.SHOW,{relatedTarget:t});g(this._element).trigger(n),this._isShown||n.isDefaultPrevented()||(this._isShown=!0,this._checkScrollbar(),this._setScrollbar(),this._adjustDialog(),this._setEscapeEvent(),this._setResizeEvent(),g(this._element).on(re.CLICK_DISMISS,_e,function(t){return e.hide(t)}),g(this._dialog).on(re.MOUSEDOWN_DISMISS,function(){g(e._element).one(re.MOUSEUP_DISMISS,function(t){g(t.target).is(e._element)&&(e._ignoreBackdropClick=!0)})}),this._showBackdrop(function(){return e._showElement(t)}))}},t.hide=function(t){var e=this;if(t&&t.preventDefault(),this._isShown&&!this._isTransitioning){var n=g.Event(re.HIDE);if(g(this._element).trigger(n),this._isShown&&!n.isDefaultPrevented()){this._isShown=!1;var i=g(this._element).hasClass(he);if(i&&(this._isTransitioning=!0),this._setEscapeEvent(),this._setResizeEvent(),g(document).off(re.FOCUSIN),g(this._element).removeClass(ue),g(this._element).off(re.CLICK_DISMISS),g(this._dialog).off(re.MOUSEDOWN_DISMISS),i){var o=_.getTransitionDurationFromElement(this._element);g(this._element).one(_.TRANSITION_END,function(t){return e._hideModal(t)}).emulateTransitionEnd(o)}else this._hideModal()}}},t.dispose=function(){[window,this._element,this._dialog].forEach(function(t){return g(t).off(ee)}),g(document).off(re.FOCUSIN),g.removeData(this._element,te),this._config=null,this._element=null,this._dialog=null,this._backdrop=null,this._isShown=null,this._isBodyOverflowing=null,this._ignoreBackdropClick=null,this._isTransitioning=null,this._scrollbarWidth=null},t.handleUpdate=function(){this._adjustDialog()},t._getConfig=function(t){return t=l({},ie,t),_.typeCheckConfig(Zt,t,oe),t},t._showElement=function(t){var e=this,n=g(this._element).hasClass(he);this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||document.body.appendChild(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),g(this._dialog).hasClass(se)?this._dialog.querySelector(de).scrollTop=0:this._element.scrollTop=0,n&&_.reflow(this._element),g(this._element).addClass(ue),this._config.focus&&this._enforceFocus();var i=g.Event(re.SHOWN,{relatedTarget:t}),o=function(){e._config.focus&&e._element.focus(),e._isTransitioning=!1,g(e._element).trigger(i)};if(n){var r=_.getTransitionDurationFromElement(this._dialog);g(this._dialog).one(_.TRANSITION_END,o).emulateTransitionEnd(r)}else o()},t._enforceFocus=function(){var e=this;g(document).off(re.FOCUSIN).on(re.FOCUSIN,function(t){document!==t.target&&e._element!==t.target&&0===g(e._element).has(t.target).length&&e._element.focus()})},t._setEscapeEvent=function(){var e=this;this._isShown&&this._config.keyboard?g(this._element).on(re.KEYDOWN_DISMISS,function(t){27===t.which&&(t.preventDefault(),e.hide())}):this._isShown||g(this._element).off(re.KEYDOWN_DISMISS)},t._setResizeEvent=function(){var e=this;this._isShown?g(window).on(re.RESIZE,function(t){return e.handleUpdate(t)}):g(window).off(re.RESIZE)},t._hideModal=function(){var t=this;this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._isTransitioning=!1,this._showBackdrop(function(){g(document.body).removeClass(ce),t._resetAdjustments(),t._resetScrollbar(),g(t._element).trigger(re.HIDDEN)})},t._removeBackdrop=function(){this._backdrop&&(g(this._backdrop).remove(),this._backdrop=null)},t._showBackdrop=function(t){var e=this,n=g(this._element).hasClass(he)?he:"";if(this._isShown&&this._config.backdrop){if(this._backdrop=document.createElement("div"),this._backdrop.className=le,n&&this._backdrop.classList.add(n),g(this._backdrop).appendTo(document.body),g(this._element).on(re.CLICK_DISMISS,function(t){e._ignoreBackdropClick?e._ignoreBackdropClick=!1:t.target===t.currentTarget&&("static"===e._config.backdrop?e._element.focus():e.hide())}),n&&_.reflow(this._backdrop),g(this._backdrop).addClass(ue),!t)return;if(!n)return void t();var i=_.getTransitionDurationFromElement(this._backdrop);g(this._backdrop).one(_.TRANSITION_END,t).emulateTransitionEnd(i)}else if(!this._isShown&&this._backdrop){g(this._backdrop).removeClass(ue);var o=function(){e._removeBackdrop(),t&&t()};if(g(this._element).hasClass(he)){var r=_.getTransitionDurationFromElement(this._backdrop);g(this._backdrop).one(_.TRANSITION_END,o).emulateTransitionEnd(r)}else o()}else t&&t()},t._adjustDialog=function(){var t=this._element.scrollHeight>document.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},t._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},t._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=t.left+t.right<window.innerWidth,this._scrollbarWidth=this._getScrollbarWidth()},t._setScrollbar=function(){var o=this;if(this._isBodyOverflowing){var t=[].slice.call(document.querySelectorAll(me)),e=[].slice.call(document.querySelectorAll(pe));g(t).each(function(t,e){var n=e.style.paddingRight,i=g(e).css("padding-right");g(e).data("padding-right",n).css("padding-right",parseFloat(i)+o._scrollbarWidth+"px")}),g(e).each(function(t,e){var n=e.style.marginRight,i=g(e).css("margin-right");g(e).data("margin-right",n).css("margin-right",parseFloat(i)-o._scrollbarWidth+"px")});var n=document.body.style.paddingRight,i=g(document.body).css("padding-right");g(document.body).data("padding-right",n).css("padding-right",parseFloat(i)+this._scrollbarWidth+"px")}g(document.body).addClass(ce)},t._resetScrollbar=function(){var t=[].slice.call(document.querySelectorAll(me));g(t).each(function(t,e){var n=g(e).data("padding-right");g(e).removeData("padding-right"),e.style.paddingRight=n||""});var e=[].slice.call(document.querySelectorAll(""+pe));g(e).each(function(t,e){var n=g(e).data("margin-right");"undefined"!=typeof n&&g(e).css("margin-right",n).removeData("margin-right")});var n=g(document.body).data("padding-right");g(document.body).removeData("padding-right"),document.body.style.paddingRight=n||""},t._getScrollbarWidth=function(){var t=document.createElement("div");t.className=ae,document.body.appendChild(t);var e=t.getBoundingClientRect().width-t.clientWidth;return document.body.removeChild(t),e},o._jQueryInterface=function(n,i){return this.each(function(){var t=g(this).data(te),e=l({},ie,g(this).data(),"object"==typeof n&&n?n:{});if(t||(t=new o(this,e),g(this).data(te,t)),"string"==typeof n){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n](i)}else e.show&&t.show(i)})},s(o,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return ie}}]),o}();g(document).on(re.CLICK_DATA_API,ge,function(t){var e,n=this,i=_.getSelectorFromElement(this);i&&(e=document.querySelector(i));var o=g(e).data(te)?"toggle":l({},g(e).data(),g(this).data());"A"!==this.tagName&&"AREA"!==this.tagName||t.preventDefault();var r=g(e).one(re.SHOW,function(t){t.isDefaultPrevented()||r.one(re.HIDDEN,function(){g(n).is(":visible")&&n.focus()})});ve._jQueryInterface.call(g(e),o,this)}),g.fn[Zt]=ve._jQueryInterface,g.fn[Zt].Constructor=ve,g.fn[Zt].noConflict=function(){return g.fn[Zt]=ne,ve._jQueryInterface};var ye=["background","cite","href","itemtype","longdesc","poster","src","xlink:href"],Ee={"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},Ce=/^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi,Te=/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i;function Se(t,s,e){if(0===t.length)return t;if(e&&"function"==typeof e)return e(t);for(var n=(new window.DOMParser).parseFromString(t,"text/html"),a=Object.keys(s),l=[].slice.call(n.body.querySelectorAll("*")),i=function(t,e){var n=l[t],i=n.nodeName.toLowerCase();if(-1===a.indexOf(n.nodeName.toLowerCase()))return n.parentNode.removeChild(n),"continue";var o=[].slice.call(n.attributes),r=[].concat(s["*"]||[],s[i]||[]);o.forEach(function(t){(function(t,e){var n=t.nodeName.toLowerCase();if(-1!==e.indexOf(n))return-1===ye.indexOf(n)||Boolean(t.nodeValue.match(Ce)||t.nodeValue.match(Te));for(var i=e.filter(function(t){return t instanceof RegExp}),o=0,r=i.length;o<r;o++)if(n.match(i[o]))return!0;return!1})(t,r)||n.removeAttribute(t.nodeName)})},o=0,r=l.length;o<r;o++)i(o);return n.body.innerHTML}var be="tooltip",Ie="bs.tooltip",De="."+Ie,we=g.fn[be],Ae="bs-tooltip",Ne=new RegExp("(^|\\s)"+Ae+"\\S+","g"),Oe=["sanitize","whiteList","sanitizeFn"],ke={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"(number|string|function)",container:"(string|element|boolean)",fallbackPlacement:"(string|array)",boundary:"(string|element)",sanitize:"boolean",sanitizeFn:"(null|function)",whiteList:"object"},Pe={AUTO:"auto",TOP:"top",RIGHT:"right",BOTTOM:"bottom",LEFT:"left"},Le={animation:!0,template:'<div class="tooltip" role="tooltip"><div class="arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent",sanitize:!0,sanitizeFn:null,whiteList:Ee},je="show",He="out",Re={HIDE:"hide"+De,HIDDEN:"hidden"+De,SHOW:"show"+De,SHOWN:"shown"+De,INSERTED:"inserted"+De,CLICK:"click"+De,FOCUSIN:"focusin"+De,FOCUSOUT:"focusout"+De,MOUSEENTER:"mouseenter"+De,MOUSELEAVE:"mouseleave"+De},xe="fade",Fe="show",Ue=".tooltip-inner",We=".arrow",qe="hover",Me="focus",Ke="click",Qe="manual",Be=function(){function i(t,e){if("undefined"==typeof u)throw new TypeError("Bootstrap's tooltips require Popper.js (https://popper.js.org/)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var t=i.prototype;return t.enable=function(){this._isEnabled=!0},t.disable=function(){this._isEnabled=!1},t.toggleEnabled=function(){this._isEnabled=!this._isEnabled},t.toggle=function(t){if(this._isEnabled)if(t){var e=this.constructor.DATA_KEY,n=g(t.currentTarget).data(e);n||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(e,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(g(this.getTipElement()).hasClass(Fe))return void this._leave(null,this);this._enter(null,this)}},t.dispose=function(){clearTimeout(this._timeout),g.removeData(this.element,this.constructor.DATA_KEY),g(this.element).off(this.constructor.EVENT_KEY),g(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&g(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,(this._activeTrigger=null)!==this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},t.show=function(){var e=this;if("none"===g(this.element).css("display"))throw new Error("Please use show on visible elements");var t=g.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){g(this.element).trigger(t);var n=_.findShadowRoot(this.element),i=g.contains(null!==n?n:this.element.ownerDocument.documentElement,this.element);if(t.isDefaultPrevented()||!i)return;var o=this.getTipElement(),r=_.getUID(this.constructor.NAME);o.setAttribute("id",r),this.element.setAttribute("aria-describedby",r),this.setContent(),this.config.animation&&g(o).addClass(xe);var s="function"==typeof this.config.placement?this.config.placement.call(this,o,this.element):this.config.placement,a=this._getAttachment(s);this.addAttachmentClass(a);var l=this._getContainer();g(o).data(this.constructor.DATA_KEY,this),g.contains(this.element.ownerDocument.documentElement,this.tip)||g(o).appendTo(l),g(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new u(this.element,o,{placement:a,modifiers:{offset:this._getOffset(),flip:{behavior:this.config.fallbackPlacement},arrow:{element:We},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){return e._handlePopperPlacementChange(t)}}),g(o).addClass(Fe),"ontouchstart"in document.documentElement&&g(document.body).children().on("mouseover",null,g.noop);var c=function(){e.config.animation&&e._fixTransition();var t=e._hoverState;e._hoverState=null,g(e.element).trigger(e.constructor.Event.SHOWN),t===He&&e._leave(null,e)};if(g(this.tip).hasClass(xe)){var h=_.getTransitionDurationFromElement(this.tip);g(this.tip).one(_.TRANSITION_END,c).emulateTransitionEnd(h)}else c()}},t.hide=function(t){var e=this,n=this.getTipElement(),i=g.Event(this.constructor.Event.HIDE),o=function(){e._hoverState!==je&&n.parentNode&&n.parentNode.removeChild(n),e._cleanTipClass(),e.element.removeAttribute("aria-describedby"),g(e.element).trigger(e.constructor.Event.HIDDEN),null!==e._popper&&e._popper.destroy(),t&&t()};if(g(this.element).trigger(i),!i.isDefaultPrevented()){if(g(n).removeClass(Fe),"ontouchstart"in document.documentElement&&g(document.body).children().off("mouseover",null,g.noop),this._activeTrigger[Ke]=!1,this._activeTrigger[Me]=!1,this._activeTrigger[qe]=!1,g(this.tip).hasClass(xe)){var r=_.getTransitionDurationFromElement(n);g(n).one(_.TRANSITION_END,o).emulateTransitionEnd(r)}else o();this._hoverState=""}},t.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},t.isWithContent=function(){return Boolean(this.getTitle())},t.addAttachmentClass=function(t){g(this.getTipElement()).addClass(Ae+"-"+t)},t.getTipElement=function(){return this.tip=this.tip||g(this.config.template)[0],this.tip},t.setContent=function(){var t=this.getTipElement();this.setElementContent(g(t.querySelectorAll(Ue)),this.getTitle()),g(t).removeClass(xe+" "+Fe)},t.setElementContent=function(t,e){"object"!=typeof e||!e.nodeType&&!e.jquery?this.config.html?(this.config.sanitize&&(e=Se(e,this.config.whiteList,this.config.sanitizeFn)),t.html(e)):t.text(e):this.config.html?g(e).parent().is(t)||t.empty().append(e):t.text(g(e).text())},t.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},t._getOffset=function(){var e=this,t={};return"function"==typeof this.config.offset?t.fn=function(t){return t.offsets=l({},t.offsets,e.config.offset(t.offsets,e.element)||{}),t}:t.offset=this.config.offset,t},t._getContainer=function(){return!1===this.config.container?document.body:_.isElement(this.config.container)?g(this.config.container):g(document).find(this.config.container)},t._getAttachment=function(t){return Pe[t.toUpperCase()]},t._setListeners=function(){var i=this;this.config.trigger.split(" ").forEach(function(t){if("click"===t)g(i.element).on(i.constructor.Event.CLICK,i.config.selector,function(t){return i.toggle(t)});else if(t!==Qe){var e=t===qe?i.constructor.Event.MOUSEENTER:i.constructor.Event.FOCUSIN,n=t===qe?i.constructor.Event.MOUSELEAVE:i.constructor.Event.FOCUSOUT;g(i.element).on(e,i.config.selector,function(t){return i._enter(t)}).on(n,i.config.selector,function(t){return i._leave(t)})}}),g(this.element).closest(".modal").on("hide.bs.modal",function(){i.element&&i.hide()}),this.config.selector?this.config=l({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},t._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},t._enter=function(t,e){var n=this.constructor.DATA_KEY;(e=e||g(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusin"===t.type?Me:qe]=!0),g(e.getTipElement()).hasClass(Fe)||e._hoverState===je?e._hoverState=je:(clearTimeout(e._timeout),e._hoverState=je,e.config.delay&&e.config.delay.show?e._timeout=setTimeout(function(){e._hoverState===je&&e.show()},e.config.delay.show):e.show())},t._leave=function(t,e){var n=this.constructor.DATA_KEY;(e=e||g(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusout"===t.type?Me:qe]=!1),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState=He,e.config.delay&&e.config.delay.hide?e._timeout=setTimeout(function(){e._hoverState===He&&e.hide()},e.config.delay.hide):e.hide())},t._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},t._getConfig=function(t){var e=g(this.element).data();return Object.keys(e).forEach(function(t){-1!==Oe.indexOf(t)&&delete e[t]}),"number"==typeof(t=l({},this.constructor.Default,e,"object"==typeof t&&t?t:{})).delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),_.typeCheckConfig(be,t,this.constructor.DefaultType),t.sanitize&&(t.template=Se(t.template,t.whiteList,t.sanitizeFn)),t},t._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},t._cleanTipClass=function(){var t=g(this.getTipElement()),e=t.attr("class").match(Ne);null!==e&&e.length&&t.removeClass(e.join(""))},t._handlePopperPlacementChange=function(t){var e=t.instance;this.tip=e.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},t._fixTransition=function(){var t=this.getTipElement(),e=this.config.animation;null===t.getAttribute("x-placement")&&(g(t).removeClass(xe),this.config.animation=!1,this.hide(),this.show(),this.config.animation=e)},i._jQueryInterface=function(n){return this.each(function(){var t=g(this).data(Ie),e="object"==typeof n&&n;if((t||!/dispose|hide/.test(n))&&(t||(t=new i(this,e),g(this).data(Ie,t)),"string"==typeof n)){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return Le}},{key:"NAME",get:function(){return be}},{key:"DATA_KEY",get:function(){return Ie}},{key:"Event",get:function(){return Re}},{key:"EVENT_KEY",get:function(){return De}},{key:"DefaultType",get:function(){return ke}}]),i}();g.fn[be]=Be._jQueryInterface,g.fn[be].Constructor=Be,g.fn[be].noConflict=function(){return g.fn[be]=we,Be._jQueryInterface};var Ve="popover",Ye="bs.popover",ze="."+Ye,Xe=g.fn[Ve],$e="bs-popover",Ge=new RegExp("(^|\\s)"+$e+"\\S+","g"),Je=l({},Be.Default,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>'}),Ze=l({},Be.DefaultType,{content:"(string|element|function)"}),tn="fade",en="show",nn=".popover-header",on=".popover-body",rn={HIDE:"hide"+ze,HIDDEN:"hidden"+ze,SHOW:"show"+ze,SHOWN:"shown"+ze,INSERTED:"inserted"+ze,CLICK:"click"+ze,FOCUSIN:"focusin"+ze,FOCUSOUT:"focusout"+ze,MOUSEENTER:"mouseenter"+ze,MOUSELEAVE:"mouseleave"+ze},sn=function(t){var e,n;function i(){return t.apply(this,arguments)||this}n=t,(e=i).prototype=Object.create(n.prototype),(e.prototype.constructor=e).__proto__=n;var o=i.prototype;return o.isWithContent=function(){return this.getTitle()||this._getContent()},o.addAttachmentClass=function(t){g(this.getTipElement()).addClass($e+"-"+t)},o.getTipElement=function(){return this.tip=this.tip||g(this.config.template)[0],this.tip},o.setContent=function(){var t=g(this.getTipElement());this.setElementContent(t.find(nn),this.getTitle());var e=this._getContent();"function"==typeof e&&(e=e.call(this.element)),this.setElementContent(t.find(on),e),t.removeClass(tn+" "+en)},o._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},o._cleanTipClass=function(){var t=g(this.getTipElement()),e=t.attr("class").match(Ge);null!==e&&0<e.length&&t.removeClass(e.join(""))},i._jQueryInterface=function(n){return this.each(function(){var t=g(this).data(Ye),e="object"==typeof n?n:null;if((t||!/dispose|hide/.test(n))&&(t||(t=new i(this,e),g(this).data(Ye,t)),"string"==typeof n)){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return Je}},{key:"NAME",get:function(){return Ve}},{key:"DATA_KEY",get:function(){return Ye}},{key:"Event",get:function(){return rn}},{key:"EVENT_KEY",get:function(){return ze}},{key:"DefaultType",get:function(){return Ze}}]),i}(Be);g.fn[Ve]=sn._jQueryInterface,g.fn[Ve].Constructor=sn,g.fn[Ve].noConflict=function(){return g.fn[Ve]=Xe,sn._jQueryInterface};var an="scrollspy",ln="bs.scrollspy",cn="."+ln,hn=g.fn[an],un={offset:10,method:"auto",target:""},fn={offset:"number",method:"string",target:"(string|element)"},dn={ACTIVATE:"activate"+cn,SCROLL:"scroll"+cn,LOAD_DATA_API:"load"+cn+".data-api"},gn="dropdown-item",_n="active",mn='[data-spy="scroll"]',pn=".nav, .list-group",vn=".nav-link",yn=".nav-item",En=".list-group-item",Cn=".dropdown",Tn=".dropdown-item",Sn=".dropdown-toggle",bn="offset",In="position",Dn=function(){function n(t,e){var n=this;this._element=t,this._scrollElement="BODY"===t.tagName?window:t,this._config=this._getConfig(e),this._selector=this._config.target+" "+vn+","+this._config.target+" "+En+","+this._config.target+" "+Tn,this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,g(this._scrollElement).on(dn.SCROLL,function(t){return n._process(t)}),this.refresh(),this._process()}var t=n.prototype;return t.refresh=function(){var e=this,t=this._scrollElement===this._scrollElement.window?bn:In,o="auto"===this._config.method?t:this._config.method,r=o===In?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),[].slice.call(document.querySelectorAll(this._selector)).map(function(t){var e,n=_.getSelectorFromElement(t);if(n&&(e=document.querySelector(n)),e){var i=e.getBoundingClientRect();if(i.width||i.height)return[g(e)[o]().top+r,n]}return null}).filter(function(t){return t}).sort(function(t,e){return t[0]-e[0]}).forEach(function(t){e._offsets.push(t[0]),e._targets.push(t[1])})},t.dispose=function(){g.removeData(this._element,ln),g(this._scrollElement).off(cn),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},t._getConfig=function(t){if("string"!=typeof(t=l({},un,"object"==typeof t&&t?t:{})).target){var e=g(t.target).attr("id");e||(e=_.getUID(an),g(t.target).attr("id",e)),t.target="#"+e}return _.typeCheckConfig(an,t,fn),t},t._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},t._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},t._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},t._process=function(){var t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),n=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),n<=t){var i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&t<this._offsets[0]&&0<this._offsets[0])return this._activeTarget=null,void this._clear();for(var o=this._offsets.length;o--;){this._activeTarget!==this._targets[o]&&t>=this._offsets[o]&&("undefined"==typeof this._offsets[o+1]||t<this._offsets[o+1])&&this._activate(this._targets[o])}}},t._activate=function(e){this._activeTarget=e,this._clear();var t=this._selector.split(",").map(function(t){return t+'[data-target="'+e+'"],'+t+'[href="'+e+'"]'}),n=g([].slice.call(document.querySelectorAll(t.join(","))));n.hasClass(gn)?(n.closest(Cn).find(Sn).addClass(_n),n.addClass(_n)):(n.addClass(_n),n.parents(pn).prev(vn+", "+En).addClass(_n),n.parents(pn).prev(yn).children(vn).addClass(_n)),g(this._scrollElement).trigger(dn.ACTIVATE,{relatedTarget:e})},t._clear=function(){[].slice.call(document.querySelectorAll(this._selector)).filter(function(t){return t.classList.contains(_n)}).forEach(function(t){return t.classList.remove(_n)})},n._jQueryInterface=function(e){return this.each(function(){var t=g(this).data(ln);if(t||(t=new n(this,"object"==typeof e&&e),g(this).data(ln,t)),"string"==typeof e){if("undefined"==typeof t[e])throw new TypeError('No method named "'+e+'"');t[e]()}})},s(n,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return un}}]),n}();g(window).on(dn.LOAD_DATA_API,function(){for(var t=[].slice.call(document.querySelectorAll(mn)),e=t.length;e--;){var n=g(t[e]);Dn._jQueryInterface.call(n,n.data())}}),g.fn[an]=Dn._jQueryInterface,g.fn[an].Constructor=Dn,g.fn[an].noConflict=function(){return g.fn[an]=hn,Dn._jQueryInterface};var wn="bs.tab",An="."+wn,Nn=g.fn.tab,On={HIDE:"hide"+An,HIDDEN:"hidden"+An,SHOW:"show"+An,SHOWN:"shown"+An,CLICK_DATA_API:"click"+An+".data-api"},kn="dropdown-menu",Pn="active",Ln="disabled",jn="fade",Hn="show",Rn=".dropdown",xn=".nav, .list-group",Fn=".active",Un="> li > .active",Wn='[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',qn=".dropdown-toggle",Mn="> .dropdown-menu .active",Kn=function(){function i(t){this._element=t}var t=i.prototype;return t.show=function(){var n=this;if(!(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&g(this._element).hasClass(Pn)||g(this._element).hasClass(Ln))){var t,i,e=g(this._element).closest(xn)[0],o=_.getSelectorFromElement(this._element);if(e){var r="UL"===e.nodeName||"OL"===e.nodeName?Un:Fn;i=(i=g.makeArray(g(e).find(r)))[i.length-1]}var s=g.Event(On.HIDE,{relatedTarget:this._element}),a=g.Event(On.SHOW,{relatedTarget:i});if(i&&g(i).trigger(s),g(this._element).trigger(a),!a.isDefaultPrevented()&&!s.isDefaultPrevented()){o&&(t=document.querySelector(o)),this._activate(this._element,e);var l=function(){var t=g.Event(On.HIDDEN,{relatedTarget:n._element}),e=g.Event(On.SHOWN,{relatedTarget:i});g(i).trigger(t),g(n._element).trigger(e)};t?this._activate(t,t.parentNode,l):l()}}},t.dispose=function(){g.removeData(this._element,wn),this._element=null},t._activate=function(t,e,n){var i=this,o=(!e||"UL"!==e.nodeName&&"OL"!==e.nodeName?g(e).children(Fn):g(e).find(Un))[0],r=n&&o&&g(o).hasClass(jn),s=function(){return i._transitionComplete(t,o,n)};if(o&&r){var a=_.getTransitionDurationFromElement(o);g(o).removeClass(Hn).one(_.TRANSITION_END,s).emulateTransitionEnd(a)}else s()},t._transitionComplete=function(t,e,n){if(e){g(e).removeClass(Pn);var i=g(e.parentNode).find(Mn)[0];i&&g(i).removeClass(Pn),"tab"===e.getAttribute("role")&&e.setAttribute("aria-selected",!1)}if(g(t).addClass(Pn),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!0),_.reflow(t),t.classList.contains(jn)&&t.classList.add(Hn),t.parentNode&&g(t.parentNode).hasClass(kn)){var o=g(t).closest(Rn)[0];if(o){var r=[].slice.call(o.querySelectorAll(qn));g(r).addClass(Pn)}t.setAttribute("aria-expanded",!0)}n&&n()},i._jQueryInterface=function(n){return this.each(function(){var t=g(this),e=t.data(wn);if(e||(e=new i(this),t.data(wn,e)),"string"==typeof n){if("undefined"==typeof e[n])throw new TypeError('No method named "'+n+'"');e[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}}]),i}();g(document).on(On.CLICK_DATA_API,Wn,function(t){t.preventDefault(),Kn._jQueryInterface.call(g(this),"show")}),g.fn.tab=Kn._jQueryInterface,g.fn.tab.Constructor=Kn,g.fn.tab.noConflict=function(){return g.fn.tab=Nn,Kn._jQueryInterface};var Qn="toast",Bn="bs.toast",Vn="."+Bn,Yn=g.fn[Qn],zn={CLICK_DISMISS:"click.dismiss"+Vn,HIDE:"hide"+Vn,HIDDEN:"hidden"+Vn,SHOW:"show"+Vn,SHOWN:"shown"+Vn},Xn="fade",$n="hide",Gn="show",Jn="showing",Zn={animation:"boolean",autohide:"boolean",delay:"number"},ti={animation:!0,autohide:!0,delay:500},ei='[data-dismiss="toast"]',ni=function(){function i(t,e){this._element=t,this._config=this._getConfig(e),this._timeout=null,this._setListeners()}var t=i.prototype;return t.show=function(){var t=this;g(this._element).trigger(zn.SHOW),this._config.animation&&this._element.classList.add(Xn);var e=function(){t._element.classList.remove(Jn),t._element.classList.add(Gn),g(t._element).trigger(zn.SHOWN),t._config.autohide&&t.hide()};if(this._element.classList.remove($n),this._element.classList.add(Jn),this._config.animation){var n=_.getTransitionDurationFromElement(this._element);g(this._element).one(_.TRANSITION_END,e).emulateTransitionEnd(n)}else e()},t.hide=function(t){var e=this;this._element.classList.contains(Gn)&&(g(this._element).trigger(zn.HIDE),t?this._close():this._timeout=setTimeout(function(){e._close()},this._config.delay))},t.dispose=function(){clearTimeout(this._timeout),this._timeout=null,this._element.classList.contains(Gn)&&this._element.classList.remove(Gn),g(this._element).off(zn.CLICK_DISMISS),g.removeData(this._element,Bn),this._element=null,this._config=null},t._getConfig=function(t){return t=l({},ti,g(this._element).data(),"object"==typeof t&&t?t:{}),_.typeCheckConfig(Qn,t,this.constructor.DefaultType),t},t._setListeners=function(){var t=this;g(this._element).on(zn.CLICK_DISMISS,ei,function(){return t.hide(!0)})},t._close=function(){var t=this,e=function(){t._element.classList.add($n),g(t._element).trigger(zn.HIDDEN)};if(this._element.classList.remove(Gn),this._config.animation){var n=_.getTransitionDurationFromElement(this._element);g(this._element).one(_.TRANSITION_END,e).emulateTransitionEnd(n)}else e()},i._jQueryInterface=function(n){return this.each(function(){var t=g(this),e=t.data(Bn);if(e||(e=new i(this,"object"==typeof n&&n),t.data(Bn,e)),"string"==typeof n){if("undefined"==typeof e[n])throw new TypeError('No method named "'+n+'"');e[n](this)}})},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"DefaultType",get:function(){return Zn}},{key:"Default",get:function(){return ti}}]),i}();g.fn[Qn]=ni._jQueryInterface,g.fn[Qn].Constructor=ni,g.fn[Qn].noConflict=function(){return g.fn[Qn]=Yn,ni._jQueryInterface},function(){if("undefined"==typeof g)throw new TypeError("Bootstrap's JavaScript requires jQuery. jQuery must be included before Bootstrap's JavaScript.");var t=g.fn.jquery.split(" ")[0].split(".");if(t[0]<2&&t[1]<9||1===t[0]&&9===t[1]&&t[2]<1||4<=t[0])throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}(),t.Util=_,t.Alert=p,t.Button=P,t.Carousel=lt,t.Collapse=bt,t.Dropdown=Jt,t.Modal=ve,t.Popover=sn,t.Scrollspy=Dn,t.Tab=Kn,t.Toast=ni,t.Tooltip=Be,Object.defineProperty(t,"__esModule",{value:!0})});
7
  //# sourceMappingURL=bootstrap.min.js.map
1
  /*!
2
+ * Bootstrap v4.4.1 (https://getbootstrap.com/)
3
  * Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
4
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
5
  */
6
+ !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("jquery"),require("popper.js")):"function"==typeof define&&define.amd?define(["exports","jquery","popper.js"],e):e((t=t||self).bootstrap={},t.jQuery,t.Popper)}(this,function(t,g,u){"use strict";function i(t,e){for(var n=0;n<e.length;n++){var i=e[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}function s(t,e,n){return e&&i(t.prototype,e),n&&i(t,n),t}function e(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,i)}return n}function l(o){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?e(Object(r),!0).forEach(function(t){var e,n,i;e=o,i=r[n=t],n in e?Object.defineProperty(e,n,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[n]=i}):Object.getOwnPropertyDescriptors?Object.defineProperties(o,Object.getOwnPropertyDescriptors(r)):e(Object(r)).forEach(function(t){Object.defineProperty(o,t,Object.getOwnPropertyDescriptor(r,t))})}return o}g=g&&g.hasOwnProperty("default")?g.default:g,u=u&&u.hasOwnProperty("default")?u.default:u;var n="transitionend";function o(t){var e=this,n=!1;return g(this).one(_.TRANSITION_END,function(){n=!0}),setTimeout(function(){n||_.triggerTransitionEnd(e)},t),this}var _={TRANSITION_END:"bsTransitionEnd",getUID:function(t){for(;t+=~~(1e6*Math.random()),document.getElementById(t););return t},getSelectorFromElement:function(t){var e=t.getAttribute("data-target");if(!e||"#"===e){var n=t.getAttribute("href");e=n&&"#"!==n?n.trim():""}try{return document.querySelector(e)?e:null}catch(t){return null}},getTransitionDurationFromElement:function(t){if(!t)return 0;var e=g(t).css("transition-duration"),n=g(t).css("transition-delay"),i=parseFloat(e),o=parseFloat(n);return i||o?(e=e.split(",")[0],n=n.split(",")[0],1e3*(parseFloat(e)+parseFloat(n))):0},reflow:function(t){return t.offsetHeight},triggerTransitionEnd:function(t){g(t).trigger(n)},supportsTransitionEnd:function(){return Boolean(n)},isElement:function(t){return(t[0]||t).nodeType},typeCheckConfig:function(t,e,n){for(var i in n)if(Object.prototype.hasOwnProperty.call(n,i)){var o=n[i],r=e[i],s=r&&_.isElement(r)?"element":(a=r,{}.toString.call(a).match(/\s([a-z]+)/i)[1].toLowerCase());if(!new RegExp(o).test(s))throw new Error(t.toUpperCase()+': Option "'+i+'" provided type "'+s+'" but expected type "'+o+'".')}var a},findShadowRoot:function(t){if(!document.documentElement.attachShadow)return null;if("function"!=typeof t.getRootNode)return t instanceof ShadowRoot?t:t.parentNode?_.findShadowRoot(t.parentNode):null;var e=t.getRootNode();return e instanceof ShadowRoot?e:null},jQueryDetection:function(){if("undefined"==typeof g)throw new TypeError("Bootstrap's JavaScript requires jQuery. jQuery must be included before Bootstrap's JavaScript.");var t=g.fn.jquery.split(" ")[0].split(".");if(t[0]<2&&t[1]<9||1===t[0]&&9===t[1]&&t[2]<1||4<=t[0])throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}};_.jQueryDetection(),g.fn.emulateTransitionEnd=o,g.event.special[_.TRANSITION_END]={bindType:n,delegateType:n,handle:function(t){if(g(t.target).is(this))return t.handleObj.handler.apply(this,arguments)}};var r="alert",a="bs.alert",c="."+a,h=g.fn[r],f={CLOSE:"close"+c,CLOSED:"closed"+c,CLICK_DATA_API:"click"+c+".data-api"},d="alert",m="fade",p="show",v=function(){function i(t){this._element=t}var t=i.prototype;return t.close=function(t){var e=this._element;t&&(e=this._getRootElement(t)),this._triggerCloseEvent(e).isDefaultPrevented()||this._removeElement(e)},t.dispose=function(){g.removeData(this._element,a),this._element=null},t._getRootElement=function(t){var e=_.getSelectorFromElement(t),n=!1;return e&&(n=document.querySelector(e)),n=n||g(t).closest("."+d)[0]},t._triggerCloseEvent=function(t){var e=g.Event(f.CLOSE);return g(t).trigger(e),e},t._removeElement=function(e){var n=this;if(g(e).removeClass(p),g(e).hasClass(m)){var t=_.getTransitionDurationFromElement(e);g(e).one(_.TRANSITION_END,function(t){return n._destroyElement(e,t)}).emulateTransitionEnd(t)}else this._destroyElement(e)},t._destroyElement=function(t){g(t).detach().trigger(f.CLOSED).remove()},i._jQueryInterface=function(n){return this.each(function(){var t=g(this),e=t.data(a);e||(e=new i(this),t.data(a,e)),"close"===n&&e[n](this)})},i._handleDismiss=function(e){return function(t){t&&t.preventDefault(),e.close(this)}},s(i,null,[{key:"VERSION",get:function(){return"4.4.1"}}]),i}();g(document).on(f.CLICK_DATA_API,'[data-dismiss="alert"]',v._handleDismiss(new v)),g.fn[r]=v._jQueryInterface,g.fn[r].Constructor=v,g.fn[r].noConflict=function(){return g.fn[r]=h,v._jQueryInterface};var y="button",E="bs.button",C="."+E,T=".data-api",b=g.fn[y],S="active",D="btn",I="focus",w='[data-toggle^="button"]',A='[data-toggle="buttons"]',N='[data-toggle="button"]',O='[data-toggle="buttons"] .btn',k='input:not([type="hidden"])',P=".active",L=".btn",j={CLICK_DATA_API:"click"+C+T,FOCUS_BLUR_DATA_API:"focus"+C+T+" blur"+C+T,LOAD_DATA_API:"load"+C+T},H=function(){function n(t){this._element=t}var t=n.prototype;return t.toggle=function(){var t=!0,e=!0,n=g(this._element).closest(A)[0];if(n){var i=this._element.querySelector(k);if(i){if("radio"===i.type)if(i.checked&&this._element.classList.contains(S))t=!1;else{var o=n.querySelector(P);o&&g(o).removeClass(S)}else"checkbox"===i.type?"LABEL"===this._element.tagName&&i.checked===this._element.classList.contains(S)&&(t=!1):t=!1;t&&(i.checked=!this._element.classList.contains(S),g(i).trigger("change")),i.focus(),e=!1}}this._element.hasAttribute("disabled")||this._element.classList.contains("disabled")||(e&&this._element.setAttribute("aria-pressed",!this._element.classList.contains(S)),t&&g(this._element).toggleClass(S))},t.dispose=function(){g.removeData(this._element,E),this._element=null},n._jQueryInterface=function(e){return this.each(function(){var t=g(this).data(E);t||(t=new n(this),g(this).data(E,t)),"toggle"===e&&t[e]()})},s(n,null,[{key:"VERSION",get:function(){return"4.4.1"}}]),n}();g(document).on(j.CLICK_DATA_API,w,function(t){var e=t.target;if(g(e).hasClass(D)||(e=g(e).closest(L)[0]),!e||e.hasAttribute("disabled")||e.classList.contains("disabled"))t.preventDefault();else{var n=e.querySelector(k);if(n&&(n.hasAttribute("disabled")||n.classList.contains("disabled")))return void t.preventDefault();H._jQueryInterface.call(g(e),"toggle")}}).on(j.FOCUS_BLUR_DATA_API,w,function(t){var e=g(t.target).closest(L)[0];g(e).toggleClass(I,/^focus(in)?$/.test(t.type))}),g(window).on(j.LOAD_DATA_API,function(){for(var t=[].slice.call(document.querySelectorAll(O)),e=0,n=t.length;e<n;e++){var i=t[e],o=i.querySelector(k);o.checked||o.hasAttribute("checked")?i.classList.add(S):i.classList.remove(S)}for(var r=0,s=(t=[].slice.call(document.querySelectorAll(N))).length;r<s;r++){var a=t[r];"true"===a.getAttribute("aria-pressed")?a.classList.add(S):a.classList.remove(S)}}),g.fn[y]=H._jQueryInterface,g.fn[y].Constructor=H,g.fn[y].noConflict=function(){return g.fn[y]=b,H._jQueryInterface};var R="carousel",x="bs.carousel",F="."+x,U=".data-api",W=g.fn[R],q={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0,touch:!0},M={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean",touch:"boolean"},K="next",Q="prev",B="left",V="right",Y={SLIDE:"slide"+F,SLID:"slid"+F,KEYDOWN:"keydown"+F,MOUSEENTER:"mouseenter"+F,MOUSELEAVE:"mouseleave"+F,TOUCHSTART:"touchstart"+F,TOUCHMOVE:"touchmove"+F,TOUCHEND:"touchend"+F,POINTERDOWN:"pointerdown"+F,POINTERUP:"pointerup"+F,DRAG_START:"dragstart"+F,LOAD_DATA_API:"load"+F+U,CLICK_DATA_API:"click"+F+U},z="carousel",X="active",$="slide",G="carousel-item-right",J="carousel-item-left",Z="carousel-item-next",tt="carousel-item-prev",et="pointer-event",nt=".active",it=".active.carousel-item",ot=".carousel-item",rt=".carousel-item img",st=".carousel-item-next, .carousel-item-prev",at=".carousel-indicators",lt="[data-slide], [data-slide-to]",ct='[data-ride="carousel"]',ht={TOUCH:"touch",PEN:"pen"},ut=function(){function r(t,e){this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this.touchStartX=0,this.touchDeltaX=0,this._config=this._getConfig(e),this._element=t,this._indicatorsElement=this._element.querySelector(at),this._touchSupported="ontouchstart"in document.documentElement||0<navigator.maxTouchPoints,this._pointerEvent=Boolean(window.PointerEvent||window.MSPointerEvent),this._addEventListeners()}var t=r.prototype;return t.next=function(){this._isSliding||this._slide(K)},t.nextWhenVisible=function(){!document.hidden&&g(this._element).is(":visible")&&"hidden"!==g(this._element).css("visibility")&&this.next()},t.prev=function(){this._isSliding||this._slide(Q)},t.pause=function(t){t||(this._isPaused=!0),this._element.querySelector(st)&&(_.triggerTransitionEnd(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},t.cycle=function(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config.interval&&!this._isPaused&&(this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},t.to=function(t){var e=this;this._activeElement=this._element.querySelector(it);var n=this._getItemIndex(this._activeElement);if(!(t>this._items.length-1||t<0))if(this._isSliding)g(this._element).one(Y.SLID,function(){return e.to(t)});else{if(n===t)return this.pause(),void this.cycle();var i=n<t?K:Q;this._slide(i,this._items[t])}},t.dispose=function(){g(this._element).off(F),g.removeData(this._element,x),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},t._getConfig=function(t){return t=l({},q,{},t),_.typeCheckConfig(R,t,M),t},t._handleSwipe=function(){var t=Math.abs(this.touchDeltaX);if(!(t<=40)){var e=t/this.touchDeltaX;(this.touchDeltaX=0)<e&&this.prev(),e<0&&this.next()}},t._addEventListeners=function(){var e=this;this._config.keyboard&&g(this._element).on(Y.KEYDOWN,function(t){return e._keydown(t)}),"hover"===this._config.pause&&g(this._element).on(Y.MOUSEENTER,function(t){return e.pause(t)}).on(Y.MOUSELEAVE,function(t){return e.cycle(t)}),this._config.touch&&this._addTouchEventListeners()},t._addTouchEventListeners=function(){var e=this;if(this._touchSupported){var n=function(t){e._pointerEvent&&ht[t.originalEvent.pointerType.toUpperCase()]?e.touchStartX=t.originalEvent.clientX:e._pointerEvent||(e.touchStartX=t.originalEvent.touches[0].clientX)},i=function(t){e._pointerEvent&&ht[t.originalEvent.pointerType.toUpperCase()]&&(e.touchDeltaX=t.originalEvent.clientX-e.touchStartX),e._handleSwipe(),"hover"===e._config.pause&&(e.pause(),e.touchTimeout&&clearTimeout(e.touchTimeout),e.touchTimeout=setTimeout(function(t){return e.cycle(t)},500+e._config.interval))};g(this._element.querySelectorAll(rt)).on(Y.DRAG_START,function(t){return t.preventDefault()}),this._pointerEvent?(g(this._element).on(Y.POINTERDOWN,function(t){return n(t)}),g(this._element).on(Y.POINTERUP,function(t){return i(t)}),this._element.classList.add(et)):(g(this._element).on(Y.TOUCHSTART,function(t){return n(t)}),g(this._element).on(Y.TOUCHMOVE,function(t){return function(t){t.originalEvent.touches&&1<t.originalEvent.touches.length?e.touchDeltaX=0:e.touchDeltaX=t.originalEvent.touches[0].clientX-e.touchStartX}(t)}),g(this._element).on(Y.TOUCHEND,function(t){return i(t)}))}},t._keydown=function(t){if(!/input|textarea/i.test(t.target.tagName))switch(t.which){case 37:t.preventDefault(),this.prev();break;case 39:t.preventDefault(),this.next()}},t._getItemIndex=function(t){return this._items=t&&t.parentNode?[].slice.call(t.parentNode.querySelectorAll(ot)):[],this._items.indexOf(t)},t._getItemByDirection=function(t,e){var n=t===K,i=t===Q,o=this._getItemIndex(e),r=this._items.length-1;if((i&&0===o||n&&o===r)&&!this._config.wrap)return e;var s=(o+(t===Q?-1:1))%this._items.length;return-1==s?this._items[this._items.length-1]:this._items[s]},t._triggerSlideEvent=function(t,e){var n=this._getItemIndex(t),i=this._getItemIndex(this._element.querySelector(it)),o=g.Event(Y.SLIDE,{relatedTarget:t,direction:e,from:i,to:n});return g(this._element).trigger(o),o},t._setActiveIndicatorElement=function(t){if(this._indicatorsElement){var e=[].slice.call(this._indicatorsElement.querySelectorAll(nt));g(e).removeClass(X);var n=this._indicatorsElement.children[this._getItemIndex(t)];n&&g(n).addClass(X)}},t._slide=function(t,e){var n,i,o,r=this,s=this._element.querySelector(it),a=this._getItemIndex(s),l=e||s&&this._getItemByDirection(t,s),c=this._getItemIndex(l),h=Boolean(this._interval);if(o=t===K?(n=J,i=Z,B):(n=G,i=tt,V),l&&g(l).hasClass(X))this._isSliding=!1;else if(!this._triggerSlideEvent(l,o).isDefaultPrevented()&&s&&l){this._isSliding=!0,h&&this.pause(),this._setActiveIndicatorElement(l);var u=g.Event(Y.SLID,{relatedTarget:l,direction:o,from:a,to:c});if(g(this._element).hasClass($)){g(l).addClass(i),_.reflow(l),g(s).addClass(n),g(l).addClass(n);var f=parseInt(l.getAttribute("data-interval"),10);f?(this._config.defaultInterval=this._config.defaultInterval||this._config.interval,this._config.interval=f):this._config.interval=this._config.defaultInterval||this._config.interval;var d=_.getTransitionDurationFromElement(s);g(s).one(_.TRANSITION_END,function(){g(l).removeClass(n+" "+i).addClass(X),g(s).removeClass(X+" "+i+" "+n),r._isSliding=!1,setTimeout(function(){return g(r._element).trigger(u)},0)}).emulateTransitionEnd(d)}else g(s).removeClass(X),g(l).addClass(X),this._isSliding=!1,g(this._element).trigger(u);h&&this.cycle()}},r._jQueryInterface=function(i){return this.each(function(){var t=g(this).data(x),e=l({},q,{},g(this).data());"object"==typeof i&&(e=l({},e,{},i));var n="string"==typeof i?i:e.slide;if(t||(t=new r(this,e),g(this).data(x,t)),"number"==typeof i)t.to(i);else if("string"==typeof n){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n]()}else e.interval&&e.ride&&(t.pause(),t.cycle())})},r._dataApiClickHandler=function(t){var e=_.getSelectorFromElement(this);if(e){var n=g(e)[0];if(n&&g(n).hasClass(z)){var i=l({},g(n).data(),{},g(this).data()),o=this.getAttribute("data-slide-to");o&&(i.interval=!1),r._jQueryInterface.call(g(n),i),o&&g(n).data(x).to(o),t.preventDefault()}}},s(r,null,[{key:"VERSION",get:function(){return"4.4.1"}},{key:"Default",get:function(){return q}}]),r}();g(document).on(Y.CLICK_DATA_API,lt,ut._dataApiClickHandler),g(window).on(Y.LOAD_DATA_API,function(){for(var t=[].slice.call(document.querySelectorAll(ct)),e=0,n=t.length;e<n;e++){var i=g(t[e]);ut._jQueryInterface.call(i,i.data())}}),g.fn[R]=ut._jQueryInterface,g.fn[R].Constructor=ut,g.fn[R].noConflict=function(){return g.fn[R]=W,ut._jQueryInterface};var ft="collapse",dt="bs.collapse",gt="."+dt,_t=g.fn[ft],mt={toggle:!0,parent:""},pt={toggle:"boolean",parent:"(string|element)"},vt={SHOW:"show"+gt,SHOWN:"shown"+gt,HIDE:"hide"+gt,HIDDEN:"hidden"+gt,CLICK_DATA_API:"click"+gt+".data-api"},yt="show",Et="collapse",Ct="collapsing",Tt="collapsed",bt="width",St="height",Dt=".show, .collapsing",It='[data-toggle="collapse"]',wt=function(){function a(e,t){this._isTransitioning=!1,this._element=e,this._config=this._getConfig(t),this._triggerArray=[].slice.call(document.querySelectorAll('[data-toggle="collapse"][href="#'+e.id+'"],[data-toggle="collapse"][data-target="#'+e.id+'"]'));for(var n=[].slice.call(document.querySelectorAll(It)),i=0,o=n.length;i<o;i++){var r=n[i],s=_.getSelectorFromElement(r),a=[].slice.call(document.querySelectorAll(s)).filter(function(t){return t===e});null!==s&&0<a.length&&(this._selector=s,this._triggerArray.push(r))}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}var t=a.prototype;return t.toggle=function(){g(this._element).hasClass(yt)?this.hide():this.show()},t.show=function(){var t,e,n=this;if(!this._isTransitioning&&!g(this._element).hasClass(yt)&&(this._parent&&0===(t=[].slice.call(this._parent.querySelectorAll(Dt)).filter(function(t){return"string"==typeof n._config.parent?t.getAttribute("data-parent")===n._config.parent:t.classList.contains(Et)})).length&&(t=null),!(t&&(e=g(t).not(this._selector).data(dt))&&e._isTransitioning))){var i=g.Event(vt.SHOW);if(g(this._element).trigger(i),!i.isDefaultPrevented()){t&&(a._jQueryInterface.call(g(t).not(this._selector),"hide"),e||g(t).data(dt,null));var o=this._getDimension();g(this._element).removeClass(Et).addClass(Ct),this._element.style[o]=0,this._triggerArray.length&&g(this._triggerArray).removeClass(Tt).attr("aria-expanded",!0),this.setTransitioning(!0);var r="scroll"+(o[0].toUpperCase()+o.slice(1)),s=_.getTransitionDurationFromElement(this._element);g(this._element).one(_.TRANSITION_END,function(){g(n._element).removeClass(Ct).addClass(Et).addClass(yt),n._element.style[o]="",n.setTransitioning(!1),g(n._element).trigger(vt.SHOWN)}).emulateTransitionEnd(s),this._element.style[o]=this._element[r]+"px"}}},t.hide=function(){var t=this;if(!this._isTransitioning&&g(this._element).hasClass(yt)){var e=g.Event(vt.HIDE);if(g(this._element).trigger(e),!e.isDefaultPrevented()){var n=this._getDimension();this._element.style[n]=this._element.getBoundingClientRect()[n]+"px",_.reflow(this._element),g(this._element).addClass(Ct).removeClass(Et).removeClass(yt);var i=this._triggerArray.length;if(0<i)for(var o=0;o<i;o++){var r=this._triggerArray[o],s=_.getSelectorFromElement(r);if(null!==s)g([].slice.call(document.querySelectorAll(s))).hasClass(yt)||g(r).addClass(Tt).attr("aria-expanded",!1)}this.setTransitioning(!0);this._element.style[n]="";var a=_.getTransitionDurationFromElement(this._element);g(this._element).one(_.TRANSITION_END,function(){t.setTransitioning(!1),g(t._element).removeClass(Ct).addClass(Et).trigger(vt.HIDDEN)}).emulateTransitionEnd(a)}}},t.setTransitioning=function(t){this._isTransitioning=t},t.dispose=function(){g.removeData(this._element,dt),this._config=null,this._parent=null,this._element=null,this._triggerArray=null,this._isTransitioning=null},t._getConfig=function(t){return(t=l({},mt,{},t)).toggle=Boolean(t.toggle),_.typeCheckConfig(ft,t,pt),t},t._getDimension=function(){return g(this._element).hasClass(bt)?bt:St},t._getParent=function(){var t,n=this;_.isElement(this._config.parent)?(t=this._config.parent,"undefined"!=typeof this._config.parent.jquery&&(t=this._config.parent[0])):t=document.querySelector(this._config.parent);var e='[data-toggle="collapse"][data-parent="'+this._config.parent+'"]',i=[].slice.call(t.querySelectorAll(e));return g(i).each(function(t,e){n._addAriaAndCollapsedClass(a._getTargetFromElement(e),[e])}),t},t._addAriaAndCollapsedClass=function(t,e){var n=g(t).hasClass(yt);e.length&&g(e).toggleClass(Tt,!n).attr("aria-expanded",n)},a._getTargetFromElement=function(t){var e=_.getSelectorFromElement(t);return e?document.querySelector(e):null},a._jQueryInterface=function(i){return this.each(function(){var t=g(this),e=t.data(dt),n=l({},mt,{},t.data(),{},"object"==typeof i&&i?i:{});if(!e&&n.toggle&&/show|hide/.test(i)&&(n.toggle=!1),e||(e=new a(this,n),t.data(dt,e)),"string"==typeof i){if("undefined"==typeof e[i])throw new TypeError('No method named "'+i+'"');e[i]()}})},s(a,null,[{key:"VERSION",get:function(){return"4.4.1"}},{key:"Default",get:function(){return mt}}]),a}();g(document).on(vt.CLICK_DATA_API,It,function(t){"A"===t.currentTarget.tagName&&t.preventDefault();var n=g(this),e=_.getSelectorFromElement(this),i=[].slice.call(document.querySelectorAll(e));g(i).each(function(){var t=g(this),e=t.data(dt)?"toggle":n.data();wt._jQueryInterface.call(t,e)})}),g.fn[ft]=wt._jQueryInterface,g.fn[ft].Constructor=wt,g.fn[ft].noConflict=function(){return g.fn[ft]=_t,wt._jQueryInterface};var At="dropdown",Nt="bs.dropdown",Ot="."+Nt,kt=".data-api",Pt=g.fn[At],Lt=new RegExp("38|40|27"),jt={HIDE:"hide"+Ot,HIDDEN:"hidden"+Ot,SHOW:"show"+Ot,SHOWN:"shown"+Ot,CLICK:"click"+Ot,CLICK_DATA_API:"click"+Ot+kt,KEYDOWN_DATA_API:"keydown"+Ot+kt,KEYUP_DATA_API:"keyup"+Ot+kt},Ht="disabled",Rt="show",xt="dropup",Ft="dropright",Ut="dropleft",Wt="dropdown-menu-right",qt="position-static",Mt='[data-toggle="dropdown"]',Kt=".dropdown form",Qt=".dropdown-menu",Bt=".navbar-nav",Vt=".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",Yt="top-start",zt="top-end",Xt="bottom-start",$t="bottom-end",Gt="right-start",Jt="left-start",Zt={offset:0,flip:!0,boundary:"scrollParent",reference:"toggle",display:"dynamic",popperConfig:null},te={offset:"(number|string|function)",flip:"boolean",boundary:"(string|element)",reference:"(string|element)",display:"string",popperConfig:"(null|object)"},ee=function(){function c(t,e){this._element=t,this._popper=null,this._config=this._getConfig(e),this._menu=this._getMenuElement(),this._inNavbar=this._detectNavbar(),this._addEventListeners()}var t=c.prototype;return t.toggle=function(){if(!this._element.disabled&&!g(this._element).hasClass(Ht)){var t=g(this._menu).hasClass(Rt);c._clearMenus(),t||this.show(!0)}},t.show=function(t){if(void 0===t&&(t=!1),!(this._element.disabled||g(this._element).hasClass(Ht)||g(this._menu).hasClass(Rt))){var e={relatedTarget:this._element},n=g.Event(jt.SHOW,e),i=c._getParentFromElement(this._element);if(g(i).trigger(n),!n.isDefaultPrevented()){if(!this._inNavbar&&t){if("undefined"==typeof u)throw new TypeError("Bootstrap's dropdowns require Popper.js (https://popper.js.org/)");var o=this._element;"parent"===this._config.reference?o=i:_.isElement(this._config.reference)&&(o=this._config.reference,"undefined"!=typeof this._config.reference.jquery&&(o=this._config.reference[0])),"scrollParent"!==this._config.boundary&&g(i).addClass(qt),this._popper=new u(o,this._menu,this._getPopperConfig())}"ontouchstart"in document.documentElement&&0===g(i).closest(Bt).length&&g(document.body).children().on("mouseover",null,g.noop),this._element.focus(),this._element.setAttribute("aria-expanded",!0),g(this._menu).toggleClass(Rt),g(i).toggleClass(Rt).trigger(g.Event(jt.SHOWN,e))}}},t.hide=function(){if(!this._element.disabled&&!g(this._element).hasClass(Ht)&&g(this._menu).hasClass(Rt)){var t={relatedTarget:this._element},e=g.Event(jt.HIDE,t),n=c._getParentFromElement(this._element);g(n).trigger(e),e.isDefaultPrevented()||(this._popper&&this._popper.destroy(),g(this._menu).toggleClass(Rt),g(n).toggleClass(Rt).trigger(g.Event(jt.HIDDEN,t)))}},t.dispose=function(){g.removeData(this._element,Nt),g(this._element).off(Ot),this._element=null,(this._menu=null)!==this._popper&&(this._popper.destroy(),this._popper=null)},t.update=function(){this._inNavbar=this._detectNavbar(),null!==this._popper&&this._popper.scheduleUpdate()},t._addEventListeners=function(){var e=this;g(this._element).on(jt.CLICK,function(t){t.preventDefault(),t.stopPropagation(),e.toggle()})},t._getConfig=function(t){return t=l({},this.constructor.Default,{},g(this._element).data(),{},t),_.typeCheckConfig(At,t,this.constructor.DefaultType),t},t._getMenuElement=function(){if(!this._menu){var t=c._getParentFromElement(this._element);t&&(this._menu=t.querySelector(Qt))}return this._menu},t._getPlacement=function(){var t=g(this._element.parentNode),e=Xt;return t.hasClass(xt)?(e=Yt,g(this._menu).hasClass(Wt)&&(e=zt)):t.hasClass(Ft)?e=Gt:t.hasClass(Ut)?e=Jt:g(this._menu).hasClass(Wt)&&(e=$t),e},t._detectNavbar=function(){return 0<g(this._element).closest(".navbar").length},t._getOffset=function(){var e=this,t={};return"function"==typeof this._config.offset?t.fn=function(t){return t.offsets=l({},t.offsets,{},e._config.offset(t.offsets,e._element)||{}),t}:t.offset=this._config.offset,t},t._getPopperConfig=function(){var t={placement:this._getPlacement(),modifiers:{offset:this._getOffset(),flip:{enabled:this._config.flip},preventOverflow:{boundariesElement:this._config.boundary}}};return"static"===this._config.display&&(t.modifiers.applyStyle={enabled:!1}),l({},t,{},this._config.popperConfig)},c._jQueryInterface=function(e){return this.each(function(){var t=g(this).data(Nt);if(t||(t=new c(this,"object"==typeof e?e:null),g(this).data(Nt,t)),"string"==typeof e){if("undefined"==typeof t[e])throw new TypeError('No method named "'+e+'"');t[e]()}})},c._clearMenus=function(t){if(!t||3!==t.which&&("keyup"!==t.type||9===t.which))for(var e=[].slice.call(document.querySelectorAll(Mt)),n=0,i=e.length;n<i;n++){var o=c._getParentFromElement(e[n]),r=g(e[n]).data(Nt),s={relatedTarget:e[n]};if(t&&"click"===t.type&&(s.clickEvent=t),r){var a=r._menu;if(g(o).hasClass(Rt)&&!(t&&("click"===t.type&&/input|textarea/i.test(t.target.tagName)||"keyup"===t.type&&9===t.which)&&g.contains(o,t.target))){var l=g.Event(jt.HIDE,s);g(o).trigger(l),l.isDefaultPrevented()||("ontouchstart"in document.documentElement&&g(document.body).children().off("mouseover",null,g.noop),e[n].setAttribute("aria-expanded","false"),r._popper&&r._popper.destroy(),g(a).removeClass(Rt),g(o).removeClass(Rt).trigger(g.Event(jt.HIDDEN,s)))}}}},c._getParentFromElement=function(t){var e,n=_.getSelectorFromElement(t);return n&&(e=document.querySelector(n)),e||t.parentNode},c._dataApiKeydownHandler=function(t){if((/input|textarea/i.test(t.target.tagName)?!(32===t.which||27!==t.which&&(40!==t.which&&38!==t.which||g(t.target).closest(Qt).length)):Lt.test(t.which))&&(t.preventDefault(),t.stopPropagation(),!this.disabled&&!g(this).hasClass(Ht))){var e=c._getParentFromElement(this),n=g(e).hasClass(Rt);if(n||27!==t.which)if(n&&(!n||27!==t.which&&32!==t.which)){var i=[].slice.call(e.querySelectorAll(Vt)).filter(function(t){return g(t).is(":visible")});if(0!==i.length){var o=i.indexOf(t.target);38===t.which&&0<o&&o--,40===t.which&&o<i.length-1&&o++,o<0&&(o=0),i[o].focus()}}else{if(27===t.which){var r=e.querySelector(Mt);g(r).trigger("focus")}g(this).trigger("click")}}},s(c,null,[{key:"VERSION",get:function(){return"4.4.1"}},{key:"Default",get:function(){return Zt}},{key:"DefaultType",get:function(){return te}}]),c}();g(document).on(jt.KEYDOWN_DATA_API,Mt,ee._dataApiKeydownHandler).on(jt.KEYDOWN_DATA_API,Qt,ee._dataApiKeydownHandler).on(jt.CLICK_DATA_API+" "+jt.KEYUP_DATA_API,ee._clearMenus).on(jt.CLICK_DATA_API,Mt,function(t){t.preventDefault(),t.stopPropagation(),ee._jQueryInterface.call(g(this),"toggle")}).on(jt.CLICK_DATA_API,Kt,function(t){t.stopPropagation()}),g.fn[At]=ee._jQueryInterface,g.fn[At].Constructor=ee,g.fn[At].noConflict=function(){return g.fn[At]=Pt,ee._jQueryInterface};var ne="modal",ie="bs.modal",oe="."+ie,re=g.fn[ne],se={backdrop:!0,keyboard:!0,focus:!0,show:!0},ae={backdrop:"(boolean|string)",keyboard:"boolean",focus:"boolean",show:"boolean"},le={HIDE:"hide"+oe,HIDE_PREVENTED:"hidePrevented"+oe,HIDDEN:"hidden"+oe,SHOW:"show"+oe,SHOWN:"shown"+oe,FOCUSIN:"focusin"+oe,RESIZE:"resize"+oe,CLICK_DISMISS:"click.dismiss"+oe,KEYDOWN_DISMISS:"keydown.dismiss"+oe,MOUSEUP_DISMISS:"mouseup.dismiss"+oe,MOUSEDOWN_DISMISS:"mousedown.dismiss"+oe,CLICK_DATA_API:"click"+oe+".data-api"},ce="modal-dialog-scrollable",he="modal-scrollbar-measure",ue="modal-backdrop",fe="modal-open",de="fade",ge="show",_e="modal-static",me=".modal-dialog",pe=".modal-body",ve='[data-toggle="modal"]',ye='[data-dismiss="modal"]',Ee=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",Ce=".sticky-top",Te=function(){function o(t,e){this._config=this._getConfig(e),this._element=t,this._dialog=t.querySelector(me),this._backdrop=null,this._isShown=!1,this._isBodyOverflowing=!1,this._ignoreBackdropClick=!1,this._isTransitioning=!1,this._scrollbarWidth=0}var t=o.prototype;return t.toggle=function(t){return this._isShown?this.hide():this.show(t)},t.show=function(t){var e=this;if(!this._isShown&&!this._isTransitioning){g(this._element).hasClass(de)&&(this._isTransitioning=!0);var n=g.Event(le.SHOW,{relatedTarget:t});g(this._element).trigger(n),this._isShown||n.isDefaultPrevented()||(this._isShown=!0,this._checkScrollbar(),this._setScrollbar(),this._adjustDialog(),this._setEscapeEvent(),this._setResizeEvent(),g(this._element).on(le.CLICK_DISMISS,ye,function(t){return e.hide(t)}),g(this._dialog).on(le.MOUSEDOWN_DISMISS,function(){g(e._element).one(le.MOUSEUP_DISMISS,function(t){g(t.target).is(e._element)&&(e._ignoreBackdropClick=!0)})}),this._showBackdrop(function(){return e._showElement(t)}))}},t.hide=function(t){var e=this;if(t&&t.preventDefault(),this._isShown&&!this._isTransitioning){var n=g.Event(le.HIDE);if(g(this._element).trigger(n),this._isShown&&!n.isDefaultPrevented()){this._isShown=!1;var i=g(this._element).hasClass(de);if(i&&(this._isTransitioning=!0),this._setEscapeEvent(),this._setResizeEvent(),g(document).off(le.FOCUSIN),g(this._element).removeClass(ge),g(this._element).off(le.CLICK_DISMISS),g(this._dialog).off(le.MOUSEDOWN_DISMISS),i){var o=_.getTransitionDurationFromElement(this._element);g(this._element).one(_.TRANSITION_END,function(t){return e._hideModal(t)}).emulateTransitionEnd(o)}else this._hideModal()}}},t.dispose=function(){[window,this._element,this._dialog].forEach(function(t){return g(t).off(oe)}),g(document).off(le.FOCUSIN),g.removeData(this._element,ie),this._config=null,this._element=null,this._dialog=null,this._backdrop=null,this._isShown=null,this._isBodyOverflowing=null,this._ignoreBackdropClick=null,this._isTransitioning=null,this._scrollbarWidth=null},t.handleUpdate=function(){this._adjustDialog()},t._getConfig=function(t){return t=l({},se,{},t),_.typeCheckConfig(ne,t,ae),t},t._triggerBackdropTransition=function(){var t=this;if("static"===this._config.backdrop){var e=g.Event(le.HIDE_PREVENTED);if(g(this._element).trigger(e),e.defaultPrevented)return;this._element.classList.add(_e);var n=_.getTransitionDurationFromElement(this._element);g(this._element).one(_.TRANSITION_END,function(){t._element.classList.remove(_e)}).emulateTransitionEnd(n),this._element.focus()}else this.hide()},t._showElement=function(t){var e=this,n=g(this._element).hasClass(de),i=this._dialog?this._dialog.querySelector(pe):null;this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||document.body.appendChild(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),g(this._dialog).hasClass(ce)&&i?i.scrollTop=0:this._element.scrollTop=0,n&&_.reflow(this._element),g(this._element).addClass(ge),this._config.focus&&this._enforceFocus();function o(){e._config.focus&&e._element.focus(),e._isTransitioning=!1,g(e._element).trigger(r)}var r=g.Event(le.SHOWN,{relatedTarget:t});if(n){var s=_.getTransitionDurationFromElement(this._dialog);g(this._dialog).one(_.TRANSITION_END,o).emulateTransitionEnd(s)}else o()},t._enforceFocus=function(){var e=this;g(document).off(le.FOCUSIN).on(le.FOCUSIN,function(t){document!==t.target&&e._element!==t.target&&0===g(e._element).has(t.target).length&&e._element.focus()})},t._setEscapeEvent=function(){var e=this;this._isShown&&this._config.keyboard?g(this._element).on(le.KEYDOWN_DISMISS,function(t){27===t.which&&e._triggerBackdropTransition()}):this._isShown||g(this._element).off(le.KEYDOWN_DISMISS)},t._setResizeEvent=function(){var e=this;this._isShown?g(window).on(le.RESIZE,function(t){return e.handleUpdate(t)}):g(window).off(le.RESIZE)},t._hideModal=function(){var t=this;this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._isTransitioning=!1,this._showBackdrop(function(){g(document.body).removeClass(fe),t._resetAdjustments(),t._resetScrollbar(),g(t._element).trigger(le.HIDDEN)})},t._removeBackdrop=function(){this._backdrop&&(g(this._backdrop).remove(),this._backdrop=null)},t._showBackdrop=function(t){var e=this,n=g(this._element).hasClass(de)?de:"";if(this._isShown&&this._config.backdrop){if(this._backdrop=document.createElement("div"),this._backdrop.className=ue,n&&this._backdrop.classList.add(n),g(this._backdrop).appendTo(document.body),g(this._element).on(le.CLICK_DISMISS,function(t){e._ignoreBackdropClick?e._ignoreBackdropClick=!1:t.target===t.currentTarget&&e._triggerBackdropTransition()}),n&&_.reflow(this._backdrop),g(this._backdrop).addClass(ge),!t)return;if(!n)return void t();var i=_.getTransitionDurationFromElement(this._backdrop);g(this._backdrop).one(_.TRANSITION_END,t).emulateTransitionEnd(i)}else if(!this._isShown&&this._backdrop){g(this._backdrop).removeClass(ge);var o=function(){e._removeBackdrop(),t&&t()};if(g(this._element).hasClass(de)){var r=_.getTransitionDurationFromElement(this._backdrop);g(this._backdrop).one(_.TRANSITION_END,o).emulateTransitionEnd(r)}else o()}else t&&t()},t._adjustDialog=function(){var t=this._element.scrollHeight>document.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},t._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},t._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=t.left+t.right<window.innerWidth,this._scrollbarWidth=this._getScrollbarWidth()},t._setScrollbar=function(){var o=this;if(this._isBodyOverflowing){var t=[].slice.call(document.querySelectorAll(Ee)),e=[].slice.call(document.querySelectorAll(Ce));g(t).each(function(t,e){var n=e.style.paddingRight,i=g(e).css("padding-right");g(e).data("padding-right",n).css("padding-right",parseFloat(i)+o._scrollbarWidth+"px")}),g(e).each(function(t,e){var n=e.style.marginRight,i=g(e).css("margin-right");g(e).data("margin-right",n).css("margin-right",parseFloat(i)-o._scrollbarWidth+"px")});var n=document.body.style.paddingRight,i=g(document.body).css("padding-right");g(document.body).data("padding-right",n).css("padding-right",parseFloat(i)+this._scrollbarWidth+"px")}g(document.body).addClass(fe)},t._resetScrollbar=function(){var t=[].slice.call(document.querySelectorAll(Ee));g(t).each(function(t,e){var n=g(e).data("padding-right");g(e).removeData("padding-right"),e.style.paddingRight=n||""});var e=[].slice.call(document.querySelectorAll(""+Ce));g(e).each(function(t,e){var n=g(e).data("margin-right");"undefined"!=typeof n&&g(e).css("margin-right",n).removeData("margin-right")});var n=g(document.body).data("padding-right");g(document.body).removeData("padding-right"),document.body.style.paddingRight=n||""},t._getScrollbarWidth=function(){var t=document.createElement("div");t.className=he,document.body.appendChild(t);var e=t.getBoundingClientRect().width-t.clientWidth;return document.body.removeChild(t),e},o._jQueryInterface=function(n,i){return this.each(function(){var t=g(this).data(ie),e=l({},se,{},g(this).data(),{},"object"==typeof n&&n?n:{});if(t||(t=new o(this,e),g(this).data(ie,t)),"string"==typeof n){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n](i)}else e.show&&t.show(i)})},s(o,null,[{key:"VERSION",get:function(){return"4.4.1"}},{key:"Default",get:function(){return se}}]),o}();g(document).on(le.CLICK_DATA_API,ve,function(t){var e,n=this,i=_.getSelectorFromElement(this);i&&(e=document.querySelector(i));var o=g(e).data(ie)?"toggle":l({},g(e).data(),{},g(this).data());"A"!==this.tagName&&"AREA"!==this.tagName||t.preventDefault();var r=g(e).one(le.SHOW,function(t){t.isDefaultPrevented()||r.one(le.HIDDEN,function(){g(n).is(":visible")&&n.focus()})});Te._jQueryInterface.call(g(e),o,this)}),g.fn[ne]=Te._jQueryInterface,g.fn[ne].Constructor=Te,g.fn[ne].noConflict=function(){return g.fn[ne]=re,Te._jQueryInterface};var be=["background","cite","href","itemtype","longdesc","poster","src","xlink:href"],Se={"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},De=/^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi,Ie=/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i;function we(t,r,e){if(0===t.length)return t;if(e&&"function"==typeof e)return e(t);for(var n=(new window.DOMParser).parseFromString(t,"text/html"),s=Object.keys(r),a=[].slice.call(n.body.querySelectorAll("*")),i=function(t){var e=a[t],n=e.nodeName.toLowerCase();if(-1===s.indexOf(e.nodeName.toLowerCase()))return e.parentNode.removeChild(e),"continue";var i=[].slice.call(e.attributes),o=[].concat(r["*"]||[],r[n]||[]);i.forEach(function(t){!function(t,e){var n=t.nodeName.toLowerCase();if(-1!==e.indexOf(n))return-1===be.indexOf(n)||Boolean(t.nodeValue.match(De)||t.nodeValue.match(Ie));for(var i=e.filter(function(t){return t instanceof RegExp}),o=0,r=i.length;o<r;o++)if(n.match(i[o]))return!0;return!1}(t,o)&&e.removeAttribute(t.nodeName)})},o=0,l=a.length;o<l;o++)i(o);return n.body.innerHTML}var Ae="tooltip",Ne="bs.tooltip",Oe="."+Ne,ke=g.fn[Ae],Pe="bs-tooltip",Le=new RegExp("(^|\\s)"+Pe+"\\S+","g"),je=["sanitize","whiteList","sanitizeFn"],He={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"(number|string|function)",container:"(string|element|boolean)",fallbackPlacement:"(string|array)",boundary:"(string|element)",sanitize:"boolean",sanitizeFn:"(null|function)",whiteList:"object",popperConfig:"(null|object)"},Re={AUTO:"auto",TOP:"top",RIGHT:"right",BOTTOM:"bottom",LEFT:"left"},xe={animation:!0,template:'<div class="tooltip" role="tooltip"><div class="arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent",sanitize:!0,sanitizeFn:null,whiteList:Se,popperConfig:null},Fe="show",Ue="out",We={HIDE:"hide"+Oe,HIDDEN:"hidden"+Oe,SHOW:"show"+Oe,SHOWN:"shown"+Oe,INSERTED:"inserted"+Oe,CLICK:"click"+Oe,FOCUSIN:"focusin"+Oe,FOCUSOUT:"focusout"+Oe,MOUSEENTER:"mouseenter"+Oe,MOUSELEAVE:"mouseleave"+Oe},qe="fade",Me="show",Ke=".tooltip-inner",Qe=".arrow",Be="hover",Ve="focus",Ye="click",ze="manual",Xe=function(){function i(t,e){if("undefined"==typeof u)throw new TypeError("Bootstrap's tooltips require Popper.js (https://popper.js.org/)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var t=i.prototype;return t.enable=function(){this._isEnabled=!0},t.disable=function(){this._isEnabled=!1},t.toggleEnabled=function(){this._isEnabled=!this._isEnabled},t.toggle=function(t){if(this._isEnabled)if(t){var e=this.constructor.DATA_KEY,n=g(t.currentTarget).data(e);n||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(e,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(g(this.getTipElement()).hasClass(Me))return void this._leave(null,this);this._enter(null,this)}},t.dispose=function(){clearTimeout(this._timeout),g.removeData(this.element,this.constructor.DATA_KEY),g(this.element).off(this.constructor.EVENT_KEY),g(this.element).closest(".modal").off("hide.bs.modal",this._hideModalHandler),this.tip&&g(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},t.show=function(){var e=this;if("none"===g(this.element).css("display"))throw new Error("Please use show on visible elements");var t=g.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){g(this.element).trigger(t);var n=_.findShadowRoot(this.element),i=g.contains(null!==n?n:this.element.ownerDocument.documentElement,this.element);if(t.isDefaultPrevented()||!i)return;var o=this.getTipElement(),r=_.getUID(this.constructor.NAME);o.setAttribute("id",r),this.element.setAttribute("aria-describedby",r),this.setContent(),this.config.animation&&g(o).addClass(qe);var s="function"==typeof this.config.placement?this.config.placement.call(this,o,this.element):this.config.placement,a=this._getAttachment(s);this.addAttachmentClass(a);var l=this._getContainer();g(o).data(this.constructor.DATA_KEY,this),g.contains(this.element.ownerDocument.documentElement,this.tip)||g(o).appendTo(l),g(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new u(this.element,o,this._getPopperConfig(a)),g(o).addClass(Me),"ontouchstart"in document.documentElement&&g(document.body).children().on("mouseover",null,g.noop);var c=function(){e.config.animation&&e._fixTransition();var t=e._hoverState;e._hoverState=null,g(e.element).trigger(e.constructor.Event.SHOWN),t===Ue&&e._leave(null,e)};if(g(this.tip).hasClass(qe)){var h=_.getTransitionDurationFromElement(this.tip);g(this.tip).one(_.TRANSITION_END,c).emulateTransitionEnd(h)}else c()}},t.hide=function(t){function e(){n._hoverState!==Fe&&i.parentNode&&i.parentNode.removeChild(i),n._cleanTipClass(),n.element.removeAttribute("aria-describedby"),g(n.element).trigger(n.constructor.Event.HIDDEN),null!==n._popper&&n._popper.destroy(),t&&t()}var n=this,i=this.getTipElement(),o=g.Event(this.constructor.Event.HIDE);if(g(this.element).trigger(o),!o.isDefaultPrevented()){if(g(i).removeClass(Me),"ontouchstart"in document.documentElement&&g(document.body).children().off("mouseover",null,g.noop),this._activeTrigger[Ye]=!1,this._activeTrigger[Ve]=!1,this._activeTrigger[Be]=!1,g(this.tip).hasClass(qe)){var r=_.getTransitionDurationFromElement(i);g(i).one(_.TRANSITION_END,e).emulateTransitionEnd(r)}else e();this._hoverState=""}},t.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},t.isWithContent=function(){return Boolean(this.getTitle())},t.addAttachmentClass=function(t){g(this.getTipElement()).addClass(Pe+"-"+t)},t.getTipElement=function(){return this.tip=this.tip||g(this.config.template)[0],this.tip},t.setContent=function(){var t=this.getTipElement();this.setElementContent(g(t.querySelectorAll(Ke)),this.getTitle()),g(t).removeClass(qe+" "+Me)},t.setElementContent=function(t,e){"object"!=typeof e||!e.nodeType&&!e.jquery?this.config.html?(this.config.sanitize&&(e=we(e,this.config.whiteList,this.config.sanitizeFn)),t.html(e)):t.text(e):this.config.html?g(e).parent().is(t)||t.empty().append(e):t.text(g(e).text())},t.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t=t||("function"==typeof this.config.title?this.config.title.call(this.element):this.config.title)},t._getPopperConfig=function(t){var e=this;return l({},{placement:t,modifiers:{offset:this._getOffset(),flip:{behavior:this.config.fallbackPlacement},arrow:{element:Qe},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){return e._handlePopperPlacementChange(t)}},{},this.config.popperConfig)},t._getOffset=function(){var e=this,t={};return"function"==typeof this.config.offset?t.fn=function(t){return t.offsets=l({},t.offsets,{},e.config.offset(t.offsets,e.element)||{}),t}:t.offset=this.config.offset,t},t._getContainer=function(){return!1===this.config.container?document.body:_.isElement(this.config.container)?g(this.config.container):g(document).find(this.config.container)},t._getAttachment=function(t){return Re[t.toUpperCase()]},t._setListeners=function(){var i=this;this.config.trigger.split(" ").forEach(function(t){if("click"===t)g(i.element).on(i.constructor.Event.CLICK,i.config.selector,function(t){return i.toggle(t)});else if(t!==ze){var e=t===Be?i.constructor.Event.MOUSEENTER:i.constructor.Event.FOCUSIN,n=t===Be?i.constructor.Event.MOUSELEAVE:i.constructor.Event.FOCUSOUT;g(i.element).on(e,i.config.selector,function(t){return i._enter(t)}).on(n,i.config.selector,function(t){return i._leave(t)})}}),this._hideModalHandler=function(){i.element&&i.hide()},g(this.element).closest(".modal").on("hide.bs.modal",this._hideModalHandler),this.config.selector?this.config=l({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},t._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");!this.element.getAttribute("title")&&"string"==t||(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},t._enter=function(t,e){var n=this.constructor.DATA_KEY;(e=e||g(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusin"===t.type?Ve:Be]=!0),g(e.getTipElement()).hasClass(Me)||e._hoverState===Fe?e._hoverState=Fe:(clearTimeout(e._timeout),e._hoverState=Fe,e.config.delay&&e.config.delay.show?e._timeout=setTimeout(function(){e._hoverState===Fe&&e.show()},e.config.delay.show):e.show())},t._leave=function(t,e){var n=this.constructor.DATA_KEY;(e=e||g(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusout"===t.type?Ve:Be]=!1),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState=Ue,e.config.delay&&e.config.delay.hide?e._timeout=setTimeout(function(){e._hoverState===Ue&&e.hide()},e.config.delay.hide):e.hide())},t._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},t._getConfig=function(t){var e=g(this.element).data();return Object.keys(e).forEach(function(t){-1!==je.indexOf(t)&&delete e[t]}),"number"==typeof(t=l({},this.constructor.Default,{},e,{},"object"==typeof t&&t?t:{})).delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),_.typeCheckConfig(Ae,t,this.constructor.DefaultType),t.sanitize&&(t.template=we(t.template,t.whiteList,t.sanitizeFn)),t},t._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},t._cleanTipClass=function(){var t=g(this.getTipElement()),e=t.attr("class").match(Le);null!==e&&e.length&&t.removeClass(e.join(""))},t._handlePopperPlacementChange=function(t){var e=t.instance;this.tip=e.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},t._fixTransition=function(){var t=this.getTipElement(),e=this.config.animation;null===t.getAttribute("x-placement")&&(g(t).removeClass(qe),this.config.animation=!1,this.hide(),this.show(),this.config.animation=e)},i._jQueryInterface=function(n){return this.each(function(){var t=g(this).data(Ne),e="object"==typeof n&&n;if((t||!/dispose|hide/.test(n))&&(t||(t=new i(this,e),g(this).data(Ne,t)),"string"==typeof n)){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.4.1"}},{key:"Default",get:function(){return xe}},{key:"NAME",get:function(){return Ae}},{key:"DATA_KEY",get:function(){return Ne}},{key:"Event",get:function(){return We}},{key:"EVENT_KEY",get:function(){return Oe}},{key:"DefaultType",get:function(){return He}}]),i}();g.fn[Ae]=Xe._jQueryInterface,g.fn[Ae].Constructor=Xe,g.fn[Ae].noConflict=function(){return g.fn[Ae]=ke,Xe._jQueryInterface};var $e="popover",Ge="bs.popover",Je="."+Ge,Ze=g.fn[$e],tn="bs-popover",en=new RegExp("(^|\\s)"+tn+"\\S+","g"),nn=l({},Xe.Default,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>'}),on=l({},Xe.DefaultType,{content:"(string|element|function)"}),rn="fade",sn="show",an=".popover-header",ln=".popover-body",cn={HIDE:"hide"+Je,HIDDEN:"hidden"+Je,SHOW:"show"+Je,SHOWN:"shown"+Je,INSERTED:"inserted"+Je,CLICK:"click"+Je,FOCUSIN:"focusin"+Je,FOCUSOUT:"focusout"+Je,MOUSEENTER:"mouseenter"+Je,MOUSELEAVE:"mouseleave"+Je},hn=function(t){function i(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),(t.prototype.constructor=t).__proto__=e}(i,t);var e=i.prototype;return e.isWithContent=function(){return this.getTitle()||this._getContent()},e.addAttachmentClass=function(t){g(this.getTipElement()).addClass(tn+"-"+t)},e.getTipElement=function(){return this.tip=this.tip||g(this.config.template)[0],this.tip},e.setContent=function(){var t=g(this.getTipElement());this.setElementContent(t.find(an),this.getTitle());var e=this._getContent();"function"==typeof e&&(e=e.call(this.element)),this.setElementContent(t.find(ln),e),t.removeClass(rn+" "+sn)},e._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},e._cleanTipClass=function(){var t=g(this.getTipElement()),e=t.attr("class").match(en);null!==e&&0<e.length&&t.removeClass(e.join(""))},i._jQueryInterface=function(n){return this.each(function(){var t=g(this).data(Ge),e="object"==typeof n?n:null;if((t||!/dispose|hide/.test(n))&&(t||(t=new i(this,e),g(this).data(Ge,t)),"string"==typeof n)){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.4.1"}},{key:"Default",get:function(){return nn}},{key:"NAME",get:function(){return $e}},{key:"DATA_KEY",get:function(){return Ge}},{key:"Event",get:function(){return cn}},{key:"EVENT_KEY",get:function(){return Je}},{key:"DefaultType",get:function(){return on}}]),i}(Xe);g.fn[$e]=hn._jQueryInterface,g.fn[$e].Constructor=hn,g.fn[$e].noConflict=function(){return g.fn[$e]=Ze,hn._jQueryInterface};var un="scrollspy",fn="bs.scrollspy",dn="."+fn,gn=g.fn[un],_n={offset:10,method:"auto",target:""},mn={offset:"number",method:"string",target:"(string|element)"},pn={ACTIVATE:"activate"+dn,SCROLL:"scroll"+dn,LOAD_DATA_API:"load"+dn+".data-api"},vn="dropdown-item",yn="active",En='[data-spy="scroll"]',Cn=".nav, .list-group",Tn=".nav-link",bn=".nav-item",Sn=".list-group-item",Dn=".dropdown",In=".dropdown-item",wn=".dropdown-toggle",An="offset",Nn="position",On=function(){function n(t,e){var n=this;this._element=t,this._scrollElement="BODY"===t.tagName?window:t,this._config=this._getConfig(e),this._selector=this._config.target+" "+Tn+","+this._config.target+" "+Sn+","+this._config.target+" "+In,this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,g(this._scrollElement).on(pn.SCROLL,function(t){return n._process(t)}),this.refresh(),this._process()}var t=n.prototype;return t.refresh=function(){var e=this,t=this._scrollElement===this._scrollElement.window?An:Nn,o="auto"===this._config.method?t:this._config.method,r=o===Nn?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),[].slice.call(document.querySelectorAll(this._selector)).map(function(t){var e,n=_.getSelectorFromElement(t);if(n&&(e=document.querySelector(n)),e){var i=e.getBoundingClientRect();if(i.width||i.height)return[g(e)[o]().top+r,n]}return null}).filter(function(t){return t}).sort(function(t,e){return t[0]-e[0]}).forEach(function(t){e._offsets.push(t[0]),e._targets.push(t[1])})},t.dispose=function(){g.removeData(this._element,fn),g(this._scrollElement).off(dn),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},t._getConfig=function(t){if("string"!=typeof(t=l({},_n,{},"object"==typeof t&&t?t:{})).target){var e=g(t.target).attr("id");e||(e=_.getUID(un),g(t.target).attr("id",e)),t.target="#"+e}return _.typeCheckConfig(un,t,mn),t},t._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},t._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},t._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},t._process=function(){var t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),n=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),n<=t){var i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&t<this._offsets[0]&&0<this._offsets[0])return this._activeTarget=null,void this._clear();for(var o=this._offsets.length;o--;){this._activeTarget!==this._targets[o]&&t>=this._offsets[o]&&("undefined"==typeof this._offsets[o+1]||t<this._offsets[o+1])&&this._activate(this._targets[o])}}},t._activate=function(e){this._activeTarget=e,this._clear();var t=this._selector.split(",").map(function(t){return t+'[data-target="'+e+'"],'+t+'[href="'+e+'"]'}),n=g([].slice.call(document.querySelectorAll(t.join(","))));n.hasClass(vn)?(n.closest(Dn).find(wn).addClass(yn),n.addClass(yn)):(n.addClass(yn),n.parents(Cn).prev(Tn+", "+Sn).addClass(yn),n.parents(Cn).prev(bn).children(Tn).addClass(yn)),g(this._scrollElement).trigger(pn.ACTIVATE,{relatedTarget:e})},t._clear=function(){[].slice.call(document.querySelectorAll(this._selector)).filter(function(t){return t.classList.contains(yn)}).forEach(function(t){return t.classList.remove(yn)})},n._jQueryInterface=function(e){return this.each(function(){var t=g(this).data(fn);if(t||(t=new n(this,"object"==typeof e&&e),g(this).data(fn,t)),"string"==typeof e){if("undefined"==typeof t[e])throw new TypeError('No method named "'+e+'"');t[e]()}})},s(n,null,[{key:"VERSION",get:function(){return"4.4.1"}},{key:"Default",get:function(){return _n}}]),n}();g(window).on(pn.LOAD_DATA_API,function(){for(var t=[].slice.call(document.querySelectorAll(En)),e=t.length;e--;){var n=g(t[e]);On._jQueryInterface.call(n,n.data())}}),g.fn[un]=On._jQueryInterface,g.fn[un].Constructor=On,g.fn[un].noConflict=function(){return g.fn[un]=gn,On._jQueryInterface};var kn="bs.tab",Pn="."+kn,Ln=g.fn.tab,jn={HIDE:"hide"+Pn,HIDDEN:"hidden"+Pn,SHOW:"show"+Pn,SHOWN:"shown"+Pn,CLICK_DATA_API:"click"+Pn+".data-api"},Hn="dropdown-menu",Rn="active",xn="disabled",Fn="fade",Un="show",Wn=".dropdown",qn=".nav, .list-group",Mn=".active",Kn="> li > .active",Qn='[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',Bn=".dropdown-toggle",Vn="> .dropdown-menu .active",Yn=function(){function i(t){this._element=t}var t=i.prototype;return t.show=function(){var n=this;if(!(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&g(this._element).hasClass(Rn)||g(this._element).hasClass(xn))){var t,i,e=g(this._element).closest(qn)[0],o=_.getSelectorFromElement(this._element);if(e){var r="UL"===e.nodeName||"OL"===e.nodeName?Kn:Mn;i=(i=g.makeArray(g(e).find(r)))[i.length-1]}var s=g.Event(jn.HIDE,{relatedTarget:this._element}),a=g.Event(jn.SHOW,{relatedTarget:i});if(i&&g(i).trigger(s),g(this._element).trigger(a),!a.isDefaultPrevented()&&!s.isDefaultPrevented()){o&&(t=document.querySelector(o)),this._activate(this._element,e);var l=function(){var t=g.Event(jn.HIDDEN,{relatedTarget:n._element}),e=g.Event(jn.SHOWN,{relatedTarget:i});g(i).trigger(t),g(n._element).trigger(e)};t?this._activate(t,t.parentNode,l):l()}}},t.dispose=function(){g.removeData(this._element,kn),this._element=null},t._activate=function(t,e,n){function i(){return o._transitionComplete(t,r,n)}var o=this,r=(!e||"UL"!==e.nodeName&&"OL"!==e.nodeName?g(e).children(Mn):g(e).find(Kn))[0],s=n&&r&&g(r).hasClass(Fn);if(r&&s){var a=_.getTransitionDurationFromElement(r);g(r).removeClass(Un).one(_.TRANSITION_END,i).emulateTransitionEnd(a)}else i()},t._transitionComplete=function(t,e,n){if(e){g(e).removeClass(Rn);var i=g(e.parentNode).find(Vn)[0];i&&g(i).removeClass(Rn),"tab"===e.getAttribute("role")&&e.setAttribute("aria-selected",!1)}if(g(t).addClass(Rn),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!0),_.reflow(t),t.classList.contains(Fn)&&t.classList.add(Un),t.parentNode&&g(t.parentNode).hasClass(Hn)){var o=g(t).closest(Wn)[0];if(o){var r=[].slice.call(o.querySelectorAll(Bn));g(r).addClass(Rn)}t.setAttribute("aria-expanded",!0)}n&&n()},i._jQueryInterface=function(n){return this.each(function(){var t=g(this),e=t.data(kn);if(e||(e=new i(this),t.data(kn,e)),"string"==typeof n){if("undefined"==typeof e[n])throw new TypeError('No method named "'+n+'"');e[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.4.1"}}]),i}();g(document).on(jn.CLICK_DATA_API,Qn,function(t){t.preventDefault(),Yn._jQueryInterface.call(g(this),"show")}),g.fn.tab=Yn._jQueryInterface,g.fn.tab.Constructor=Yn,g.fn.tab.noConflict=function(){return g.fn.tab=Ln,Yn._jQueryInterface};var zn="toast",Xn="bs.toast",$n="."+Xn,Gn=g.fn[zn],Jn={CLICK_DISMISS:"click.dismiss"+$n,HIDE:"hide"+$n,HIDDEN:"hidden"+$n,SHOW:"show"+$n,SHOWN:"shown"+$n},Zn="fade",ti="hide",ei="show",ni="showing",ii={animation:"boolean",autohide:"boolean",delay:"number"},oi={animation:!0,autohide:!0,delay:500},ri='[data-dismiss="toast"]',si=function(){function i(t,e){this._element=t,this._config=this._getConfig(e),this._timeout=null,this._setListeners()}var t=i.prototype;return t.show=function(){var t=this,e=g.Event(Jn.SHOW);if(g(this._element).trigger(e),!e.isDefaultPrevented()){this._config.animation&&this._element.classList.add(Zn);var n=function(){t._element.classList.remove(ni),t._element.classList.add(ei),g(t._element).trigger(Jn.SHOWN),t._config.autohide&&(t._timeout=setTimeout(function(){t.hide()},t._config.delay))};if(this._element.classList.remove(ti),_.reflow(this._element),this._element.classList.add(ni),this._config.animation){var i=_.getTransitionDurationFromElement(this._element);g(this._element).one(_.TRANSITION_END,n).emulateTransitionEnd(i)}else n()}},t.hide=function(){if(this._element.classList.contains(ei)){var t=g.Event(Jn.HIDE);g(this._element).trigger(t),t.isDefaultPrevented()||this._close()}},t.dispose=function(){clearTimeout(this._timeout),this._timeout=null,this._element.classList.contains(ei)&&this._element.classList.remove(ei),g(this._element).off(Jn.CLICK_DISMISS),g.removeData(this._element,Xn),this._element=null,this._config=null},t._getConfig=function(t){return t=l({},oi,{},g(this._element).data(),{},"object"==typeof t&&t?t:{}),_.typeCheckConfig(zn,t,this.constructor.DefaultType),t},t._setListeners=function(){var t=this;g(this._element).on(Jn.CLICK_DISMISS,ri,function(){return t.hide()})},t._close=function(){function t(){e._element.classList.add(ti),g(e._element).trigger(Jn.HIDDEN)}var e=this;if(this._element.classList.remove(ei),this._config.animation){var n=_.getTransitionDurationFromElement(this._element);g(this._element).one(_.TRANSITION_END,t).emulateTransitionEnd(n)}else t()},i._jQueryInterface=function(n){return this.each(function(){var t=g(this),e=t.data(Xn);if(e||(e=new i(this,"object"==typeof n&&n),t.data(Xn,e)),"string"==typeof n){if("undefined"==typeof e[n])throw new TypeError('No method named "'+n+'"');e[n](this)}})},s(i,null,[{key:"VERSION",get:function(){return"4.4.1"}},{key:"DefaultType",get:function(){return ii}},{key:"Default",get:function(){return oi}}]),i}();g.fn[zn]=si._jQueryInterface,g.fn[zn].Constructor=si,g.fn[zn].noConflict=function(){return g.fn[zn]=Gn,si._jQueryInterface},t.Alert=v,t.Button=H,t.Carousel=ut,t.Collapse=wt,t.Dropdown=ee,t.Modal=Te,t.Popover=hn,t.Scrollspy=On,t.Tab=Yn,t.Toast=si,t.Tooltip=Xe,t.Util=_,Object.defineProperty(t,"__esModule",{value:!0})});
7
  //# sourceMappingURL=bootstrap.min.js.map
resources/js/global-plugin.js CHANGED
@@ -22,6 +22,18 @@ var iCWP_WPSF_SecurityAdmin = new function () {
22
  return false;
23
  }
24
  );
 
 
 
 
 
 
 
 
 
 
 
 
25
  } );
26
  };
27
  }();
22
  return false;
23
  }
24
  );
25
+
26
+ if ( typeof icwp_wpsf_vars_secadmin !== 'undefined' ) {
27
+ jQuery( document ).on( "click", '#SecAdminRemoveConfirmEmail',
28
+ function ( event ) {
29
+ event.preventDefault();
30
+ if ( confirm( icwp_wpsf_vars_secadmin.strings.are_you_sure ) ) {
31
+ iCWP_WPSF_StandardAjax.send_ajax_req( icwp_wpsf_vars_secadmin.ajax.req_email_remove );
32
+ }
33
+ return false;
34
+ }
35
+ );
36
+ }
37
  } );
38
  };
39
  }();
resources/js/introjs.min.js ADDED
@@ -0,0 +1 @@
 
1
+ !function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t(),module.exports.introJs=function(){return console.warn('Deprecated: please use require("intro.js") directly, instead of the introJs method of the function'),t().apply(this,arguments)};else if("function"==typeof define&&define.amd)define([],t);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).introJs=t()}}(function(){function n(t){this._targetElement=t,this._introItems=[],this._options={nextLabel:"Next &rarr;",prevLabel:"&larr; Back",skipLabel:"Skip",doneLabel:"Done",hidePrev:!1,hideNext:!1,tooltipPosition:"bottom",tooltipClass:"",highlightClass:"",exitOnEsc:!0,exitOnOverlayClick:!0,showStepNumbers:!0,keyboardNavigation:!0,showButtons:!0,showBullets:!0,showProgress:!1,scrollToElement:!0,scrollTo:"element",scrollPadding:30,overlayOpacity:.8,positionPrecedence:["bottom","top","right","left"],disableInteraction:!1,helperElementPadding:10,hintPosition:"top-middle",hintButtonLabel:"Got it",hintAnimation:!0,buttonClass:"introjs-button"}}function e(t,i){var e=t.querySelectorAll("*[data-intro]"),n=[];if(this._options.steps)B(this._options.steps,function(t){var e=h(t);if(e.step=n.length+1,"string"==typeof e.element&&(e.element=document.querySelector(e.element)),void 0===e.element||null===e.element){var i=document.querySelector(".introjsFloatingElement");null===i&&((i=document.createElement("div")).className="introjsFloatingElement",document.body.appendChild(i)),e.element=i,e.position="floating"}e.scrollTo=e.scrollTo||this._options.scrollTo,void 0===e.disableInteraction&&(e.disableInteraction=this._options.disableInteraction),null!==e.element&&n.push(e)}.bind(this));else{var o;if(e.length<1)return!1;B(e,function(t){if((!i||t.getAttribute("data-intro-group")===i)&&"none"!==t.style.display){var e=parseInt(t.getAttribute("data-step"),10);o=void 0!==t.getAttribute("data-disable-interaction")?!!t.getAttribute("data-disable-interaction"):this._options.disableInteraction,0<e&&(n[e-1]={element:t,intro:t.getAttribute("data-intro"),step:parseInt(t.getAttribute("data-step"),10),tooltipClass:t.getAttribute("data-tooltipclass"),highlightClass:t.getAttribute("data-highlightclass"),position:t.getAttribute("data-position")||this._options.tooltipPosition,scrollTo:t.getAttribute("data-scrollto")||this._options.scrollTo,disableInteraction:o})}}.bind(this));var s=0;B(e,function(t){if((!i||t.getAttribute("data-intro-group")===i)&&null===t.getAttribute("data-step")){for(;void 0!==n[s];)s++;o=void 0!==t.getAttribute("data-disable-interaction")?!!t.getAttribute("data-disable-interaction"):this._options.disableInteraction,n[s]={element:t,intro:t.getAttribute("data-intro"),step:s+1,tooltipClass:t.getAttribute("data-tooltipclass"),highlightClass:t.getAttribute("data-highlightclass"),position:t.getAttribute("data-position")||this._options.tooltipPosition,scrollTo:t.getAttribute("data-scrollto")||this._options.scrollTo,disableInteraction:o}}}.bind(this))}for(var l=[],r=0;r<n.length;r++)n[r]&&l.push(n[r]);return(n=l).sort(function(t,e){return t.step-e.step}),this._introItems=n,function(t){var e=document.createElement("div"),i="",n=this;if(e.className="introjs-overlay",t.tagName&&"body"!==t.tagName.toLowerCase()){var o=k(t);o&&(i+="width: "+o.width+"px; height:"+o.height+"px; top:"+o.top+"px;left: "+o.left+"px;",e.style.cssText=i)}else i+="top: 0;bottom: 0; left: 0;right: 0;position: fixed;",e.style.cssText=i;return t.appendChild(e),e.onclick=function(){!0===n._options.exitOnOverlayClick&&A.call(n,t)},window.setTimeout(function(){i+="opacity: "+n._options.overlayOpacity.toString()+";",e.style.cssText=i},10),!0}.call(this,t)&&(E.call(this),this._options.keyboardNavigation&&u.on(window,"keydown",c,this,!0),u.on(window,"resize",a,this,!0)),!1}function a(){this.refresh.call(this)}function c(t){var e=null===t.code?t.which:t.code;if(null===e&&(e=null===t.charCode?t.keyCode:t.charCode),"Escape"!==e&&27!==e||!0!==this._options.exitOnEsc){if("ArrowLeft"===e||37===e)N.call(this);else if("ArrowRight"===e||39===e)E.call(this);else if("Enter"===e||13===e){var i=t.target||t.srcElement;i&&i.className.match("introjs-prevbutton")?N.call(this):i&&i.className.match("introjs-skipbutton")?(this._introItems.length-1===this._currentStep&&"function"==typeof this._introCompleteCallback&&this._introCompleteCallback.call(this),A.call(this,this._targetElement)):i&&i.getAttribute("data-stepnumber")?i.click():E.call(this),t.preventDefault?t.preventDefault():t.returnValue=!1}}else A.call(this,this._targetElement)}function h(t){if(null===t||"object"!=typeof t||void 0!==t.nodeType)return t;var e={};for(var i in t)void 0!==window.jQuery&&t[i]instanceof window.jQuery?e[i]=t[i]:e[i]=h(t[i]);return e}function E(){this._direction="forward",void 0!==this._currentStepNumber&&B(this._introItems,function(t,e){t.step===this._currentStepNumber&&(this._currentStep=e-1,this._currentStepNumber=void 0)}.bind(this)),void 0===this._currentStep?this._currentStep=0:++this._currentStep;var t=this._introItems[this._currentStep],e=!0;return void 0!==this._introBeforeChangeCallback&&(e=this._introBeforeChangeCallback.call(this,t.element)),!1===e?(--this._currentStep,!1):this._introItems.length<=this._currentStep?("function"==typeof this._introCompleteCallback&&this._introCompleteCallback.call(this),void A.call(this,this._targetElement)):void i.call(this,t)}function N(){if(this._direction="backward",0===this._currentStep)return!1;--this._currentStep;var t=this._introItems[this._currentStep],e=!0;if(void 0!==this._introBeforeChangeCallback&&(e=this._introBeforeChangeCallback.call(this,t.element)),!1===e)return++this._currentStep,!1;i.call(this,t)}function A(t,e){var i=!0;if(void 0!==this._introBeforeExitCallback&&(i=this._introBeforeExitCallback.call(this)),e||!1!==i){var n=t.querySelectorAll(".introjs-overlay");n&&n.length&&B(n,function(t){t.style.opacity=0,window.setTimeout(function(){this.parentNode&&this.parentNode.removeChild(this)}.bind(t),500)}.bind(this));var o=t.querySelector(".introjs-helperLayer");o&&o.parentNode.removeChild(o);var s=t.querySelector(".introjs-tooltipReferenceLayer");s&&s.parentNode.removeChild(s);var l=t.querySelector(".introjs-disableInteraction");l&&l.parentNode.removeChild(l);var r=document.querySelector(".introjsFloatingElement");r&&r.parentNode.removeChild(r),q(),B(document.querySelectorAll(".introjs-fixParent"),function(t){O(t,/introjs-fixParent/g)}),u.off(window,"keydown",c,this,!0),u.off(window,"resize",a,this,!0),void 0!==this._introExitCallback&&this._introExitCallback.call(this),this._currentStep=void 0}}function L(t,e,i,n,o){var s,l,r,a,c,h="";if(o=o||!1,e.style.top=null,e.style.right=null,e.style.bottom=null,e.style.left=null,e.style.marginLeft=null,e.style.marginTop=null,i.style.display="inherit",null!=n&&(n.style.top=null,n.style.left=null),this._introItems[this._currentStep])switch(h="string"==typeof(s=this._introItems[this._currentStep]).tooltipClass?s.tooltipClass:this._options.tooltipClass,e.className=("introjs-tooltip "+h).replace(/^\s+|\s+$/g,""),e.setAttribute("role","dialog"),"floating"!==(c=this._introItems[this._currentStep].position)&&(c=function(t,e,i){var n=this._options.positionPrecedence.slice(),o=b(),s=k(e).height+10,l=k(e).width+20,r=t.getBoundingClientRect(),a="floating";r.bottom+s+s>o.height&&m(n,"bottom");r.top-s<0&&m(n,"top");r.right+l>o.width&&m(n,"right");r.left-l<0&&m(n,"left");var c=(h=i||"",u=h.indexOf("-"),-1!==u?h.substr(u):"");var h,u;i&&(i=i.split("-")[0]);n.length&&(a="auto"!==i&&-1<n.indexOf(i)?i:n[0]);-1!==["top","bottom"].indexOf(a)&&(a+=function(t,e,i,n){var o=e/2,s=Math.min(i.width,window.screen.width),l=["-left-aligned","-middle-aligned","-right-aligned"],r="";s-t<e&&m(l,"-left-aligned");(t<o||s-t<o)&&m(l,"-middle-aligned");t<e&&m(l,"-right-aligned");r=l.length?-1!==l.indexOf(n)?n:l[0]:"-middle-aligned";return r}(r.left,l,o,c));return a}.call(this,t,e,c)),r=k(t),l=k(e),a=b(),H(e,"introjs-"+c),c){case"top-right-aligned":i.className="introjs-arrow bottom-right";var u=0;f(r,u,l,e),e.style.bottom=r.height+20+"px";break;case"top-middle-aligned":i.className="introjs-arrow bottom-middle";var d=r.width/2-l.width/2;o&&(d+=5),f(r,d,l,e)&&(e.style.right=null,p(r,d,l,a,e)),e.style.bottom=r.height+20+"px";break;case"top-left-aligned":case"top":i.className="introjs-arrow bottom",p(r,o?0:15,l,a,e),e.style.bottom=r.height+20+"px";break;case"right":e.style.left=r.width+20+"px",r.top+l.height>a.height?(i.className="introjs-arrow left-bottom",e.style.top="-"+(l.height-r.height-20)+"px"):i.className="introjs-arrow left";break;case"left":o||!0!==this._options.showStepNumbers||(e.style.top="15px"),r.top+l.height>a.height?(e.style.top="-"+(l.height-r.height-20)+"px",i.className="introjs-arrow right-bottom"):i.className="introjs-arrow right",e.style.right=r.width+20+"px";break;case"floating":i.style.display="none",e.style.left="50%",e.style.top="50%",e.style.marginLeft="-"+l.width/2+"px",e.style.marginTop="-"+l.height/2+"px",null!=n&&(n.style.left="-"+(l.width/2+18)+"px",n.style.top="-"+(l.height/2+18)+"px");break;case"bottom-right-aligned":i.className="introjs-arrow top-right",f(r,u=0,l,e),e.style.top=r.height+20+"px";break;case"bottom-middle-aligned":i.className="introjs-arrow top-middle",d=r.width/2-l.width/2,o&&(d+=5),f(r,d,l,e)&&(e.style.right=null,p(r,d,l,a,e)),e.style.top=r.height+20+"px";break;default:i.className="introjs-arrow top",p(r,0,l,a,e),e.style.top=r.height+20+"px"}}function p(t,e,i,n,o){return t.left+e+i.width>n.width?(o.style.left=n.width-i.width-t.left+"px",!1):(o.style.left=e+"px",!0)}function f(t,e,i,n){return t.left+t.width-e-i.width<0?(n.style.left=-t.left+"px",!1):(n.style.right=e+"px",!0)}function m(t,e){-1<t.indexOf(e)&&t.splice(t.indexOf(e),1)}function T(t){if(t){if(!this._introItems[this._currentStep])return;var e=this._introItems[this._currentStep],i=k(e.element),n=this._options.helperElementPadding;d(e.element)?H(t,"introjs-fixedTooltip"):O(t,"introjs-fixedTooltip"),"floating"===e.position&&(n=0),t.style.cssText="width: "+(i.width+n)+"px; height:"+(i.height+n)+"px; top:"+(i.top-n/2)+"px;left: "+(i.left-n/2)+"px;"}}function I(t){t.setAttribute("role","button"),t.tabIndex=0}function i(o){void 0!==this._introChangeCallback&&this._introChangeCallback.call(this,o.element);var t,e,i,n,s=this,l=document.querySelector(".introjs-helperLayer"),r=document.querySelector(".introjs-tooltipReferenceLayer"),a="introjs-helperLayer";if("string"==typeof o.highlightClass&&(a+=" "+o.highlightClass),"string"==typeof this._options.highlightClass&&(a+=" "+this._options.highlightClass),null!==l){var c=r.querySelector(".introjs-helperNumberLayer"),h=r.querySelector(".introjs-tooltiptext"),u=r.querySelector(".introjs-arrow"),d=r.querySelector(".introjs-tooltip");if(i=r.querySelector(".introjs-skipbutton"),e=r.querySelector(".introjs-prevbutton"),t=r.querySelector(".introjs-nextbutton"),l.className=a,d.style.opacity=0,d.style.display="none",null!==c){var p=this._introItems[0<=o.step-2?o.step-2:0];(null!==p&&"forward"===this._direction&&"floating"===p.position||"backward"===this._direction&&"floating"===o.position)&&(c.style.opacity=0)}(n=R(o.element))!==document.body&&V(n,o.element),T.call(s,l),T.call(s,r),B(document.querySelectorAll(".introjs-fixParent"),function(t){O(t,/introjs-fixParent/g)}),q(),s._lastShowElementTimer&&window.clearTimeout(s._lastShowElementTimer),s._lastShowElementTimer=window.setTimeout(function(){null!==c&&(c.innerHTML=o.step),h.innerHTML=o.intro,d.style.display="block",L.call(s,o.element,d,u,c),s._options.showBullets&&(r.querySelector(".introjs-bullets li > a.active").className="",r.querySelector('.introjs-bullets li > a[data-stepnumber="'+o.step+'"]').className="active"),r.querySelector(".introjs-progress .introjs-progressbar").style.cssText="width:"+z.call(s)+"%;",r.querySelector(".introjs-progress .introjs-progressbar").setAttribute("aria-valuenow",z.call(s)),d.style.opacity=1,c&&(c.style.opacity=1),null!=i&&/introjs-donebutton/gi.test(i.className)?i.focus():null!=t&&t.focus(),P.call(s,o.scrollTo,o,h)},350)}else{var f=document.createElement("div"),m=document.createElement("div"),b=document.createElement("div"),g=document.createElement("div"),y=document.createElement("div"),v=document.createElement("div"),_=document.createElement("div"),w=document.createElement("div");f.className=a,m.className="introjs-tooltipReferenceLayer",(n=R(o.element))!==document.body&&V(n,o.element),T.call(s,f),T.call(s,m),this._targetElement.appendChild(f),this._targetElement.appendChild(m),b.className="introjs-arrow",y.className="introjs-tooltiptext",y.innerHTML=o.intro,!(v.className="introjs-bullets")===this._options.showBullets&&(v.style.display="none");var C=document.createElement("ul");C.setAttribute("role","tablist");var j=function(){s.goToStep(this.getAttribute("data-stepnumber"))};B(this._introItems,function(t,e){var i=document.createElement("li"),n=document.createElement("a");i.setAttribute("role","presentation"),n.setAttribute("role","tab"),n.onclick=j,e===o.step-1&&(n.className="active"),I(n),n.innerHTML="&nbsp;",n.setAttribute("data-stepnumber",t.step),i.appendChild(n),C.appendChild(i)}),v.appendChild(C),!(_.className="introjs-progress")===this._options.showProgress&&(_.style.display="none");var k=document.createElement("div");k.className="introjs-progressbar",k.setAttribute("role","progress"),k.setAttribute("aria-valuemin",0),k.setAttribute("aria-valuemax",100),k.setAttribute("aria-valuenow",z.call(this)),k.style.cssText="width:"+z.call(this)+"%;",_.appendChild(k),!(w.className="introjs-tooltipbuttons")===this._options.showButtons&&(w.style.display="none"),g.className="introjs-tooltip",g.appendChild(y),g.appendChild(v),g.appendChild(_);var x=document.createElement("span");!0===this._options.showStepNumbers&&(x.className="introjs-helperNumberLayer",x.innerHTML=o.step,m.appendChild(x)),g.appendChild(b),m.appendChild(g),(t=document.createElement("a")).onclick=function(){s._introItems.length-1!==s._currentStep&&E.call(s)},I(t),t.innerHTML=this._options.nextLabel,(e=document.createElement("a")).onclick=function(){0!==s._currentStep&&N.call(s)},I(e),e.innerHTML=this._options.prevLabel,(i=document.createElement("a")).className=this._options.buttonClass+" introjs-skipbutton ",I(i),i.innerHTML=this._options.skipLabel,i.onclick=function(){s._introItems.length-1===s._currentStep&&"function"==typeof s._introCompleteCallback&&s._introCompleteCallback.call(s),s._introItems.length-1!==s._currentStep&&"function"==typeof s._introExitCallback&&s._introExitCallback.call(s),"function"==typeof s._introSkipCallback&&s._introSkipCallback.call(s),A.call(s,s._targetElement)},w.appendChild(i),1<this._introItems.length&&(w.appendChild(e),w.appendChild(t)),g.appendChild(w),L.call(s,o.element,g,b,x),P.call(this,o.scrollTo,o,g)}var S=s._targetElement.querySelector(".introjs-disableInteraction");S&&S.parentNode.removeChild(S),o.disableInteraction&&function(){var t=document.querySelector(".introjs-disableInteraction");null===t&&((t=document.createElement("div")).className="introjs-disableInteraction",this._targetElement.appendChild(t)),T.call(this,t)}.call(s),0===this._currentStep&&1<this._introItems.length?(null!=i&&(i.className=this._options.buttonClass+" introjs-skipbutton"),null!=t&&(t.className=this._options.buttonClass+" introjs-nextbutton"),!0===this._options.hidePrev?(null!=e&&(e.className=this._options.buttonClass+" introjs-prevbutton introjs-hidden"),null!=t&&H(t,"introjs-fullbutton")):null!=e&&(e.className=this._options.buttonClass+" introjs-prevbutton introjs-disabled"),null!=i&&(i.innerHTML=this._options.skipLabel)):this._introItems.length-1===this._currentStep||1===this._introItems.length?(null!=i&&(i.innerHTML=this._options.doneLabel,H(i,"introjs-donebutton")),null!=e&&(e.className=this._options.buttonClass+" introjs-prevbutton"),!0===this._options.hideNext?(null!=t&&(t.className=this._options.buttonClass+" introjs-nextbutton introjs-hidden"),null!=e&&H(e,"introjs-fullbutton")):null!=t&&(t.className=this._options.buttonClass+" introjs-nextbutton introjs-disabled")):(null!=i&&(i.className=this._options.buttonClass+" introjs-skipbutton"),null!=e&&(e.className=this._options.buttonClass+" introjs-prevbutton"),null!=t&&(t.className=this._options.buttonClass+" introjs-nextbutton"),null!=i&&(i.innerHTML=this._options.skipLabel)),e.setAttribute("role","button"),t.setAttribute("role","button"),i.setAttribute("role","button"),null!=t&&t.focus(),function(t){var e;if(t.element instanceof SVGElement)for(e=t.element.parentNode;null!==t.element.parentNode&&e.tagName&&"body"!==e.tagName.toLowerCase();)"svg"===e.tagName.toLowerCase()&&H(e,"introjs-showElement introjs-relativePosition"),e=e.parentNode;H(t.element,"introjs-showElement");var i=M(t.element,"position");"absolute"!==i&&"relative"!==i&&"fixed"!==i&&H(t.element,"introjs-relativePosition");e=t.element.parentNode;for(;null!==e&&e.tagName&&"body"!==e.tagName.toLowerCase();){var n=M(e,"z-index"),o=parseFloat(M(e,"opacity")),s=M(e,"transform")||M(e,"-webkit-transform")||M(e,"-moz-transform")||M(e,"-ms-transform")||M(e,"-o-transform");(/[0-9]+/.test(n)||o<1||"none"!==s&&void 0!==s)&&H(e,"introjs-fixParent"),e=e.parentNode}}(o),void 0!==this._introAfterChangeCallback&&this._introAfterChangeCallback.call(this,o.element)}function P(t,e,i){var n,o,s;if("off"!==t&&(this._options.scrollToElement&&(n="tooltip"===t?i.getBoundingClientRect():e.element.getBoundingClientRect(),o=e.element,!(0<=(s=o.getBoundingClientRect()).top&&0<=s.left&&s.bottom+80<=window.innerHeight&&s.right<=window.innerWidth)))){var l=b().height;n.bottom-(n.bottom-n.top)<0||e.element.clientHeight>l?window.scrollBy(0,n.top-(l/2-n.height/2)-this._options.scrollPadding):window.scrollBy(0,n.top-(l/2-n.height/2)+this._options.scrollPadding)}}function q(){B(document.querySelectorAll(".introjs-showElement"),function(t){O(t,/introjs-[a-zA-Z]+/g)})}function B(t,e,i){if(t)for(var n=0,o=t.length;n<o;n++)e(t[n],n);"function"==typeof i&&i()}var o,s=(o={},function(t,e){return o[e=e||"introjs-stamp"]=o[e]||0,void 0===t[e]&&(t[e]=o[e]++),t[e]}),u=new function(){var r="introjs_event";this._id=function(t,e,i,n){return e+s(i)+(n?"_"+s(n):"")},this.on=function(e,t,i,n,o){var s=this._id.apply(this,arguments),l=function(t){return i.call(n||e,t||window.event)};"addEventListener"in e?e.addEventListener(t,l,o):"attachEvent"in e&&e.attachEvent("on"+t,l),e[r]=e[r]||{},e[r][s]=l},this.off=function(t,e,i,n,o){var s=this._id.apply(this,arguments),l=t[r]&&t[r][s];l&&("removeEventListener"in t?t.removeEventListener(e,l,o):"detachEvent"in t&&t.detachEvent("on"+e,l),t[r][s]=null)}};function H(e,t){if(e instanceof SVGElement){var i=e.getAttribute("class")||"";e.setAttribute("class",i+" "+t)}else{if(void 0!==e.classList)B(t.split(" "),function(t){e.classList.add(t)});else e.className.match(t)||(e.className+=" "+t)}}function O(t,e){if(t instanceof SVGElement){var i=t.getAttribute("class")||"";t.setAttribute("class",i.replace(e,"").replace(/^\s+|\s+$/g,""))}else t.className=t.className.replace(e,"").replace(/^\s+|\s+$/g,"")}function M(t,e){var i="";return t.currentStyle?i=t.currentStyle[e]:document.defaultView&&document.defaultView.getComputedStyle&&(i=document.defaultView.getComputedStyle(t,null).getPropertyValue(e)),i&&i.toLowerCase?i.toLowerCase():i}function d(t){var e=t.parentNode;return!(!e||"HTML"===e.nodeName)&&("fixed"===M(t,"position")||d(e))}function b(){if(void 0!==window.innerWidth)return{width:window.innerWidth,height:window.innerHeight};var t=document.documentElement;return{width:t.clientWidth,height:t.clientHeight}}function g(){var t=document.querySelector(".introjs-hintReference");if(t){var e=t.getAttribute("data-step");return t.parentNode.removeChild(t),e}}function l(t){if(this._introItems=[],this._options.hints)B(this._options.hints,function(t){var e=h(t);"string"==typeof e.element&&(e.element=document.querySelector(e.element)),e.hintPosition=e.hintPosition||this._options.hintPosition,e.hintAnimation=e.hintAnimation||this._options.hintAnimation,null!==e.element&&this._introItems.push(e)}.bind(this));else{var e=t.querySelectorAll("*[data-hint]");if(!e||!e.length)return!1;B(e,function(t){var e=t.getAttribute("data-hintanimation");e=e?"true"===e:this._options.hintAnimation,this._introItems.push({element:t,hint:t.getAttribute("data-hint"),hintPosition:t.getAttribute("data-hintposition")||this._options.hintPosition,hintAnimation:e,tooltipClass:t.getAttribute("data-tooltipclass"),position:t.getAttribute("data-position")||this._options.tooltipPosition})}.bind(this))}(function(){var l=this,r=document.querySelector(".introjs-hints");null===r&&((r=document.createElement("div")).className="introjs-hints");B(this._introItems,function(t,e){if(!document.querySelector('.introjs-hint[data-step="'+e+'"]')){var i,n=document.createElement("a");I(n),n.onclick=(i=e,function(t){var e=t||window.event;e.stopPropagation&&e.stopPropagation(),null!==e.cancelBubble&&(e.cancelBubble=!0),j.call(l,i)}),n.className="introjs-hint",t.hintAnimation||H(n,"introjs-hint-no-anim"),d(t.element)&&H(n,"introjs-fixedhint");var o=document.createElement("div");o.className="introjs-hint-dot";var s=document.createElement("div");s.className="introjs-hint-pulse",n.appendChild(o),n.appendChild(s),n.setAttribute("data-step",e),t.targetElement=t.element,t.element=n,C.call(this,t.hintPosition,n,t.targetElement),r.appendChild(n)}}.bind(this)),document.body.appendChild(r),void 0!==this._hintsAddedCallback&&this._hintsAddedCallback.call(this)}).call(this),u.on(document,"click",g,this,!1),u.on(window,"resize",r,this,!0)}function r(){B(this._introItems,function(t){void 0!==t.targetElement&&C.call(this,t.hintPosition,t.element,t.targetElement)}.bind(this))}function y(t){var e=document.querySelector(".introjs-hints");return e?e.querySelectorAll(t):[]}function v(t){var e=y('.introjs-hint[data-step="'+t+'"]')[0];g.call(this),e&&H(e,"introjs-hidehint"),void 0!==this._hintCloseCallback&&this._hintCloseCallback.call(this,t)}function _(t){var e=y('.introjs-hint[data-step="'+t+'"]')[0];e&&O(e,/introjs-hidehint/g)}function w(t){var e=y('.introjs-hint[data-step="'+t+'"]')[0];e&&e.parentNode.removeChild(e)}function C(t,e,i){var n=k.call(this,i);switch(t){default:case"top-left":e.style.left=n.left+"px",e.style.top=n.top+"px";break;case"top-right":e.style.left=n.left+n.width-20+"px",e.style.top=n.top+"px";break;case"bottom-left":e.style.left=n.left+"px",e.style.top=n.top+n.height-20+"px";break;case"bottom-right":e.style.left=n.left+n.width-20+"px",e.style.top=n.top+n.height-20+"px";break;case"middle-left":e.style.left=n.left+"px",e.style.top=n.top+(n.height-20)/2+"px";break;case"middle-right":e.style.left=n.left+n.width-20+"px",e.style.top=n.top+(n.height-20)/2+"px";break;case"middle-middle":e.style.left=n.left+(n.width-20)/2+"px",e.style.top=n.top+(n.height-20)/2+"px";break;case"bottom-middle":e.style.left=n.left+(n.width-20)/2+"px",e.style.top=n.top+n.height-20+"px";break;case"top-middle":e.style.left=n.left+(n.width-20)/2+"px",e.style.top=n.top+"px"}}function j(t){var e=document.querySelector('.introjs-hint[data-step="'+t+'"]'),i=this._introItems[t];void 0!==this._hintClickCallback&&this._hintClickCallback.call(this,e,i,t);var n=g.call(this);if(parseInt(n,10)!==t){var o=document.createElement("div"),s=document.createElement("div"),l=document.createElement("div"),r=document.createElement("div");o.className="introjs-tooltip",o.onclick=function(t){t.stopPropagation?t.stopPropagation():t.cancelBubble=!0},s.className="introjs-tooltiptext";var a=document.createElement("p");a.innerHTML=i.hint;var c=document.createElement("a");c.className=this._options.buttonClass,c.setAttribute("role","button"),c.innerHTML=this._options.hintButtonLabel,c.onclick=v.bind(this,t),s.appendChild(a),s.appendChild(c),l.className="introjs-arrow",o.appendChild(l),o.appendChild(s),this._currentStep=e.getAttribute("data-step"),r.className="introjs-tooltipReferenceLayer introjs-hintReference",r.setAttribute("data-step",e.getAttribute("data-step")),T.call(this,r),r.appendChild(o),document.body.appendChild(r),L.call(this,e,o,l,null,!0)}}function k(t){var e=document.body,i=document.documentElement,n=window.pageYOffset||i.scrollTop||e.scrollTop,o=window.pageXOffset||i.scrollLeft||e.scrollLeft,s=t.getBoundingClientRect();return{top:s.top+n,width:s.width,height:s.height,left:s.left+o}}function R(t){var e=window.getComputedStyle(t),i="absolute"===e.position,n=/(auto|scroll)/;if("fixed"===e.position)return document.body;for(var o=t;o=o.parentElement;)if(e=window.getComputedStyle(o),(!i||"static"!==e.position)&&n.test(e.overflow+e.overflowY+e.overflowX))return o;return document.body}function V(t,e){t.scrollTop=e.offsetTop-t.offsetTop}function z(){return parseInt(this._currentStep+1,10)/this._introItems.length*100}var x=function(t){var e;if("object"==typeof t)e=new n(t);else if("string"==typeof t){var i=document.querySelector(t);if(!i)throw new Error("There is no element with given selector.");e=new n(i)}else e=new n(document.body);return x.instances[s(e,"introjs-instance")]=e};return x.version="2.9.3",x.instances={},x.fn=n.prototype={clone:function(){return new n(this)},setOption:function(t,e){return this._options[t]=e,this},setOptions:function(t){return this._options=function(t,e){var i,n={};for(i in t)n[i]=t[i];for(i in e)n[i]=e[i];return n}(this._options,t),this},start:function(t){return e.call(this,this._targetElement,t),this},goToStep:function(t){return function(t){this._currentStep=t-2,void 0!==this._introItems&&E.call(this)}.call(this,t),this},addStep:function(t){return this._options.steps||(this._options.steps=[]),this._options.steps.push(t),this},addSteps:function(t){if(t.length){for(var e=0;e<t.length;e++)this.addStep(t[e]);return this}},goToStepNumber:function(t){return function(t){this._currentStepNumber=t,void 0!==this._introItems&&E.call(this)}.call(this,t),this},nextStep:function(){return E.call(this),this},previousStep:function(){return N.call(this),this},exit:function(t){return A.call(this,this._targetElement,t),this},refresh:function(){return function(){if(T.call(this,document.querySelector(".introjs-helperLayer")),T.call(this,document.querySelector(".introjs-tooltipReferenceLayer")),T.call(this,document.querySelector(".introjs-disableInteraction")),void 0!==this._currentStep&&null!==this._currentStep){var t=document.querySelector(".introjs-helperNumberLayer"),e=document.querySelector(".introjs-arrow"),i=document.querySelector(".introjs-tooltip");L.call(this,this._introItems[this._currentStep].element,i,e,t)}return r.call(this),this}.call(this),this},onbeforechange:function(t){if("function"!=typeof t)throw new Error("Provided callback for onbeforechange was not a function");return this._introBeforeChangeCallback=t,this},onchange:function(t){if("function"!=typeof t)throw new Error("Provided callback for onchange was not a function.");return this._introChangeCallback=t,this},onafterchange:function(t){if("function"!=typeof t)throw new Error("Provided callback for onafterchange was not a function");return this._introAfterChangeCallback=t,this},oncomplete:function(t){if("function"!=typeof t)throw new Error("Provided callback for oncomplete was not a function.");return this._introCompleteCallback=t,this},onhintsadded:function(t){if("function"!=typeof t)throw new Error("Provided callback for onhintsadded was not a function.");return this._hintsAddedCallback=t,this},onhintclick:function(t){if("function"!=typeof t)throw new Error("Provided callback for onhintclick was not a function.");return this._hintClickCallback=t,this},onhintclose:function(t){if("function"!=typeof t)throw new Error("Provided callback for onhintclose was not a function.");return this._hintCloseCallback=t,this},onexit:function(t){if("function"!=typeof t)throw new Error("Provided callback for onexit was not a function.");return this._introExitCallback=t,this},onskip:function(t){if("function"!=typeof t)throw new Error("Provided callback for onskip was not a function.");return this._introSkipCallback=t,this},onbeforeexit:function(t){if("function"!=typeof t)throw new Error("Provided callback for onbeforeexit was not a function.");return this._introBeforeExitCallback=t,this},addHints:function(){return l.call(this,this._targetElement),this},hideHint:function(t){return v.call(this,t),this},hideHints:function(){return function(){B(y(".introjs-hint"),function(t){v.call(this,t.getAttribute("data-step"))}.bind(this))}.call(this),this},showHint:function(t){return _.call(this,t),this},showHints:function(){return function(){var t=y(".introjs-hint");t&&t.length?B(t,function(t){_.call(this,t.getAttribute("data-step"))}.bind(this)):l.call(this,this._targetElement)}.call(this),this},removeHints:function(){return function(){B(y(".introjs-hint"),function(t){w.call(this,t.getAttribute("data-step"))}.bind(this))}.call(this),this},removeHint:function(t){return w.call(this,t),this},showHintDialog:function(t){return j.call(this,t),this}},x});
resources/js/plugin.js CHANGED
@@ -52,6 +52,15 @@ let iCWP_WPSF_OptsPageRender = new function () {
52
  };
53
  }();
54
 
 
 
 
 
 
 
 
 
 
55
  var iCWP_WPSF_Toaster = new function () {
56
 
57
  this.showMessage = function ( sMessage, bSuccess ) {
@@ -214,7 +223,7 @@ if ( typeof icwp_wpsf_vars_secadmin !== 'undefined' && icwp_wpsf_vars_secadmin.t
214
 
215
  bCheckInPlace = false;
216
 
217
- jQuery.post( ajaxurl, icwp_wpsf_vars_secadmin.reqajax,
218
  function ( oResponse ) {
219
  if ( oResponse.data.success ) {
220
  var nLeft = oResponse.data.timeleft;
52
  };
53
  }();
54
 
55
+ if ( typeof icwp_wpsf_vars_tourmanager !== 'undefined' ) {
56
+ var iCWP_WPSF_MarkTourFinished = new function () {
57
+ this.finishedTour = function ( sTourKey ) {
58
+ icwp_wpsf_vars_tourmanager.ajax[ 'tour_key' ] = sTourKey;
59
+ jQuery.post( ajaxurl, icwp_wpsf_vars_tourmanager.ajax ).always();
60
+ };
61
+ }();
62
+ }
63
+
64
  var iCWP_WPSF_Toaster = new function () {
65
 
66
  this.showMessage = function ( sMessage, bSuccess ) {
223
 
224
  bCheckInPlace = false;
225
 
226
+ jQuery.post( ajaxurl, icwp_wpsf_vars_secadmin.ajax.check,
227
  function ( oResponse ) {
228
  if ( oResponse.data.success ) {
229
  var nLeft = oResponse.data.timeleft;
resources/js/shield-tables.js CHANGED
@@ -118,6 +118,17 @@ jQuery.fn.icwpWpsfTableWithFilter = function ( aOptions ) {
118
  }
119
  );
120
 
 
 
 
 
 
 
 
 
 
 
 
121
  plugin.$element.on(
122
  'click' + '.' + plugin._name,
123
  '.tablenav.top input[type=submit].button.action',
@@ -218,6 +229,13 @@ jQuery.fn.icwpWpsfTableWithFilter = function ( aOptions ) {
218
  this.sendReq( aRequestData );
219
  },
220
 
 
 
 
 
 
 
 
221
  customAction: function () {
222
  this.sendReq( this.options[ 'working_custom_action' ] );
223
  },
118
  }
119
  );
120
 
121
+ plugin.$element.on(
122
+ 'click' + '.' + plugin._name,
123
+ 'button.action.item_action',
124
+ function ( evt ) {
125
+ evt.preventDefault();
126
+ plugin.options[ 'working_rid' ] = $( this ).data( 'rid' );
127
+ plugin.options[ 'working_item_action' ] = $( this ).data( 'item_action' );
128
+ plugin.itemAction.call( plugin );
129
+ }
130
+ );
131
+
132
  plugin.$element.on(
133
  'click' + '.' + plugin._name,
134
  '.tablenav.top input[type=submit].button.action',
229
  this.sendReq( aRequestData );
230
  },
231
 
232
+ itemAction: function () {
233
+ let aRequestData = this.options[ 'ajax_item_action' ];
234
+ aRequestData[ 'rid' ] = this.options[ 'working_rid' ];
235
+ aRequestData[ 'item_action' ] = this.options[ 'working_item_action' ];
236
+ this.sendReq( aRequestData );
237
+ },
238
+
239
  customAction: function () {
240
  this.sendReq( this.options[ 'working_custom_action' ] );
241
  },
src/common/icwp-data.php DELETED
@@ -1,606 +0,0 @@
1
- <?php
2
-
3
- class ICWP_WPSF_DataProcessor extends ICWP_WPSF_Foundation {
4
-
5
- /**
6
- * @var ICWP_WPSF_DataProcessor
7
- */
8
- protected static $oInstance = null;
9
-
10
- /**
11
- * @var int
12
- */
13
- protected static $nRequestTime = null;
14
-
15
- protected function __construct() {
16
- }
17
-
18
- /**
19
- * @return ICWP_WPSF_DataProcessor
20
- */
21
- public static function GetInstance() {
22
- if ( is_null( self::$oInstance ) ) {
23
- self::$oInstance = new self();
24
- }
25
- return self::$oInstance;
26
- }
27
-
28
- /**
29
- * @param array $aA
30
- * @return array
31
- */
32
- public function shuffleArray( $aA ) {
33
- $aKeys = array_keys( $aA );
34
- shuffle( $aKeys );
35
- return array_merge( array_flip( $aKeys ), $aA );
36
- }
37
-
38
- /**
39
- * @param array $aArray1
40
- * @param array $aArray2
41
- * @return array
42
- */
43
- public function mergeArraysRecursive( $aArray1, $aArray2 ) {
44
- foreach ( $aArray2 as $key => $Value ) {
45
- if ( array_key_exists( $key, $aArray1 ) && is_array( $Value ) ) {
46
- $aArray1[ $key ] = $this->mergeArraysRecursive( $aArray1[ $key ], $aArray2[ $key ] );
47
- }
48
- else {
49
- $aArray1[ $key ] = $Value;
50
- }
51
- }
52
- return $aArray1;
53
- }
54
-
55
- /**
56
- * @param string $sPath
57
- * @param string $sExtensionToAdd
58
- * @return string
59
- */
60
- public function addExtensionToFilePath( $sPath, $sExtensionToAdd ) {
61
-
62
- if ( strpos( $sExtensionToAdd, '.' ) === false ) {
63
- $sExtensionToAdd = '.'.$sExtensionToAdd;
64
- }
65
-
66
- if ( !$this->getIfStringEndsIn( $sPath, $sExtensionToAdd ) ) {
67
- $sPath = $sPath.$sExtensionToAdd;
68
- }
69
- return $sPath;
70
- }
71
-
72
- /**
73
- * @param string $sHaystack
74
- * @param string $sNeedle
75
- * @return bool
76
- */
77
- public function getIfStringEndsIn( $sHaystack, $sNeedle ) {
78
- $nNeedleLength = strlen( $sNeedle );
79
- $sStringEndsIn = substr( $sHaystack, strlen( $sHaystack ) - $nNeedleLength, $nNeedleLength );
80
- return ( $sStringEndsIn == $sNeedle );
81
- }
82
-
83
- /**
84
- * @param string $sPath
85
- * @return string
86
- */
87
- public function getExtension( $sPath ) {
88
- $nLastPeriod = strrpos( $sPath, '.' );
89
- return ( $nLastPeriod === false ) ? $sPath : str_replace( '.', '', substr( $sPath, $nLastPeriod ) );
90
- }
91
-
92
- /**
93
- * @return bool
94
- */
95
- public function isWindows() {
96
- return strtoupper( substr( PHP_OS, 0, 3 ) ) === 'WIN';
97
- }
98
-
99
- /**
100
- * @param string $sPrevious
101
- * @param string $sNew
102
- * @param string $sQueryType
103
- * @return bool
104
- * @throws \Exception
105
- */
106
- public function isNewVersion( $sPrevious, $sNew, $sQueryType = 'minor' ) {
107
- if ( substr_count( $sPrevious, '.' ) !== 2 || substr_count( $sNew, '.' ) !== 2 ) {
108
- throw new \Exception( 'Version not of support type' );
109
- }
110
- $sPreviousBranch = implode( '.', array_slice( preg_split( '/[.-]/', $sPrevious ), 0, 2 ) ); // x.y
111
- $sNewBranch = implode( '.', array_slice( preg_split( '/[.-]/', $sNew ), 0, 2 ) ); // x.y
112
-
113
- $bIsType = false;
114
- switch ( $sQueryType ) {
115
- case 'minor':
116
- $bIsType = ( $sPreviousBranch == $sNew );
117
- break;
118
- case 'major':
119
- $bIsType = version_compare( $sPreviousBranch, $sNewBranch, '<' );
120
- break;
121
- }
122
- return $bIsType;
123
- }
124
-
125
- /**
126
- * @param string $sUrl
127
- * @return string
128
- */
129
- public function urlStripQueryPart( $sUrl ) {
130
- return preg_replace( '#\s?\?.*$#', '', $sUrl );
131
- }
132
-
133
- /**
134
- * @param string $sUrl
135
- * @return string
136
- */
137
- public function urlStripSchema( $sUrl ) {
138
- return preg_replace( '#^((http|https):)?//#i', '', $sUrl );
139
- }
140
-
141
- /**
142
- * Will strip everything from a URL except Scheme+Host and requires that Scheme+Host be present
143
- * @return string|false
144
- */
145
- public function validateSimpleHttpUrl( $sUrl ) {
146
- $sValidatedUrl = false;
147
-
148
- $sUrl = trim( $this->urlStripQueryPart( $sUrl ) );
149
- if ( filter_var( $sUrl, FILTER_VALIDATE_URL ) ) { // we have a scheme+host
150
- if ( in_array( parse_url( $sUrl, PHP_URL_SCHEME ), [ 'http', 'https' ] ) ) {
151
- $sValidatedUrl = rtrim( $sUrl, '/' );
152
- }
153
- }
154
-
155
- return $sValidatedUrl;
156
- }
157
-
158
- /**
159
- * @param string $sEmail
160
- * @return boolean
161
- */
162
- public function validEmail( $sEmail ) {
163
- return ( !empty( $sEmail ) && function_exists( 'is_email' ) && is_email( $sEmail ) );
164
- }
165
-
166
- /**
167
- * @param string $sUrl
168
- * @param bool $bVerify
169
- * @return bool
170
- */
171
- public function isValidUrl( $sUrl, $bVerify = false ) {
172
- $bValid = filter_var( $sUrl, FILTER_VALIDATE_URL );
173
- if ( $bValid && $bVerify ) {
174
- $mRes = $this->loadFS()->getUrl( $sUrl );
175
- if ( is_array( $mRes ) && isset( $mRes[ 'http_response' ] ) ) {
176
- /** @var WP_HTTP_Requests_Response $oResp */
177
- $oResp = $mRes[ 'http_response' ];
178
- $bValid = $oResp->get_status() >= 200 && $oResp->get_status() < 300;
179
- }
180
- }
181
- return $bValid;
182
- }
183
-
184
- /**
185
- * @param string $sRawList
186
- * @return array
187
- */
188
- public function extractCommaSeparatedList( $sRawList = '' ) {
189
-
190
- $aRawList = [];
191
- if ( empty( $sRawList ) ) {
192
- return $aRawList;
193
- }
194
-
195
- $aRawList = array_map( 'trim', preg_split( '/\r\n|\r|\n/', $sRawList ) );
196
- $aNewList = [];
197
- $bHadStar = false;
198
- foreach ( $aRawList as $sKey => $sRawLine ) {
199
-
200
- if ( empty( $sRawLine ) ) {
201
- continue;
202
- }
203
- $sRawLine = str_replace( ' ', '', $sRawLine );
204
- $aParts = explode( ',', $sRawLine, 2 );
205
- // we only permit 1x line beginning with *
206
- if ( $aParts[ 0 ] == '*' ) {
207
- if ( $bHadStar ) {
208
- continue;
209
- }
210
- $bHadStar = true;
211
- }
212
- else {
213
- //If there's only 1 item on the line, we assume it to be a global
214
- // parameter rule
215
- if ( count( $aParts ) == 1 || empty( $aParts[ 1 ] ) ) { // there was no comma in this line in the first place
216
- array_unshift( $aParts, '*' );
217
- }
218
- }
219
-
220
- $aParams = empty( $aParts[ 1 ] ) ? [] : explode( ',', $aParts[ 1 ] );
221
- $aNewList[ $aParts[ 0 ] ] = $aParams;
222
- }
223
- return $aNewList;
224
- }
225
-
226
- /**
227
- * Strength can be 1, 3, 7, 15
228
- * @param integer $nLength
229
- * @param integer $nStrength
230
- * @param boolean $bIgnoreAmb
231
- * @return string
232
- */
233
- public function generateRandomString( $nLength = 10, $nStrength = 7, $bIgnoreAmb = true ) {
234
- $aChars = [ 'abcdefghijkmnopqrstuvwxyz' ];
235
-
236
- if ( $nStrength & 2 ) {
237
- $aChars[] = '023456789';
238
- }
239
-
240
- if ( $nStrength & 4 ) {
241
- $aChars[] = 'ABCDEFGHJKLMNPQRSTUVWXYZ';
242
- }
243
-
244
- if ( $nStrength & 8 ) {
245
- $aChars[] = '$%^&*#';
246
- }
247
-
248
- if ( !$bIgnoreAmb ) {
249
- $aChars[] = 'OOlI1';
250
- }
251
-
252
- $sPassword = '';
253
- $sCharset = implode( '', $aChars );
254
- for ( $i = 0 ; $i < $nLength ; $i++ ) {
255
- $sPassword .= $sCharset[ ( rand()%strlen( $sCharset ) ) ];
256
- }
257
- return $sPassword;
258
- }
259
-
260
- /**
261
- * @return string
262
- */
263
- public function generateRandomLetter() {
264
- $sAtoZ = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
265
- return $sAtoZ[ wp_rand( 0, ( strlen( $sAtoZ ) - 1 ) ) ];
266
- }
267
-
268
- /**
269
- * @param array $aA
270
- * @param string $sKey
271
- * @param mixed $mDefault
272
- * @return mixed|null
273
- */
274
- public function arrayFetch( &$aA, $sKey, $mDefault = null ) {
275
- return isset( $aA[ $sKey ] ) ? $aA[ $sKey ] : $mDefault;
276
- }
277
-
278
- /**
279
- * @param string $sStringContent
280
- * @param string $sFilename
281
- */
282
- public function downloadStringAsFile( $sStringContent, $sFilename ) {
283
- header( "Content-type: application/octet-stream" );
284
- header( "Content-disposition: attachment; filename=".$sFilename );
285
- header( "Content-Transfer-Encoding: binary" );
286
- header( "Content-Length: ".strlen( $sStringContent ) );
287
- echo $sStringContent;
288
- die();
289
- }
290
-
291
- /**
292
- * Use this to reliably read the contents of a PHP file that doesn't have executable
293
- * PHP Code.
294
- * Why use this? In the name of naive security, silly web hosts can prevent reading the contents of
295
- * non-PHP files so we simply put the content we want to have read into a php file and then "include" it.
296
- * @param string $sFile
297
- * @return string
298
- */
299
- public function readFileContentsUsingInclude( $sFile ) {
300
- ob_start();
301
- include( $sFile );
302
- return ob_get_clean();
303
- }
304
-
305
- /**
306
- * @return string
307
- */
308
- public function getPhpVersion() {
309
- return ( defined( 'PHP_VERSION' ) ? PHP_VERSION : phpversion() );
310
- }
311
-
312
- /**
313
- * Cleans out any of the junk that can appear in a PHP version and returns just the 5.4.45
314
- * e.g. 5.4.45-0+deb7u5
315
- * @return string
316
- */
317
- public function getPhpVersionCleaned() {
318
- $sVersion = $this->getPhpVersion();
319
- if ( preg_match( '#^[0-9]{1}\.[0-9]{1}(\.[0-9]{1,3})?#', $sVersion, $aMatches ) ) {
320
- return $aMatches[ 0 ];
321
- }
322
- else {
323
- return $sVersion;
324
- }
325
- }
326
-
327
- /**
328
- * @param string $sAtLeastVersion
329
- * @return bool
330
- */
331
- public function getPhpVersionIsAtLeast( $sAtLeastVersion ) {
332
- return version_compare( $this->getPhpVersion(), $sAtLeastVersion, '>=' );
333
- }
334
-
335
- /**
336
- * @return bool
337
- */
338
- public function getPhpSupportsNamespaces() {
339
- return $this->getPhpVersionIsAtLeast( '5.3' );
340
- }
341
-
342
- /**
343
- * @return bool
344
- */
345
- public function getCanOpensslSign() {
346
- return function_exists( 'base64_decode' )
347
- && function_exists( 'openssl_sign' )
348
- && function_exists( 'openssl_verify' )
349
- && defined( 'OPENSSL_ALGO_SHA1' );
350
- }
351
-
352
- /**
353
- * @param array $aArray
354
- * @return stdClass
355
- */
356
- public function convertArrayToStdClass( $aArray ) {
357
- $oObject = new stdClass();
358
- if ( !empty( $aArray ) && is_array( $aArray ) ) {
359
- foreach ( $aArray as $sKey => $mValue ) {
360
- $oObject->{$sKey} = $mValue;
361
- }
362
- }
363
- return $oObject;
364
- }
365
-
366
- /**
367
- * @param stdClass $oStdClass
368
- * @return array
369
- */
370
- public function convertStdClassToArray( $oStdClass ) {
371
- return json_decode( json_encode( $oStdClass ), true );
372
- }
373
-
374
- /**
375
- * @param array $aSubjectArray
376
- * @param mixed $mValue
377
- * @param int $nDesiredPosition
378
- * @return array
379
- */
380
- public function setArrayValueToPosition( $aSubjectArray, $mValue, $nDesiredPosition ) {
381
-
382
- if ( $nDesiredPosition < 0 ) {
383
- return $aSubjectArray;
384
- }
385
-
386
- $nMaxPossiblePosition = count( $aSubjectArray ) - 1;
387
- if ( $nDesiredPosition > $nMaxPossiblePosition ) {
388
- $nDesiredPosition = $nMaxPossiblePosition;
389
- }
390
-
391
- $nPosition = array_search( $mValue, $aSubjectArray );
392
- if ( $nPosition !== false && $nPosition != $nDesiredPosition ) {
393
-
394
- // remove existing and reset index
395
- unset( $aSubjectArray[ $nPosition ] );
396
- $aSubjectArray = array_values( $aSubjectArray );
397
-
398
- // insert and update
399
- // http://stackoverflow.com/questions/3797239/insert-new-item-in-array-on-any-position-in-php
400
- array_splice( $aSubjectArray, $nDesiredPosition, 0, $mValue );
401
- }
402
-
403
- return $aSubjectArray;
404
- }
405
-
406
- /**
407
- * note: employs strict search comparison
408
- * @param array $aArray
409
- * @param mixed $mValue
410
- * @param bool $bFirstOnly - set true to only remove the first element found of this value
411
- * @return array
412
- */
413
- public function removeFromArrayByValue( $aArray, $mValue, $bFirstOnly = false ) {
414
- $aKeys = [];
415
-
416
- if ( $bFirstOnly ) {
417
- $mKey = array_search( $mValue, $aArray, true );
418
- if ( $mKey !== false ) {
419
- $aKeys[] = $mKey;
420
- }
421
- }
422
- else {
423
- $aKeys = array_keys( $aArray, $mValue, true );
424
- }
425
-
426
- foreach ( $aKeys as $mKey ) {
427
- unset( $aArray[ $mKey ] );
428
- }
429
-
430
- return $aArray;
431
- }
432
-
433
- /**
434
- * Taken from: http://stackoverflow.com/questions/1755144/how-to-validate-domain-name-in-php
435
- * @param string $sDomainName
436
- * @return bool
437
- */
438
- public function isValidDomainName( $sDomainName ) {
439
- $sDomainName = trim( $sDomainName );
440
- return ( preg_match( "/^([a-z\d](-*[a-z\d])*)(\.([a-z\d](-*[a-z\d])*))*$/i", $sDomainName ) //valid chars check
441
- && preg_match( "/^.{1,253}$/", $sDomainName ) //overall length check
442
- && preg_match( "/^[^\.]{1,63}(\.[^\.]{1,63})*$/", $sDomainName ) );//length of each label
443
- }
444
-
445
- /**
446
- * @return int
447
- * @deprecated
448
- */
449
- public function time() {
450
- return $this->loadRequest()->ts();
451
- }
452
-
453
- /**
454
- * @param string $sKey
455
- * @param string $mDefault
456
- * @param bool $bTrim -automatically trim whitespace
457
- * @return mixed|null
458
- * @deprecated
459
- */
460
- public function cookie( $sKey, $mDefault = null, $bTrim = true ) {
461
- return \FernleafSystems\Wordpress\Services\Services::Request()->cookie( $sKey, $mDefault );
462
- }
463
-
464
- /**
465
- * @param string $sKey
466
- * @param mixed $mDefault
467
- * @return mixed|null
468
- * @deprecated
469
- */
470
- public function env( $sKey, $mDefault = null ) {
471
- return \FernleafSystems\Wordpress\Services\Services::Request()->env( $sKey, $mDefault );
472
- }
473
-
474
- /**
475
- * @param string $sKey
476
- * @param null $mDefault
477
- * @param bool $bTrim -automatically trim whitespace
478
- * @return mixed|null
479
- * @deprecated
480
- */
481
- public function post( $sKey, $mDefault = null, $bTrim = true ) {
482
- return \FernleafSystems\Wordpress\Services\Services::Request()->post( $sKey, $mDefault );
483
- }
484
-
485
- /**
486
- * @param string $sKey
487
- * @param null $mDefault
488
- * @param bool $bTrim -automatically trim whitespace
489
- * @return mixed|null
490
- * @deprecated
491
- */
492
- public function query( $sKey, $mDefault = null, $bTrim = true ) {
493
- return \FernleafSystems\Wordpress\Services\Services::Request()->query( $sKey, $mDefault );
494
- }
495
-
496
- /**
497
- * @param string $sKey
498
- * @param null $mDefault
499
- * @param bool $bTrim -automatically trim whitespace
500
- * @return mixed|null
501
- * @deprecated
502
- */
503
- public function server( $sKey, $mDefault = null, $bTrim = true ) {
504
- return $this->loadRequest()->server( $sKey, $mDefault, $bTrim );
505
- }
506
-
507
- /**
508
- * @param string $sKey
509
- * @param null $mDefault
510
- * @param bool $bIncludeCookie
511
- * @param bool $bTrim -automatically trim whitespace
512
- * @return mixed|null
513
- * @deprecated
514
- */
515
- public function request( $sKey, $bIncludeCookie = false, $mDefault = null, $bTrim = true ) {
516
- return $this->loadRequest()->request( $sKey, $bIncludeCookie, $mDefault, $bTrim );
517
- }
518
-
519
- /**
520
- * @return string URI Path in lowercase
521
- * @deprecated
522
- */
523
- public function getRequestPath() {
524
- return $this->loadRequest()->getPath();
525
- }
526
-
527
- /**
528
- * @return string
529
- * @deprecated
530
- */
531
- public function getRequestUri() {
532
- return $this->loadRequest()->getUri();
533
- }
534
-
535
- /**
536
- * @return string
537
- * @deprecated
538
- */
539
- public function getUserAgent() {
540
- return $this->loadRequest()->getUserAgent();
541
- }
542
-
543
- /**
544
- * @param bool $bIncludeCookie
545
- * @return array
546
- * @deprecated
547
- */
548
- public function getRequestParams( $bIncludeCookie = true ) {
549
- return $this->loadRequest()->getParams( $bIncludeCookie );
550
- }
551
-
552
- /**
553
- * @return array
554
- * @deprecated
555
- */
556
- public function getRequestUriParts() {
557
- return $this->loadRequest()->getUriParts();
558
- }
559
-
560
- /**
561
- * @return string
562
- * @deprecated
563
- */
564
- public function getRequestMethod() {
565
- return $this->loadRequest()->getMethod();
566
- }
567
-
568
- /**
569
- * @return bool
570
- * @deprecated
571
- */
572
- public function isMethodPost() {
573
- return $this->loadRequest()->isMethodPost();
574
- }
575
-
576
- /**
577
- * @return string|null
578
- * @deprecated
579
- */
580
- public function getScriptName() {
581
- return $this->loadRequest()->getScriptName();
582
- }
583
-
584
- /**
585
- * @param $sKey
586
- * @param $mValue
587
- * @param int $nExpireLength
588
- * @param null $sPath
589
- * @param null $sDomain
590
- * @param bool $bSsl
591
- * @return bool
592
- * @deprecated
593
- */
594
- public function setCookie( $sKey, $mValue, $nExpireLength = 3600, $sPath = null, $sDomain = null, $bSsl = true ) {
595
- return $this->loadRequest()->setCookie( $sKey, $mValue, $nExpireLength, $sPath, $sDomain, $bSsl );
596
- }
597
-
598
- /**
599
- * @param string $sKey
600
- * @return bool
601
- * @deprecated
602
- */
603
- public function setDeleteCookie( $sKey ) {
604
- return $this->loadRequest()->setDeleteCookie( $sKey );
605
- }
606
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/common/wp-admin-notices.php DELETED
@@ -1,92 +0,0 @@
1
- <?php
2
-
3
- use FernleafSystems\Wordpress\Services\Services;
4
-
5
- /**
6
- * Class ICWP_WPSF_WpAdminNotices
7
- * @deprecated 8.4
8
- */
9
- class ICWP_WPSF_WpAdminNotices extends ICWP_WPSF_Foundation {
10
-
11
- /**
12
- * @var ICWP_WPSF_WpAdminNotices
13
- */
14
- protected static $oInstance = null;
15
-
16
- /**
17
- * @var string
18
- */
19
- protected $sFlashMessage;
20
-
21
- /**
22
- * @var string
23
- */
24
- protected $sPrefix = '';
25
-
26
- /**
27
- * @return ICWP_WPSF_WpAdminNotices
28
- */
29
- public static function GetInstance() {
30
- if ( is_null( self::$oInstance ) ) {
31
- self::$oInstance = new self();
32
- }
33
- return self::$oInstance;
34
- }
35
-
36
- protected function __construct() {
37
- }
38
-
39
- public function onWpAdminNotices() {
40
- }
41
-
42
- /**
43
- * @return \FernleafSystems\Wordpress\Services\Utilities\PluginUserMeta
44
- * @throws \Exception
45
- */
46
- protected function getCurrentUserMeta() {
47
- return Services::WpUsers()->metaVoForUser( rtrim( $this->getPrefix(), '-' ) );
48
- }
49
-
50
- /**
51
- * @return string
52
- */
53
- public function getPrefix() {
54
- return $this->sPrefix;
55
- }
56
-
57
- /**
58
- * @return string
59
- */
60
- protected function getFlash() {
61
- return $this->sFlashMessage;
62
- }
63
-
64
- /**
65
- * @return array
66
- */
67
- protected function getFlashParts() {
68
- return explode( '::', $this->getFlash(), 3 );
69
- }
70
-
71
- /**
72
- * @return string
73
- */
74
- public function getFlashText() {
75
- $aParts = $this->getFlashParts();
76
- return isset( $aParts[ 1 ] ) ? $aParts[ 1 ] : '';
77
- }
78
-
79
- /**
80
- * @return $this
81
- */
82
- public function flushFlash() {
83
- if ( Services::WpUsers()->isUserLoggedIn() ) {
84
- $oMeta = $this->getCurrentUserMeta();
85
- if ( isset( $oMeta->flash_msg ) ) {
86
- $this->sFlashMessage = (string)$oMeta->flash_msg;
87
- unset( $oMeta->flash_msg );
88
- }
89
- }
90
- return $this;
91
- }
92
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/common/wp-widget.php DELETED
@@ -1,22 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Class ICWP_WPSF_WpWidget
5
- * @deprecated 8.4
6
- */
7
- abstract class ICWP_WPSF_WpWidget extends \WP_Widget {
8
-
9
- /**
10
- * @param array $aWidgetArguments
11
- * @param string $sTitle
12
- * @param string $sContent
13
- * @return string
14
- */
15
- protected function standardRender( $aWidgetArguments, $sTitle = '', $sContent = '' ) {
16
- echo $aWidgetArguments[ 'before_widget' ];
17
- if ( !empty( $sTitle ) ) {
18
- echo $aWidgetArguments[ 'before_title' ].$sTitle.$aWidgetArguments[ 'after_title' ];
19
- }
20
- return $sContent.$aWidgetArguments[ 'after_widget' ];
21
- }
22
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/config/feature-admin_access_restriction.php CHANGED
@@ -125,6 +125,17 @@
125
  "summary": "Specify An Automatic Timeout Interval For Security Admin Access",
126
  "description": "This will automatically expire your Security Admin Session. Does not apply until you enter the access key again. Default: 60 minutes."
127
  },
 
 
 
 
 
 
 
 
 
 
 
128
  {
129
  "key": "admin_access_restrict_options",
130
  "section": "section_admin_access_restriction_areas",
125
  "summary": "Specify An Automatic Timeout Interval For Security Admin Access",
126
  "description": "This will automatically expire your Security Admin Session. Does not apply until you enter the access key again. Default: 60 minutes."
127
  },
128
+ {
129
+ "key": "allow_email_override",
130
+ "section": "section_admin_access_restriction_settings",
131
+ "default": "Y",
132
+ "type": "checkbox",
133
+ "link_info": "https://shsec.io/gf",
134
+ "link_blog": "",
135
+ "name": "Allow Email Override",
136
+ "summary": "Allow Email Override Of Admin Access Restrictions",
137
+ "description": "Allow the use of verification emails to override and switch off the Security Admin restrictions."
138
+ },
139
  {
140
  "key": "admin_access_restrict_options",
141
  "section": "section_admin_access_restriction_areas",
src/config/feature-audit_trail.php CHANGED
@@ -245,8 +245,10 @@
245
  "event",
246
  "category",
247
  "message",
 
248
  "immutable",
249
  "meta",
 
250
  "created_at",
251
  "deleted_at"
252
  ],
245
  "event",
246
  "category",
247
  "message",
248
+ "count",
249
  "immutable",
250
  "meta",
251
+ "updated_at",
252
  "created_at",
253
  "deleted_at"
254
  ],
src/config/feature-hack_protect.php CHANGED
@@ -534,19 +534,6 @@
534
  "summary": "Enable The Guard For Plugin And Theme Files",
535
  "description": "When enabled the Guard will automatically scan for changes to your Plugin and Theme files."
536
  },
537
- {
538
- "key": "ptg_depth",
539
- "section": "section_scan_ptg",
540
- "premium": true,
541
- "type": "integer",
542
- "default": 1,
543
- "min": 0,
544
- "link_info": "https://shsec.io/bn",
545
- "link_blog": "https://shsec.io/bm",
546
- "name": "Guard/Scan Depth",
547
- "summary": "How Deep Into The Plugin Directories To Scan And Guard",
548
- "description": "The Guard normally operates scan only the top level of a plugin folder. Increasing depth increases scan times."
549
- },
550
  {
551
  "key": "ptg_extensions",
552
  "section": "section_scan_ptg",
@@ -577,13 +564,6 @@
577
  "summary": "Show Re-Install Links For Plugins",
578
  "description": "Show links to re-install plugins and offer re-install when activating plugins."
579
  },
580
- {
581
- "key": "ptg_last_build_at",
582
- "section": "section_non_ui",
583
- "transferable": false,
584
- "type": "integer",
585
- "default": 0
586
- },
587
  {
588
  "key": "ptg_candiskwrite",
589
  "section": "section_non_ui",
@@ -606,20 +586,6 @@
606
  "type": "array",
607
  "default": []
608
  },
609
- {
610
- "key": "rebuild_self",
611
- "section": "section_non_ui",
612
- "transferable": false,
613
- "type": "boolean",
614
- "default": false
615
- },
616
- {
617
- "key": "ptg_update_store_format",
618
- "section": "section_non_ui",
619
- "transferable": false,
620
- "type": "boolean",
621
- "default": false
622
- },
623
  {
624
  "key": "rt_file_hashes",
625
  "section": "section_non_ui",
534
  "summary": "Enable The Guard For Plugin And Theme Files",
535
  "description": "When enabled the Guard will automatically scan for changes to your Plugin and Theme files."
536
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
537
  {
538
  "key": "ptg_extensions",
539
  "section": "section_scan_ptg",
564
  "summary": "Show Re-Install Links For Plugins",
565
  "description": "Show links to re-install plugins and offer re-install when activating plugins."
566
  },
 
 
 
 
 
 
 
567
  {
568
  "key": "ptg_candiskwrite",
569
  "section": "section_non_ui",
586
  "type": "array",
587
  "default": []
588
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
589
  {
590
  "key": "rt_file_hashes",
591
  "section": "section_non_ui",
src/config/feature-headers.php CHANGED
@@ -236,11 +236,23 @@
236
  "*"
237
  ],
238
  "type": "array",
239
- "link_info": "",
240
  "link_blog": "",
241
  "name": "Permitted Hosts",
242
  "summary": "Permitted Hosts and Domains",
243
  "description": "You can explicitly state which hosts/domain from which content may be loaded. Take great care and test your site as you may block legitimate resources. If in-doubt, leave blank or use '*' only. Note: You can force only HTTPS for a given domain by prefixing it with 'https://'."
 
 
 
 
 
 
 
 
 
 
 
 
244
  }
245
  ]
246
  }
236
  "*"
237
  ],
238
  "type": "array",
239
+ "link_info": "https://shsec.io/ga",
240
  "link_blog": "",
241
  "name": "Permitted Hosts",
242
  "summary": "Permitted Hosts and Domains",
243
  "description": "You can explicitly state which hosts/domain from which content may be loaded. Take great care and test your site as you may block legitimate resources. If in-doubt, leave blank or use '*' only. Note: You can force only HTTPS for a given domain by prefixing it with 'https://'."
244
+ },
245
+ {
246
+ "key": "xcsp_custom",
247
+ "section": "section_content_security_policy",
248
+ "premium": true,
249
+ "default": [],
250
+ "type": "array",
251
+ "link_info": "https://shsec.io/g9",
252
+ "link_blog": "",
253
+ "name": "Manual Rules",
254
+ "summary": "Manual CSP Rules",
255
+ "description": "Manual CSP rules which are not covered by the rules above."
256
  }
257
  ]
258
  }
src/config/feature-ips.php CHANGED
@@ -184,6 +184,18 @@
184
  "summary": "Allow Visitors To Unblock Their IP",
185
  "description": "Allow visitors blocked by the plugin to automatically unblock themselves."
186
  },
 
 
 
 
 
 
 
 
 
 
 
 
187
  {
188
  "key": "text_loginfailed",
189
  "section": "section_user_messages",
@@ -470,6 +482,7 @@
470
  "is_range",
471
  "transgressions",
472
  "last_access_at",
 
473
  "created_at",
474
  "deleted_at"
475
  ],
184
  "summary": "Allow Visitors To Unblock Their IP",
185
  "description": "Allow visitors blocked by the plugin to automatically unblock themselves."
186
  },
187
+ {
188
+ "key": "request_whitelist",
189
+ "section": "section_auto_black_list",
190
+ "premium": true,
191
+ "default": [],
192
+ "type": "array",
193
+ "link_info": "https://shsec.io/gd",
194
+ "link_blog": "",
195
+ "name": "Request Path Whitelist",
196
+ "summary": "Request Path Whitelist",
197
+ "description": "Request Path Whitelist."
198
+ },
199
  {
200
  "key": "text_loginfailed",
201
  "section": "section_user_messages",
482
  "is_range",
483
  "transgressions",
484
  "last_access_at",
485
+ "blocked_at",
486
  "created_at",
487
  "deleted_at"
488
  ],
src/config/feature-plugin.php CHANGED
@@ -25,6 +25,14 @@
25
  "can_dismiss": false,
26
  "type": "error"
27
  },
 
 
 
 
 
 
 
 
28
  "compat-sgoptimize": {
29
  "id": "compat-sgoptimize",
30
  "schedule": "conditions",
@@ -349,7 +357,8 @@
349
  "section": "section_non_ui",
350
  "transferable": false,
351
  "type": "integer",
352
- "default": 0
 
353
  },
354
  {
355
  "key": "unique_installation_id",
@@ -399,14 +408,6 @@
399
  "type": "text",
400
  "default": ""
401
  },
402
- {
403
- "key": "this_server_ip_details",
404
- "section": "section_non_ui",
405
- "transferable": false,
406
- "sensitive": true,
407
- "type": "array",
408
- "default": []
409
- },
410
  {
411
  "key": "last_ip_detect_source",
412
  "transferable": false,
@@ -420,6 +421,13 @@
420
  "section": "section_non_ui",
421
  "type": "text",
422
  "default": ""
 
 
 
 
 
 
 
423
  }
424
  ],
425
  "definitions": {
25
  "can_dismiss": false,
26
  "type": "error"
27
  },
28
+ "plugin-disabled": {
29
+ "id": "plugin-disabled",
30
+ "schedule": "conditions",
31
+ "valid_admin": true,
32
+ "plugin_page_only": true,
33
+ "can_dismiss": false,
34
+ "type": "error"
35
+ },
36
  "compat-sgoptimize": {
37
  "id": "compat-sgoptimize",
38
  "schedule": "conditions",
357
  "section": "section_non_ui",
358
  "transferable": false,
359
  "type": "integer",
360
+ "default": 0,
361
+ "min": 0
362
  },
363
  {
364
  "key": "unique_installation_id",
408
  "type": "text",
409
  "default": ""
410
  },
 
 
 
 
 
 
 
 
411
  {
412
  "key": "last_ip_detect_source",
413
  "transferable": false,
421
  "section": "section_non_ui",
422
  "type": "text",
423
  "default": ""
424
+ },
425
+ {
426
+ "key": "wphashes_api_token",
427
+ "transferable": false,
428
+ "section": "section_non_ui",
429
+ "type": "array",
430
+ "default": []
431
  }
432
  ],
433
  "definitions": {
src/features/admin_access_restriction.php CHANGED
@@ -136,13 +136,28 @@ class ICWP_WPSF_FeatureHandler_AdminAccessRestriction extends ICWP_WPSF_FeatureH
136
  if ( $this->isRegisteredSecAdminUser() ) {
137
  $nLeft = 0;
138
  }
139
- else if ( $nSecAdminAt > 0 ) {
140
  $nLeft = $this->getSecAdminTimeout() - ( Services::Request()->ts() - $nSecAdminAt );
141
  }
142
  }
143
  return max( 0, $nLeft );
144
  }
145
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
146
  /**
147
  * @return bool
148
  */
@@ -321,20 +336,37 @@ class ICWP_WPSF_FeatureHandler_AdminAccessRestriction extends ICWP_WPSF_FeatureH
321
  public function insertCustomJsVars_Admin() {
322
  parent::insertCustomJsVars_Admin();
323
 
 
324
  if ( $this->getSecAdminTimeLeft() > 0 ) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
325
  wp_localize_script(
326
  $this->prefix( 'plugin' ),
327
  'icwp_wpsf_vars_secadmin',
328
- [
329
- 'reqajax' => $this->getSecAdminCheckAjaxData(),
330
- 'is_sec_admin' => true, // if $nSecTimeLeft > 0
331
- 'timeleft' => $this->getSecAdminTimeLeft(), // JS uses milliseconds
332
- 'strings' => [
333
- 'confirm' => __( 'Security Admin session has timed-out.', 'wp-simple-firewall' ).' '.__( 'Reload now?', 'wp-simple-firewall' ),
334
- 'nearly' => __( 'Security Admin session has nearly timed-out.', 'wp-simple-firewall' ),
335
- 'expired' => __( 'Security Admin session has timed-out.', 'wp-simple-firewall' )
336
- ]
337
- ]
338
  );
339
  }
340
  }
136
  if ( $this->isRegisteredSecAdminUser() ) {
137
  $nLeft = 0;
138
  }
139
+ elseif ( $nSecAdminAt > 0 ) {
140
  $nLeft = $this->getSecAdminTimeout() - ( Services::Request()->ts() - $nSecAdminAt );
141
  }
142
  }
143
  return max( 0, $nLeft );
144
  }
145
 
146
+ /**
147
+ */
148
+ public function handleModRequest() {
149
+ $oReq = Services::Request();
150
+ switch ( $oReq->query( 'exec' ) ) {
151
+ case 'remove_secadmin_confirm':
152
+ ( new SecurityAdmin\Lib\Actions\RemoveSecAdmin() )
153
+ ->setMod( $this )
154
+ ->remove();
155
+ break;
156
+ default:
157
+ break;
158
+ }
159
+ }
160
+
161
  /**
162
  * @return bool
163
  */
336
  public function insertCustomJsVars_Admin() {
337
  parent::insertCustomJsVars_Admin();
338
 
339
+ $aInsertData = [];
340
  if ( $this->getSecAdminTimeLeft() > 0 ) {
341
+ $aInsertData = [
342
+ 'ajax' => [
343
+ 'check' => $this->getSecAdminCheckAjaxData(),
344
+ ],
345
+ 'is_sec_admin' => true, // if $nSecTimeLeft > 0
346
+ 'timeleft' => $this->getSecAdminTimeLeft(), // JS uses milliseconds
347
+ 'strings' => [
348
+ 'confirm' => __( 'Security Admin session has timed-out.', 'wp-simple-firewall' ).' '.__( 'Reload now?', 'wp-simple-firewall' ),
349
+ 'nearly' => __( 'Security Admin session has nearly timed-out.', 'wp-simple-firewall' ),
350
+ 'expired' => __( 'Security Admin session has timed-out.', 'wp-simple-firewall' )
351
+ ]
352
+ ];
353
+ }
354
+ else {
355
+ $aInsertData = [
356
+ 'ajax' => [
357
+ 'req_email_remove' => $this->getAjaxActionData( 'req_email_remove' ),
358
+ ],
359
+ 'strings' => [
360
+ 'are_you_sure' => __( 'Are you sure?', 'wp-simple-firewall' )
361
+ ]
362
+ ];
363
+ }
364
+
365
+ if ( !empty( $aInsertData ) ) {
366
  wp_localize_script(
367
  $this->prefix( 'plugin' ),
368
  'icwp_wpsf_vars_secadmin',
369
+ $aInsertData
 
 
 
 
 
 
 
 
 
370
  );
371
  }
372
  }
src/features/audit_trail.php CHANGED
@@ -147,7 +147,7 @@ class ICWP_WPSF_FeatureHandler_AuditTrail extends ICWP_WPSF_FeatureHandler_BaseW
147
  'href' => $this->getUrl_DirectLinkToSection( 'section_enable_audit_contexts' ),
148
  ];
149
  }
150
- else if ( empty( $aAudit ) ) {
151
  $aThis[ 'key_opts' ][ 'audit' ] = [
152
  'name' => __( 'Audit Areas', 'wp-simple-firewall' ),
153
  'enabled' => false,
147
  'href' => $this->getUrl_DirectLinkToSection( 'section_enable_audit_contexts' ),
148
  ];
149
  }
150
+ elseif ( empty( $aAudit ) ) {
151
  $aThis[ 'key_opts' ][ 'audit' ] = [
152
  'name' => __( 'Audit Areas', 'wp-simple-firewall' ),
153
  'enabled' => false,
src/features/autoupdates.php CHANGED
@@ -132,151 +132,4 @@ class ICWP_WPSF_FeatureHandler_Autoupdates extends ICWP_WPSF_FeatureHandler_Base
132
  protected function getNamespaceBase() {
133
  return 'Autoupdates';
134
  }
135
-
136
- /**
137
- * @return bool
138
- * @deprecated 8.4
139
- */
140
- public function isSendAutoupdatesNotificationEmail() {
141
- return $this->isOpt( 'enable_upgrade_notification_email', 'Y' );
142
- }
143
-
144
- /**
145
- * @return bool
146
- * @deprecated 8.4
147
- */
148
- public function isDisableAllAutoUpdates() {
149
- return $this->isOpt( 'enable_autoupdate_disable_all', 'Y' );
150
- }
151
-
152
- /**
153
- * @return bool
154
- * @deprecated 8.4
155
- */
156
- public function isAutoUpdateCoreMajor() {
157
- return $this->isOpt( 'autoupdate_core', 'core_major' );
158
- }
159
-
160
- /**
161
- * @return bool
162
- * @deprecated 8.4
163
- */
164
- public function isAutoUpdateCoreMinor() {
165
- return !$this->isOpt( 'autoupdate_core', 'core_never' );
166
- }
167
-
168
- /**
169
- * @return string
170
- * @deprecated 8.4
171
- */
172
- public function getSelfAutoUpdateOpt() {
173
- return $this->getOpt( 'autoupdate_plugin_self' );
174
- }
175
-
176
- /**
177
- * @return array
178
- * @deprecated 8.4
179
- */
180
- public function getDelayTracking() {
181
- $aTracking = $this->getOpt( 'delay_tracking', [] );
182
- if ( !is_array( $aTracking ) ) {
183
- $aTracking = [];
184
- }
185
- $aTracking = Services::DataManipulation()->mergeArraysRecursive(
186
- [
187
- 'core' => [],
188
- 'plugins' => [],
189
- 'themes' => [],
190
- ],
191
- $aTracking
192
- );
193
- $this->setOpt( 'delay_tracking', $aTracking );
194
-
195
- return $aTracking;
196
- }
197
-
198
- /**
199
- * @return string[]
200
- * @deprecated 8.4
201
- */
202
- public function getAutoupdatePlugins() {
203
- $aSelected = [];
204
- if ( $this->isAutoupdateIndividualPlugins() ) {
205
- $aSelected = $this->getOpt( 'selected_plugins', [] );
206
- if ( !is_array( $aSelected ) ) {
207
- $aSelected = [];
208
- }
209
- }
210
- return $aSelected;
211
- }
212
-
213
- /**
214
- * @return int
215
- * @deprecated 8.4
216
- */
217
- public function getDelayUpdatesPeriod() {
218
- return $this->isPremium() ? $this->getOpt( 'update_delay', 0 )*DAY_IN_SECONDS : 0;
219
- }
220
-
221
- /**
222
- * @param array $aTrackingInfo
223
- * @return $this
224
- * @deprecated 8.4
225
- */
226
- public function setDelayTracking( $aTrackingInfo ) {
227
- return $this->setOpt( 'delay_tracking', $aTrackingInfo );
228
- }
229
-
230
- /**
231
- * @return bool
232
- * @deprecated 8.4
233
- */
234
- public function isAutoupdateAllPlugins() {
235
- return $this->isOpt( 'enable_autoupdate_plugins', 'Y' );
236
- }
237
-
238
- /**
239
- * @premium
240
- * @return bool
241
- * @deprecated 8.4
242
- */
243
- public function isAutoupdateIndividualPlugins() {
244
- return $this->isOpt( 'enable_individual_autoupdate_plugins', 'Y' );
245
- }
246
-
247
- /**
248
- * @return bool
249
- * @deprecated 8.4
250
- */
251
- public function isDelayUpdates() {
252
- return $this->getDelayUpdatesPeriod() > 0;
253
- }
254
-
255
- /**
256
- * @param string $sPluginFile
257
- * @return bool
258
- * @deprecated 8.4
259
- */
260
- public function isPluginSetToAutoupdate( $sPluginFile ) {
261
- return in_array( $sPluginFile, $this->getAutoupdatePlugins() );
262
- }
263
-
264
- /**
265
- * @param string $sPluginFile
266
- * @return $this
267
- * @deprecated 8.4
268
- */
269
- public function setPluginToAutoUpdate( $sPluginFile ) {
270
- $aPlugins = $this->getAutoupdatePlugins();
271
- $nKey = array_search( $sPluginFile, $aPlugins );
272
-
273
- if ( $nKey === false ) {
274
- $aPlugins[] = $sPluginFile;
275
- }
276
- else {
277
- unset( $aPlugins[ $nKey ] );
278
- }
279
-
280
- return $this->setOpt( 'selected_plugins', $aPlugins );
281
- }
282
  }
132
  protected function getNamespaceBase() {
133
  return 'Autoupdates';
134
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
135
  }
src/features/base.php CHANGED
@@ -18,7 +18,7 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends Shield\Deprecated\Foundatio
18
  protected $sModSlug;
19
 
20
  /**
21
- * @var boolean
22
  */
23
  protected $bImportExportWhitelistNotify = false;
24
 
@@ -58,12 +58,10 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends Shield\Deprecated\Foundatio
58
  * @throws \Exception
59
  */
60
  public function __construct( $oPluginController, $aMod = [] ) {
61
- if ( empty( self::$oPluginController ) ) {
62
- if ( !$oPluginController instanceof Shield\Controller\Controller ) {
63
- throw new \Exception( 'Plugin controller not supplied to Module' );
64
- }
65
- $this->setCon( $oPluginController );
66
  }
 
67
 
68
  if ( empty( $aMod[ 'storage_key' ] ) && empty( $aMod[ 'slug' ] ) ) {
69
  throw new \Exception( 'Module storage key AND slug are undefined' );
@@ -121,12 +119,18 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends Shield\Deprecated\Foundatio
121
  add_action( $this->prefix( 'daily_cron' ), [ $this, 'runDailyCron' ] );
122
  add_action( $this->prefix( 'hourly_cron' ), [ $this, 'runHourlyCron' ] );
123
 
124
- // supply our supported plugin events for this module
125
- add_filter( $this->prefix( 'is_event_supported' ), function ( $bSupported, $sEventTag ) {
126
- return $bSupported || $this->isSupportedEvent( $sEventTag );
127
- }, 10, 2 );
128
  add_filter( $this->prefix( 'get_all_events' ), function ( $aEvents ) {
129
- return array_merge( $aEvents, $this->getEvents() );
 
 
 
 
 
 
 
 
 
130
  } );
131
 
132
  add_action( 'admin_enqueue_scripts', [ $this, 'onWpEnqueueAdminJs' ], 100 );
@@ -219,72 +223,6 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends Shield\Deprecated\Foundatio
219
  return is_array( $aCls ) ? $aCls : [];
220
  }
221
 
222
- /**
223
- * @param string $sKey
224
- * @return array|null
225
- */
226
- public function getEventDef( $sKey ) {
227
- return $this->isSupportedEvent( $sKey ) ? $this->getEvents()[ $sKey ] : null;
228
- }
229
-
230
- /**
231
- * @return array[]
232
- */
233
- public function getEvents() {
234
- $aEvts = $this->getSupportedEvents();
235
-
236
- $aDefaults = [
237
- 'context' => $this->getSlug(),
238
- 'cat' => 1,
239
- 'stat' => true,
240
- 'audit' => true,
241
- 'recent' => false, // whether to show in the recent events logs
242
- 'offense' => false, // whether to mark offense against IP
243
- 'audit_multiple' => false, // allow multiple audit entries in the same request
244
- ];
245
- foreach ( $aEvts as $sKey => $aEvt ) {
246
- $aEvts[ $sKey ] = array_merge( $aDefaults, $aEvt );
247
- $aEvts[ $sKey ][ 'key' ] = $sKey;
248
- }
249
- return $aEvts;
250
- }
251
-
252
- /**
253
- * @return array[]
254
- */
255
- public function getStatEvents_Recent() {
256
- return array_filter(
257
- $this->getEvents(),
258
- function ( $aEvt ) {
259
- return $aEvt[ 'recent' ];
260
- }
261
- );
262
- }
263
-
264
- /**
265
- * @return array[]
266
- */
267
- protected function getSupportedEvents() {
268
- $aEvts = $this->getDef( 'events' );
269
- return is_array( $aEvts ) ? $aEvts : [];
270
- }
271
-
272
- /**
273
- * @param string $sKey
274
- * @return bool
275
- */
276
- public function isSupportedEvent( $sKey ) {
277
- return array_key_exists( $sKey, $this->getSupportedEvents() );
278
- }
279
-
280
- /**
281
- * @param string $sKey
282
- * @return bool
283
- */
284
- public function isOffenseEvent( $sKey ) {
285
- return $this->isSupportedEvent( $sKey ) && $this->getEvents()[ $sKey ][ 'offense' ];
286
- }
287
-
288
  /**
289
  * Should be over-ridden by each new class to handle upgrades.
290
  * Called upon construction and after plugin options are initialized.
@@ -526,11 +464,21 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends Shield\Deprecated\Foundatio
526
  );
527
  }
528
 
 
 
 
 
 
 
 
 
 
 
529
  /**
530
  * @param string $sOptKey
531
  * @return string
532
  */
533
- protected function getUrl_DirectLinkToOption( $sOptKey ) {
534
  $sUrl = $this->getUrl_AdminPage();
535
  $aDef = $this->getOptions()->getOptDefinition( $sOptKey );
536
  if ( !empty( $aDef[ 'section' ] ) ) {
@@ -583,18 +531,20 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends Shield\Deprecated\Foundatio
583
  */
584
  public function isModuleEnabled() {
585
  $oOpts = $this->getOptions();
 
 
586
 
587
  if ( $this->getOptions()->getFeatureProperty( 'auto_enabled' ) === true ) {
588
  // Auto enabled modules always run regardless
589
  $bEnabled = true;
590
  }
591
- else if ( apply_filters( $this->prefix( 'globally_disabled' ), false ) ) {
592
  $bEnabled = false;
593
  }
594
- else if ( $this->getCon()->getIfForceOffActive() ) {
595
  $bEnabled = false;
596
  }
597
- else if ( $oOpts->getFeatureProperty( 'premium' ) === true && !$this->isPremium() ) {
598
  $bEnabled = false;
599
  }
600
  else {
@@ -800,21 +750,21 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends Shield\Deprecated\Foundatio
800
  }
801
 
802
  /**
803
- * @return boolean
804
  */
805
  public function getIfShowModuleMenuItem() {
806
  return (bool)$this->getOptions()->getFeatureProperty( 'show_module_menu_item' );
807
  }
808
 
809
  /**
810
- * @return boolean
811
  */
812
  public function getIfShowModuleLink() {
813
  return (bool)$this->getOptions()->getFeatureProperty( 'show_module_options' );
814
  }
815
 
816
  /**
817
- * @return boolean
818
  */
819
  public function getIfUseSessions() {
820
  return $this->getOptions()->getFeatureProperty( 'use_sessions' );
@@ -866,9 +816,9 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends Shield\Deprecated\Foundatio
866
  }
867
 
868
  /**
869
- * @param string $sOptionKey
870
- * @param mixed $mValueToTest
871
- * @param boolean $bStrict
872
  * @return bool
873
  */
874
  public function isOpt( $sOptionKey, $mValueToTest, $bStrict = false ) {
@@ -1311,13 +1261,13 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends Shield\Deprecated\Foundatio
1311
  if ( in_array( $sOptType, [ 'text', 'email' ] ) ) { //text box, and it's null, don't update
1312
  continue;
1313
  }
1314
- else if ( $sOptType == 'checkbox' ) { //if it was a checkbox, and it's null, it means 'N'
1315
  $sOptionValue = 'N';
1316
  }
1317
- else if ( $sOptType == 'integer' ) { //if it was a integer, and it's null, it means '0'
1318
  $sOptionValue = 0;
1319
  }
1320
- else if ( $sOptType == 'multiple_select' ) {
1321
  $sOptionValue = [];
1322
  }
1323
  }
@@ -1329,7 +1279,7 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends Shield\Deprecated\Foundatio
1329
  if ( $sOptType == 'integer' ) {
1330
  $sOptionValue = intval( $sOptionValue );
1331
  }
1332
- else if ( $sOptType == 'password' ) {
1333
  $sTempValue = trim( $sOptionValue );
1334
  if ( empty( $sTempValue ) ) {
1335
  continue;
@@ -1342,13 +1292,13 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends Shield\Deprecated\Foundatio
1342
 
1343
  $sOptionValue = md5( $sTempValue );
1344
  }
1345
- else if ( $sOptType == 'array' ) { //arrays are textareas, where each is separated by newline
1346
  $sOptionValue = array_filter( explode( "\n", esc_textarea( $sOptionValue ) ), 'trim' );
1347
  }
1348
- else if ( $sOptType == 'comma_separated_lists' ) {
1349
  $sOptionValue = Services::Data()->extractCommaSeparatedList( $sOptionValue );
1350
  }
1351
- else if ( $sOptType == 'multiple_select' ) {
1352
  }
1353
  }
1354
 
@@ -1438,12 +1388,7 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends Shield\Deprecated\Foundatio
1438
  * @uses echo()
1439
  */
1440
  public function displayModuleAdminPage() {
1441
- if ( $this->canDisplayOptionsForm() ) {
1442
- echo $this->renderModulePage();
1443
- }
1444
- else {
1445
- echo $this->renderRestrictedPage();
1446
- }
1447
  }
1448
 
1449
  /**
@@ -1460,26 +1405,10 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends Shield\Deprecated\Foundatio
1460
  return $this->renderTemplate( 'index.php', $aData );
1461
  }
1462
 
1463
- /**
1464
- * @return string
1465
- */
1466
- protected function renderRestrictedPage() {
1467
- $aData = Services::DataManipulation()
1468
- ->mergeArraysRecursive(
1469
- $this->getBaseDisplayData(),
1470
- [
1471
- 'ajax' => [
1472
- 'restricted_access' => $this->getAjaxActionData( 'restricted_access' )
1473
- ]
1474
- ]
1475
- );
1476
- return $this->renderTemplate( 'access_restricted.php', $aData );
1477
- }
1478
-
1479
  /**
1480
  * @return array
1481
  */
1482
- protected function getBaseDisplayData() {
1483
  $oCon = $this->getCon();
1484
 
1485
  return [
@@ -1520,12 +1449,32 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends Shield\Deprecated\Foundatio
1520
  'show_content_help' => true,
1521
  'show_alt_content' => false,
1522
  'has_wizard' => $this->hasWizard(),
 
 
1523
  ],
1524
  'hrefs' => [
1525
  'go_pro' => 'https://shsec.io/shieldgoprofeature',
1526
  'goprofooter' => 'https://shsec.io/goprofooter',
1527
  'wizard_link' => $this->getUrl_WizardLanding(),
1528
- 'wizard_landing' => $this->getUrl_WizardLanding()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1529
  ],
1530
  'content' => [
1531
  'options_form' => '',
@@ -1652,7 +1601,7 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends Shield\Deprecated\Foundatio
1652
  }
1653
 
1654
  /**
1655
- * @return boolean
1656
  */
1657
  protected function getIsShowMarketing() {
1658
  return apply_filters( $this->prefix( 'show_marketing' ), !$this->isPremium() );
@@ -2017,10 +1966,44 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends Shield\Deprecated\Foundatio
2017
  }
2018
 
2019
  /**
2020
- * @return Shield\Databases\Base\Handler|mixed|false
2021
- * @deprecated 8.4
2022
  */
2023
- protected function loadDbHandler() {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2024
  return false;
2025
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2026
  }
18
  protected $sModSlug;
19
 
20
  /**
21
+ * @var bool
22
  */
23
  protected $bImportExportWhitelistNotify = false;
24
 
58
  * @throws \Exception
59
  */
60
  public function __construct( $oPluginController, $aMod = [] ) {
61
+ if ( !$oPluginController instanceof Shield\Controller\Controller ) {
62
+ throw new \Exception( 'Plugin controller not supplied to Module' );
 
 
 
63
  }
64
+ $this->setCon( $oPluginController );
65
 
66
  if ( empty( $aMod[ 'storage_key' ] ) && empty( $aMod[ 'slug' ] ) ) {
67
  throw new \Exception( 'Module storage key AND slug are undefined' );
119
  add_action( $this->prefix( 'daily_cron' ), [ $this, 'runDailyCron' ] );
120
  add_action( $this->prefix( 'hourly_cron' ), [ $this, 'runHourlyCron' ] );
121
 
122
+ // supply supported events for this module
 
 
 
123
  add_filter( $this->prefix( 'get_all_events' ), function ( $aEvents ) {
124
+ return array_merge(
125
+ is_array( $aEvents ) ? $aEvents : [],
126
+ array_map(
127
+ function ( $aEvt ) {
128
+ $aEvt[ 'context' ] = $this->getSlug();
129
+ return $aEvt;
130
+ },
131
+ is_array( $this->getDef( 'events' ) ) ? $this->getDef( 'events' ) : []
132
+ )
133
+ );
134
  } );
135
 
136
  add_action( 'admin_enqueue_scripts', [ $this, 'onWpEnqueueAdminJs' ], 100 );
223
  return is_array( $aCls ) ? $aCls : [];
224
  }
225
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
226
  /**
227
  * Should be over-ridden by each new class to handle upgrades.
228
  * Called upon construction and after plugin options are initialized.
464
  );
465
  }
466
 
467
+ /**
468
+ * @param string $sAction
469
+ * @return string
470
+ */
471
+ public function buildAdminActionNonceUrl( $sAction ) {
472
+ $aActionNonce = $this->getNonceActionData( $sAction );
473
+ $aActionNonce[ 'ts' ] = Services::Request()->ts();
474
+ return add_query_arg( $aActionNonce, $this->getUrl_AdminPage() );
475
+ }
476
+
477
  /**
478
  * @param string $sOptKey
479
  * @return string
480
  */
481
+ public function getUrl_DirectLinkToOption( $sOptKey ) {
482
  $sUrl = $this->getUrl_AdminPage();
483
  $aDef = $this->getOptions()->getOptDefinition( $sOptKey );
484
  if ( !empty( $aDef[ 'section' ] ) ) {
531
  */
532
  public function isModuleEnabled() {
533
  $oOpts = $this->getOptions();
534
+ /** @var Shield\Modules\Plugin\Options $oPluginOpts */
535
+ $oPluginOpts = $this->getCon()->getModule_Plugin()->getOptions();
536
 
537
  if ( $this->getOptions()->getFeatureProperty( 'auto_enabled' ) === true ) {
538
  // Auto enabled modules always run regardless
539
  $bEnabled = true;
540
  }
541
+ elseif ( $oPluginOpts->isPluginGloballyDisabled() ) {
542
  $bEnabled = false;
543
  }
544
+ elseif ( $this->getCon()->getIfForceOffActive() ) {
545
  $bEnabled = false;
546
  }
547
+ elseif ( $oOpts->getFeatureProperty( 'premium' ) === true && !$this->isPremium() ) {
548
  $bEnabled = false;
549
  }
550
  else {
750
  }
751
 
752
  /**
753
+ * @return bool
754
  */
755
  public function getIfShowModuleMenuItem() {
756
  return (bool)$this->getOptions()->getFeatureProperty( 'show_module_menu_item' );
757
  }
758
 
759
  /**
760
+ * @return bool
761
  */
762
  public function getIfShowModuleLink() {
763
  return (bool)$this->getOptions()->getFeatureProperty( 'show_module_options' );
764
  }
765
 
766
  /**
767
+ * @return bool
768
  */
769
  public function getIfUseSessions() {
770
  return $this->getOptions()->getFeatureProperty( 'use_sessions' );
816
  }
817
 
818
  /**
819
+ * @param string $sOptionKey
820
+ * @param mixed $mValueToTest
821
+ * @param bool $bStrict
822
  * @return bool
823
  */
824
  public function isOpt( $sOptionKey, $mValueToTest, $bStrict = false ) {
1261
  if ( in_array( $sOptType, [ 'text', 'email' ] ) ) { //text box, and it's null, don't update
1262
  continue;
1263
  }
1264
+ elseif ( $sOptType == 'checkbox' ) { //if it was a checkbox, and it's null, it means 'N'
1265
  $sOptionValue = 'N';
1266
  }
1267
+ elseif ( $sOptType == 'integer' ) { //if it was a integer, and it's null, it means '0'
1268
  $sOptionValue = 0;
1269
  }
1270
+ elseif ( $sOptType == 'multiple_select' ) {
1271
  $sOptionValue = [];
1272
  }
1273
  }
1279
  if ( $sOptType == 'integer' ) {
1280
  $sOptionValue = intval( $sOptionValue );
1281
  }
1282
+ elseif ( $sOptType == 'password' ) {
1283
  $sTempValue = trim( $sOptionValue );
1284
  if ( empty( $sTempValue ) ) {
1285
  continue;
1292
 
1293
  $sOptionValue = md5( $sTempValue );
1294
  }
1295
+ elseif ( $sOptType == 'array' ) { //arrays are textareas, where each is separated by newline
1296
  $sOptionValue = array_filter( explode( "\n", esc_textarea( $sOptionValue ) ), 'trim' );
1297
  }
1298
+ elseif ( $sOptType == 'comma_separated_lists' ) {
1299
  $sOptionValue = Services::Data()->extractCommaSeparatedList( $sOptionValue );
1300
  }
1301
+ elseif ( $sOptType == 'multiple_select' ) {
1302
  }
1303
  }
1304
 
1388
  * @uses echo()
1389
  */
1390
  public function displayModuleAdminPage() {
1391
+ echo $this->renderModulePage();
 
 
 
 
 
1392
  }
1393
 
1394
  /**
1405
  return $this->renderTemplate( 'index.php', $aData );
1406
  }
1407
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1408
  /**
1409
  * @return array
1410
  */
1411
+ public function getBaseDisplayData() {
1412
  $oCon = $this->getCon();
1413
 
1414
  return [
1449
  'show_content_help' => true,
1450
  'show_alt_content' => false,
1451
  'has_wizard' => $this->hasWizard(),
1452
+
1453
+ 'is_premium' => $this->isPremium(),
1454
  ],
1455
  'hrefs' => [
1456
  'go_pro' => 'https://shsec.io/shieldgoprofeature',
1457
  'goprofooter' => 'https://shsec.io/goprofooter',
1458
  'wizard_link' => $this->getUrl_WizardLanding(),
1459
+ 'wizard_landing' => $this->getUrl_WizardLanding(),
1460
+
1461
+ 'form_action' => Services::Request()->getUri(),
1462
+ 'css_bootstrap' => $oCon->getPluginUrl_Css( 'bootstrap4.min' ),
1463
+ 'css_pages' => $oCon->getPluginUrl_Css( 'pages' ),
1464
+ 'css_steps' => $oCon->getPluginUrl_Css( 'jquery.steps' ),
1465
+ 'css_fancybox' => $oCon->getPluginUrl_Css( 'jquery.fancybox.min' ),
1466
+ 'css_globalplugin' => $oCon->getPluginUrl_Css( 'global-plugin' ),
1467
+ 'css_wizard' => $oCon->getPluginUrl_Css( 'wizard' ),
1468
+ 'js_jquery' => Services::Includes()->getUrl_Jquery(),
1469
+ 'js_bootstrap' => $oCon->getPluginUrl_Js( 'bootstrap4.bundle.min' ),
1470
+ 'js_fancybox' => $oCon->getPluginUrl_Js( 'jquery.fancybox.min' ),
1471
+ 'js_globalplugin' => $oCon->getPluginUrl_Js( 'global-plugin' ),
1472
+ 'js_steps' => $oCon->getPluginUrl_Js( 'jquery.steps.min' ),
1473
+ 'js_wizard' => $oCon->getPluginUrl_Js( 'wizard' ),
1474
+ ],
1475
+ 'imgs' => [
1476
+ 'favicon' => $oCon->getPluginUrl_Image( 'pluginlogo_24x24.png' ),
1477
+ 'plugin_banner' => $oCon->getPluginUrl_Image( 'banner-1500x500-transparent.png' ),
1478
  ],
1479
  'content' => [
1480
  'options_form' => '',
1601
  }
1602
 
1603
  /**
1604
+ * @return bool
1605
  */
1606
  protected function getIsShowMarketing() {
1607
  return apply_filters( $this->prefix( 'show_marketing' ), !$this->isPremium() );
1966
  }
1967
 
1968
  /**
1969
+ * @return array[]
1970
+ * @deprecated 8.5
1971
  */
1972
+ public function getStatEvents_Recent() {
1973
+ return [];
1974
+ }
1975
+
1976
+ /**
1977
+ * @param string $sKey
1978
+ * @return array|null
1979
+ * @deprecated 8.5
1980
+ */
1981
+ public function getEventDef( $sKey ) {
1982
+ return null;
1983
+ }
1984
+
1985
+ /**
1986
+ * @param string $sKey
1987
+ * @return bool
1988
+ * @deprecated 8.5
1989
+ */
1990
+ public function isSupportedEvent( $sKey ) {
1991
  return false;
1992
  }
1993
+
1994
+ /**
1995
+ * @return array[]
1996
+ * @deprecated 8.5
1997
+ */
1998
+ protected function getSupportedEvents() {
1999
+ return [];
2000
+ }
2001
+
2002
+ /**
2003
+ * @return array[]
2004
+ * @deprecated 8.5
2005
+ */
2006
+ public function getEvents() {
2007
+ return $this->getDef( 'events' );
2008
+ }
2009
  }
src/features/base_wpsf.php CHANGED
@@ -2,33 +2,24 @@
2
 
3
  use FernleafSystems\Wordpress\Plugin\Shield;
4
  use FernleafSystems\Wordpress\Services\Services;
 
5
 
6
  class ICWP_WPSF_FeatureHandler_BaseWpsf extends ICWP_WPSF_FeatureHandler_Base {
7
 
8
- /**
9
- * @var string[]
10
- */
11
- private static $aStatEvents;
12
-
13
- /**
14
- * @var Shield\Databases\AuditTrail\EntryVO[]
15
- */
16
- private static $aAuditLogs;
17
-
18
  /**
19
  * @var bool
20
  */
21
- static protected $bIsVerifiedBot;
22
 
23
  /**
24
  * @var int
25
  */
26
- static private $nIpOffenceCount = 0;
27
 
28
  /**
29
  * @var bool
30
  */
31
- private $bVisitorIsWhitelisted;
32
 
33
  /**
34
  * @return \ICWP_WPSF_Processor_Sessions
@@ -72,107 +63,11 @@ class ICWP_WPSF_FeatureHandler_BaseWpsf extends ICWP_WPSF_FeatureHandler_Base {
72
  return ( $this->getSession() instanceof \FernleafSystems\Wordpress\Plugin\Shield\Databases\Session\EntryVO );
73
  }
74
 
75
- protected function setupCustomHooks() {
76
- $oCon = $this->getCon();
77
- add_action( $oCon->prefix( 'event' ), [ $this, 'eventOffense' ], 10, 2 );
78
- add_action( $oCon->prefix( 'event' ), [ $this, 'eventAudit' ], 10, 2 );
79
- add_action( $oCon->prefix( 'event' ), [ $this, 'eventStat' ], 10, 2 );
80
- }
81
-
82
- /**
83
- * @param string $sEvent
84
- * @param array $aMeta
85
- * @return $this
86
- */
87
- public function eventAudit( $sEvent = '', $aMeta = [] ) {
88
- if ( $this->isSupportedEvent( $sEvent ) ) {
89
- $aDef = $this->getEventDef( $sEvent );
90
- if ( $aDef[ 'audit' ] && empty( $aMeta[ 'suppress_audit' ] ) ) { // only audit if it's an auditable event
91
- $oEntry = new Shield\Databases\AuditTrail\EntryVO();
92
- $oEntry->event = $sEvent;
93
- $oEntry->category = $aDef[ 'cat' ];
94
- $oEntry->context = $aDef[ 'context' ];
95
- $oEntry->meta = isset( $aMeta[ 'audit' ] ) ? $aMeta[ 'audit' ] : [];
96
- if ( !is_array( self::$aAuditLogs ) ) {
97
- self::$aAuditLogs = [];
98
- }
99
-
100
- // cater for where certain events may happen more than once in the same request
101
- if ( !empty( $aDef[ 'audit_multiple' ] ) ) {
102
- self::$aAuditLogs[] = $oEntry;
103
- }
104
- else {
105
- self::$aAuditLogs[ $sEvent ] = $oEntry;
106
- }
107
- }
108
- }
109
- return $this;
110
- }
111
-
112
- /**
113
- * @param string $sEvent
114
- * @param array $aMeta
115
- */
116
- public function eventOffense( $sEvent, $aMeta = [] ) {
117
- if ( $this->isSupportedEvent( $sEvent ) ) {
118
- $aDef = $this->getEventDef( $sEvent );
119
- if ( $aDef[ 'offense' ] && empty( $aMeta[ 'suppress_offense' ] ) ) {
120
- self::$nIpOffenceCount = max(
121
- (int)self::$nIpOffenceCount,
122
- isset( $aMeta[ 'offense_count' ] ) ? $aMeta[ 'offense_count' ] : 1
123
- );
124
- }
125
- }
126
- }
127
-
128
  /**
129
- * @param string $sEvent
130
- * @param array $aMeta
131
- */
132
- public function eventStat( $sEvent, $aMeta = [] ) {
133
- if ( $this->isSupportedEvent( $sEvent ) ) {
134
- $aDef = $this->getEventDef( $sEvent );
135
- if ( $aDef[ 'stat' ] && empty( $aMeta[ 'suppress_stat' ] ) ) { // only stat if it's a statable event
136
- $this->addStatEvent( $sEvent, $aMeta );
137
- }
138
- }
139
- }
140
-
141
- /**
142
- * @param string $sEvent
143
- * @param array $aMeta
144
- * @return $this
145
- */
146
- protected function addStatEvent( $sEvent, $aMeta = [] ) {
147
- if ( !is_array( self::$aStatEvents ) ) {
148
- self::$aStatEvents = [];
149
- }
150
- self::$aStatEvents[ $sEvent ] = isset( $aMeta[ 'ts' ] ) ? $aMeta[ 'ts' ] : Services::Request()->ts();
151
- return $this;
152
- }
153
-
154
- /**
155
- * @param bool $bFlush
156
- * @return Shield\Databases\AuditTrail\EntryVO[]
157
  */
158
- public function getRegisteredAuditLogs( $bFlush = false ) {
159
- $aEntries = self::$aAuditLogs;
160
- if ( $bFlush ) {
161
- self::$aAuditLogs = [];
162
- }
163
- return is_array( $aEntries ) ? $aEntries : [];
164
- }
165
-
166
- /**
167
- * @param bool $bFlush
168
- * @return string[]
169
- */
170
- public function getRegisteredEvents( $bFlush = false ) {
171
- $aEntries = self::$aStatEvents;
172
- if ( $bFlush ) {
173
- self::$aStatEvents = [];
174
- }
175
- return is_array( $aEntries ) ? $aEntries : [];
176
  }
177
 
178
  /**
@@ -280,22 +175,48 @@ class ICWP_WPSF_FeatureHandler_BaseWpsf extends ICWP_WPSF_FeatureHandler_Base {
280
  }
281
 
282
  /**
283
- * @return array
284
  */
285
- protected function getBaseDisplayData() {
286
- $sHelpUrl = $this->isWlEnabled() ? $this->getCon()->getLabels()[ 'AuthorURI' ] : 'https://shsec.io/b5';
 
 
 
 
 
 
287
 
 
 
 
 
288
  return Services::DataManipulation()->mergeArraysRecursive(
289
  parent::getBaseDisplayData(),
290
  [
 
 
 
 
 
 
 
 
 
 
 
 
 
 
291
  'ajax' => [
292
  'sec_admin_login' => $this->getSecAdminLoginAjaxData(),
293
  ],
294
  'flags' => [
 
295
  'has_session' => $this->hasSession()
296
  ],
297
  'hrefs' => [
298
- 'aar_forget_key' => $sHelpUrl
 
299
  ],
300
  'classes' => [
301
  'top_container' => implode( ' ', array_filter( [
@@ -309,6 +230,36 @@ class ICWP_WPSF_FeatureHandler_BaseWpsf extends ICWP_WPSF_FeatureHandler_Base {
309
  );
310
  }
311
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
312
  /**
313
  * @return bool
314
  */
@@ -332,16 +283,15 @@ class ICWP_WPSF_FeatureHandler_BaseWpsf extends ICWP_WPSF_FeatureHandler_Base {
332
  * @return bool
333
  */
334
  public function isVisitorWhitelisted() {
335
- if ( !isset( $this->bVisitorIsWhitelisted ) ) {
336
- $oIpMod = $this->getCon()->getModule_IPs();
337
- $oIp = ( new Shield\Modules\IPs\Components\LookupIpOnList() )
338
- ->setMod( $oIpMod )
339
- ->setIp( Services::IP()->getRequestIp() )
340
- ->setList( $oIpMod::LIST_MANUAL_WHITE )
341
  ->lookup();
342
- $this->bVisitorIsWhitelisted = $oIp instanceof Shield\Databases\IPs\EntryVO;
343
  }
344
- return $this->bVisitorIsWhitelisted;
345
  }
346
 
347
  /**
@@ -349,21 +299,27 @@ class ICWP_WPSF_FeatureHandler_BaseWpsf extends ICWP_WPSF_FeatureHandler_Base {
349
  */
350
  public function isVerifiedBot() {
351
  if ( !isset( self::$bIsVerifiedBot ) ) {
352
- $oSp = $this->loadServiceProviders();
353
 
354
- $sIp = Services::IP()->getRequestIp();
355
- $sAgent = Services::Request()->getUserAgent();
356
- if ( empty( $sAgent ) ) {
357
- $sAgent = 'Unknown';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
358
  }
359
- self::$bIsVerifiedBot = $oSp->isIp_GoogleBot( $sIp, $sAgent )
360
- || $oSp->isIp_BingBot( $sIp, $sAgent )
361
- || $oSp->isIp_AppleBot( $sIp, $sAgent )
362
- || $oSp->isIp_YahooBot( $sIp, $sAgent )
363
- || $oSp->isIp_DuckDuckGoBot( $sIp, $sAgent )
364
- || $oSp->isIp_YandexBot( $sIp, $sAgent )
365
- || ( class_exists( 'ICWP_Plugin' ) && $oSp->isIp_iControlWP( $sIp ) )
366
- || $oSp->isIp_BaiduBot( $sIp, $sAgent );
367
  }
368
  return self::$bIsVerifiedBot;
369
  }
@@ -423,4 +379,58 @@ class ICWP_WPSF_FeatureHandler_BaseWpsf extends ICWP_WPSF_FeatureHandler_Base {
423
  public function getIpOffenceCount() {
424
  return isset( self::$nIpOffenceCount ) ? self::$nIpOffenceCount : 0;
425
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
426
  }
2
 
3
  use FernleafSystems\Wordpress\Plugin\Shield;
4
  use FernleafSystems\Wordpress\Services\Services;
5
+ use FernleafSystems\Wordpress\Services\Utilities;
6
 
7
  class ICWP_WPSF_FeatureHandler_BaseWpsf extends ICWP_WPSF_FeatureHandler_Base {
8
 
 
 
 
 
 
 
 
 
 
 
9
  /**
10
  * @var bool
11
  */
12
+ protected static $bIsVerifiedBot;
13
 
14
  /**
15
  * @var int
16
  */
17
+ private static $nIpOffenceCount = 0;
18
 
19
  /**
20
  * @var bool
21
  */
22
+ private static $bVisitorIsWhitelisted;
23
 
24
  /**
25
  * @return \ICWP_WPSF_Processor_Sessions
63
  return ( $this->getSession() instanceof \FernleafSystems\Wordpress\Plugin\Shield\Databases\Session\EntryVO );
64
  }
65
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
66
  /**
67
+ * @return bool
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
68
  */
69
+ public function hasValidRequestIP() {
70
+ return Services::IP()->isValidIp( Services::IP()->getRequestIp() );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
71
  }
72
 
73
  /**
175
  }
176
 
177
  /**
178
+ * @uses echo()
179
  */
180
+ public function displayModuleAdminPage() {
181
+ if ( $this->canDisplayOptionsForm() ) {
182
+ parent::displayModuleAdminPage();
183
+ }
184
+ else {
185
+ echo $this->renderRestrictedPage();
186
+ }
187
+ }
188
 
189
+ /**
190
+ * @return array
191
+ */
192
+ public function getBaseDisplayData() {
193
  return Services::DataManipulation()->mergeArraysRecursive(
194
  parent::getBaseDisplayData(),
195
  [
196
+ 'head' => [
197
+ 'meta' => [
198
+ [
199
+ 'type' => 'http-equiv',
200
+ 'type_type' => 'Cache-Control',
201
+ 'content' => 'no-store, no-cache',
202
+ ],
203
+ [
204
+ 'type' => 'http-equiv',
205
+ 'type_type' => 'Expires',
206
+ 'content' => '0',
207
+ ],
208
+ ]
209
+ ],
210
  'ajax' => [
211
  'sec_admin_login' => $this->getSecAdminLoginAjaxData(),
212
  ],
213
  'flags' => [
214
+ 'show_promo' => !$this->isPremium(),
215
  'has_session' => $this->hasSession()
216
  ],
217
  'hrefs' => [
218
+ 'aar_forget_key' => $this->isWlEnabled() ?
219
+ $this->getCon()->getLabels()[ 'AuthorURI' ] : 'https://shsec.io/gc'
220
  ],
221
  'classes' => [
222
  'top_container' => implode( ' ', array_filter( [
230
  );
231
  }
232
 
233
+ /**
234
+ * @return string
235
+ */
236
+ protected function renderRestrictedPage() {
237
+ /** @var Shield\Modules\SecurityAdmin\Options $oSecOpts */
238
+ $oSecOpts = $this->getCon()
239
+ ->getModule_SecAdmin()
240
+ ->getOptions();
241
+ $aData = Services::DataManipulation()
242
+ ->mergeArraysRecursive(
243
+ $this->getBaseDisplayData(),
244
+ [
245
+ 'ajax' => [
246
+ 'restricted_access' => $this->getAjaxActionData( 'restricted_access' ),
247
+ ],
248
+ 'strings' => [
249
+ 'force_remove_email' => __( "If you've forgotten your key, a link can be sent to the plugin administrator email address to remove this restriction.", 'wp-simple-firewall' ),
250
+ 'click_email' => __( "Click here to send the verification email.", 'wp-simple-firewall' ),
251
+ 'send_to_email' => sprintf( __( "Email will be sent to %s", 'wp-simple-firewall' ),
252
+ Utilities\Obfuscate::Email( $this->getPluginDefaultRecipientAddress() ) ),
253
+ 'no_email_override' => __( "The Security Administrator has restricted the use of the email override feature.", 'wp-simple-firewall' ),
254
+ ],
255
+ 'flags' => [
256
+ 'allow_email_override' => $oSecOpts->isEmailOverridePermitted()
257
+ ]
258
+ ]
259
+ );
260
+ return $this->renderTemplate( '/wpadmin_pages/security_admin/index.twig', $aData, true );
261
+ }
262
+
263
  /**
264
  * @return bool
265
  */
283
  * @return bool
284
  */
285
  public function isVisitorWhitelisted() {
286
+ if ( !isset( self::$bVisitorIsWhitelisted ) ) {
287
+ $oIp = ( new Shield\Modules\IPs\Lib\Ops\LookupIpOnList() )
288
+ ->setDbHandler( $this->getCon()->getModule_IPs()->getDbHandler_IPs() )
289
+ ->setIP( Services::IP()->getRequestIp() )
290
+ ->setListTypeWhite()
 
291
  ->lookup();
292
+ self::$bVisitorIsWhitelisted = $oIp instanceof Shield\Databases\IPs\EntryVO;
293
  }
294
+ return self::$bVisitorIsWhitelisted;
295
  }
296
 
297
  /**
299
  */
300
  public function isVerifiedBot() {
301
  if ( !isset( self::$bIsVerifiedBot ) ) {
302
+ $oIP = Services::IP();
303
 
304
+ if ( $oIP->isLoopback() ) {
305
+ self::$bIsVerifiedBot = false;
306
+ }
307
+ else {
308
+ $oSP = Services::ServiceProviders();
309
+ $sIp = $oIP->getRequestIp();
310
+ $sAgent = Services::Request()->getUserAgent();
311
+ if ( empty( $sAgent ) ) {
312
+ $sAgent = 'Unknown';
313
+ }
314
+ self::$bIsVerifiedBot = $oSP->isIp_GoogleBot( $sIp, $sAgent )
315
+ || $oSP->isIp_BingBot( $sIp, $sAgent )
316
+ || $oSP->isIp_AppleBot( $sIp, $sAgent )
317
+ || $oSP->isIp_YahooBot( $sIp, $sAgent )
318
+ || $oSP->isIp_DuckDuckGoBot( $sIp, $sAgent )
319
+ || $oSP->isIp_YandexBot( $sIp, $sAgent )
320
+ || ( class_exists( 'ICWP_Plugin' ) && $oSP->isIp_iControlWP( $sIp ) )
321
+ || $oSP->isIp_BaiduBot( $sIp, $sAgent );
322
  }
 
 
 
 
 
 
 
 
323
  }
324
  return self::$bIsVerifiedBot;
325
  }
379
  public function getIpOffenceCount() {
380
  return isset( self::$nIpOffenceCount ) ? self::$nIpOffenceCount : 0;
381
  }
382
+
383
+ /**
384
+ * @param string $sEvent
385
+ * @param array $aMeta
386
+ * @return $this
387
+ * @deprecated 8.5
388
+ */
389
+ public function eventAudit( $sEvent = '', $aMeta = [] ) {
390
+ return $this;
391
+ }
392
+
393
+ /**
394
+ * @param string $sEvent
395
+ * @param array $aMeta
396
+ * @deprecated 8.5
397
+ */
398
+ public function eventOffense( $sEvent, $aMeta = [] ) {
399
+ }
400
+
401
+ /**
402
+ * @param string $sEvent
403
+ * @param array $aMeta
404
+ * @deprecated 8.5
405
+ */
406
+ public function eventStat( $sEvent, $aMeta = [] ) {
407
+ }
408
+
409
+ /**
410
+ * @param string $sEvent
411
+ * @param array $aMeta
412
+ * @return $this
413
+ * @deprecated 8.5
414
+ */
415
+ protected function addStatEvent( $sEvent, $aMeta = [] ) {
416
+ return $this;
417
+ }
418
+
419
+ /**
420
+ * @param bool $bFlush
421
+ * @return Shield\Databases\AuditTrail\EntryVO[]
422
+ * @deprecated 8.5
423
+ */
424
+ public function getRegisteredAuditLogs( $bFlush = false ) {
425
+ return [];
426
+ }
427
+
428
+ /**
429
+ * @param bool $bFlush
430
+ * @return string[]
431
+ * @deprecated 8.5
432
+ */
433
+ public function getRegisteredEvents( $bFlush = false ) {
434
+ return [];
435
+ }
436
  }
src/features/events.php CHANGED
@@ -27,12 +27,4 @@ class ICWP_WPSF_FeatureHandler_Events extends ICWP_WPSF_FeatureHandler_BaseWpsf
27
  protected function getNamespaceBase() {
28
  return 'Events';
29
  }
30
-
31
- /**
32
- * @return Shield\Databases\Events\Handler
33
- * @deprecated 8.4
34
- */
35
- protected function loadDbHandler() {
36
- return new Shield\Databases\Events\Handler();
37
- }
38
  }
27
  protected function getNamespaceBase() {
28
  return 'Events';
29
  }
 
 
 
 
 
 
 
 
30
  }
src/features/hack_protect.php CHANGED
@@ -11,6 +11,11 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
11
  */
12
  private $oScanQueueController;
13
 
 
 
 
 
 
14
  protected function doPostConstruction() {
15
  parent::doPostConstruction();
16
  $this->setCustomCronSchedules();
@@ -24,14 +29,6 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
24
  $this->getScanController();
25
  }
26
 
27
- /**
28
- */
29
- protected function updateHandler() {
30
- parent::updateHandler();
31
- $this->setPtgUpdateStoreFormat( true );
32
- // ->setPtgRebuildSelfRequired( true ) // this is permanently required until a better solution is found
33
- }
34
-
35
  /**
36
  * @return HackGuard\Scan\Queue\Controller
37
  */
@@ -43,18 +40,42 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
43
  return $this->oScanQueueController;
44
  }
45
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
46
  /**
47
  */
48
  public function handleModRequest() {
49
  $oReq = Services::Request();
50
- switch ( $oReq->query( 'exec' ) && $this->getCon()->isPluginAdmin() ) {
51
- case 'scan_file_download':
52
- /** @var \ICWP_WPSF_Processor_HackProtect $oPro */
53
- $oPro = $this->getProcessor();
54
- $oPro->getSubProScanner()->downloadItemFile( $oReq->query( 'rid' ) );
55
- break;
56
- default:
57
- break;
 
 
58
  }
59
  }
60
 
@@ -75,18 +96,12 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
75
  $this->cleanFileExclusions();
76
  $this->cleanPtgFileExtensions();
77
 
78
- $oOpts = $this->getOptions();
79
- if ( $oOpts->isOptChanged( 'ptg_enable' ) || $oOpts->isOptChanged( 'ptg_depth' ) || $oOpts->isOptChanged( 'ptg_extensions' ) ) {
80
- $this->setPtgLastBuildAt( 0 );
81
- /** @var \ICWP_WPSF_Processor_HackProtect $oPro */
82
- $oPro = $this->getProcessor();
83
- $oPro->getSubProScanner()
84
- ->getSubProcessorPtg()
85
- ->resetScan();
86
- }
87
-
88
  $this->setOpt( 'ptg_candiskwrite_at', 0 );
89
  $this->resetRtBackupFiles();
 
 
 
 
90
  }
91
 
92
  /**
@@ -127,13 +142,10 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
127
  /**
128
  * @param string $sScan ptg, wcf, ufc, wpv
129
  * @return bool
 
130
  */
131
  public function getScanHasProblem( $sScan ) {
132
- /** @var Shield\Databases\Scanner\Select $oSel */
133
- $oSel = $this->getDbHandler_ScanResults()->getQuerySelector();
134
- return $oSel->filterByNotIgnored()
135
- ->filterByScan( $sScan )
136
- ->count() > 0;
137
  }
138
 
139
  /**
@@ -154,17 +166,17 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
154
  * @return $this
155
  */
156
  protected function setCustomCronSchedules() {
157
- /** @var HackGuard\Options $oStrings */
158
  $oOpts = $this->getOptions();
159
  $nFreq = $oOpts->getScanFrequency();
160
- $this->loadWpCronProcessor()
161
- ->addNewSchedule(
162
- $this->prefix( sprintf( 'per-day-%s', $nFreq ) ),
163
- [
164
- 'interval' => DAY_IN_SECONDS/$nFreq,
165
- 'display' => sprintf( __( '%s per day', 'wp-simple-firewall' ), $nFreq )
166
- ]
167
- );
168
  return $this;
169
  }
170
 
@@ -197,13 +209,6 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
197
  return $this->setOpt( 'snapshot_users', $aUsers );
198
  }
199
 
200
- /**
201
- * @return string
202
- */
203
- public function getUnrecognisedFileScannerOption() {
204
- return $this->getOpt( 'enable_unrecognised_file_cleaner_scan', 'disabled' );
205
- }
206
-
207
  /**
208
  * @return array
209
  */
@@ -227,7 +232,7 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
227
  if ( preg_match( '/^#(.+)#$/', $sExclusion, $aMatches ) ) { // it's regex
228
  // ignore it
229
  }
230
- else if ( strpos( $sExclusion, '/' ) === false ) { // filename only
231
  $sExclusion = trim( preg_replace( '#[^.0-9a-z_-]#i', '', $sExclusion ) );
232
  }
233
 
@@ -242,70 +247,10 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
242
  /**
243
  * @return string
244
  */
245
- public function isUfcDeleteFiles() {
246
- return in_array( $this->getUnrecognisedFileScannerOption(), [
247
- 'enabled_delete_only',
248
- 'enabled_delete_report'
249
- ] );
250
- }
251
-
252
- /**
253
- * @return bool
254
- */
255
- public function isUfcEnabled() {
256
- return ( $this->getUnrecognisedFileScannerOption() != 'disabled' );
257
- }
258
-
259
- /**
260
- * @return string
261
- */
262
- public function isUfcSendReport() {
263
- return in_array( $this->getUnrecognisedFileScannerOption(), [
264
- 'enabled_report_only',
265
- 'enabled_delete_report'
266
- ] );
267
- }
268
-
269
- /**
270
- * @return bool
271
- */
272
- public function isWcfScanAutoRepair() {
273
- return $this->isOpt( 'attempt_auto_file_repair', 'Y' );
274
- }
275
-
276
- /**
277
- * @return bool
278
- */
279
- public function isWcfScanEnabled() {
280
- return $this->isOpt( 'enable_core_file_integrity_scan', 'Y' );
281
- }
282
-
283
- /**
284
- * @return bool
285
- */
286
- public function isWpvulnEnabled() {
287
- return $this->isPremium() && !$this->isOpt( 'enable_wpvuln_scan', 'disabled' );
288
- }
289
-
290
- /**
291
- * @return bool
292
- */
293
- public function isWpvulnSendEmail() {
294
- return $this->isWpvulnEnabled() && $this->isOpt( 'enable_wpvuln_scan', 'enabled_email' );
295
- }
296
-
297
- /**
298
- * @return bool
299
- */
300
- public function isWpvulnAutoupdatesEnabled() {
301
- return $this->isWpvulnEnabled() && $this->isOpt( 'wpvuln_scan_autoupdate', 'Y' );
302
- }
303
-
304
- /**
305
- * @return mixed
306
- */
307
  public function getWpvulnPluginsHighlightOption() {
308
- return $this->isWpvulnEnabled() ? $this->getOpt( 'wpvuln_scan_display' ) : 'disabled';
 
 
309
  }
310
 
311
  /**
@@ -349,113 +294,32 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
349
  * @return $this
350
  */
351
  protected function cleanPtgFileExtensions() {
352
- return $this->setOpt(
 
 
353
  'ptg_extensions',
354
- $this->cleanStringArray( $this->getPtgFileExtensions(), '#[^a-z0-9_-]#i' )
355
  );
356
- }
357
-
358
- /**
359
- * @return string[]
360
- */
361
- public function getPtgFileExtensions() {
362
- return $this->getOpt( 'ptg_extensions' );
363
- }
364
-
365
- /**
366
- * @return bool
367
- */
368
- public function getPtgDepth() {
369
- return $this->getOpt( 'ptg_depth' );
370
- }
371
-
372
- /**
373
- * @return int
374
- */
375
- public function getPtgLastBuildAt() {
376
- return $this->getOpt( 'ptg_last_build_at' );
377
- }
378
-
379
- /**
380
- * @return string|false
381
- */
382
- public function getPtgSnapsBaseDir() {
383
- return $this->getCon()->getPluginCachePath( 'ptguard/' );
384
- }
385
-
386
- /**
387
- * @return bool
388
- */
389
- public function isPtgBuildRequired() {
390
- return $this->isPtgEnabled() && ( $this->getPtgLastBuildAt() == 0 );
391
- }
392
-
393
- /**
394
- * @param bool $bIsRequired
395
- * @return $this
396
- */
397
- public function setPtgRebuildSelfRequired( $bIsRequired ) {
398
- return $this->setOpt( 'rebuild_self', (bool)$bIsRequired );
399
- }
400
-
401
- /**
402
- * @param bool $bIsRequired
403
- * @return $this
404
- */
405
- public function setPtgUpdateStoreFormat( $bIsRequired ) {
406
- return $this->setOpt( 'ptg_update_store_format', (bool)$bIsRequired );
407
- }
408
-
409
- /**
410
- * @return bool
411
- */
412
- public function isPtgRebuildSelfRequired() {
413
- return $this->isOpt( 'rebuild_self', true );
414
- }
415
-
416
- /**
417
- * @return bool
418
- */
419
- public function isPtgUpdateStoreFormat() {
420
- return $this->isOpt( 'ptg_update_store_format', true );
421
  }
422
 
423
  /**
424
  * @return bool
425
  */
426
  public function isPtgEnabled() {
427
- return $this->isPremium() && $this->isOpt( 'ptg_enable', 'enabled' )
 
428
  && $this->getOptions()->isOptReqsMet( 'ptg_enable' )
429
  && $this->canPtgWriteToDisk();
430
  }
431
 
432
  /**
 
433
  * @return bool
434
  */
435
- public function isPtgReadyToScan() {
436
- return $this->isPtgEnabled() && !$this->isPtgBuildRequired();
437
- }
438
-
439
- /**
440
- * @return bool
441
- */
442
- public function isPtgReinstallLinks() {
443
- return $this->isPtgEnabled() && $this->isOpt( 'ptg_reinstall_links', 'Y' );
444
- }
445
-
446
- /**
447
- * @param int $nTime
448
- * @return $this
449
- */
450
- public function setPtgLastBuildAt( $nTime = null ) {
451
- return $this->setOpt( 'ptg_last_build_at', is_null( $nTime ) ? Services::Request()->ts() : $nTime );
452
- }
453
-
454
- /**
455
- * @return bool
456
- */
457
- public function isApcEnabled() {
458
- return !$this->isOpt( 'enabled_scan_apc', 'disabled' );
459
  }
460
 
461
  /**
@@ -468,7 +332,10 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
468
  public function insertCustomJsVars_Admin() {
469
  parent::insertCustomJsVars_Admin();
470
 
471
- if ( Services::WpPost()->isCurrentPage( 'plugins.php' ) && $this->isPtgReinstallLinks() ) {
 
 
 
472
  wp_localize_script(
473
  $this->prefix( 'global-plugin' ),
474
  'icwp_wpsf_vars_hp',
@@ -565,6 +432,13 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
565
  return $aWarnings;
566
  }
567
 
 
 
 
 
 
 
 
568
  /**
569
  * temporary
570
  * @return bool
@@ -734,8 +608,6 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
734
  * @return array
735
  */
736
  public function addInsightsNoticeData( $aAllNotices ) {
737
- /** @var Shield\Modules\HackGuard\Options $oOpts */
738
- $oOpts = $this->getOptions();
739
  /** @var HackGuard\Strings $oStrings */
740
  $oStrings = $this->getStrings();
741
  $aScanNames = $oStrings->getScanNames();
@@ -746,7 +618,7 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
746
  ];
747
 
748
  {// Core files
749
- if ( !$this->isWcfScanEnabled() ) {
750
  $aNotices[ 'messages' ][ 'wcf' ] = [
751
  'title' => $aScanNames[ 'wcf' ],
752
  'message' => __( 'Core File scanner is not enabled.', 'wp-simple-firewall' ),
@@ -755,7 +627,7 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
755
  'rec' => __( 'Automatic WordPress Core File scanner should be turned-on.', 'wp-simple-firewall' )
756
  ];
757
  }
758
- else if ( $this->getScanHasProblem( 'wcf' ) ) {
759
  $aNotices[ 'messages' ][ 'wcf' ] = [
760
  'title' => $aScanNames[ 'wcf' ],
761
  'message' => __( 'Modified WordPress core files found.', 'wp-simple-firewall' ),
@@ -767,7 +639,7 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
767
  }
768
 
769
  {// Unrecognised
770
- if ( !$this->isUfcEnabled() ) {
771
  $aNotices[ 'messages' ][ 'ufc' ] = [
772
  'title' => $aScanNames[ 'ufc' ],
773
  'message' => __( 'Unrecognised File scanner is not enabled.', 'wp-simple-firewall' ),
@@ -776,7 +648,7 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
776
  'rec' => __( 'Automatic scanning for non-WordPress core files is recommended.', 'wp-simple-firewall' )
777
  ];
778
  }
779
- else if ( $this->getScanHasProblem( 'ufc' ) ) {
780
  $aNotices[ 'messages' ][ 'ufc' ] = [
781
  'title' => $aScanNames[ 'ufc' ],
782
  'message' => __( 'Unrecognised files found in WordPress Core directory.', 'wp-simple-firewall' ),
@@ -788,7 +660,8 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
788
  }
789
 
790
  {// Plugin/Theme Guard
791
- if ( !$this->isPtgEnabled() ) {
 
792
  $aNotices[ 'messages' ][ 'ptg' ] = [
793
  'title' => $aScanNames[ 'ptg' ],
794
  'message' => __( 'Automatic Plugin/Themes Guard is not enabled.', 'wp-simple-firewall' ),
@@ -797,7 +670,7 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
797
  'rec' => __( 'Automatic detection of plugin/theme modifications is recommended.', 'wp-simple-firewall' )
798
  ];
799
  }
800
- else if ( $this->getScanHasProblem( 'ptg' ) ) {
801
  $aNotices[ 'messages' ][ 'ptg' ] = [
802
  'title' => $aScanNames[ 'ptg' ],
803
  'message' => __( 'A plugin/theme was found to have been modified.', 'wp-simple-firewall' ),
@@ -809,7 +682,7 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
809
  }
810
 
811
  {// Vulnerability Scanner
812
- if ( !$this->isWpvulnEnabled() ) {
813
  $aNotices[ 'messages' ][ 'wpv' ] = [
814
  'title' => $aScanNames[ 'wpv' ],
815
  'message' => __( 'Vulnerability Scanner is not enabled.', 'wp-simple-firewall' ),
@@ -818,7 +691,7 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
818
  'rec' => __( 'Automatic detection of vulnerabilities is recommended.', 'wp-simple-firewall' )
819
  ];
820
  }
821
- else if ( $this->getScanHasProblem( 'wpv' ) ) {
822
  $aNotices[ 'messages' ][ 'wpv' ] = [
823
  'title' => $aScanNames[ 'wpv' ],
824
  'message' => __( 'At least 1 item has known vulnerabilities.', 'wp-simple-firewall' ),
@@ -830,7 +703,7 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
830
  }
831
 
832
  {// Abandoned Plugins
833
- if ( !$this->isApcEnabled() ) {
834
  $aNotices[ 'messages' ][ 'apc' ] = [
835
  'title' => $aScanNames[ 'apc' ],
836
  'message' => __( 'Abandoned Plugins Scanner is not enabled.', 'wp-simple-firewall' ),
@@ -839,7 +712,7 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
839
  'rec' => __( 'Automatic detection of abandoned plugins is recommended.', 'wp-simple-firewall' )
840
  ];
841
  }
842
- else if ( $this->getScanHasProblem( 'apc' ) ) {
843
  $aNotices[ 'messages' ][ 'apc' ] = [
844
  'title' => $aScanNames[ 'apc' ],
845
  'message' => __( 'At least 1 plugin on your site is abandoned.', 'wp-simple-firewall' ),
@@ -851,7 +724,7 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
851
  }
852
 
853
  {// Malware
854
- if ( !$oOpts->isMalScanEnabled() ) {
855
  $aNotices[ 'messages' ][ 'mal' ] = [
856
  'title' => $aScanNames[ 'mal' ],
857
  'message' => sprintf( __( '%s Scanner is not enabled.' ), $aScanNames[ 'mal' ] ),
@@ -860,7 +733,7 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
860
  'rec' => __( 'Automatic detection of Malware is recommended.', 'wp-simple-firewall' )
861
  ];
862
  }
863
- else if ( $this->getScanHasProblem( 'mal' ) ) {
864
  $aNotices[ 'messages' ][ 'mal' ] = [
865
  'title' => $aScanNames[ 'mal' ],
866
  'message' => __( 'At least 1 file with potential Malware has been discovered.', 'wp-simple-firewall' ),
@@ -884,7 +757,7 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
884
  public function addInsightsConfigData( $aAllData ) {
885
  /** @var HackGuard\Strings $oStrings */
886
  $oStrings = $this->getStrings();
887
- /** @var HackGuard\Options $oStrings */
888
  $oOpts = $this->getOptions();
889
  $aScanNames = $oStrings->getScanNames();
890
 
@@ -912,7 +785,7 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
912
  'href' => $this->getUrl_DirectLinkToSection( 'section_scan_options' ),
913
  ];
914
 
915
- $bCore = $this->isWcfScanEnabled();
916
  $aThis[ 'key_opts' ][ 'wcf' ] = [
917
  'name' => __( 'WP Core File Scan', 'wp-simple-firewall' ),
918
  'enabled' => $bCore,
@@ -956,7 +829,7 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
956
  ];
957
  }
958
 
959
- $bWpv = $this->isWpvulnEnabled();
960
  $aThis[ 'key_opts' ][ 'wpv' ] = [
961
  'name' => __( 'Vulnerability Scan', 'wp-simple-firewall' ),
962
  'enabled' => $bWpv,
@@ -966,11 +839,12 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
966
  'weight' => 2,
967
  'href' => $this->getUrl_DirectLinkToSection( 'section_scan_wpv' ),
968
  ];
969
- if ( $bWpv && !$this->isWpvulnAutoupdatesEnabled() ) {
 
970
  $aThis[ 'key_opts' ][ 'wpv_repair' ] = [
971
  'name' => __( 'Auto Update', 'wp-simple-firewall' ),
972
- 'enabled' => $this->isWpvulnAutoupdatesEnabled(),
973
- 'summary' => $this->isWpvulnAutoupdatesEnabled() ?
974
  __( 'Vulnerable items are automatically updated', 'wp-simple-firewall' )
975
  : __( "Vulnerable items aren't automatically updated!", 'wp-simple-firewall' ),
976
  'weight' => 1,
@@ -978,7 +852,7 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
978
  ];
979
  }
980
 
981
- $bPtg = $this->isPtgEnabled();
982
  $aThis[ 'key_opts' ][ 'ptg' ] = [
983
  'title' => $aScanNames[ 'ptg' ],
984
  'name' => __( 'Plugin/Theme Guard', 'wp-simple-firewall' ),
@@ -990,7 +864,7 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
990
  'href' => $this->getUrl_DirectLinkToSection( 'section_scan_ptg' ),
991
  ];
992
 
993
- $bMal = $oOpts->isMalScanEnabled();
994
  $aThis[ 'key_opts' ][ 'mal' ] = [
995
  'title' => $aScanNames[ 'mal' ],
996
  'name' => $aScanNames[ 'mal' ],
@@ -1002,7 +876,7 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
1002
  'href' => $this->getUrl_DirectLinkToSection( 'section_scan_mal' ),
1003
  ];
1004
 
1005
- $bApc = $this->isApcEnabled();
1006
  $aThis[ 'key_opts' ][ 'apc' ] = [
1007
  'title' => $aScanNames[ 'apc' ],
1008
  'name' => $aScanNames[ 'apc' ],
@@ -1055,52 +929,197 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
1055
  && parent::isReadyToExecute();
1056
  }
1057
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1058
  /**
1059
  * @return bool
1060
- * @deprecated 8.4
1061
  */
1062
- public function isMalScanEnabled() {
1063
- return !$this->isOpt( 'mal_scan_enable', 'disabled' );
 
 
1064
  }
1065
 
1066
  /**
1067
  * @return bool
1068
- * @deprecated 8.4
1069
  */
1070
- public function isMalAutoRepairPlugins() {
1071
- return $this->isOpt( 'mal_autorepair_plugins', 'Y' );
 
 
1072
  }
1073
 
1074
  /**
1075
  * @return bool
1076
- * @deprecated 8.4
1077
  */
1078
- public function isMalScanAutoRepair() {
1079
  /** @var HackGuard\Options $oOpts */
1080
  $oOpts = $this->getOptions();
1081
- return $oOpts->isMalAutoRepair();
1082
  }
1083
 
1084
  /**
1085
  * @return bool
1086
- * @deprecated 8.4
1087
  */
1088
- public function isMalAutoRepairCore() {
1089
- return $this->isOpt( 'mal_autorepair_core', 'Y' );
1090
  }
1091
 
1092
  /**
1093
  * @return bool
1094
- * @deprecated 8.4
1095
  */
1096
- public function isMalAutoRepairSurgical() {
1097
- return $this->isOpt( 'mal_autorepair_surgical', 'Y' );
 
 
1098
  }
1099
 
1100
  /**
1101
  * @return string
 
1102
  */
1103
- protected function getNamespaceBase() {
1104
- return 'HackGuard';
 
 
 
 
 
 
 
 
 
 
1105
  }
1106
  }
11
  */
12
  private $oScanQueueController;
13
 
14
+ /**
15
+ * @var HackGuard\Scan\Controller\Base[]
16
+ */
17
+ private $aScanCons;
18
+
19
  protected function doPostConstruction() {
20
  parent::doPostConstruction();
21
  $this->setCustomCronSchedules();
29
  $this->getScanController();
30
  }
31
 
 
 
 
 
 
 
 
 
32
  /**
33
  * @return HackGuard\Scan\Queue\Controller
34
  */
40
  return $this->oScanQueueController;
41
  }
42
 
43
+ /**
44
+ * @param string $sSlug
45
+ * @return HackGuard\Scan\Controller\Base|mixed
46
+ */
47
+ public function getScanCon( $sSlug ) {
48
+ if ( !is_array( $this->aScanCons ) ) {
49
+ $this->aScanCons = [];
50
+ }
51
+ if ( !isset( $this->aScanCons[ $sSlug ] ) ) {
52
+ $sClass = '\FernleafSystems\Wordpress\Plugin\Shield\Modules\HackGuard\Scan\Controller\\'.ucwords( $sSlug );
53
+ if ( @class_exists( $sClass ) ) {
54
+ /** @var HackGuard\Scan\Controller\Base $oObj */
55
+ $oObj = new $sClass();
56
+ $this->aScanCons[ $sSlug ] = $oObj->setMod( $this );
57
+ }
58
+ else {
59
+ $this->aScanCons[ $sSlug ] = false;
60
+ }
61
+ }
62
+ return $this->aScanCons[ $sSlug ];
63
+ }
64
+
65
  /**
66
  */
67
  public function handleModRequest() {
68
  $oReq = Services::Request();
69
+ if ( $this->getCon()->isPluginAdmin() ) {
70
+ switch ( $oReq->query( 'exec' ) ) {
71
+ case 'scan_file_download':
72
+ ( new Shield\Modules\HackGuard\Lib\Utility\FileDownloadHandler() )
73
+ ->setDbHandler( $this->getDbHandler_ScanResults() )
74
+ ->downloadByItemId( (int)$oReq->query( 'rid', 0 ) );
75
+ break;
76
+ default:
77
+ break;
78
+ }
79
  }
80
  }
81
 
96
  $this->cleanFileExclusions();
97
  $this->cleanPtgFileExtensions();
98
 
 
 
 
 
 
 
 
 
 
 
99
  $this->setOpt( 'ptg_candiskwrite_at', 0 );
100
  $this->resetRtBackupFiles();
101
+
102
+ /** @var ICWP_WPSF_Processor_HackProtect $oPro */
103
+ $oPro = $this->getProcessor();
104
+ $oPro->getSubProScanner()->deleteCron(); // very important if the scan cron schedule is changed.
105
  }
106
 
107
  /**
142
  /**
143
  * @param string $sScan ptg, wcf, ufc, wpv
144
  * @return bool
145
+ * @deprecated 8.5.5
146
  */
147
  public function getScanHasProblem( $sScan ) {
148
+ return $this->getScanCon( $sScan )->getScanHasProblem();
 
 
 
 
149
  }
150
 
151
  /**
166
  * @return $this
167
  */
168
  protected function setCustomCronSchedules() {
169
+ /** @var HackGuard\Options $oOpts */
170
  $oOpts = $this->getOptions();
171
  $nFreq = $oOpts->getScanFrequency();
172
+ Services::WpCron()
173
+ ->addNewSchedule(
174
+ $this->prefix( sprintf( 'per-day-%s', $nFreq ) ),
175
+ [
176
+ 'interval' => DAY_IN_SECONDS/$nFreq,
177
+ 'display' => sprintf( __( '%s per day', 'wp-simple-firewall' ), $nFreq )
178
+ ]
179
+ );
180
  return $this;
181
  }
182
 
209
  return $this->setOpt( 'snapshot_users', $aUsers );
210
  }
211
 
 
 
 
 
 
 
 
212
  /**
213
  * @return array
214
  */
232
  if ( preg_match( '/^#(.+)#$/', $sExclusion, $aMatches ) ) { // it's regex
233
  // ignore it
234
  }
235
+ elseif ( strpos( $sExclusion, '/' ) === false ) { // filename only
236
  $sExclusion = trim( preg_replace( '#[^.0-9a-z_-]#i', '', $sExclusion ) );
237
  }
238
 
247
  /**
248
  * @return string
249
  */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
250
  public function getWpvulnPluginsHighlightOption() {
251
+ /** @var HackGuard\Options $oOpts */
252
+ $oOpts = $this->getOptions();
253
+ return $oOpts->isWpvulnEnabled() ? $oOpts->getOpt( 'wpvuln_scan_display' ) : 'disabled';
254
  }
255
 
256
  /**
294
  * @return $this
295
  */
296
  protected function cleanPtgFileExtensions() {
297
+ /** @var HackGuard\Options $oOpts */
298
+ $oOpts = $this->getOptions();
299
+ $oOpts->setOpt(
300
  'ptg_extensions',
301
+ $this->cleanStringArray( $oOpts->getPtgFileExtensions(), '#[^a-z0-9_-]#i' )
302
  );
303
+ return $this;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
304
  }
305
 
306
  /**
307
  * @return bool
308
  */
309
  public function isPtgEnabled() {
310
+ return $this->isModuleEnabled() && $this->isPremium()
311
+ && $this->isOpt( 'ptg_enable', 'enabled' )
312
  && $this->getOptions()->isOptReqsMet( 'ptg_enable' )
313
  && $this->canPtgWriteToDisk();
314
  }
315
 
316
  /**
317
+ * @param string $sSlug
318
  * @return bool
319
  */
320
+ protected function isScanEnabled( $sSlug ) {
321
+ return $this->getScanCon( $sSlug )
322
+ ->isEnabled();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
323
  }
324
 
325
  /**
332
  public function insertCustomJsVars_Admin() {
333
  parent::insertCustomJsVars_Admin();
334
 
335
+ /** @var HackGuard\Options $oOpts */
336
+ $oOpts = $this->getOptions();
337
+ if ( Services::WpPost()->isCurrentPage( 'plugins.php' )
338
+ && $oOpts->isPtgReinstallLinks() && $this->getScanCon( 'ptg' )->isReady() ) {
339
  wp_localize_script(
340
  $this->prefix( 'global-plugin' ),
341
  'icwp_wpsf_vars_hp',
432
  return $aWarnings;
433
  }
434
 
435
+ /**
436
+ * @return string|false
437
+ */
438
+ public function getPtgSnapsBaseDir() {
439
+ return $this->getCon()->getPluginCachePath( 'ptguard/' );
440
+ }
441
+
442
  /**
443
  * temporary
444
  * @return bool
608
  * @return array
609
  */
610
  public function addInsightsNoticeData( $aAllNotices ) {
 
 
611
  /** @var HackGuard\Strings $oStrings */
612
  $oStrings = $this->getStrings();
613
  $aScanNames = $oStrings->getScanNames();
618
  ];
619
 
620
  {// Core files
621
+ if ( !$this->isScanEnabled( 'wcf' ) ) {
622
  $aNotices[ 'messages' ][ 'wcf' ] = [
623
  'title' => $aScanNames[ 'wcf' ],
624
  'message' => __( 'Core File scanner is not enabled.', 'wp-simple-firewall' ),
627
  'rec' => __( 'Automatic WordPress Core File scanner should be turned-on.', 'wp-simple-firewall' )
628
  ];
629
  }
630
+ elseif ( $this->getScanHasProblem( 'wcf' ) ) {
631
  $aNotices[ 'messages' ][ 'wcf' ] = [
632
  'title' => $aScanNames[ 'wcf' ],
633
  'message' => __( 'Modified WordPress core files found.', 'wp-simple-firewall' ),
639
  }
640
 
641
  {// Unrecognised
642
+ if ( !$this->isScanEnabled( 'ufc' ) ) {
643
  $aNotices[ 'messages' ][ 'ufc' ] = [
644
  'title' => $aScanNames[ 'ufc' ],
645
  'message' => __( 'Unrecognised File scanner is not enabled.', 'wp-simple-firewall' ),
648
  'rec' => __( 'Automatic scanning for non-WordPress core files is recommended.', 'wp-simple-firewall' )
649
  ];
650
  }
651
+ elseif ( $this->getScanHasProblem( 'ufc' ) ) {
652
  $aNotices[ 'messages' ][ 'ufc' ] = [
653
  'title' => $aScanNames[ 'ufc' ],
654
  'message' => __( 'Unrecognised files found in WordPress Core directory.', 'wp-simple-firewall' ),
660
  }
661
 
662
  {// Plugin/Theme Guard
663
+ $oPTG = $this->getScanCon( 'ptg' );
664
+ if ( !$oPTG->isEnabled() ) {
665
  $aNotices[ 'messages' ][ 'ptg' ] = [
666
  'title' => $aScanNames[ 'ptg' ],
667
  'message' => __( 'Automatic Plugin/Themes Guard is not enabled.', 'wp-simple-firewall' ),
670
  'rec' => __( 'Automatic detection of plugin/theme modifications is recommended.', 'wp-simple-firewall' )
671
  ];
672
  }
673
+ elseif ( $oPTG->getScanHasProblem() ) {
674
  $aNotices[ 'messages' ][ 'ptg' ] = [
675
  'title' => $aScanNames[ 'ptg' ],
676
  'message' => __( 'A plugin/theme was found to have been modified.', 'wp-simple-firewall' ),
682
  }
683
 
684
  {// Vulnerability Scanner
685
+ if ( !$this->isScanEnabled( 'wpv' ) ) {
686
  $aNotices[ 'messages' ][ 'wpv' ] = [
687
  'title' => $aScanNames[ 'wpv' ],
688
  'message' => __( 'Vulnerability Scanner is not enabled.', 'wp-simple-firewall' ),
691
  'rec' => __( 'Automatic detection of vulnerabilities is recommended.', 'wp-simple-firewall' )
692
  ];
693
  }
694
+ elseif ( $this->getScanHasProblem( 'wpv' ) ) {
695
  $aNotices[ 'messages' ][ 'wpv' ] = [
696
  'title' => $aScanNames[ 'wpv' ],
697
  'message' => __( 'At least 1 item has known vulnerabilities.', 'wp-simple-firewall' ),
703
  }
704
 
705
  {// Abandoned Plugins
706
+ if ( !$this->isScanEnabled( 'apc' ) ) {
707
  $aNotices[ 'messages' ][ 'apc' ] = [
708
  'title' => $aScanNames[ 'apc' ],
709
  'message' => __( 'Abandoned Plugins Scanner is not enabled.', 'wp-simple-firewall' ),
712
  'rec' => __( 'Automatic detection of abandoned plugins is recommended.', 'wp-simple-firewall' )
713
  ];
714
  }
715
+ elseif ( $this->getScanHasProblem( 'apc' ) ) {
716
  $aNotices[ 'messages' ][ 'apc' ] = [
717
  'title' => $aScanNames[ 'apc' ],
718
  'message' => __( 'At least 1 plugin on your site is abandoned.', 'wp-simple-firewall' ),
724
  }
725
 
726
  {// Malware
727
+ if ( !$this->isScanEnabled( 'mal' ) ) {
728
  $aNotices[ 'messages' ][ 'mal' ] = [
729
  'title' => $aScanNames[ 'mal' ],
730
  'message' => sprintf( __( '%s Scanner is not enabled.' ), $aScanNames[ 'mal' ] ),
733
  'rec' => __( 'Automatic detection of Malware is recommended.', 'wp-simple-firewall' )
734
  ];
735
  }
736
+ elseif ( $this->getScanHasProblem( 'mal' ) ) {
737
  $aNotices[ 'messages' ][ 'mal' ] = [
738
  'title' => $aScanNames[ 'mal' ],
739
  'message' => __( 'At least 1 file with potential Malware has been discovered.', 'wp-simple-firewall' ),
757
  public function addInsightsConfigData( $aAllData ) {
758
  /** @var HackGuard\Strings $oStrings */
759
  $oStrings = $this->getStrings();
760
+ /** @var HackGuard\Options $oOpts */
761
  $oOpts = $this->getOptions();
762
  $aScanNames = $oStrings->getScanNames();
763
 
785
  'href' => $this->getUrl_DirectLinkToSection( 'section_scan_options' ),
786
  ];
787
 
788
+ $bCore = $this->isScanEnabled( 'wcf' );
789
  $aThis[ 'key_opts' ][ 'wcf' ] = [
790
  'name' => __( 'WP Core File Scan', 'wp-simple-firewall' ),
791
  'enabled' => $bCore,
829
  ];
830
  }
831
 
832
+ $bWpv = $oOpts->isWpvulnEnabled();
833
  $aThis[ 'key_opts' ][ 'wpv' ] = [
834
  'name' => __( 'Vulnerability Scan', 'wp-simple-firewall' ),
835
  'enabled' => $bWpv,
839
  'weight' => 2,
840
  'href' => $this->getUrl_DirectLinkToSection( 'section_scan_wpv' ),
841
  ];
842
+ $bWpvAutoUpdates = $oOpts->isWpvulnAutoupdatesEnabled();
843
+ if ( $bWpv && !$bWpvAutoUpdates ) {
844
  $aThis[ 'key_opts' ][ 'wpv_repair' ] = [
845
  'name' => __( 'Auto Update', 'wp-simple-firewall' ),
846
+ 'enabled' => $bWpvAutoUpdates,
847
+ 'summary' => $bWpvAutoUpdates ?
848
  __( 'Vulnerable items are automatically updated', 'wp-simple-firewall' )
849
  : __( "Vulnerable items aren't automatically updated!", 'wp-simple-firewall' ),
850
  'weight' => 1,
852
  ];
853
  }
854
 
855
+ $bPtg = $this->isScanEnabled( 'ptg' );
856
  $aThis[ 'key_opts' ][ 'ptg' ] = [
857
  'title' => $aScanNames[ 'ptg' ],
858
  'name' => __( 'Plugin/Theme Guard', 'wp-simple-firewall' ),
864
  'href' => $this->getUrl_DirectLinkToSection( 'section_scan_ptg' ),
865
  ];
866
 
867
+ $bMal = $this->isScanEnabled( 'mal' );
868
  $aThis[ 'key_opts' ][ 'mal' ] = [
869
  'title' => $aScanNames[ 'mal' ],
870
  'name' => $aScanNames[ 'mal' ],
876
  'href' => $this->getUrl_DirectLinkToSection( 'section_scan_mal' ),
877
  ];
878
 
879
+ $bApc = $this->isScanEnabled( 'apc' );
880
  $aThis[ 'key_opts' ][ 'apc' ] = [
881
  'title' => $aScanNames[ 'apc' ],
882
  'name' => $aScanNames[ 'apc' ],
929
  && parent::isReadyToExecute();
930
  }
931
 
932
+ /**
933
+ * @return string
934
+ */
935
+ protected function getNamespaceBase() {
936
+ return 'HackGuard';
937
+ }
938
+
939
+ /**
940
+ * @return bool
941
+ * @deprecated 8.5
942
+ */
943
+ public function isPtgReadyToScan() {
944
+ return false;
945
+ }
946
+
947
+ /**
948
+ * @param int $nTime
949
+ * @return $this
950
+ * @deprecated 8.5
951
+ */
952
+ public function setPtgLastBuildAt( $nTime = null ) {
953
+ return $this;
954
+ }
955
+
956
+ /**
957
+ * @return int
958
+ * @deprecated 8.5
959
+ */
960
+ public function getPtgLastBuildAt() {
961
+ return $this->getOpt( 'ptg_last_build_at' );
962
+ }
963
+
964
+ /**
965
+ * @return bool
966
+ * @deprecated 8.5
967
+ */
968
+ public function isPtgRebuildSelfRequired() {
969
+ return $this->isOpt( 'rebuild_self', true );
970
+ }
971
+
972
+ /**
973
+ * @param bool $bIsRequired
974
+ * @return $this
975
+ * @deprecated 8.5
976
+ */
977
+ public function setPtgRebuildSelfRequired( $bIsRequired ) {
978
+ return $this->setOpt( 'rebuild_self', (bool)$bIsRequired );
979
+ }
980
+
981
+ /**
982
+ * @return bool
983
+ * @deprecated 8.5
984
+ */
985
+ public function isPtgBuildRequired() {
986
+ return false;
987
+ }
988
+
989
+ /**
990
+ * @param bool $bIsRequired
991
+ * @return $this
992
+ * @deprecated 8.5
993
+ */
994
+ public function setPtgUpdateStoreFormat( $bIsRequired ) {
995
+ return $this->setOpt( 'ptg_update_store_format', (bool)$bIsRequired );
996
+ }
997
+
998
+ /**
999
+ * @return bool
1000
+ * @deprecated 8.5
1001
+ */
1002
+ public function getPtgDepth() {
1003
+ return 0;
1004
+ }
1005
+
1006
+ /**
1007
+ * @return bool
1008
+ * @deprecated 8.5
1009
+ */
1010
+ public function isPtgUpdateStoreFormat() {
1011
+ return $this->isOpt( 'ptg_update_store_format', true );
1012
+ }
1013
+
1014
+ /**
1015
+ * @return string[]
1016
+ * @deprecated 8.5
1017
+ */
1018
+ public function getPtgFileExtensions() {
1019
+ return $this->getOpt( 'ptg_extensions' );
1020
+ }
1021
+
1022
+ /**
1023
+ * @return bool
1024
+ * @deprecated 8.5
1025
+ */
1026
+ public function isPtgReinstallLinks() {
1027
+ return $this->isOpt( 'ptg_reinstall_links', 'Y' );
1028
+ }
1029
+
1030
+ /**
1031
+ * @return string
1032
+ * @deprecated 8.5
1033
+ */
1034
+ public function isUfcDeleteFiles() {
1035
+ /** @var HackGuard\Options $oOpts */
1036
+ $oOpts = $this->getOptions();
1037
+ return $oOpts->isUfcDeleteFiles();
1038
+ }
1039
+
1040
+ /**
1041
+ * @return bool
1042
+ * @deprecated 8.5
1043
+ */
1044
+ public function isUfcEnabled() {
1045
+ /** @var HackGuard\Options $oOpts */
1046
+ $oOpts = $this->getOptions();
1047
+ return $oOpts->isUfcEnabled();
1048
+ }
1049
+
1050
+ /**
1051
+ * @return string
1052
+ * @deprecated 8.5
1053
+ */
1054
+ public function isUfcSendReport() {
1055
+ /** @var HackGuard\Options $oOpts */
1056
+ $oOpts = $this->getOptions();
1057
+ return $oOpts->isUfcSendReport();
1058
+ }
1059
+
1060
  /**
1061
  * @return bool
1062
+ * @deprecated 8.5
1063
  */
1064
+ public function isApcEnabled() {
1065
+ /** @var HackGuard\Options $oOpts */
1066
+ $oOpts = $this->getOptions();
1067
+ return $oOpts->isApcEnabled();
1068
  }
1069
 
1070
  /**
1071
  * @return bool
1072
+ * @deprecated 8.5
1073
  */
1074
+ public function isWcfScanEnabled() {
1075
+ /** @var HackGuard\Options $oOpts */
1076
+ $oOpts = $this->getOptions();
1077
+ return $oOpts->isWcfScanEnabled();
1078
  }
1079
 
1080
  /**
1081
  * @return bool
1082
+ * @deprecated 8.5
1083
  */
1084
+ public function isWpvulnEnabled() {
1085
  /** @var HackGuard\Options $oOpts */
1086
  $oOpts = $this->getOptions();
1087
+ return $oOpts->isWpvulnEnabled();
1088
  }
1089
 
1090
  /**
1091
  * @return bool
1092
+ * @deprecated 8.5
1093
  */
1094
+ public function isWpvulnSendEmail() {
1095
+ return $this->isWpvulnEnabled() && $this->isOpt( 'enable_wpvuln_scan', 'enabled_email' );
1096
  }
1097
 
1098
  /**
1099
  * @return bool
1100
+ * @deprecated 8.5
1101
  */
1102
+ public function isWpvulnAutoupdatesEnabled() {
1103
+ /** @var HackGuard\Options $oOpts */
1104
+ $oOpts = $this->getOptions();
1105
+ return $oOpts->isWpvulnAutoupdatesEnabled();
1106
  }
1107
 
1108
  /**
1109
  * @return string
1110
+ * @deprecated 8.5
1111
  */
1112
+ public function getUnrecognisedFileScannerOption() {
1113
+ return $this->getOpt( 'enable_unrecognised_file_cleaner_scan', 'disabled' );
1114
+ }
1115
+
1116
+ /**
1117
+ * @return bool
1118
+ * @deprecated 8.5
1119
+ */
1120
+ public function isWcfScanAutoRepair() {
1121
+ /** @var HackGuard\Options $oOpts */
1122
+ $oOpts = $this->getOptions();
1123
+ return $oOpts->isWcfScanAutoRepair();
1124
  }
1125
  }
src/features/headers.php CHANGED
@@ -1,127 +1,89 @@
1
  <?php
2
 
3
- use FernleafSystems\Wordpress\Plugin\Shield;
4
  use FernleafSystems\Wordpress\Services\Services;
5
 
6
  class ICWP_WPSF_FeatureHandler_Headers extends ICWP_WPSF_FeatureHandler_BaseWpsf {
7
 
8
- /**
9
- * @return boolean
10
- */
11
- public function isContentSecurityPolicyEnabled() {
12
- return $this->isOpt( 'enable_x_content_security_policy', 'Y' );
13
- }
14
-
15
- /**
16
- * @return bool
17
- */
18
- public function isReferrerPolicyEnabled() {
19
- return !$this->isOpt( 'x_referrer_policy', 'disabled' );
20
- }
21
-
22
- /**
23
- * @return bool
24
- */
25
- public function isEnabledXFrame() {
26
- return in_array( $this->getOpt( 'x_frame' ), [ 'on_sameorigin', 'on_deny' ] );
27
- }
28
-
29
- /**
30
- * @return bool
31
- */
32
- public function isEnabledXssProtection() {
33
- return $this->isOpt( 'x_xss_protect', 'Y' );
34
  }
35
 
36
- /**
37
- * @return bool
38
- */
39
- public function isEnabledContentTypeHeader() {
40
- return $this->isOpt( 'x_content_type', 'Y' );
 
 
 
 
 
 
 
 
41
  }
42
 
43
- /**
44
- * Using this function without first checking isReferrerPolicyEnabled() will result in empty
45
- * referrer policy header in the case of "disabled"
46
- * @return string
47
- */
48
- public function getReferrerPolicyValue() {
49
- $sValue = $this->getOpt( 'x_referrer_policy' );
50
- return in_array( $sValue, [ 'empty', 'disabled' ] ) ? '' : $sValue;
51
- }
52
 
53
- /**
54
- * @return array
55
- */
56
- public function getCspHosts() {
57
- $aHosts = $this->getOpt( 'xcsp_hosts', [] );
58
- if ( empty( $aHosts ) || !is_array( $aHosts ) ) {
59
- $aHosts = [];
60
- }
61
- return $aHosts;
62
- }
63
 
64
- protected function doExtraSubmitProcessing() {
65
- $aDomains = $this->getCspHosts();
66
- if ( !empty( $aDomains ) && is_array( $aDomains ) ) {
67
- $oDP = Services::Data();
68
- $aValidDomains = [];
69
- foreach ( $aDomains as $sDomain ) {
70
- $bValidDomain = false;
71
- $sDomain = trim( $sDomain );
72
-
73
- $bHttps = ( strpos( $sDomain, 'https://' ) === 0 );
74
- $bHttp = ( strpos( $sDomain, 'http://' ) === 0 );
75
- if ( $bHttp || $bHttps ) {
76
- $sDomain = preg_replace( '#^http(s)?://#', '', $sDomain );
77
- }
78
 
79
- $sCustomProtocol = '';
80
- // Special wildcard case
81
- if ( $sDomain == '*' ) {
82
- if ( $bHttps ) {
83
- $this->setOpt( 'xcsp_https', 'Y' );
84
- }
85
- else {
86
- $bValidDomain = true;
87
- }
88
  }
89
- else if ( strpos( $sDomain, '://' ) && preg_match( '#^([a-zA-Z]+://)#', $sDomain, $aMatches ) ) {
90
- // there's a protocol specified
91
- $sCustomProtocol = $aMatches[ 1 ];
92
- $sDomain = str_replace( $sCustomProtocol, '', $sDomain );
93
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
94
 
95
- // First we remove the wildcard and test domain, then add it back later.
96
- $bWildCard = ( strpos( $sDomain, '*.' ) === 0 );
97
  if ( $bWildCard ) {
98
- $sDomain = preg_replace( '#^\*\.#', '', $sDomain );
99
  }
100
-
101
- if ( !empty ( $sDomain ) && $oDP->isValidDomainName( $sDomain ) ) {
102
- $bValidDomain = true;
103
  }
104
-
105
- if ( $bValidDomain ) {
106
- if ( $bWildCard ) {
107
- $sDomain = '*.'.$sDomain;
108
- }
109
- if ( $bHttp ) {
110
- // $sDomain = 'http://'.$sDomain; // it seems there's no need to "explicitly" state http://
111
- }
112
- else if ( $bHttps ) {
113
- $sDomain = 'https://'.$sDomain;
114
- }
115
- else if ( !empty( $sCustomProtocol ) ) {
116
- $sDomain = $sCustomProtocol.$sDomain;
117
- }
118
- $aValidDomains[] = $sDomain;
119
  }
 
120
  }
121
- asort( $aValidDomains );
122
- $aValidDomains = array_unique( $aValidDomains );
123
- $this->setOpt( 'xcsp_hosts', $aValidDomains );
124
  }
 
 
125
  }
126
 
127
  /**
@@ -129,6 +91,9 @@ class ICWP_WPSF_FeatureHandler_Headers extends ICWP_WPSF_FeatureHandler_BaseWpsf
129
  * @return array
130
  */
131
  public function addInsightsConfigData( $aAllData ) {
 
 
 
132
  $aThis = [
133
  'strings' => [
134
  'title' => __( 'HTTP Security Headers', 'wp-simple-firewall' ),
@@ -142,8 +107,8 @@ class ICWP_WPSF_FeatureHandler_Headers extends ICWP_WPSF_FeatureHandler_BaseWpsf
142
  $aThis[ 'key_opts' ][ 'mod' ] = $this->getModDisabledInsight();
143
  }
144
  else {
145
- $bAllEnabled = $this->isEnabledXFrame() && $this->isEnabledXssProtection()
146
- && $this->isEnabledContentTypeHeader() && $this->isReferrerPolicyEnabled();
147
  $aThis[ 'key_opts' ][ 'all' ] = [
148
  'name' => __( 'HTTP Headers', 'wp-simple-firewall' ),
149
  'enabled' => $bAllEnabled,
@@ -153,7 +118,7 @@ class ICWP_WPSF_FeatureHandler_Headers extends ICWP_WPSF_FeatureHandler_BaseWpsf
153
  'weight' => 2,
154
  'href' => $this->getUrl_DirectLinkToSection( 'section_security_headers' ),
155
  ];
156
- $bCsp = $this->isContentSecurityPolicyEnabled();
157
  $aThis[ 'key_opts' ][ 'csp' ] = [
158
  'name' => __( 'Content Security Policies', 'wp-simple-firewall' ),
159
  'enabled' => $bCsp,
@@ -175,4 +140,67 @@ class ICWP_WPSF_FeatureHandler_Headers extends ICWP_WPSF_FeatureHandler_BaseWpsf
175
  protected function getNamespaceBase() {
176
  return 'Headers';
177
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
178
  }
1
  <?php
2
 
3
+ use FernleafSystems\Wordpress\Plugin\Shield\Modules\Headers;
4
  use FernleafSystems\Wordpress\Services\Services;
5
 
6
  class ICWP_WPSF_FeatureHandler_Headers extends ICWP_WPSF_FeatureHandler_BaseWpsf {
7
 
8
+ protected function doExtraSubmitProcessing() {
9
+ $this->cleanCspHosts();
10
+ $this->cleanCustomRules();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11
  }
12
 
13
+ private function cleanCustomRules() {
14
+ /** @var Headers\Options $oOpts */
15
+ $oOpts = $this->getOptions();
16
+ $oOpts->setOpt( 'xcsp_custom', array_unique( array_filter( array_map(
17
+ function ( $sRule ) {
18
+ $sRule = trim( preg_replace( '#;|\s{2,}#', '', html_entity_decode( $sRule, ENT_QUOTES ) ) );
19
+ if ( !empty( $sRule ) ) {
20
+ $sRule .= ';';
21
+ }
22
+ return $sRule;
23
+ },
24
+ $this->getOpt( 'xcsp_custom', [] )
25
+ ) ) ) );
26
  }
27
 
28
+ private function cleanCspHosts() {
29
+ /** @var Headers\Options $oOpts */
30
+ $oOpts = $this->getOptions();
 
 
 
 
 
 
31
 
32
+ $aValidDomains = [];
33
+ foreach ( $oOpts->getOpt( 'xcsp_hosts', [] ) as $sDomain ) {
34
+ $bValidDomain = false;
35
+ $sDomain = trim( $sDomain );
 
 
 
 
 
 
36
 
37
+ $bHttps = ( strpos( $sDomain, 'https://' ) === 0 );
38
+ $bHttp = ( strpos( $sDomain, 'http://' ) === 0 );
39
+ if ( $bHttp || $bHttps ) {
40
+ $sDomain = preg_replace( '#^http(s)?://#', '', $sDomain );
41
+ }
 
 
 
 
 
 
 
 
 
42
 
43
+ $sCustomProtocol = '';
44
+ // Special wildcard case
45
+ if ( $sDomain == '*' ) {
46
+ if ( $bHttps ) {
47
+ $this->setOpt( 'xcsp_https', 'Y' );
 
 
 
 
48
  }
49
+ else {
50
+ $bValidDomain = true;
 
 
51
  }
52
+ }
53
+ elseif ( strpos( $sDomain, '://' ) && preg_match( '#^([a-zA-Z]+://)#', $sDomain, $aMatches ) ) {
54
+ // there's a protocol specified
55
+ $sCustomProtocol = $aMatches[ 1 ];
56
+ $sDomain = str_replace( $sCustomProtocol, '', $sDomain );
57
+ }
58
+
59
+ // First we remove the wildcard and test domain, then add it back later.
60
+ $bWildCard = ( strpos( $sDomain, '*.' ) === 0 );
61
+ if ( $bWildCard ) {
62
+ $sDomain = preg_replace( '#^\*\.#', '', $sDomain );
63
+ }
64
+
65
+ if ( !empty ( $sDomain ) && Services::Data()->isValidDomainName( $sDomain ) ) {
66
+ $bValidDomain = true;
67
+ }
68
 
69
+ if ( $bValidDomain ) {
 
70
  if ( $bWildCard ) {
71
+ $sDomain = '*.'.$sDomain;
72
  }
73
+ if ( $bHttp ) {
74
+ // $sDomain = 'http://'.$sDomain; // it seems there's no need to "explicitly" state http://
 
75
  }
76
+ elseif ( $bHttps ) {
77
+ $sDomain = 'https://'.$sDomain;
78
+ }
79
+ elseif ( !empty( $sCustomProtocol ) ) {
80
+ $sDomain = $sCustomProtocol.$sDomain;
 
 
 
 
 
 
 
 
 
 
81
  }
82
+ $aValidDomains[] = $sDomain;
83
  }
 
 
 
84
  }
85
+ asort( $aValidDomains );
86
+ $oOpts->setOpt( 'xcsp_hosts', array_unique( $aValidDomains ) );
87
  }
88
 
89
  /**
91
  * @return array
92
  */
93
  public function addInsightsConfigData( $aAllData ) {
94
+ /** @var Headers\Options $oOpts */
95
+ $oOpts = $this->getOptions();
96
+
97
  $aThis = [
98
  'strings' => [
99
  'title' => __( 'HTTP Security Headers', 'wp-simple-firewall' ),
107
  $aThis[ 'key_opts' ][ 'mod' ] = $this->getModDisabledInsight();
108
  }
109
  else {
110
+ $bAllEnabled = $oOpts->isEnabledXFrame() && $oOpts->isEnabledXssProtection()
111
+ && $oOpts->isEnabledContentTypeHeader() && $oOpts->isReferrerPolicyEnabled();
112
  $aThis[ 'key_opts' ][ 'all' ] = [
113
  'name' => __( 'HTTP Headers', 'wp-simple-firewall' ),
114
  'enabled' => $bAllEnabled,
118
  'weight' => 2,
119
  'href' => $this->getUrl_DirectLinkToSection( 'section_security_headers' ),
120
  ];
121
+ $bCsp = $oOpts->isEnabledContentSecurityPolicy();
122
  $aThis[ 'key_opts' ][ 'csp' ] = [
123
  'name' => __( 'Content Security Policies', 'wp-simple-firewall' ),
124
  'enabled' => $bCsp,
140
  protected function getNamespaceBase() {
141
  return 'Headers';
142
  }
143
+
144
+ /**
145
+ * @return bool
146
+ * @deprecated 8.5
147
+ */
148
+ public function isContentSecurityPolicyEnabled() {
149
+ return $this->isOpt( 'enable_x_content_security_policy', 'Y' );
150
+ }
151
+
152
+ /**
153
+ * @return bool
154
+ * @deprecated 8.5
155
+ */
156
+ public function isReferrerPolicyEnabled() {
157
+ return !$this->isOpt( 'x_referrer_policy', 'disabled' );
158
+ }
159
+
160
+ /**
161
+ * @return bool
162
+ * @deprecated 8.5
163
+ */
164
+ public function isEnabledXFrame() {
165
+ return in_array( $this->getOpt( 'x_frame' ), [ 'on_sameorigin', 'on_deny' ] );
166
+ }
167
+
168
+ /**
169
+ * @return bool
170
+ * @deprecated 8.5
171
+ */
172
+ public function isEnabledXssProtection() {
173
+ return $this->isOpt( 'x_xss_protect', 'Y' );
174
+ }
175
+
176
+ /**
177
+ * @return bool
178
+ * @deprecated 8.5
179
+ */
180
+ public function isEnabledContentTypeHeader() {
181
+ return $this->isOpt( 'x_content_type', 'Y' );
182
+ }
183
+
184
+ /**
185
+ * Using this function without first checking isReferrerPolicyEnabled() will result in empty
186
+ * referrer policy header in the case of "disabled"
187
+ * @return string
188
+ * @deprecated 8.5
189
+ */
190
+ public function getReferrerPolicyValue() {
191
+ $sValue = $this->getOpt( 'x_referrer_policy' );
192
+ return in_array( $sValue, [ 'empty', 'disabled' ] ) ? '' : $sValue;
193
+ }
194
+
195
+ /**
196
+ * @return array
197
+ * @deprecated 8.5
198
+ */
199
+ public function getCspHosts() {
200
+ $aHosts = $this->getOpt( 'xcsp_hosts', [] );
201
+ if ( empty( $aHosts ) || !is_array( $aHosts ) ) {
202
+ $aHosts = [];
203
+ }
204
+ return $aHosts;
205
+ }
206
  }
src/features/insights.php CHANGED
@@ -7,10 +7,13 @@ class ICWP_WPSF_FeatureHandler_Insights extends ICWP_WPSF_FeatureHandler_BaseWps
7
 
8
  protected function doPostConstruction() {
9
  parent::doPostConstruction();
10
- $nActivatedAt = $this->getCon()
11
- ->getModule_Plugin()
12
- ->getActivatedAt();
13
- if ( $nActivatedAt > 0 && Services::Request()->ts() - $nActivatedAt < 5 ) {
 
 
 
14
  Services::Response()->redirect( $this->getUrl_AdminPage() );
15
  }
16
  }
@@ -60,7 +63,13 @@ class ICWP_WPSF_FeatureHandler_Insights extends ICWP_WPSF_FeatureHandler_BaseWps
60
  $oProHp = $oCon->getModule( 'hack_protect' )->getProcessor();
61
  /** @var ICWP_WPSF_FeatureHandler_License $oModLicense */
62
  $oModLicense = $oCon->getModule( 'license' );
 
63
  $oModPlugin = $oCon->getModule_Plugin();
 
 
 
 
 
64
  /** @var ICWP_WPSF_Processor_Plugin $oProPlugin */
65
  $oProPlugin = $oModPlugin->getProcessor();
66
  $oEvtsMod = $oCon->getModule_Events();
@@ -125,11 +134,20 @@ class ICWP_WPSF_FeatureHandler_Insights extends ICWP_WPSF_FeatureHandler_BaseWps
125
  'summary_blacklist' => sprintf( __( 'IP addresses that have tripped %s defenses.', 'wp-simple-firewall' ), $nPluginName ),
126
  'enter_ip_block' => __( 'Enter IP address to block', 'wp-simple-firewall' ),
127
  'enter_ip_white' => __( 'Enter IP address to whitelist', 'wp-simple-firewall' ),
 
128
  'label_for_ip' => __( 'Label for IP', 'wp-simple-firewall' ),
129
  'ip_new' => __( 'New IP', 'wp-simple-firewall' ),
 
130
  'ip_block' => __( 'Block IP', 'wp-simple-firewall' ),
131
  ],
132
- 'vars' => [],
 
 
 
 
 
 
 
133
  ];
134
  break;
135
 
@@ -137,6 +155,7 @@ class ICWP_WPSF_FeatureHandler_Insights extends ICWP_WPSF_FeatureHandler_BaseWps
137
  $aData = [
138
  'ajax' => [
139
  'render_table_adminnotes' => $oModPlugin->getAjaxActionData( 'render_table_adminnotes', true ),
 
140
  'item_delete' => $oModPlugin->getAjaxActionData( 'note_delete', true ),
141
  'item_insert' => $oModPlugin->getAjaxActionData( 'note_insert', true ),
142
  'bulk_action' => $oModPlugin->getAjaxActionData( 'bulk_action', true ),
@@ -309,6 +328,7 @@ class ICWP_WPSF_FeatureHandler_Insights extends ICWP_WPSF_FeatureHandler_BaseWps
309
  $sName = [
310
  'href' => add_query_arg( [ 'inav' => $sKey ], $this->getUrl_AdminPage() ),
311
  'name' => $sName,
 
312
  'active' => $sKey === $sNavSection,
313
  'subnavs' => []
314
  ];
@@ -344,6 +364,9 @@ class ICWP_WPSF_FeatureHandler_Insights extends ICWP_WPSF_FeatureHandler_BaseWps
344
  'flags' => [
345
  'show_promo' => !$bIsPro && ( $sNavSection != 'settings' ),
346
  'show_guided_tour' => $oModPlugin->getIfShowIntroVideo(),
 
 
 
347
  ],
348
  'hrefs' => [
349
  'go_pro' => 'https://shsec.io/shieldgoprofeature',
@@ -370,6 +393,9 @@ class ICWP_WPSF_FeatureHandler_Insights extends ICWP_WPSF_FeatureHandler_BaseWps
370
  $oCon = $this->getCon();
371
  $aStdDepsJs = [ $this->prefix( 'plugin' ) ];
372
  $sNav = Services::Request()->query( 'inav', 'overview' );
 
 
 
373
  switch ( $sNav ) {
374
 
375
  case 'importexport':
@@ -390,7 +416,11 @@ class ICWP_WPSF_FeatureHandler_Insights extends ICWP_WPSF_FeatureHandler_BaseWps
390
  case 'reports':
391
 
392
  $aDeps = $aStdDepsJs;
 
393
  $aJsAssets = [ 'chartist.min', 'chartist-plugin-legend', 'charts' ];
 
 
 
394
  foreach ( $aJsAssets as $sAsset ) {
395
  $sUnique = $oCon->prefix( $sAsset );
396
  wp_register_script(
@@ -406,6 +436,9 @@ class ICWP_WPSF_FeatureHandler_Insights extends ICWP_WPSF_FeatureHandler_BaseWps
406
 
407
  $aDeps = [];
408
  $aCssAssets = [ 'chartist.min', 'chartist-plugin-legend' ];
 
 
 
409
  foreach ( $aCssAssets as $sAsset ) {
410
  $sUnique = $oCon->prefix( $sAsset );
411
  wp_register_style(
@@ -781,11 +814,11 @@ class ICWP_WPSF_FeatureHandler_Insights extends ICWP_WPSF_FeatureHandler_BaseWps
781
 
782
  $aStatsData = [
783
  'login' => [
784
- 'id' => 'login_block',
785
- 'title' => __( 'Login Blocks', 'wp-simple-firewall' ),
786
- 'val' => sprintf( '%s: %s', __( 'Lifetime Total' ),
787
  $oSelEvents->clearWheres()->sumEvent( 'login_block' ) ),
788
- 'tooltip_p' => __( 'Total login attempts blocked.', 'wp-simple-firewall' ),
789
  ],
790
  // 'firewall' => [
791
  // 'id' => 'firewall_block',
@@ -794,48 +827,43 @@ class ICWP_WPSF_FeatureHandler_Insights extends ICWP_WPSF_FeatureHandler_BaseWps
794
  // 'tooltip' => __( 'Total requests blocked by firewall rules.', 'wp-simple-firewall' )
795
  // ],
796
  'bot_blocks' => [
797
- 'id' => 'bot_blocks',
798
- 'title' => __( 'Bot Detection', 'wp-simple-firewall' ),
799
- 'val' => sprintf( '%s: %s', __( 'Lifetime Total' ),
800
  $oSelEvents->clearWheres()->sumEventsLike( 'bottrack_' ) ),
801
- 'tooltip_p' => __( 'Total requests identified as bots.', 'wp-simple-firewall' ),
802
  ],
803
  'comments' => [
804
- 'id' => 'comment_block',
805
- 'title' => __( 'Comment Blocks', 'wp-simple-firewall' ),
806
- 'val' => sprintf( '%s: %s', __( 'Lifetime Total' ),
807
  $oSelEvents->clearWheres()->sumEvents( [
808
  'spam_block_bot',
809
  'spam_block_human',
810
  'spam_block_recaptcha'
811
  ] ) ),
812
- 'tooltip_p' => __( 'Total SPAM comments blocked.', 'wp-simple-firewall' ),
813
  ],
814
  'transgressions' => [
815
- 'id' => 'ip_offense',
816
- 'title' => __( 'Offenses', 'wp-simple-firewall' ),
817
- 'val' => sprintf( '%s: %s', __( 'Lifetime Total' ),
818
  $oSelEvents->clearWheres()->sumEvent( 'ip_offense' ) ),
819
- 'tooltip_p' => __( 'Total offenses against the site.', 'wp-simple-firewall' ),
820
  ],
821
  'conn_kills' => [
822
- 'id' => 'conn_kill',
823
- 'title' => __( 'Connection Killed', 'wp-simple-firewall' ),
824
- 'val' => sprintf( '%s: %s', __( 'Lifetime Total' ),
825
  $oSelEvents->clearWheres()->sumEvent( 'conn_kill' ) ),
826
- 'tooltip_p' => __( 'Total connections blocked/killed after too many offenses.', 'wp-simple-firewall' ),
827
  ],
828
  'ip_blocked' => [
829
  'id' => 'ip_blocked',
830
  'title' => __( 'IP Blocked', 'wp-simple-firewall' ),
831
  'val' => sprintf( '%s: %s', __( 'Now' ),
832
- $oSelectIp
833
- ->filterByLists(
834
- [
835
- ICWP_WPSF_FeatureHandler_Ips::LIST_AUTO_BLACK,
836
- ICWP_WPSF_FeatureHandler_Ips::LIST_MANUAL_BLACK
837
- ]
838
- )->count() ),
839
  'tooltip_p' => __( 'IP address exceeds offense limit and is blocked.', 'wp-simple-firewall' ),
840
  ],
841
  ];
@@ -855,12 +883,12 @@ class ICWP_WPSF_FeatureHandler_Insights extends ICWP_WPSF_FeatureHandler_BaseWps
855
  protected function getRecentEvents() {
856
  $oCon = $this->getCon();
857
 
858
- $aEmptyStats = [];
859
- foreach ( $oCon->getModules() as $oModule ) {
860
- /** @var ICWP_WPSF_FeatureHandler_BaseWpsf $oModule */
861
- $aStat = $oModule->getStatEvents_Recent();
862
- $aEmptyStats = array_merge( $aEmptyStats, $aStat );
863
- }
864
 
865
  /** @var Shield\Modules\Insights\Strings $oStrs */
866
  $oStrs = $this->getStrings();
@@ -871,7 +899,7 @@ class ICWP_WPSF_FeatureHandler_Insights extends ICWP_WPSF_FeatureHandler_BaseWps
871
  ->getDbHandler_Events()
872
  ->getQuerySelector();
873
 
874
- $aLatestStats = array_intersect_key(
875
  array_map(
876
  function ( $oEntryVO ) use ( $aNames ) {
877
  /** @var Shield\Databases\Events\EntryVO $oEntryVO */
@@ -882,20 +910,20 @@ class ICWP_WPSF_FeatureHandler_Insights extends ICWP_WPSF_FeatureHandler_BaseWps
882
  },
883
  $oSel->getLatestForAllEvents()
884
  ),
885
- $aEmptyStats
886
  );
887
 
888
  $sNotYetRecorded = __( 'Not yet recorded', 'wp-simple-firewall' );
889
- foreach ( array_keys( $aEmptyStats ) as $sStatKey ) {
890
- if ( !isset( $aLatestStats[ $sStatKey ] ) ) {
891
- $aLatestStats[ $sStatKey ] = [
892
  'name' => isset( $aNames[ $sStatKey ] ) ? $aNames[ $sStatKey ] : '*** '.$sStatKey,
893
  'val' => $sNotYetRecorded
894
  ];
895
  }
896
  }
897
 
898
- return $aLatestStats;
899
  }
900
 
901
  /**
7
 
8
  protected function doPostConstruction() {
9
  parent::doPostConstruction();
10
+ $this->maybeRedirectToAdmin();
11
+ }
12
+
13
+ private function maybeRedirectToAdmin() {
14
+ $oCon = $this->getCon();
15
+ $nActiveFor = $oCon->getModule_Plugin()->getActivateLength();
16
+ if ( !Services::WpGeneral()->isAjax() && is_admin() && !$oCon->isModulePage() && $nActiveFor < 4 ) {
17
  Services::Response()->redirect( $this->getUrl_AdminPage() );
18
  }
19
  }
63
  $oProHp = $oCon->getModule( 'hack_protect' )->getProcessor();
64
  /** @var ICWP_WPSF_FeatureHandler_License $oModLicense */
65
  $oModLicense = $oCon->getModule( 'license' );
66
+
67
  $oModPlugin = $oCon->getModule_Plugin();
68
+ $oTourManager = $oModPlugin->getTourManager();
69
+ if ( !$oTourManager->isCompleted( 'insights_overview' ) && $oModPlugin->getActivateLength() > 600 ) {
70
+ $oTourManager->setCompleted( 'insights_overview' );
71
+ }
72
+
73
  /** @var ICWP_WPSF_Processor_Plugin $oProPlugin */
74
  $oProPlugin = $oModPlugin->getProcessor();
75
  $oEvtsMod = $oCon->getModule_Events();
134
  'summary_blacklist' => sprintf( __( 'IP addresses that have tripped %s defenses.', 'wp-simple-firewall' ), $nPluginName ),
135
  'enter_ip_block' => __( 'Enter IP address to block', 'wp-simple-firewall' ),
136
  'enter_ip_white' => __( 'Enter IP address to whitelist', 'wp-simple-firewall' ),
137
+ 'enter_ip' => __( 'Enter IP address', 'wp-simple-firewall' ),
138
  'label_for_ip' => __( 'Label for IP', 'wp-simple-firewall' ),
139
  'ip_new' => __( 'New IP', 'wp-simple-firewall' ),
140
+ 'ip_filter' => __( 'Filter By IP', 'wp-simple-firewall' ),
141
  'ip_block' => __( 'Block IP', 'wp-simple-firewall' ),
142
  ],
143
+ 'vars' => [
144
+ 'unique_ips_black' => ( new Shield\Modules\IPs\Lib\Ops\RetrieveIpsForLists() )
145
+ ->setDbHandler( $oIpMod->getDbHandler_IPs() )
146
+ ->black(),
147
+ 'unique_ips_white' => ( new Shield\Modules\IPs\Lib\Ops\RetrieveIpsForLists() )
148
+ ->setDbHandler( $oIpMod->getDbHandler_IPs() )
149
+ ->white()
150
+ ],
151
  ];
152
  break;
153
 
155
  $aData = [
156
  'ajax' => [
157
  'render_table_adminnotes' => $oModPlugin->getAjaxActionData( 'render_table_adminnotes', true ),
158
+ 'item_action_notes' => $oModPlugin->getAjaxActionData( 'item_action_notes', true ),
159
  'item_delete' => $oModPlugin->getAjaxActionData( 'note_delete', true ),
160
  'item_insert' => $oModPlugin->getAjaxActionData( 'note_insert', true ),
161
  'bulk_action' => $oModPlugin->getAjaxActionData( 'bulk_action', true ),
328
  $sName = [
329
  'href' => add_query_arg( [ 'inav' => $sKey ], $this->getUrl_AdminPage() ),
330
  'name' => $sName,
331
+ 'slug' => $sKey,
332
  'active' => $sKey === $sNavSection,
333
  'subnavs' => []
334
  ];
364
  'flags' => [
365
  'show_promo' => !$bIsPro && ( $sNavSection != 'settings' ),
366
  'show_guided_tour' => $oModPlugin->getIfShowIntroVideo(),
367
+ 'tours' => [
368
+ 'insights_overview' => $oTourManager->canShow( 'insights_overview' )
369
+ ]
370
  ],
371
  'hrefs' => [
372
  'go_pro' => 'https://shsec.io/shieldgoprofeature',
393
  $oCon = $this->getCon();
394
  $aStdDepsJs = [ $this->prefix( 'plugin' ) ];
395
  $sNav = Services::Request()->query( 'inav', 'overview' );
396
+
397
+ $oModPlugin = $oCon->getModule_Plugin();
398
+ $oTourManager = $oModPlugin->getTourManager();
399
  switch ( $sNav ) {
400
 
401
  case 'importexport':
416
  case 'reports':
417
 
418
  $aDeps = $aStdDepsJs;
419
+
420
  $aJsAssets = [ 'chartist.min', 'chartist-plugin-legend', 'charts' ];
421
+ if ( $oTourManager->canShow( 'insights_overview' ) ) {
422
+ array_unshift( $aJsAssets, 'introjs.min.js' );
423
+ }
424
  foreach ( $aJsAssets as $sAsset ) {
425
  $sUnique = $oCon->prefix( $sAsset );
426
  wp_register_script(
436
 
437
  $aDeps = [];
438
  $aCssAssets = [ 'chartist.min', 'chartist-plugin-legend' ];
439
+ if ( $oTourManager->canShow( 'insights_overview' ) ) {
440
+ array_unshift( $aCssAssets, 'introjs.min.css' );
441
+ }
442
  foreach ( $aCssAssets as $sAsset ) {
443
  $sUnique = $oCon->prefix( $sAsset );
444
  wp_register_style(
814
 
815
  $aStatsData = [
816
  'login' => [
817
+ 'id' => 'login_block',
818
+ 'title' => __( 'Login Blocks', 'wp-simple-firewall' ),
819
+ 'val' => sprintf( '%s: %s', __( 'Lifetime Total' ),
820
  $oSelEvents->clearWheres()->sumEvent( 'login_block' ) ),
821
+ 'tooltip_p' => __( 'Total login attempts blocked.', 'wp-simple-firewall' ),
822
  ],
823
  // 'firewall' => [
824
  // 'id' => 'firewall_block',
827
  // 'tooltip' => __( 'Total requests blocked by firewall rules.', 'wp-simple-firewall' )
828
  // ],
829
  'bot_blocks' => [
830
+ 'id' => 'bot_blocks',
831
+ 'title' => __( 'Bot Detection', 'wp-simple-firewall' ),
832
+ 'val' => sprintf( '%s: %s', __( 'Lifetime Total' ),
833
  $oSelEvents->clearWheres()->sumEventsLike( 'bottrack_' ) ),
834
+ 'tooltip_p' => __( 'Total requests identified as bots.', 'wp-simple-firewall' ),
835
  ],
836
  'comments' => [
837
+ 'id' => 'comment_block',
838
+ 'title' => __( 'Comment Blocks', 'wp-simple-firewall' ),
839
+ 'val' => sprintf( '%s: %s', __( 'Lifetime Total' ),
840
  $oSelEvents->clearWheres()->sumEvents( [
841
  'spam_block_bot',
842
  'spam_block_human',
843
  'spam_block_recaptcha'
844
  ] ) ),
845
+ 'tooltip_p' => __( 'Total SPAM comments blocked.', 'wp-simple-firewall' ),
846
  ],
847
  'transgressions' => [
848
+ 'id' => 'ip_offense',
849
+ 'title' => __( 'Offenses', 'wp-simple-firewall' ),
850
+ 'val' => sprintf( '%s: %s', __( 'Lifetime Total' ),
851
  $oSelEvents->clearWheres()->sumEvent( 'ip_offense' ) ),
852
+ 'tooltip_p' => __( 'Total offenses against the site.', 'wp-simple-firewall' ),
853
  ],
854
  'conn_kills' => [
855
+ 'id' => 'conn_kill',
856
+ 'title' => __( 'Connection Killed', 'wp-simple-firewall' ),
857
+ 'val' => sprintf( '%s: %s', __( 'Lifetime Total' ),
858
  $oSelEvents->clearWheres()->sumEvent( 'conn_kill' ) ),
859
+ 'tooltip_p' => __( 'Total connections blocked/killed after too many offenses.', 'wp-simple-firewall' ),
860
  ],
861
  'ip_blocked' => [
862
  'id' => 'ip_blocked',
863
  'title' => __( 'IP Blocked', 'wp-simple-firewall' ),
864
  'val' => sprintf( '%s: %s', __( 'Now' ),
865
+ $oSelectIp->filterByBlacklist()->count()
866
+ ),
 
 
 
 
 
867
  'tooltip_p' => __( 'IP address exceeds offense limit and is blocked.', 'wp-simple-firewall' ),
868
  ],
869
  ];
883
  protected function getRecentEvents() {
884
  $oCon = $this->getCon();
885
 
886
+ $aTheStats = array_filter(
887
+ $oCon->loadEventsService()->getEvents(),
888
+ function ( $aEvt ) {
889
+ return isset( $aEvt[ 'recent' ] ) && $aEvt[ 'recent' ];
890
+ }
891
+ );
892
 
893
  /** @var Shield\Modules\Insights\Strings $oStrs */
894
  $oStrs = $this->getStrings();
899
  ->getDbHandler_Events()
900
  ->getQuerySelector();
901
 
902
+ $aRecentStats = array_intersect_key(
903
  array_map(
904
  function ( $oEntryVO ) use ( $aNames ) {
905
  /** @var Shield\Databases\Events\EntryVO $oEntryVO */
910
  },
911
  $oSel->getLatestForAllEvents()
912
  ),
913
+ $aTheStats
914
  );
915
 
916
  $sNotYetRecorded = __( 'Not yet recorded', 'wp-simple-firewall' );
917
+ foreach ( array_keys( $aTheStats ) as $sStatKey ) {
918
+ if ( !isset( $aRecentStats[ $sStatKey ] ) ) {
919
+ $aRecentStats[ $sStatKey ] = [
920
  'name' => isset( $aNames[ $sStatKey ] ) ? $aNames[ $sStatKey ] : '*** '.$sStatKey,
921
  'val' => $sNotYetRecorded
922
  ];
923
  }
924
  }
925
 
926
+ return $aRecentStats;
927
  }
928
 
929
  /**
src/features/ips.php CHANGED
@@ -1,6 +1,7 @@
1
  <?php
2
 
3
  use FernleafSystems\Wordpress\Plugin\Shield;
 
4
  use FernleafSystems\Wordpress\Services\Services;
5
 
6
  class ICWP_WPSF_FeatureHandler_Ips extends ICWP_WPSF_FeatureHandler_BaseWpsf {
@@ -9,6 +10,11 @@ class ICWP_WPSF_FeatureHandler_Ips extends ICWP_WPSF_FeatureHandler_BaseWpsf {
9
  const LIST_MANUAL_BLACK = 'MB';
10
  const LIST_AUTO_BLACK = 'AB';
11
 
 
 
 
 
 
12
  /**
13
  * @return false|Shield\Databases\IPs\Handler
14
  */
@@ -39,17 +45,34 @@ class ICWP_WPSF_FeatureHandler_Ips extends ICWP_WPSF_FeatureHandler_BaseWpsf {
39
  if ( !is_int( $nLimit ) || $nLimit < 0 ) {
40
  $oOpts->resetOptToDefault( 'transgression_limit' );
41
  }
 
 
42
  }
43
 
44
- /**
45
- * IP addresses that should never be put on the black list.
46
- * @return string[]
47
- */
48
- public function getReservedIps() {
49
- return [
50
- Services::Request()->getServerAddress(),
51
- $this->getCon()->getModule_Plugin()->getMyServerIp()
52
- ];
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
53
  }
54
 
55
  /**
@@ -60,6 +83,16 @@ class ICWP_WPSF_FeatureHandler_Ips extends ICWP_WPSF_FeatureHandler_BaseWpsf {
60
  return is_array( $aIps ) ? $aIps : [];
61
  }
62
 
 
 
 
 
 
 
 
 
 
 
63
  /**
64
  * @param string $sIp
65
  * @return $this
@@ -149,17 +182,17 @@ class ICWP_WPSF_FeatureHandler_Ips extends ICWP_WPSF_FeatureHandler_BaseWpsf {
149
  if ( !$this->getCon()->isPluginDeleting() ) {
150
  $this->addFilterIpsToWhiteList();
151
  }
152
- parent::onPluginShutdown(); //save
153
  }
154
 
155
  /**
156
  */
157
  protected function addFilterIpsToWhiteList() {
158
  $aIps = [];
159
- $oSp = $this->loadServiceProviders();
160
 
161
- if ( function_exists( 'mwp_init' ) ) {
162
- foreach ( array_flip( $oSp->getIps_ManageWp() ) as $sIp => $n ) {
163
  $aIps[ $sIp ] = 'ManageWP';
164
  }
165
  }
@@ -173,13 +206,15 @@ class ICWP_WPSF_FeatureHandler_Ips extends ICWP_WPSF_FeatureHandler_BaseWpsf {
173
  $aIps = apply_filters( 'icwp_simple_firewall_whitelist_ips', $aIps );
174
 
175
  if ( !empty( $aIps ) && is_array( $aIps ) ) {
176
- /** @var \ICWP_WPSF_Processor_Ips $oPro */
177
- $oPro = $this->getProcessor();
178
-
179
- $aWhiteIps = $oPro->getWhitelistIps();
180
  foreach ( $aIps as $sIP => $sLabel ) {
181
  if ( !in_array( $sIP, $aWhiteIps ) ) {
182
- $oPro->addIpToWhiteList( $sIP, $sLabel );
 
 
 
183
  }
184
  }
185
  }
@@ -191,4 +226,13 @@ class ICWP_WPSF_FeatureHandler_Ips extends ICWP_WPSF_FeatureHandler_BaseWpsf {
191
  protected function getNamespaceBase() {
192
  return 'IPs';
193
  }
 
 
 
 
 
 
 
 
 
194
  }
1
  <?php
2
 
3
  use FernleafSystems\Wordpress\Plugin\Shield;
4
+ use FernleafSystems\Wordpress\Plugin\Shield\Modules\IPs;
5
  use FernleafSystems\Wordpress\Services\Services;
6
 
7
  class ICWP_WPSF_FeatureHandler_Ips extends ICWP_WPSF_FeatureHandler_BaseWpsf {
10
  const LIST_MANUAL_BLACK = 'MB';
11
  const LIST_AUTO_BLACK = 'AB';
12
 
13
+ /**
14
+ * @var IPs\Lib\OffenseTracker
15
+ */
16
+ private $oOffenseTracker;
17
+
18
  /**
19
  * @return false|Shield\Databases\IPs\Handler
20
  */
45
  if ( !is_int( $nLimit ) || $nLimit < 0 ) {
46
  $oOpts->resetOptToDefault( 'transgression_limit' );
47
  }
48
+
49
+ $this->cleanPathWhitelist();
50
  }
51
 
52
+ private function cleanPathWhitelist() {
53
+ /** @var IPs\Options $oOpts */
54
+ $oOpts = $this->getOptions();
55
+ $oOpts->setOpt( 'request_whitelist', array_unique( array_filter( array_map(
56
+ function ( $sRule ) {
57
+ $sRule = strtolower( trim( $sRule ) );
58
+ if ( !empty( $sRule ) ) {
59
+ $aToCheck = [
60
+ parse_url( Services::WpGeneral()->getHomeUrl(), PHP_URL_PATH ),
61
+ parse_url( Services::WpGeneral()->getWpUrl(), PHP_URL_PATH ),
62
+ ];
63
+ $sRegEx = sprintf( '#^%s$#i', str_replace( 'STAR', '.*', preg_quote( str_replace( '*', 'STAR', $sRule ), '#' ) ) );
64
+ foreach ( $aToCheck as $sPath ) {
65
+ $sSlashPath = rtrim( $sPath, '/' ).'/';
66
+ if ( preg_match( $sRegEx, $sPath ) || preg_match( $sRegEx, $sSlashPath ) ) {
67
+ $sRule = false;
68
+ break;
69
+ }
70
+ }
71
+ }
72
+ return $sRule;
73
+ },
74
+ $this->getOpt( 'request_whitelist', [] ) // do not use Options getter as it formats into regex
75
+ ) ) ) );
76
  }
77
 
78
  /**
83
  return is_array( $aIps ) ? $aIps : [];
84
  }
85
 
86
+ /**
87
+ * @return IPs\Lib\OffenseTracker
88
+ */
89
+ public function loadOffenseTracker() {
90
+ if ( !isset( $this->oOffenseTracker ) ) {
91
+ $this->oOffenseTracker = new IPs\Lib\OffenseTracker( $this->getCon() );
92
+ }
93
+ return $this->oOffenseTracker;
94
+ }
95
+
96
  /**
97
  * @param string $sIp
98
  * @return $this
182
  if ( !$this->getCon()->isPluginDeleting() ) {
183
  $this->addFilterIpsToWhiteList();
184
  }
185
+ parent::onPluginShutdown();
186
  }
187
 
188
  /**
189
  */
190
  protected function addFilterIpsToWhiteList() {
191
  $aIps = [];
192
+ $oSp = Services::ServiceProviders();
193
 
194
+ if ( @class_exists( '\MwpWorkerResponder' ) ) {
195
+ foreach ( array_flip( $oSp->getIps_ManageWp( true ) ) as $sIp => $n ) {
196
  $aIps[ $sIp ] = 'ManageWP';
197
  }
198
  }
206
  $aIps = apply_filters( 'icwp_simple_firewall_whitelist_ips', $aIps );
207
 
208
  if ( !empty( $aIps ) && is_array( $aIps ) ) {
209
+ $aWhiteIps = ( new Shield\Modules\IPs\Lib\Ops\RetrieveIpsForLists() )
210
+ ->setDbHandler( $this->getDbHandler_IPs() )
211
+ ->white();
 
212
  foreach ( $aIps as $sIP => $sLabel ) {
213
  if ( !in_array( $sIP, $aWhiteIps ) ) {
214
+ ( new Shield\Modules\IPs\Lib\Ops\AddIp() )
215
+ ->setMod( $this )
216
+ ->setIP( $sIP )
217
+ ->toManualWhitelist( $sLabel );
218
  }
219
  }
220
  }
226
  protected function getNamespaceBase() {
227
  return 'IPs';
228
  }
229
+
230
+ /**
231
+ * IP addresses that should never be put on the black list.
232
+ * @return string[]
233
+ * @deprecated 8.5.1
234
+ */
235
+ public function getReservedIps() {
236
+ return Services::IP()->getServerPublicIPs();
237
+ }
238
  }
src/features/license.php CHANGED
@@ -19,7 +19,7 @@ class ICWP_WPSF_FeatureHandler_License extends ICWP_WPSF_FeatureHandler_BaseWpsf
19
  }
20
 
21
  /**
22
- * @return boolean
23
  */
24
  public function getIfShowModuleMenuItem() {
25
  return parent::getIfShowModuleMenuItem() && !$this->isPremium();
@@ -111,7 +111,7 @@ class ICWP_WPSF_FeatureHandler_License extends ICWP_WPSF_FeatureHandler_BaseWpsf
111
  $this->sendLicenseWarningEmail();
112
  $oCon->fireEvent( 'lic_fail_email' );
113
  }
114
- else if ( $bForceCheck || $oCurrent->isExpired() || $this->isLastVerifiedGraceExpired() ) {
115
  $oCurrent = $oLookupLicense;
116
  $this->deactivate( __( 'Automatic license verification failed.', 'wp-simple-firewall' ) );
117
  $this->sendLicenseDeactivatedEmail();
@@ -176,12 +176,11 @@ class ICWP_WPSF_FeatureHandler_License extends ICWP_WPSF_FeatureHandler_BaseWpsf
176
  * @return bool
177
  */
178
  protected function isLicenseMaybeExpiring() {
179
- $bNearly = $this->isLicenseActive() &&
180
- (
181
- abs( Services::Request()->ts() - $this->loadLicense()->getExpiresAt() )
182
- < ( DAY_IN_SECONDS/2 )
183
- );
184
- return $bNearly;
185
  }
186
 
187
  /**
@@ -263,6 +262,7 @@ class ICWP_WPSF_FeatureHandler_License extends ICWP_WPSF_FeatureHandler_BaseWpsf
263
  ->setRequestParams(
264
  [
265
  'installation_id' => $this->getCon()->getSiteInstallationId(),
 
266
  'nonce' => $sPass,
267
  ]
268
  )
@@ -311,14 +311,6 @@ class ICWP_WPSF_FeatureHandler_License extends ICWP_WPSF_FeatureHandler_BaseWpsf
311
  return $this->getDef( 'license_item_id' );
312
  }
313
 
314
- /**
315
- * Unused
316
- * @return string
317
- */
318
- public function getLicenseItemIdShieldCentral() {
319
- return $this->getDef( 'license_item_id_sc' );
320
- }
321
-
322
  /**
323
  * @return string
324
  */
@@ -562,7 +554,7 @@ class ICWP_WPSF_FeatureHandler_License extends ICWP_WPSF_FeatureHandler_BaseWpsf
562
  if ( !$this->isKeyless() ) {
563
  $aLicenseTableVars[ 'license_key' ] = $this->hasLicenseKey() ? $this->getLicenseKey() : 'n/a';
564
  }
565
- $aData = [
566
  'vars' => [
567
  'license_table' => $aLicenseTableVars,
568
  'activation_url' => $oWp->getHomeUrl()
@@ -595,7 +587,6 @@ class ICWP_WPSF_FeatureHandler_License extends ICWP_WPSF_FeatureHandler_BaseWpsf
595
  ],
596
  'strings' => $this->getStrings()->getDisplayStrings(),
597
  ];
598
- return $aData;
599
  }
600
 
601
  /**
19
  }
20
 
21
  /**
22
+ * @return bool
23
  */
24
  public function getIfShowModuleMenuItem() {
25
  return parent::getIfShowModuleMenuItem() && !$this->isPremium();
111
  $this->sendLicenseWarningEmail();
112
  $oCon->fireEvent( 'lic_fail_email' );
113
  }
114
+ elseif ( $bForceCheck || $oCurrent->isExpired() || $this->isLastVerifiedGraceExpired() ) {
115
  $oCurrent = $oLookupLicense;
116
  $this->deactivate( __( 'Automatic license verification failed.', 'wp-simple-firewall' ) );
117
  $this->sendLicenseDeactivatedEmail();
176
  * @return bool
177
  */
178
  protected function isLicenseMaybeExpiring() {
179
+ return $this->isLicenseActive() &&
180
+ (
181
+ abs( Services::Request()->ts() - $this->loadLicense()->getExpiresAt() )
182
+ < ( DAY_IN_SECONDS/2 )
183
+ );
 
184
  }
185
 
186
  /**
262
  ->setRequestParams(
263
  [
264
  'installation_id' => $this->getCon()->getSiteInstallationId(),
265
+ 'version_shield' => $this->getCon()->getVersion(),
266
  'nonce' => $sPass,
267
  ]
268
  )
311
  return $this->getDef( 'license_item_id' );
312
  }
313
 
 
 
 
 
 
 
 
 
314
  /**
315
  * @return string
316
  */
554
  if ( !$this->isKeyless() ) {
555
  $aLicenseTableVars[ 'license_key' ] = $this->hasLicenseKey() ? $this->getLicenseKey() : 'n/a';
556
  }
557
+ return [
558
  'vars' => [
559
  'license_table' => $aLicenseTableVars,
560
  'activation_url' => $oWp->getHomeUrl()
587
  ],
588
  'strings' => $this->getStrings()->getDisplayStrings(),
589
  ];
 
590
  }
591
 
592
  /**
src/features/login_protect.php CHANGED
@@ -52,13 +52,6 @@ class ICWP_WPSF_FeatureHandler_LoginProtect extends ICWP_WPSF_FeatureHandler_Bas
52
  }
53
  }
54
 
55
- /**
56
- * @return string
57
- */
58
- private function generateCanSendEmailVerifyLink() {
59
- return add_query_arg( $this->getNonceActionData( 'email_send_verify' ), $this->getUrl_AdminPage() );
60
- }
61
-
62
  /**
63
  * @uses wp_redirect()
64
  */
@@ -81,7 +74,7 @@ class ICWP_WPSF_FeatureHandler_LoginProtect extends ICWP_WPSF_FeatureHandler_Bas
81
  /**
82
  * @param string $sEmail
83
  * @param bool $bSendAsLink
84
- * @return boolean
85
  */
86
  public function sendEmailVerifyCanSend( $sEmail = null, $bSendAsLink = true ) {
87
 
@@ -96,7 +89,10 @@ class ICWP_WPSF_FeatureHandler_LoginProtect extends ICWP_WPSF_FeatureHandler_Bas
96
  ];
97
 
98
  if ( $bSendAsLink ) {
99
- $aMessage[] = sprintf( __( 'Click the verify link: %s', 'wp-simple-firewall' ), $this->generateCanSendEmailVerifyLink() );
 
 
 
100
  }
101
  else {
102
  $aMessage[] = sprintf( __( "Here's your code for the guided wizard: %s", 'wp-simple-firewall' ), $this->getCanEmailVerifyCode() );
@@ -162,7 +158,7 @@ class ICWP_WPSF_FeatureHandler_LoginProtect extends ICWP_WPSF_FeatureHandler_Bas
162
  }
163
 
164
  /**
165
- * @param boolean $bAsOptDefaults
166
  * @return array
167
  */
168
  protected function getOptEmailTwoFactorRolesDefaults( $bAsOptDefaults = true ) {
@@ -182,14 +178,6 @@ class ICWP_WPSF_FeatureHandler_LoginProtect extends ICWP_WPSF_FeatureHandler_Bas
182
  return $aTwoAuthRoles;
183
  }
184
 
185
- /**
186
- * @return int
187
- * @deprecated 8.4
188
- */
189
- public function getCooldownInterval() {
190
- return (int)$this->getOpt( 'login_limit_interval' );
191
- }
192
-
193
  /**
194
  * @return string
195
  */
@@ -252,7 +240,7 @@ class ICWP_WPSF_FeatureHandler_LoginProtect extends ICWP_WPSF_FeatureHandler_Bas
252
  $bCanSkip = isset( $aHashes[ $sHash ] )
253
  && ( (int)$aHashes[ $sHash ] + $nSkipTime ) > $oReq->ts();
254
  }
255
- else if ( $this->getIfSupport3rdParty() && class_exists( 'WC_Social_Login' ) ) {
256
  // custom support for WooCommerce Social login
257
  $oMeta = $this->getCon()->getUserMeta( $oUser );
258
  $bCanSkip = isset( $oMeta->wc_social_login_valid ) ? $oMeta->wc_social_login_valid : false;
@@ -644,14 +632,6 @@ class ICWP_WPSF_FeatureHandler_LoginProtect extends ICWP_WPSF_FeatureHandler_Bas
644
  return $aAllData;
645
  }
646
 
647
- /**
648
- * @return bool
649
- * @deprecated 8.4
650
- */
651
- public function isCooldownEnabled() {
652
- return $this->getCooldownInterval() > 0;
653
- }
654
-
655
  /**
656
  * @return string
657
  */
52
  }
53
  }
54
 
 
 
 
 
 
 
 
55
  /**
56
  * @uses wp_redirect()
57
  */
74
  /**
75
  * @param string $sEmail
76
  * @param bool $bSendAsLink
77
+ * @return bool
78
  */
79
  public function sendEmailVerifyCanSend( $sEmail = null, $bSendAsLink = true ) {
80
 
89
  ];
90
 
91
  if ( $bSendAsLink ) {
92
+ $aMessage[] = sprintf(
93
+ __( 'Click the verify link: %s', 'wp-simple-firewall' ),
94
+ $this->buildAdminActionNonceUrl( 'email_send_verify' )
95
+ );
96
  }
97
  else {
98
  $aMessage[] = sprintf( __( "Here's your code for the guided wizard: %s", 'wp-simple-firewall' ), $this->getCanEmailVerifyCode() );
158
  }
159
 
160
  /**
161
+ * @param bool $bAsOptDefaults
162
  * @return array
163
  */
164
  protected function getOptEmailTwoFactorRolesDefaults( $bAsOptDefaults = true ) {
178
  return $aTwoAuthRoles;
179
  }
180
 
 
 
 
 
 
 
 
 
181
  /**
182
  * @return string
183
  */
240
  $bCanSkip = isset( $aHashes[ $sHash ] )
241
  && ( (int)$aHashes[ $sHash ] + $nSkipTime ) > $oReq->ts();
242
  }
243
+ elseif ( $this->getIfSupport3rdParty() && class_exists( 'WC_Social_Login' ) ) {
244
  // custom support for WooCommerce Social login
245
  $oMeta = $this->getCon()->getUserMeta( $oUser );
246
  $bCanSkip = isset( $oMeta->wc_social_login_valid ) ? $oMeta->wc_social_login_valid : false;
632
  return $aAllData;
633
  }
634
 
 
 
 
 
 
 
 
 
635
  /**
636
  * @return string
637
  */
src/features/plugin.php CHANGED
@@ -9,14 +9,21 @@ class ICWP_WPSF_FeatureHandler_Plugin extends ICWP_WPSF_FeatureHandler_BaseWpsf
9
 
10
  protected function doPostConstruction() {
11
  parent::doPostConstruction();
12
- $this->setVisitorIp();
13
  }
14
 
15
  protected function setupCustomHooks() {
16
  parent::setupCustomHooks();
17
- add_filter( $this->prefix( 'report_email_address' ), [ $this, 'supplyPluginReportEmail' ] );
18
- add_filter( $this->prefix( 'globally_disabled' ), [ $this, 'filter_IsPluginGloballyDisabled' ] );
19
- add_filter( $this->prefix( 'google_recaptcha_config' ), [ $this, 'getGoogleRecaptchaConfig' ], 10, 0 );
 
 
 
 
 
 
 
20
  }
21
 
22
  protected function updateHandler() {
@@ -39,75 +46,41 @@ class ICWP_WPSF_FeatureHandler_Plugin extends ICWP_WPSF_FeatureHandler_BaseWpsf
39
  }
40
 
41
  /**
42
- * A action added to WordPress 'init' hook
43
- */
44
- public function onWpInit() {
45
- parent::onWpInit();
46
- $this->getImportExportSecretKey();
47
- }
48
-
49
- /**
50
- * @return bool
51
- */
52
- public function getLastCheckServerIpAtHasExpired() {
53
- /** @var Plugin\Options $oOpts */
54
- $oOpts = $this->getOptions();
55
- $aDetails = $oOpts->getServerIpDetails();
56
- $nAge = Services::Request()->ts() - $aDetails[ 'check_ts' ];
57
- return ( $nAge > HOUR_IN_SECONDS )
58
- && ( $this->getServerHash() != $aDetails[ 'hash' ] || $nAge > WEEK_IN_SECONDS );
59
- }
60
-
61
- /**
62
- * @return string
63
  */
64
- public function getMyServerIp() {
65
- /** @var Plugin\Options $oOpts */
66
- $oOpts = $this->getOptions();
67
-
68
- $sThisServerIp = $oOpts->getServerIpDetails()[ 'ip' ];
69
- if ( empty( $sThisServerIp ) || $this->getLastCheckServerIpAtHasExpired() ) {
70
-
71
- $sThisServerIp = Services::IP()->whatIsMyIp();
72
- if ( !empty( $sThisServerIp ) ) {
73
- $oOpts->updateServerIpDetails( [
74
- 'ip' => $sThisServerIp,
75
- 'hash' => $this->getServerHash(),
76
- 'check_ts' => Services::Request()->ts(),
77
- ] );
78
- }
79
- }
80
- return $sThisServerIp;
81
  }
82
 
83
  /**
84
- * @return string
85
  */
86
- private function getServerHash() {
87
- return md5( serialize(
88
- array_values( array_intersect_key(
89
- $_SERVER,
90
- array_flip( [
91
- 'SERVER_SOFTWARE',
92
- 'SERVER_SIGNATURE',
93
- 'PATH',
94
- 'DOCUMENT_ROOT',
95
- 'SERVER_ADDR',
96
- ] )
97
- ) )
98
- ) );
99
  }
100
 
101
  /**
102
  * @return bool
103
  */
104
  public function isDisplayPluginBadge() {
105
- /** @var Shield\Modules\Plugin\Options $oOpts */
106
  $oOpts = $this->getOptions();
107
  return $oOpts->isOnFloatingPluginBadge()
108
  && ( Services::Request()->cookie( $this->getCookieIdBadgeState() ) != 'closed' );
109
  }
110
 
 
 
 
 
 
 
111
  /**
112
  * @param bool $bDisplay
113
  * @return $this
@@ -117,44 +90,24 @@ class ICWP_WPSF_FeatureHandler_Plugin extends ICWP_WPSF_FeatureHandler_BaseWpsf
117
  }
118
 
119
  /**
120
- * Forcefully sets the Visitor IP address in the Data component for use throughout the plugin
121
  */
122
- protected function setVisitorIp() {
123
- $oDetector = ( new Utilities\Net\VisitorIpDetection() )
124
- ->setPotentialHostIps(
125
- [ $this->getMyServerIp(), Services::Request()->getServerAddress() ]
 
 
126
  );
127
- if ( !$this->isVisitorAddressSourceAutoDetect() ) {
128
- $oDetector->setPreferredSource( $this->getVisitorAddressSource() );
129
- }
130
-
131
- $sIp = $oDetector->detect();
132
- if ( !empty( $sIp ) ) {
133
- Services::IP()->setRequestIpAddress( $sIp );
134
- $this->setOpt( 'last_ip_detect_source', $oDetector->getLastSuccessfulSource() );
135
  }
136
  }
137
 
138
- /**
139
- * @return string
140
- */
141
- public function getVisitorAddressSource() {
142
- return $this->getOpt( 'visitor_address_source' );
143
- }
144
-
145
  /**
146
  * @param string $sSource
147
  * @return $this
148
  */
149
  public function setVisitorAddressSource( $sSource ) {
150
- return $this->setOpt( 'visitor_address_source', $sSource );
151
- }
152
-
153
- /**
154
- * @return string
155
- */
156
- public function isVisitorAddressSourceAutoDetect() {
157
- return $this->getVisitorAddressSource() == 'AUTO_DETECT_IP';
158
  }
159
 
160
  /**
@@ -226,8 +179,9 @@ class ICWP_WPSF_FeatureHandler_Plugin extends ICWP_WPSF_FeatureHandler_BaseWpsf
226
  }
227
 
228
  /**
229
- * @param boolean $bGloballyDisabled
230
- * @return boolean
 
231
  */
232
  public function filter_IsPluginGloballyDisabled( $bGloballyDisabled ) {
233
  return $bGloballyDisabled || !$this->isOpt( 'global_enable_plugin_features', 'Y' );
@@ -260,14 +214,6 @@ class ICWP_WPSF_FeatureHandler_Plugin extends ICWP_WPSF_FeatureHandler_BaseWpsf
260
  return $aPluginFeatures;
261
  }
262
 
263
- /**
264
- * @return int
265
- */
266
- public function getTrackingLastSentAt() {
267
- $nTime = (int)$this->getOpt( 'tracking_last_sent_at', 0 );
268
- return ( $nTime < 0 ) ? 0 : $nTime;
269
- }
270
-
271
  /**
272
  * @return string
273
  */
@@ -278,34 +224,6 @@ class ICWP_WPSF_FeatureHandler_Plugin extends ICWP_WPSF_FeatureHandler_BaseWpsf
278
  );
279
  }
280
 
281
- /**
282
- * @return bool
283
- */
284
- public function isTrackingEnabled() {
285
- return $this->isOpt( 'enable_tracking', 'Y' );
286
- }
287
-
288
- /**
289
- * @return bool
290
- */
291
- public function isTrackingPermissionSet() {
292
- return !$this->isOpt( 'tracking_permission_set_at', 0 );
293
- }
294
-
295
- /**
296
- * @return $this
297
- */
298
- public function setTrackingLastSentAt() {
299
- return $this->setOpt( 'tracking_last_sent_at', Services::Request()->ts() );
300
- }
301
-
302
- /**
303
- * @return bool
304
- */
305
- public function readyToSendTrackingData() {
306
- return ( Services::Request()->ts() - $this->getTrackingLastSentAt() > WEEK_IN_SECONDS );
307
- }
308
-
309
  /**
310
  * @param string $sEmail
311
  * @return string
@@ -319,11 +237,13 @@ class ICWP_WPSF_FeatureHandler_Plugin extends ICWP_WPSF_FeatureHandler_BaseWpsf
319
  * This is the point where you would want to do any options verification
320
  */
321
  protected function doPrePluginOptionsSave() {
 
 
322
 
323
  $this->storeRealInstallDate();
324
 
325
- if ( $this->isTrackingEnabled() && !$this->isTrackingPermissionSet() ) {
326
- $this->setOpt( 'tracking_permission_set_at', Services::Request()->ts() );
327
  }
328
 
329
  $this->cleanRecaptchaKey( 'google_recaptcha_site_key' );
@@ -458,17 +378,24 @@ class ICWP_WPSF_FeatureHandler_Plugin extends ICWP_WPSF_FeatureHandler_BaseWpsf
458
  /**
459
  * @return int
460
  */
461
- public function getActivatedAt() {
462
- return (int)$this->getOpt( 'activated_at', 0 );
463
  }
464
 
465
  /**
 
466
  * @return bool
467
  */
468
  public function getIfShowIntroVideo() {
469
- $nNow = Services::Request()->ts();
470
- return ( $nNow - $this->getActivatedAt() < 8 )
471
- && ( $nNow - $this->getInstallDate() < 15 );
 
 
 
 
 
 
472
  }
473
 
474
  /**
@@ -502,21 +429,6 @@ class ICWP_WPSF_FeatureHandler_Plugin extends ICWP_WPSF_FeatureHandler_BaseWpsf
502
  );
503
  }
504
 
505
- /**
506
- * @return string
507
- */
508
- public function getImportExportMasterImportUrl() {
509
- return $this->getOpt( 'importexport_masterurl', '' );
510
- }
511
-
512
- /**
513
- * @return bool
514
- */
515
- public function hasImportExportMasterImportUrl() {
516
- $sMaster = $this->getImportExportMasterImportUrl();
517
- return !empty( $sMaster );
518
- }
519
-
520
  /**
521
  * @return bool
522
  */
@@ -524,13 +436,6 @@ class ICWP_WPSF_FeatureHandler_Plugin extends ICWP_WPSF_FeatureHandler_BaseWpsf
524
  return ( count( $this->getImportExportWhitelist() ) > 0 );
525
  }
526
 
527
- /**
528
- * @return int
529
- */
530
- public function getImportExportHandshakeExpiresAt() {
531
- return $this->getOpt( 'importexport_handshake_expires_at', Services::Request()->ts() );
532
- }
533
-
534
  /**
535
  * @return string[]
536
  */
@@ -552,20 +457,13 @@ class ICWP_WPSF_FeatureHandler_Plugin extends ICWP_WPSF_FeatureHandler_BaseWpsf
552
  protected function getImportExportSecretKey() {
553
  $sId = $this->getOpt( 'importexport_secretkey', '' );
554
  if ( empty( $sId ) || $this->isImportExportSecretKeyExpired() ) {
555
- $sId = sha1( $this->getPluginInstallationId().wp_rand( 0, PHP_INT_MAX ) );
556
  $this->setOpt( 'importexport_secretkey', $sId )
557
  ->setOpt( 'importexport_secretkey_expires_at', Services::Request()->ts() + HOUR_IN_SECONDS );
558
  }
559
  return $sId;
560
  }
561
 
562
- /**
563
- * @return bool
564
- */
565
- public function isImportExportPermitted() {
566
- return $this->isPremium() && $this->isOpt( 'importexport_enable', 'Y' );
567
- }
568
-
569
  /**
570
  * @return bool
571
  */
@@ -643,7 +541,9 @@ class ICWP_WPSF_FeatureHandler_Plugin extends ICWP_WPSF_FeatureHandler_BaseWpsf
643
  * @return $this
644
  */
645
  protected function cleanImportExportMasterImportUrl() {
646
- $sUrl = Services::Data()->validateSimpleHttpUrl( $this->getImportExportMasterImportUrl() );
 
 
647
  if ( $sUrl === false ) {
648
  $sUrl = '';
649
  }
@@ -654,7 +554,7 @@ class ICWP_WPSF_FeatureHandler_Plugin extends ICWP_WPSF_FeatureHandler_BaseWpsf
654
  * @return $this
655
  */
656
  public function startImportExportHandshake() {
657
- $this->setOpt( 'importexport_handshake_expires_at', Services::Request()->ts() + 30 );
658
  return $this->saveModOptions();
659
  }
660
 
@@ -718,6 +618,12 @@ class ICWP_WPSF_FeatureHandler_Plugin extends ICWP_WPSF_FeatureHandler_BaseWpsf
718
  wp_enqueue_script( 'jquery-ui-dialog' ); // jquery and jquery-ui should be dependencies, didn't check though...
719
  wp_enqueue_style( 'wp-jquery-ui-dialog' );
720
  }
 
 
 
 
 
 
721
  }
722
 
723
  /**
@@ -792,18 +698,26 @@ class ICWP_WPSF_FeatureHandler_Plugin extends ICWP_WPSF_FeatureHandler_BaseWpsf
792
  }
793
 
794
  /**
795
- * @return int
796
- * @deprecated 8.4
797
  */
798
- public function getLastCheckServerIpAt() {
799
- return $this->getOpt( 'this_server_ip_last_check_at', 0 );
800
  }
801
 
802
  /**
803
  * @return string
 
804
  */
805
- protected function getNamespaceBase() {
806
- return 'Plugin';
 
 
 
 
 
 
 
 
807
  }
808
 
809
  /**
@@ -812,4 +726,105 @@ class ICWP_WPSF_FeatureHandler_Plugin extends ICWP_WPSF_FeatureHandler_BaseWpsf
812
  public function getSurveyEmail() {
813
  return base64_decode( $this->getDef( 'survey_email' ) );
814
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
815
  }
9
 
10
  protected function doPostConstruction() {
11
  parent::doPostConstruction();
12
+ $this->setVisitorIpSource();
13
  }
14
 
15
  protected function setupCustomHooks() {
16
  parent::setupCustomHooks();
17
+ $oCon = $this->getCon();
18
+ add_filter( $oCon->prefix( 'report_email_address' ), [ $this, 'supplyPluginReportEmail' ] );
19
+ add_filter( $oCon->prefix( 'google_recaptcha_config' ), [ $this, 'getGoogleRecaptchaConfig' ], 10, 0 );
20
+ /* Enfold theme deletes all cookies except particular ones.
21
+ add_filter( 'avf_admin_keep_cookies', function ( $aCookiesToKeep ) use ( $oCon ) {
22
+ $aCookiesToKeep[] = $oCon->getPluginPrefix().'*';
23
+ $aCookiesToKeep[] = $oCon->getOptionStoragePrefix().'*';
24
+ return $aCookiesToKeep;
25
+ }, 10, 0 );
26
+ */
27
  }
28
 
29
  protected function updateHandler() {
46
  }
47
 
48
  /**
49
+ * Hooked to the plugin's main plugin_shutdown action
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
50
  */
51
+ public function onPluginShutdown() {
52
+ /* TODO: uncomment on any version 8.6+
53
+ $sPreferredSource = Services::IP()->getIpDetector()->getLastSuccessfulSource();
54
+ if ( !empty( $sPreferredSource ) ) {
55
+ $this->setOpt( 'last_ip_detect_source', $sPreferredSource );
56
+ } */
57
+ parent::onPluginShutdown();
 
 
 
 
 
 
 
 
 
 
58
  }
59
 
60
  /**
61
+ * A action added to WordPress 'init' hook
62
  */
63
+ public function onWpInit() {
64
+ parent::onWpInit();
65
+ $this->getImportExportSecretKey();
 
 
 
 
 
 
 
 
 
 
66
  }
67
 
68
  /**
69
  * @return bool
70
  */
71
  public function isDisplayPluginBadge() {
72
+ /** @var Plugin\Options $oOpts */
73
  $oOpts = $this->getOptions();
74
  return $oOpts->isOnFloatingPluginBadge()
75
  && ( Services::Request()->cookie( $this->getCookieIdBadgeState() ) != 'closed' );
76
  }
77
 
78
+ public function runHourlyCron() {
79
+ ( new Plugin\Lib\WpHashesTokenManager() )
80
+ ->setMod( $this )
81
+ ->getToken();
82
+ }
83
+
84
  /**
85
  * @param bool $bDisplay
86
  * @return $this
90
  }
91
 
92
  /**
93
+ * Forcefully sets preferred Visitor IP source in the Data component for use throughout the plugin
94
  */
95
+ private function setVisitorIpSource() {
96
+ /** @var Plugin\Options $oOpts */
97
+ $oOpts = $this->getOptions();
98
+ if ( !$oOpts->isIpSourceAutoDetect() ) {
99
+ Services::IP()->setIpDetector(
100
+ ( new Utilities\Net\VisitorIpDetection() )->setPreferredSource( $oOpts->getIpSource() )
101
  );
 
 
 
 
 
 
 
 
102
  }
103
  }
104
 
 
 
 
 
 
 
 
105
  /**
106
  * @param string $sSource
107
  * @return $this
108
  */
109
  public function setVisitorAddressSource( $sSource ) {
110
+ return $this->getOptions()->setOpt( 'visitor_address_source', $sSource );
 
 
 
 
 
 
 
111
  }
112
 
113
  /**
179
  }
180
 
181
  /**
182
+ * @param bool $bGloballyDisabled
183
+ * @return bool
184
+ * @deprecated 8.5.7
185
  */
186
  public function filter_IsPluginGloballyDisabled( $bGloballyDisabled ) {
187
  return $bGloballyDisabled || !$this->isOpt( 'global_enable_plugin_features', 'Y' );
214
  return $aPluginFeatures;
215
  }
216
 
 
 
 
 
 
 
 
 
217
  /**
218
  * @return string
219
  */
224
  );
225
  }
226
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
227
  /**
228
  * @param string $sEmail
229
  * @return string
237
  * This is the point where you would want to do any options verification
238
  */
239
  protected function doPrePluginOptionsSave() {
240
+ /** @var Plugin\Options $oOpts */
241
+ $oOpts = $this->getOptions();
242
 
243
  $this->storeRealInstallDate();
244
 
245
+ if ( $oOpts->isTrackingEnabled() && !$oOpts->isTrackingPermissionSet() ) {
246
+ $oOpts->setOpt( 'tracking_permission_set_at', Services::Request()->ts() );
247
  }
248
 
249
  $this->cleanRecaptchaKey( 'google_recaptcha_site_key' );
378
  /**
379
  * @return int
380
  */
381
+ public function getActivateLength() {
382
+ return Services::Request()->ts() - (int)$this->getOptions()->getOpt( 'activated_at', 0 );
383
  }
384
 
385
  /**
386
+ * hidden 20200121
387
  * @return bool
388
  */
389
  public function getIfShowIntroVideo() {
390
+ return false && ( $this->getActivateLength() < 8 )
391
+ && ( Services::Request()->ts() - $this->getInstallDate() < 15 );
392
+ }
393
+
394
+ /**
395
+ * @return Plugin\Lib\TourManager
396
+ */
397
+ public function getTourManager() {
398
+ return ( new Plugin\Lib\TourManager() )->setMod( $this );
399
  }
400
 
401
  /**
429
  );
430
  }
431
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
432
  /**
433
  * @return bool
434
  */
436
  return ( count( $this->getImportExportWhitelist() ) > 0 );
437
  }
438
 
 
 
 
 
 
 
 
439
  /**
440
  * @return string[]
441
  */
457
  protected function getImportExportSecretKey() {
458
  $sId = $this->getOpt( 'importexport_secretkey', '' );
459
  if ( empty( $sId ) || $this->isImportExportSecretKeyExpired() ) {
460
+ $sId = sha1( $this->getCon()->getSiteInstallationId().wp_rand( 0, PHP_INT_MAX ) );
461
  $this->setOpt( 'importexport_secretkey', $sId )
462
  ->setOpt( 'importexport_secretkey_expires_at', Services::Request()->ts() + HOUR_IN_SECONDS );
463
  }
464
  return $sId;
465
  }
466
 
 
 
 
 
 
 
 
467
  /**
468
  * @return bool
469
  */
541
  * @return $this
542
  */
543
  protected function cleanImportExportMasterImportUrl() {
544
+ /** @var Plugin\Options $oOpts */
545
+ $oOpts = $this->getOptions();
546
+ $sUrl = Services::Data()->validateSimpleHttpUrl( $oOpts->getImportExportMasterImportUrl() );
547
  if ( $sUrl === false ) {
548
  $sUrl = '';
549
  }
554
  * @return $this
555
  */
556
  public function startImportExportHandshake() {
557
+ $this->getOptions()->setOpt( 'importexport_handshake_expires_at', Services::Request()->ts() + 30 );
558
  return $this->saveModOptions();
559
  }
560
 
618
  wp_enqueue_script( 'jquery-ui-dialog' ); // jquery and jquery-ui should be dependencies, didn't check though...
619
  wp_enqueue_style( 'wp-jquery-ui-dialog' );
620
  }
621
+
622
+ wp_localize_script(
623
+ $this->prefix( 'plugin' ),
624
+ 'icwp_wpsf_vars_tourmanager',
625
+ [ 'ajax' => $this->getAjaxActionData( 'mark_tour_finished' ) ]
626
+ );
627
  }
628
 
629
  /**
698
  }
699
 
700
  /**
701
+ * @return string
 
702
  */
703
+ protected function getNamespaceBase() {
704
+ return 'Plugin';
705
  }
706
 
707
  /**
708
  * @return string
709
+ * @deprecated 8.5.2
710
  */
711
+ public function getVisitorAddressSource() {
712
+ return $this->getOptions()->getOpt( 'visitor_address_source' );
713
+ }
714
+
715
+ /**
716
+ * @return string
717
+ * @deprecated 8.5.2
718
+ */
719
+ public function isVisitorAddressSourceAutoDetect() {
720
+ return $this->getVisitorAddressSource() == 'AUTO_DETECT_IP';
721
  }
722
 
723
  /**
726
  public function getSurveyEmail() {
727
  return base64_decode( $this->getDef( 'survey_email' ) );
728
  }
729
+
730
+ /**
731
+ * @return bool
732
+ * @deprecated 8.5.2
733
+ */
734
+ public function hasImportExportMasterImportUrl() {
735
+ /** @var Plugin\Options $oOpts */
736
+ $oOpts = $this->getOptions();
737
+ return $oOpts->hasImportExportMasterImportUrl();
738
+ }
739
+
740
+ /**
741
+ * @return int
742
+ * @deprecated 8.5.2
743
+ */
744
+ public function getImportExportHandshakeExpiresAt() {
745
+ return $this->getOpt( 'importexport_handshake_expires_at', Services::Request()->ts() );
746
+ }
747
+
748
+ /**
749
+ * @return string
750
+ * @deprecated 8.5.2
751
+ */
752
+ public function getImportExportMasterImportUrl() {
753
+ return $this->getOpt( 'importexport_masterurl', '' );
754
+ }
755
+
756
+ /**
757
+ * @return bool
758
+ * @deprecated 8.5.2
759
+ */
760
+ public function isImportExportPermitted() {
761
+ return $this->isPremium() && $this->isOpt( 'importexport_enable', 'Y' );
762
+ }
763
+
764
+ /**
765
+ * @return bool
766
+ * @deprecated 8.5.2
767
+ */
768
+ public function readyToSendTrackingData() {
769
+ return Services::Request()
770
+ ->carbon()
771
+ ->subWeek()->timestamp > (int)$this->getOptions()->getOpt( 'tracking_last_sent_at', 0 );
772
+ }
773
+
774
+ /**
775
+ * @return bool
776
+ * @deprecated 8.5.2
777
+ */
778
+ public function isTrackingEnabled() {
779
+ return $this->isOpt( 'enable_tracking', 'Y' );
780
+ }
781
+
782
+ /**
783
+ * @return bool
784
+ * @deprecated 8.5.2
785
+ */
786
+ public function isTrackingPermissionSet() {
787
+ return !$this->isOpt( 'tracking_permission_set_at', 0 );
788
+ }
789
+
790
+ /**
791
+ * @return $this
792
+ * @deprecated 8.5.2
793
+ */
794
+ public function setTrackingLastSentAt() {
795
+ return $this->setOpt( 'tracking_last_sent_at', Services::Request()->ts() );
796
+ }
797
+
798
+ /**
799
+ * @return int
800
+ * @deprecated 8.5.2
801
+ */
802
+ public function getTrackingLastSentAt() {
803
+ return (int)max( 0, $this->getOptions()->getOpt( 'tracking_last_sent_at', 0 ) );
804
+ }
805
+
806
+ /**
807
+ * @return int
808
+ * @deprecated 8.5.2
809
+ */
810
+ public function getActivatedAt() {
811
+ return (int)$this->getOpt( 'activated_at', 0 );
812
+ }
813
+
814
+ /**
815
+ * @return string[]
816
+ * @deprecated 8.5.1
817
+ */
818
+ public function getMyServerIPs() {
819
+ return Services::IP()->getServerPublicIPs();
820
+ }
821
+
822
+ /**
823
+ * @return string
824
+ * @deprecated 8.5
825
+ */
826
+ public function getMyServerIp() {
827
+ $aIPs = $this->getMyServerIPs();
828
+ return array_shift( $aIPs );
829
+ }
830
  }
src/features/sessions.php CHANGED
@@ -41,12 +41,4 @@ class ICWP_WPSF_FeatureHandler_Sessions extends ICWP_WPSF_FeatureHandler_BaseWps
41
  protected function getNamespaceBase() {
42
  return 'Sessions';
43
  }
44
-
45
- /**
46
- * @return Shield\Databases\Session\Handler
47
- * @deprecated 8.4
48
- */
49
- protected function loadDbHandler() {
50
- return new Shield\Databases\Session\Handler();
51
- }
52
  }
41
  protected function getNamespaceBase() {
42
  return 'Sessions';
43
  }
 
 
 
 
 
 
 
 
44
  }
src/features/statistics.php DELETED
@@ -1,25 +0,0 @@
1
- <?php
2
-
3
- use FernleafSystems\Wordpress\Plugin\Shield;
4
- use FernleafSystems\Wordpress\Services\Services;
5
-
6
- /**
7
- * Class ICWP_WPSF_FeatureHandler_Statistics
8
- * @deprecated 8.4
9
- */
10
- class ICWP_WPSF_FeatureHandler_Statistics extends ICWP_WPSF_FeatureHandler_BaseWpsf {
11
-
12
- /**
13
- * @return bool
14
- */
15
- public function isModuleEnabled() {
16
- return false;
17
- }
18
-
19
- /**
20
- * @return string
21
- */
22
- protected function getNamespaceBase() {
23
- return 'Statistics';
24
- }
25
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/features/traffic.php CHANGED
@@ -82,6 +82,7 @@ class ICWP_WPSF_FeatureHandler_Traffic extends ICWP_WPSF_FeatureHandler_BaseWpsf
82
 
83
  /**
84
  * @return array
 
85
  */
86
  public function getCustomExclusions() {
87
  $aEx = $this->getOpt( 'custom_exclusions' );
@@ -164,12 +165,4 @@ class ICWP_WPSF_FeatureHandler_Traffic extends ICWP_WPSF_FeatureHandler_BaseWpsf
164
  protected function getNamespaceBase() {
165
  return 'Traffic';
166
  }
167
-
168
- /**
169
- * @return Shield\Databases\Traffic\Handler
170
- * @deprecated 8.4
171
- */
172
- protected function loadDbHandler() {
173
- return new Shield\Databases\Traffic\Handler();
174
- }
175
  }
82
 
83
  /**
84
  * @return array
85
+ * @deprecated 8.5.2
86
  */
87
  public function getCustomExclusions() {
88
  $aEx = $this->getOpt( 'custom_exclusions' );
165
  protected function getNamespaceBase() {
166
  return 'Traffic';
167
  }
 
 
 
 
 
 
 
 
168
  }
src/features/user_management.php CHANGED
@@ -1,6 +1,7 @@
1
  <?php
2
 
3
  use FernleafSystems\Wordpress\Plugin\Shield;
 
4
  use FernleafSystems\Wordpress\Services\Services;
5
 
6
  class ICWP_WPSF_FeatureHandler_UserManagement extends \ICWP_WPSF_FeatureHandler_BaseWpsf {
@@ -33,47 +34,22 @@ class ICWP_WPSF_FeatureHandler_UserManagement extends \ICWP_WPSF_FeatureHandler_
33
  return $aEmails;
34
  }
35
 
36
- /**
37
- * @return int
38
- */
39
- public function getIdleTimeoutInterval() {
40
- return $this->getOpt( 'session_idle_timeout_interval' )*HOUR_IN_SECONDS;
41
- }
42
-
43
- /**
44
- * @return int
45
- */
46
- public function getMaxSessionTime() {
47
- return $this->getOpt( 'session_timeout_interval' )*DAY_IN_SECONDS;
48
- }
49
-
50
- /**
51
- * @return bool
52
- */
53
- public function hasSessionIdleTimeout() {
54
- return $this->isModuleEnabled() && ( $this->getIdleTimeoutInterval() > 0 );
55
- }
56
-
57
- /**
58
- * @return bool
59
- */
60
- public function hasMaxSessionTimeout() {
61
- return $this->isModuleEnabled() && ( $this->getMaxSessionTime() > 0 );
62
- }
63
-
64
  protected function doExtraSubmitProcessing() {
65
- $this->setOpt( 'enable_admin_login_email_notification', implode( ', ', $this->getAdminLoginNotificationEmails() ) );
 
 
 
66
 
67
- if ( $this->getIdleTimeoutInterval() > $this->getMaxSessionTime() ) {
68
- $this->setOpt( 'session_idle_timeout_interval', $this->getOpt( 'session_timeout_interval' )*24 );
69
  }
70
 
71
- $this->setOpt( 'auto_idle_roles',
72
  array_unique( array_filter( array_map(
73
  function ( $sRole ) {
74
  return preg_replace( '#[^\sa-z0-9_-]#i', '', trim( strtolower( $sRole ) ) );
75
  },
76
- $this->getSuspendAutoIdleUserRoles()
77
  ) ) )
78
  );
79
  }
@@ -92,13 +68,6 @@ class ICWP_WPSF_FeatureHandler_UserManagement extends \ICWP_WPSF_FeatureHandler_
92
  }
93
  }
94
 
95
- /**
96
- * @return bool
97
- */
98
- public function isLockToIp() {
99
- return $this->isOpt( 'session_lock_location', 'Y' );
100
- }
101
-
102
  /**
103
  * @return bool
104
  */
@@ -115,6 +84,7 @@ class ICWP_WPSF_FeatureHandler_UserManagement extends \ICWP_WPSF_FeatureHandler_
115
 
116
  /**
117
  * @return int seconds
 
118
  */
119
  public function getPassExpireTimeout() {
120
  return $this->getPassExpireDays()*DAY_IN_SECONDS;
@@ -122,6 +92,7 @@ class ICWP_WPSF_FeatureHandler_UserManagement extends \ICWP_WPSF_FeatureHandler_
122
 
123
  /**
124
  * @return int
 
125
  */
126
  public function getPassMinLength() {
127
  return $this->isPremium() ? (int)$this->getOpt( 'pass_min_length' ) : 0;
@@ -129,6 +100,7 @@ class ICWP_WPSF_FeatureHandler_UserManagement extends \ICWP_WPSF_FeatureHandler_
129
 
130
  /**
131
  * @return int
 
132
  */
133
  public function getPassMinStrength() {
134
  return $this->isPremium() ? (int)$this->getOpt( 'pass_min_strength' ) : 0;
@@ -151,6 +123,7 @@ class ICWP_WPSF_FeatureHandler_UserManagement extends \ICWP_WPSF_FeatureHandler_
151
 
152
  /**
153
  * @return bool
 
154
  */
155
  public function isPasswordPoliciesEnabled() {
156
  return $this->isOpt( 'enable_password_policies', 'Y' )
@@ -159,6 +132,7 @@ class ICWP_WPSF_FeatureHandler_UserManagement extends \ICWP_WPSF_FeatureHandler_
159
 
160
  /**
161
  * @return bool
 
162
  */
163
  public function isPassForceUpdateExisting() {
164
  return $this->isOpt( 'pass_force_existing', 'Y' );
@@ -166,6 +140,7 @@ class ICWP_WPSF_FeatureHandler_UserManagement extends \ICWP_WPSF_FeatureHandler_
166
 
167
  /**
168
  * @return bool
 
169
  */
170
  public function isPassExpirationEnabled() {
171
  return $this->isPasswordPoliciesEnabled() && ( $this->getPassExpireTimeout() > 0 );
@@ -173,6 +148,7 @@ class ICWP_WPSF_FeatureHandler_UserManagement extends \ICWP_WPSF_FeatureHandler_
173
 
174
  /**
175
  * @return bool
 
176
  */
177
  public function isPassPreventPwned() {
178
  return $this->isOpt( 'pass_prevent_pwned', 'Y' );
@@ -180,6 +156,7 @@ class ICWP_WPSF_FeatureHandler_UserManagement extends \ICWP_WPSF_FeatureHandler_
180
 
181
  /**
182
  * @return bool
 
183
  */
184
  public function isSuspendEnabled() {
185
  return $this->isPremium() &&
@@ -191,6 +168,7 @@ class ICWP_WPSF_FeatureHandler_UserManagement extends \ICWP_WPSF_FeatureHandler_
191
 
192
  /**
193
  * @return bool
 
194
  */
195
  public function isSuspendManualEnabled() {
196
  return $this->isOpt( 'manual_suspend', 'Y' );
@@ -198,6 +176,7 @@ class ICWP_WPSF_FeatureHandler_UserManagement extends \ICWP_WPSF_FeatureHandler_
198
 
199
  /**
200
  * @return int
 
201
  */
202
  public function getSuspendAutoIdleTime() {
203
  return $this->getOpt( 'auto_idle_days', 0 )*DAY_IN_SECONDS;
@@ -205,6 +184,7 @@ class ICWP_WPSF_FeatureHandler_UserManagement extends \ICWP_WPSF_FeatureHandler_
205
 
206
  /**
207
  * @return array
 
208
  */
209
  public function getSuspendAutoIdleUserRoles() {
210
  $aRoles = $this->getOpt( 'auto_idle_roles', [] );
@@ -213,6 +193,7 @@ class ICWP_WPSF_FeatureHandler_UserManagement extends \ICWP_WPSF_FeatureHandler_
213
 
214
  /**
215
  * @return bool
 
216
  */
217
  public function isSuspendAutoIdleEnabled() {
218
  return ( $this->getSuspendAutoIdleTime() > 0 )
@@ -221,6 +202,7 @@ class ICWP_WPSF_FeatureHandler_UserManagement extends \ICWP_WPSF_FeatureHandler_
221
 
222
  /**
223
  * @return bool
 
224
  */
225
  public function isSuspendAutoPasswordEnabled() {
226
  return $this->isOpt( 'auto_password', 'Y' )
@@ -256,7 +238,7 @@ class ICWP_WPSF_FeatureHandler_UserManagement extends \ICWP_WPSF_FeatureHandler_
256
  ]
257
  );
258
  }
259
- else if ( !$bAdd && $bIdSuspended ) {
260
  $oMeta->hard_suspended_at = 0;
261
  unset( $aIds[ $nUserId ] );
262
  $this->getCon()->fireEvent(
@@ -327,6 +309,9 @@ class ICWP_WPSF_FeatureHandler_UserManagement extends \ICWP_WPSF_FeatureHandler_
327
  * @return array
328
  */
329
  public function addInsightsConfigData( $aAllData ) {
 
 
 
330
  $aThis = [
331
  'strings' => [
332
  'title' => __( 'User Management', 'wp-simple-firewall' ),
@@ -340,7 +325,7 @@ class ICWP_WPSF_FeatureHandler_UserManagement extends \ICWP_WPSF_FeatureHandler_
340
  $aThis[ 'key_opts' ][ 'mod' ] = $this->getModDisabledInsight();
341
  }
342
  else {
343
- $bHasIdle = $this->hasSessionIdleTimeout();
344
  $aThis[ 'key_opts' ][ 'idle' ] = [
345
  'name' => __( 'Idle Users', 'wp-simple-firewall' ),
346
  'enabled' => $bHasIdle,
@@ -351,7 +336,7 @@ class ICWP_WPSF_FeatureHandler_UserManagement extends \ICWP_WPSF_FeatureHandler_
351
  'href' => $this->getUrl_DirectLinkToOption( 'session_idle_timeout_interval' ),
352
  ];
353
 
354
- $bLocked = $this->isLockToIp();
355
  $aThis[ 'key_opts' ][ 'lock' ] = [
356
  'name' => __( 'Lock To IP', 'wp-simple-firewall' ),
357
  'enabled' => $bLocked,
@@ -397,4 +382,52 @@ class ICWP_WPSF_FeatureHandler_UserManagement extends \ICWP_WPSF_FeatureHandler_
397
  protected function getNamespaceBase() {
398
  return 'UserManagement';
399
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
400
  }
1
  <?php
2
 
3
  use FernleafSystems\Wordpress\Plugin\Shield;
4
+ use FernleafSystems\Wordpress\Plugin\Shield\Modules\UserManagement;
5
  use FernleafSystems\Wordpress\Services\Services;
6
 
7
  class ICWP_WPSF_FeatureHandler_UserManagement extends \ICWP_WPSF_FeatureHandler_BaseWpsf {
34
  return $aEmails;
35
  }
36
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
37
  protected function doExtraSubmitProcessing() {
38
+ /** @var UserManagement\Options $oOpts */
39
+ $oOpts = $this->getOptions();
40
+
41
+ $oOpts->setOpt( 'enable_admin_login_email_notification', implode( ', ', $this->getAdminLoginNotificationEmails() ) );
42
 
43
+ if ( $oOpts->getIdleTimeoutInterval() > $oOpts->getMaxSessionTime() ) {
44
+ $oOpts->setOpt( 'session_idle_timeout_interval', $oOpts->getOpt( 'session_timeout_interval' )*24 );
45
  }
46
 
47
+ $oOpts->setOpt( 'auto_idle_roles',
48
  array_unique( array_filter( array_map(
49
  function ( $sRole ) {
50
  return preg_replace( '#[^\sa-z0-9_-]#i', '', trim( strtolower( $sRole ) ) );
51
  },
52
+ $oOpts->getSuspendAutoIdleUserRoles()
53
  ) ) )
54
  );
55
  }
68
  }
69
  }
70
 
 
 
 
 
 
 
 
71
  /**
72
  * @return bool
73
  */
84
 
85
  /**
86
  * @return int seconds
87
+ * @deprecated 8.5.2
88
  */
89
  public function getPassExpireTimeout() {
90
  return $this->getPassExpireDays()*DAY_IN_SECONDS;
92
 
93
  /**
94
  * @return int
95
+ * @deprecated 8.5.2
96
  */
97
  public function getPassMinLength() {
98
  return $this->isPremium() ? (int)$this->getOpt( 'pass_min_length' ) : 0;
100
 
101
  /**
102
  * @return int
103
+ * @deprecated 8.5.2
104
  */
105
  public function getPassMinStrength() {
106
  return $this->isPremium() ? (int)$this->getOpt( 'pass_min_strength' ) : 0;
123
 
124
  /**
125
  * @return bool
126
+ * @deprecated 8.5.2
127
  */
128
  public function isPasswordPoliciesEnabled() {
129
  return $this->isOpt( 'enable_password_policies', 'Y' )
132
 
133
  /**
134
  * @return bool
135
+ * @deprecated 8.5.2
136
  */
137
  public function isPassForceUpdateExisting() {
138
  return $this->isOpt( 'pass_force_existing', 'Y' );
140
 
141
  /**
142
  * @return bool
143
+ * @deprecated 8.5.2
144
  */
145
  public function isPassExpirationEnabled() {
146
  return $this->isPasswordPoliciesEnabled() && ( $this->getPassExpireTimeout() > 0 );
148
 
149
  /**
150
  * @return bool
151
+ * @deprecated 8.5.2
152
  */
153
  public function isPassPreventPwned() {
154
  return $this->isOpt( 'pass_prevent_pwned', 'Y' );
156
 
157
  /**
158
  * @return bool
159
+ * @deprecated 8.5.2
160
  */
161
  public function isSuspendEnabled() {
162
  return $this->isPremium() &&
168
 
169
  /**
170
  * @return bool
171
+ * @deprecated 8.5.2
172
  */
173
  public function isSuspendManualEnabled() {
174
  return $this->isOpt( 'manual_suspend', 'Y' );
176
 
177
  /**
178
  * @return int
179
+ * @deprecated 8.5.2
180
  */
181
  public function getSuspendAutoIdleTime() {
182
  return $this->getOpt( 'auto_idle_days', 0 )*DAY_IN_SECONDS;
184
 
185
  /**
186
  * @return array
187
+ * @deprecated 8.5.2
188
  */
189
  public function getSuspendAutoIdleUserRoles() {
190
  $aRoles = $this->getOpt( 'auto_idle_roles', [] );
193
 
194
  /**
195
  * @return bool
196
+ * @deprecated 8.5.2
197
  */
198
  public function isSuspendAutoIdleEnabled() {
199
  return ( $this->getSuspendAutoIdleTime() > 0 )
202
 
203
  /**
204
  * @return bool
205
+ * @deprecated 8.5.2
206
  */
207
  public function isSuspendAutoPasswordEnabled() {
208
  return $this->isOpt( 'auto_password', 'Y' )
238
  ]
239
  );
240
  }
241
+ elseif ( !$bAdd && $bIdSuspended ) {
242
  $oMeta->hard_suspended_at = 0;
243
  unset( $aIds[ $nUserId ] );
244
  $this->getCon()->fireEvent(
309
  * @return array
310
  */
311
  public function addInsightsConfigData( $aAllData ) {
312
+ /** @var UserManagement\Options $oOpts */
313
+ $oOpts = $this->getOptions();
314
+
315
  $aThis = [
316
  'strings' => [
317
  'title' => __( 'User Management', 'wp-simple-firewall' ),
325
  $aThis[ 'key_opts' ][ 'mod' ] = $this->getModDisabledInsight();
326
  }
327
  else {
328
+ $bHasIdle = $oOpts->hasSessionIdleTimeout();
329
  $aThis[ 'key_opts' ][ 'idle' ] = [
330
  'name' => __( 'Idle Users', 'wp-simple-firewall' ),
331
  'enabled' => $bHasIdle,
336
  'href' => $this->getUrl_DirectLinkToOption( 'session_idle_timeout_interval' ),
337
  ];
338
 
339
+ $bLocked = $oOpts->isLockToIp();
340
  $aThis[ 'key_opts' ][ 'lock' ] = [
341
  'name' => __( 'Lock To IP', 'wp-simple-firewall' ),
342
  'enabled' => $bLocked,
382
  protected function getNamespaceBase() {
383
  return 'UserManagement';
384
  }
385
+
386
+ /**
387
+ * @return int
388
+ * @deprecated 8.5
389
+ */
390
+ public function getMaxSessionTime() {
391
+ /** @var UserManagement\Options $oOpts */
392
+ $oOpts = $this->getOptions();
393
+ return $oOpts->getMaxSessionTime();
394
+ }
395
+
396
+ /**
397
+ * @return int
398
+ * @deprecated 8.5
399
+ */
400
+ public function getIdleTimeoutInterval() {
401
+ return $this->getOpt( 'session_idle_timeout_interval' )*HOUR_IN_SECONDS;
402
+ }
403
+
404
+ /**
405
+ * @return bool
406
+ * @deprecated 8.5
407
+ */
408
+ public function hasMaxSessionTimeout() {
409
+ /** @var UserManagement\Options $oOpts */
410
+ $oOpts = $this->getOptions();
411
+ return $oOpts->hasMaxSessionTimeout();
412
+ }
413
+
414
+ /**
415
+ * @return bool
416
+ * @deprecated 8.5
417
+ */
418
+ public function hasSessionIdleTimeout() {
419
+ /** @var UserManagement\Options $oOpts */
420
+ $oOpts = $this->getOptions();
421
+ return $oOpts->hasSessionIdleTimeout();
422
+ }
423
+
424
+ /**
425
+ * @return bool
426
+ * @deprecated 8.5
427
+ */
428
+ public function isLockToIp() {
429
+ /** @var UserManagement\Options $oOpts */
430
+ $oOpts = $this->getOptions();
431
+ return $oOpts->isLockToIp();
432
+ }
433
  }
src/lib/src/Controller/Controller.php CHANGED
@@ -2,11 +2,29 @@
2
 
3
  namespace FernleafSystems\Wordpress\Plugin\Shield\Controller;
4
 
5
- use FernleafSystems\Wordpress\Services\Services;
6
  use FernleafSystems\Wordpress\Plugin\Shield;
 
7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8
  class Controller extends Shield\Deprecated\Foundation {
9
 
 
 
10
  /**
11
  * @var \stdClass
12
  */
@@ -23,7 +41,7 @@ class Controller extends Shield\Deprecated\Foundation {
23
  private $sRootFile;
24
 
25
  /**
26
- * @var boolean
27
  */
28
  protected $bRebuildOptions;
29
 
@@ -87,24 +105,60 @@ class Controller extends Shield\Deprecated\Foundation {
87
  */
88
  protected $oNotices;
89
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
90
  /**
91
  * @param string $sRootFile
92
  * @return Controller
93
  * @throws \Exception
94
  */
95
  public static function GetInstance( $sRootFile = null ) {
96
- if ( !isset( self::$oInstance ) ) {
97
- self::$oInstance = new self( $sRootFile );
98
  }
99
- return self::$oInstance;
100
  }
101
 
102
  /**
103
  * @param string $sRootFile
104
  * @throws \Exception
105
  */
106
- private function __construct( $sRootFile ) {
107
  $this->sRootFile = $sRootFile;
 
 
108
  $this->loadServices();
109
  $this->checkMinimumRequirements();
110
  $this->doRegisterHooks();
@@ -237,6 +291,7 @@ class Controller extends Shield\Deprecated\Foundation {
237
  do_action( $this->prefix( 'deactivate_plugin' ) );
238
  if ( apply_filters( $this->prefix( 'delete_on_deactivate' ), false ) ) {
239
  $this->bPluginDeleting = true;
 
240
  do_action( $this->prefix( 'delete_plugin' ) );
241
  $this->deletePluginControllerOptions();
242
  }
@@ -245,7 +300,11 @@ class Controller extends Shield\Deprecated\Foundation {
245
  }
246
 
247
  public function onWpActivatePlugin() {
248
- $this->getModule_Plugin()->setActivatedAt();
 
 
 
 
249
  }
250
 
251
  /**
@@ -359,9 +418,10 @@ class Controller extends Shield\Deprecated\Foundation {
359
 
360
  if ( Services::Request()->query( $this->prefix( 'runtests' ) ) && $this->isPluginAdmin() ) {
361
  $this->runTests();
362
- };
363
 
364
- if ( !Services::WpGeneral()->isAjax() && function_exists( 'wp_add_privacy_policy_content' ) ) {
 
365
  wp_add_privacy_policy_content( $this->getHumanName(), $this->buildPrivacyPolicyContent() );
366
  }
367
  }
@@ -427,14 +487,17 @@ class Controller extends Shield\Deprecated\Foundation {
427
  wp_add_dashboard_widget(
428
  $this->prefix( 'dashboard_widget' ),
429
  apply_filters( $this->prefix( 'dashboard_widget_title' ), $this->getHumanName() ),
430
- [ $this, 'displayDashboardWidget' ]
 
 
431
  );
432
  }
433
  }
434
 
 
 
 
435
  public function displayDashboardWidget() {
436
- $aContent = apply_filters( $this->prefix( 'dashboard_widget_content' ), [] );
437
- echo implode( '', $aContent );
438
  }
439
 
440
  /**
@@ -552,25 +615,6 @@ class Controller extends Shield\Deprecated\Foundation {
552
  }
553
  }
554
 
555
- /**
556
- * @param string $sEventTag
557
- * @param array $aMetaData
558
- * @return $this
559
- */
560
- public function fireEvent( $sEventTag, $aMetaData = [] ) {
561
- if ( apply_filters( $this->prefix( 'is_event_supported' ), false, $sEventTag ) ) {
562
- do_action( $this->prefix( 'event' ), $sEventTag, $aMetaData );
563
- }
564
- return $this;
565
- }
566
-
567
- /**
568
- * @return array
569
- */
570
- public function getAllEvents() {
571
- return apply_filters( $this->prefix( 'get_all_events' ), [] );
572
- }
573
-
574
  /**
575
  * Displaying all views now goes through this central function and we work out
576
  * what to display based on the name of current hook/filter being processed.
@@ -819,9 +863,9 @@ class Controller extends Shield\Deprecated\Foundation {
819
  /**
820
  * This is a filter method designed to say whether WordPress plugin upgrades should be permitted,
821
  * based on the plugin settings.
822
- * @param boolean $bDoAutoUpdate
823
  * @param string|object $mItem
824
- * @return boolean
825
  */
826
  public function onWpAutoUpdate( $bDoAutoUpdate, $mItem ) {
827
  $oWp = Services::WpGeneral();
@@ -869,8 +913,6 @@ class Controller extends Shield\Deprecated\Foundation {
869
  break;
870
 
871
  case 'pass' :
872
- break;
873
-
874
  default:
875
  break;
876
  }
@@ -1118,7 +1160,7 @@ class Controller extends Shield\Deprecated\Foundation {
1118
  if ( !$oWp->isMultisite() && is_admin() ) {
1119
  return true;
1120
  }
1121
- else if ( $oWp->isMultisite() && $this->getIsWpmsNetworkAdminOnly() && ( is_network_admin() || $oWp->isAjax() ) ) {
1122
  return true;
1123
  }
1124
  return false;
@@ -1152,11 +1194,12 @@ class Controller extends Shield\Deprecated\Foundation {
1152
  /**
1153
  * DO NOT CHANGE THIS IMPLEMENTATION. We call this as early as possible so that the
1154
  * current_user_can() never gets caught up in an infinite loop of permissions checking
1155
- * @return boolean
1156
  */
1157
  public function getMeetsBasePermissions() {
1158
  if ( did_action( 'init' ) && !isset( $this->bMeetsBasePermissions ) ) {
1159
  $this->bMeetsBasePermissions = current_user_can( $this->getBasePermissions() );
 
1160
  }
1161
  return isset( $this->bMeetsBasePermissions ) ? $this->bMeetsBasePermissions : false;
1162
  }
@@ -1228,12 +1271,13 @@ class Controller extends Shield\Deprecated\Foundation {
1228
  && hash_equals( $oConOptions->hash, $sCurrentHash ) ) {
1229
  $this->bRebuildOptions = false;
1230
  }
1231
- else if ( isset( $oConOptions->mod_time ) && ( $sModifiedTime < $oConOptions->mod_time ) ) {
1232
  $this->bRebuildOptions = false;
1233
  }
1234
 
1235
  $oConOptions->hash = $sCurrentHash;
1236
  $oConOptions->mod_time = $sModifiedTime;
 
1237
  return $this->bRebuildOptions;
1238
  }
1239
 
@@ -1245,18 +1289,19 @@ class Controller extends Shield\Deprecated\Foundation {
1245
  }
1246
 
1247
  /**
1248
- * @return boolean
1249
  */
1250
  public function getIsResetPlugin() {
1251
  if ( !isset( $this->bResetPlugin ) ) {
1252
  $bExists = Services::WpFs()->isFile( $this->getPath_Flags( 'reset' ) );
1253
  $this->bResetPlugin = (bool)$bExists;
 
1254
  }
1255
  return $this->bResetPlugin;
1256
  }
1257
 
1258
  /**
1259
- * @return boolean
1260
  */
1261
  public function getIsWpmsNetworkAdminOnly() {
1262
  return $this->getPluginSpec_Property( 'wpms_network_admin_only' );
@@ -1478,8 +1523,15 @@ class Controller extends Shield\Deprecated\Foundation {
1478
  * @return string
1479
  */
1480
  public function getRootFile() {
1481
- if ( !isset( $this->sRootFile ) ) {
1482
- $this->sRootFile = __FILE__;
 
 
 
 
 
 
 
1483
  }
1484
  return $this->sRootFile;
1485
  }
@@ -1554,7 +1606,7 @@ class Controller extends Shield\Deprecated\Foundation {
1554
  /**
1555
  */
1556
  protected function deleteCronJobs() {
1557
- $oWpCron = $this->loadWpCronProcessor();
1558
  $aCrons = $oWpCron->getCrons();
1559
 
1560
  $sPattern = sprintf( '#^(%s|%s)#', $this->getParentSlug(), $this->getPluginSlug() );
@@ -1655,6 +1707,7 @@ class Controller extends Shield\Deprecated\Foundation {
1655
  if ( $this->getIfForceOffActive() ) {
1656
  Services::WpFs()->deleteFile( $this->getForceOffFilePath() );
1657
  $this->sForceOffFile = null;
 
1658
  clearstatcache();
1659
  }
1660
  return $this;
@@ -1675,6 +1728,7 @@ class Controller extends Shield\Deprecated\Foundation {
1675
  $oFs = Services::WpFs();
1676
  $sFile = $oFs->findFileInDir( 'forceOff', $this->getRootDir(), false, false );
1677
  $this->sForceOffFile = ( !empty( $sFile ) && $oFs->isFile( $sFile ) ) ? $sFile : false;
 
1678
  }
1679
  return $this->sForceOffFile;
1680
  }
@@ -1778,6 +1832,8 @@ class Controller extends Shield\Deprecated\Foundation {
1778
  }
1779
  }
1780
 
 
 
1781
  do_action( $this->prefix( 'run_processors' ) );
1782
 
1783
  return $bSuccess;
@@ -1790,6 +1846,7 @@ class Controller extends Shield\Deprecated\Foundation {
1790
  public function getModule( $sSlug ) {
1791
  if ( !is_array( $this->aModules ) ) {
1792
  $this->aModules = [];
 
1793
  }
1794
  $oModule = isset( $this->aModules[ $sSlug ] ) ? $this->aModules[ $sSlug ] : null;
1795
  if ( !is_null( $oModule ) && !( $oModule instanceof \ICWP_WPSF_FeatureHandler_Base ) ) {
@@ -1819,6 +1876,13 @@ class Controller extends Shield\Deprecated\Foundation {
1819
  return $this->getModule( 'events' );
1820
  }
1821
 
 
 
 
 
 
 
 
1822
  /**
1823
  * @return \ICWP_WPSF_FeatureHandler_Insights
1824
  */
@@ -1833,6 +1897,13 @@ class Controller extends Shield\Deprecated\Foundation {
1833
  return $this->getModule( 'ips' );
1834
  }
1835
 
 
 
 
 
 
 
 
1836
  /**
1837
  * @return \ICWP_WPSF_FeatureHandler_LoginProtect
1838
  */
@@ -1917,6 +1988,7 @@ class Controller extends Shield\Deprecated\Foundation {
1917
  }
1918
 
1919
  $this->aModules[ $sModSlug ] = $this->{$sOptionsVarName};
 
1920
  return $this->{$sOptionsVarName};
1921
  }
1922
 
2
 
3
  namespace FernleafSystems\Wordpress\Plugin\Shield\Controller;
4
 
5
+ use FernleafSystems\Utilities\Data\Adapter\StdClassAdapter;
6
  use FernleafSystems\Wordpress\Plugin\Shield;
7
+ use FernleafSystems\Wordpress\Services\Services;
8
 
9
+ /**
10
+ * Class Controller
11
+ * @package FernleafSystems\Wordpress\Plugin\Shield\Controller
12
+ * @property bool $is_activating
13
+ * @property bool $modules_loaded
14
+ * @property bool $rebuild_options
15
+ * @property bool $plugin_deleting
16
+ * @property bool $plugin_reset
17
+ * @property string $file_forceoff
18
+ * @property string $base_file
19
+ * @property string $root_file
20
+ * @property bool $user_can_base_permissions
21
+ * @property Shield\Modules\Events\Lib\EventsService $service_events
22
+ * @property \ICWP_WPSF_FeatureHandler_Base[] $modules
23
+ */
24
  class Controller extends Shield\Deprecated\Foundation {
25
 
26
+ use StdClassAdapter;
27
+
28
  /**
29
  * @var \stdClass
30
  */
41
  private $sRootFile;
42
 
43
  /**
44
+ * @var bool
45
  */
46
  protected $bRebuildOptions;
47
 
105
  */
106
  protected $oNotices;
107
 
108
+ /**
109
+ * @var Shield\Modules\Events\Lib\EventsService
110
+ */
111
+ private $oEventsService;
112
+
113
+ /**
114
+ * @param string $sEventTag
115
+ * @param array $aMetaData
116
+ * @return $this
117
+ */
118
+ public function fireEvent( $sEventTag, $aMetaData = [] ) {
119
+ $this->loadEventsService()->fireEvent( $sEventTag, $aMetaData );
120
+ return $this;
121
+ }
122
+
123
+ /**
124
+ * @return array
125
+ */
126
+ public function getAllEvents() {
127
+ return $this->loadEventsService()->getEvents();
128
+ }
129
+
130
+ /**
131
+ * @return Shield\Modules\Events\Lib\EventsService
132
+ */
133
+ public function loadEventsService() {
134
+ if ( !isset( $this->oEventsService ) ) {
135
+ $this->oEventsService = ( new Shield\Modules\Events\Lib\EventsService() )
136
+ ->setCon( $this );
137
+ $this->service_events = $this->oEventsService;
138
+ }
139
+ return $this->oEventsService;
140
+ }
141
+
142
  /**
143
  * @param string $sRootFile
144
  * @return Controller
145
  * @throws \Exception
146
  */
147
  public static function GetInstance( $sRootFile = null ) {
148
+ if ( !isset( static::$oInstance ) ) {
149
+ static::$oInstance = new static( $sRootFile );
150
  }
151
+ return static::$oInstance;
152
  }
153
 
154
  /**
155
  * @param string $sRootFile
156
  * @throws \Exception
157
  */
158
+ protected function __construct( $sRootFile ) {
159
  $this->sRootFile = $sRootFile;
160
+ $this->root_file = $sRootFile;
161
+ $this->base_file = $this->getRootFile();
162
  $this->loadServices();
163
  $this->checkMinimumRequirements();
164
  $this->doRegisterHooks();
291
  do_action( $this->prefix( 'deactivate_plugin' ) );
292
  if ( apply_filters( $this->prefix( 'delete_on_deactivate' ), false ) ) {
293
  $this->bPluginDeleting = true;
294
+ $this->plugin_deleting = $this->bPluginDeleting;
295
  do_action( $this->prefix( 'delete_plugin' ) );
296
  $this->deletePluginControllerOptions();
297
  }
300
  }
301
 
302
  public function onWpActivatePlugin() {
303
+ $this->is_activating = true;
304
+ $oModPlugin = $this->getModule_Plugin();
305
+ if ( $oModPlugin instanceof \ICWP_WPSF_FeatureHandler_Base ) {
306
+ $oModPlugin->setActivatedAt();
307
+ }
308
  }
309
 
310
  /**
418
 
419
  if ( Services::Request()->query( $this->prefix( 'runtests' ) ) && $this->isPluginAdmin() ) {
420
  $this->runTests();
421
+ }
422
 
423
+ if ( !empty( $this->modules_loaded ) && !Services::WpGeneral()->isAjax()
424
+ && function_exists( 'wp_add_privacy_policy_content' ) ) {
425
  wp_add_privacy_policy_content( $this->getHumanName(), $this->buildPrivacyPolicyContent() );
426
  }
427
  }
487
  wp_add_dashboard_widget(
488
  $this->prefix( 'dashboard_widget' ),
489
  apply_filters( $this->prefix( 'dashboard_widget_title' ), $this->getHumanName() ),
490
+ function () {
491
+ do_action( $this->prefix( 'dashboard_widget_content' ) );
492
+ }
493
  );
494
  }
495
  }
496
 
497
+ /**
498
+ * @deprecated 8.5.7
499
+ */
500
  public function displayDashboardWidget() {
 
 
501
  }
502
 
503
  /**
615
  }
616
  }
617
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
618
  /**
619
  * Displaying all views now goes through this central function and we work out
620
  * what to display based on the name of current hook/filter being processed.
863
  /**
864
  * This is a filter method designed to say whether WordPress plugin upgrades should be permitted,
865
  * based on the plugin settings.
866
+ * @param bool $bDoAutoUpdate
867
  * @param string|object $mItem
868
+ * @return bool
869
  */
870
  public function onWpAutoUpdate( $bDoAutoUpdate, $mItem ) {
871
  $oWp = Services::WpGeneral();
913
  break;
914
 
915
  case 'pass' :
 
 
916
  default:
917
  break;
918
  }
1160
  if ( !$oWp->isMultisite() && is_admin() ) {
1161
  return true;
1162
  }
1163
+ elseif ( $oWp->isMultisite() && $this->getIsWpmsNetworkAdminOnly() && ( is_network_admin() || $oWp->isAjax() ) ) {
1164
  return true;
1165
  }
1166
  return false;
1194
  /**
1195
  * DO NOT CHANGE THIS IMPLEMENTATION. We call this as early as possible so that the
1196
  * current_user_can() never gets caught up in an infinite loop of permissions checking
1197
+ * @return bool
1198
  */
1199
  public function getMeetsBasePermissions() {
1200
  if ( did_action( 'init' ) && !isset( $this->bMeetsBasePermissions ) ) {
1201
  $this->bMeetsBasePermissions = current_user_can( $this->getBasePermissions() );
1202
+ $this->user_can_base_permissions = $this->bMeetsBasePermissions;
1203
  }
1204
  return isset( $this->bMeetsBasePermissions ) ? $this->bMeetsBasePermissions : false;
1205
  }
1271
  && hash_equals( $oConOptions->hash, $sCurrentHash ) ) {
1272
  $this->bRebuildOptions = false;
1273
  }
1274
+ elseif ( isset( $oConOptions->mod_time ) && ( $sModifiedTime < $oConOptions->mod_time ) ) {
1275
  $this->bRebuildOptions = false;
1276
  }
1277
 
1278
  $oConOptions->hash = $sCurrentHash;
1279
  $oConOptions->mod_time = $sModifiedTime;
1280
+ $this->rebuild_options = $this->bRebuildOptions;
1281
  return $this->bRebuildOptions;
1282
  }
1283
 
1289
  }
1290
 
1291
  /**
1292
+ * @return bool
1293
  */
1294
  public function getIsResetPlugin() {
1295
  if ( !isset( $this->bResetPlugin ) ) {
1296
  $bExists = Services::WpFs()->isFile( $this->getPath_Flags( 'reset' ) );
1297
  $this->bResetPlugin = (bool)$bExists;
1298
+ $this->plugin_reset = $this->bResetPlugin;
1299
  }
1300
  return $this->bResetPlugin;
1301
  }
1302
 
1303
  /**
1304
+ * @return bool
1305
  */
1306
  public function getIsWpmsNetworkAdminOnly() {
1307
  return $this->getPluginSpec_Property( 'wpms_network_admin_only' );
1523
  * @return string
1524
  */
1525
  public function getRootFile() {
1526
+ if ( empty( $this->sRootFile ) ) {
1527
+ $oVO = ( new \FernleafSystems\Wordpress\Services\Utilities\WpOrg\Plugin\Files() )
1528
+ ->findPluginFromFile( __FILE__ );
1529
+ if ( $oVO instanceof \FernleafSystems\Wordpress\Services\Core\VOs\WpPluginVo ) {
1530
+ $this->sRootFile = path_join( WP_PLUGIN_DIR, $oVO->file );
1531
+ }
1532
+ else {
1533
+ $this->sRootFile = __FILE__;
1534
+ }
1535
  }
1536
  return $this->sRootFile;
1537
  }
1606
  /**
1607
  */
1608
  protected function deleteCronJobs() {
1609
+ $oWpCron = Services::WpCron();
1610
  $aCrons = $oWpCron->getCrons();
1611
 
1612
  $sPattern = sprintf( '#^(%s|%s)#', $this->getParentSlug(), $this->getPluginSlug() );
1707
  if ( $this->getIfForceOffActive() ) {
1708
  Services::WpFs()->deleteFile( $this->getForceOffFilePath() );
1709
  $this->sForceOffFile = null;
1710
+ unset( $this->file_forceoff );
1711
  clearstatcache();
1712
  }
1713
  return $this;
1728
  $oFs = Services::WpFs();
1729
  $sFile = $oFs->findFileInDir( 'forceOff', $this->getRootDir(), false, false );
1730
  $this->sForceOffFile = ( !empty( $sFile ) && $oFs->isFile( $sFile ) ) ? $sFile : false;
1731
+ $this->file_forceoff = $this->sForceOffFile;
1732
  }
1733
  return $this->sForceOffFile;
1734
  }
1832
  }
1833
  }
1834
 
1835
+ $this->modules_loaded = true;
1836
+
1837
  do_action( $this->prefix( 'run_processors' ) );
1838
 
1839
  return $bSuccess;
1846
  public function getModule( $sSlug ) {
1847
  if ( !is_array( $this->aModules ) ) {
1848
  $this->aModules = [];
1849
+ $this->modules = $this->aModules;
1850
  }
1851
  $oModule = isset( $this->aModules[ $sSlug ] ) ? $this->aModules[ $sSlug ] : null;
1852
  if ( !is_null( $oModule ) && !( $oModule instanceof \ICWP_WPSF_FeatureHandler_Base ) ) {
1876
  return $this->getModule( 'events' );
1877
  }
1878
 
1879
+ /**
1880
+ * @return \ICWP_WPSF_FeatureHandler_HackProtect
1881
+ */
1882
+ public function getModule_HackGuard() {
1883
+ return $this->getModule( 'hack_protect' );
1884
+ }
1885
+
1886
  /**
1887
  * @return \ICWP_WPSF_FeatureHandler_Insights
1888
  */
1897
  return $this->getModule( 'ips' );
1898
  }
1899
 
1900
+ /**
1901
+ * @return \ICWP_WPSF_FeatureHandler_License
1902
+ */
1903
+ public function getModule_License() {
1904
+ return $this->getModule( 'license' );
1905
+ }
1906
+
1907
  /**
1908
  * @return \ICWP_WPSF_FeatureHandler_LoginProtect
1909
  */
1988
  }
1989
 
1990
  $this->aModules[ $sModSlug ] = $this->{$sOptionsVarName};
1991
+ $this->modules = $this->aModules;
1992
  return $this->{$sOptionsVarName};
1993
  }
1994
 
src/lib/src/Databases/AuditTrail/EntryVO.php CHANGED
@@ -7,14 +7,16 @@ use FernleafSystems\Wordpress\Plugin\Shield\Databases\Base;
7
  /**
8
  * Class EntryVO
9
  *
10
- * @property string ip
11
- * @property string message
12
- * @property string wp_username
13
- * @property string rid
14
- * @property string event
15
- * @property string context
16
- * @property string category
17
- * @property string data - do not access directly! Instead getAuditData()
 
 
18
  */
19
  class EntryVO extends Base\EntryVO {
20
 
7
  /**
8
  * Class EntryVO
9
  *
10
+ * @property string $$ip
11
+ * @property string $message
12
+ * @property string $wp_username
13
+ * @property string $rid
14
+ * @property string $ip
15
+ * @property string $event
16
+ * @property string $context
17
+ * @property string $category
18
+ * @property int $count
19
+ * @property string $data - do not access directly! Instead getAuditData()
20
  */
21
  class EntryVO extends Base\EntryVO {
22
 
src/lib/src/Databases/AuditTrail/Handler.php CHANGED
@@ -4,7 +4,6 @@ namespace FernleafSystems\Wordpress\Plugin\Shield\Databases\AuditTrail;
4
 
5
  use FernleafSystems\Wordpress\Plugin\Shield\Databases\Base;
6
  use FernleafSystems\Wordpress\Plugin\Shield\Modules\AuditTrail\Options;
7
- use FernleafSystems\Wordpress\Services\Services;
8
 
9
  class Handler extends Base\Handler {
10
 
@@ -15,46 +14,6 @@ class Handler extends Base\Handler {
15
  $this->trimDb( $oOpts->getMaxEntries() );
16
  }
17
 
18
- /**
19
- * @param $aEvents - array of events: key event slug, value created_at timestamp
20
- */
21
- public function commitAudits( $aEvents ) {
22
- foreach ( $aEvents as $oEntry ) {
23
- $this->commitAudit( $oEntry );
24
- }
25
- }
26
-
27
- /**
28
- * @param EntryVO $oEntry
29
- */
30
- public function commitAudit( $oEntry ) {
31
- $oWp = Services::WpGeneral();
32
- $oWpUsers = Services::WpUsers();
33
-
34
- $oEntry->rid = $this->getCon()->getShortRequestId();
35
- if ( empty( $oEntry->message ) ) {
36
- $oEntry->message = '';
37
- }
38
- if ( empty( $oEntry->wp_username ) ) {
39
- if ( $oWpUsers->isUserLoggedIn() ) {
40
- $sUser = $oWpUsers->getCurrentWpUsername();
41
- }
42
- else if ( $oWp->isCron() ) {
43
- $sUser = 'WP Cron';
44
- }
45
- else if ( $oWp->isWpCli() ) {
46
- $sUser = 'WP CLI';
47
- }
48
- else {
49
- $sUser = '-';
50
- }
51
- $oEntry->wp_username = $sUser;
52
- }
53
- /** @var Insert $oQI */
54
- $oQI = $this->getQueryInserter();
55
- $oQI->insert( $oEntry );
56
- }
57
-
58
  /**
59
  * @return array
60
  */
@@ -88,9 +47,25 @@ class Handler extends Base\Handler {
88
  message text COMMENT 'Audit Event Description',
89
  meta text COMMENT 'Audit Event Data',
90
  immutable tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT 'May Be Deleted',
 
 
91
  created_at int(15) UNSIGNED NOT NULL DEFAULT 0,
92
  deleted_at int(15) UNSIGNED NOT NULL DEFAULT 0,
93
  PRIMARY KEY (id)
94
  ) %s;";
95
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
96
  }
4
 
5
  use FernleafSystems\Wordpress\Plugin\Shield\Databases\Base;
6
  use FernleafSystems\Wordpress\Plugin\Shield\Modules\AuditTrail\Options;
 
7
 
8
  class Handler extends Base\Handler {
9
 
14
  $this->trimDb( $oOpts->getMaxEntries() );
15
  }
16
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
17
  /**
18
  * @return array
19
  */
47
  message text COMMENT 'Audit Event Description',
48
  meta text COMMENT 'Audit Event Data',
49
  immutable tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT 'May Be Deleted',
50
+ count SMALLINT(5) UNSIGNED NOT NULL DEFAULT 1 COMMENT 'Repeat Count',
51
+ updated_at int(15) UNSIGNED NOT NULL DEFAULT 0,
52
  created_at int(15) UNSIGNED NOT NULL DEFAULT 0,
53
  deleted_at int(15) UNSIGNED NOT NULL DEFAULT 0,
54
  PRIMARY KEY (id)
55
  ) %s;";
56
  }
57
+
58
+ /**
59
+ * @param EntryVO[] $aEvents - array of events: key event slug, value created_at timestamp
60
+ * @deprecated 8.5
61
+ */
62
+ public function commitAudits( $aEvents ) {
63
+ }
64
+
65
+ /**
66
+ * @param EntryVO $oEntry
67
+ * @deprecated 8.5
68
+ */
69
+ public function commitAudit( $oEntry ) {
70
+ }
71
  }
src/lib/src/Databases/AuditTrail/Insert.php CHANGED
@@ -16,18 +16,14 @@ class Insert extends Base\Insert {
16
 
17
  $aData = $this->getInsertData();
18
 
19
- if ( !isset( $aData[ 'ip' ] ) ) {
20
- $aData[ 'ip' ] = Services::IP()->getRequestIp();
21
- }
22
  if ( is_array( $aData[ 'message' ] ) ) {
23
  $aData[ 'message' ] = implode( ' ', $aData[ 'message' ] );
24
  }
25
  if ( isset( $aData[ 'data' ] ) && !is_string( $aData[ 'data' ] ) ) {
26
  $aData[ 'data' ] = '';
27
  }
28
- if ( empty( $aData[ 'wp_username' ] ) ) {
29
- $oWpUsers = Services::WpUsers();
30
- $aData[ 'wp_username' ] = $oWpUsers->isUserLoggedIn() ? $oWpUsers->getCurrentWpUsername() : 'unknown';
31
  }
32
 
33
  return $this->setInsertData( $aData );
16
 
17
  $aData = $this->getInsertData();
18
 
 
 
 
19
  if ( is_array( $aData[ 'message' ] ) ) {
20
  $aData[ 'message' ] = implode( ' ', $aData[ 'message' ] );
21
  }
22
  if ( isset( $aData[ 'data' ] ) && !is_string( $aData[ 'data' ] ) ) {
23
  $aData[ 'data' ] = '';
24
  }
25
+ if ( empty( $aData[ 'ip' ] ) || !Services::IP()->isValidIp( $aData[ 'ip' ] ) ) {
26
+ $aData[ 'ip' ] = '';
 
27
  }
28
 
29
  return $this->setInsertData( $aData );
src/lib/src/Databases/AuditTrail/Select.php CHANGED
@@ -3,6 +3,7 @@
3
  namespace FernleafSystems\Wordpress\Plugin\Shield\Databases\AuditTrail;
4
 
5
  use FernleafSystems\Wordpress\Plugin\Shield\Databases\Base;
 
6
  use FernleafSystems\Wordpress\Services\Services;
7
 
8
  class Select extends Base\Select {
@@ -18,7 +19,7 @@ class Select extends Base\Select {
18
  * @return string[]
19
  */
20
  public function getDistinctIps() {
21
- return $this->getDistinct_FilterAndSort( 'ip' );
22
  }
23
 
24
  /**
3
  namespace FernleafSystems\Wordpress\Plugin\Shield\Databases\AuditTrail;
4
 
5
  use FernleafSystems\Wordpress\Plugin\Shield\Databases\Base;
6
+ use FernleafSystems\Wordpress\Plugin\Shield\Utilities\Tool\IpListSort;
7
  use FernleafSystems\Wordpress\Services\Services;
8
 
9
  class Select extends Base\Select {
19
  * @return string[]
20
  */
21
  public function getDistinctIps() {
22
+ return IpListSort::Sort( $this->getDistinctForColumn( 'ip' ) );
23
  }
24
 
25
  /**
src/lib/src/Databases/AuditTrail/Update.php CHANGED
@@ -6,4 +6,12 @@ use FernleafSystems\Wordpress\Plugin\Shield\Databases\Base;
6
 
7
  class Update extends Base\Update {
8
 
 
 
 
 
 
 
 
 
9
  }
6
 
7
  class Update extends Base\Update {
8
 
9
+ /**
10
+ * @param EntryVO $oEntry
11
+ * @param int $nIncrease
12
+ * @return bool
13
+ */
14
+ public function updateCount( $oEntry, $nIncrease = 1 ) {
15
+ return $this->updateEntry( $oEntry, [ 'count' => $oEntry->count + $nIncrease ] );
16
+ }
17
  }
src/lib/src/Databases/Base/BaseQuery.php CHANGED
@@ -34,9 +34,15 @@ abstract class BaseQuery {
34
 
35
  /**
36
  * @var string
 
37
  */
38
  protected $sOrderBy;
39
 
 
 
 
 
 
40
  /**
41
  * @var string
42
  */
@@ -149,7 +155,7 @@ abstract class BaseQuery {
149
  $aExtras = array_filter(
150
  [
151
  $this->getGroupBy(),
152
- $this->getOrderBy(),
153
  $this->buildLimitPhrase(),
154
  $this->buildOffsetPhrase(),
155
  ]
@@ -329,8 +335,20 @@ abstract class BaseQuery {
329
  /**
330
  * @return string
331
  */
332
- public function getOrderBy() {
333
- return !empty( $this->sOrderBy ) ? $this->sOrderBy : 'ORDER BY `created_at` DESC';
 
 
 
 
 
 
 
 
 
 
 
 
334
  }
335
 
336
  /**
@@ -368,7 +386,7 @@ abstract class BaseQuery {
368
  return $this->setLimit( 0 )
369
  ->setWheres( [] )
370
  ->setPage( 1 )
371
- ->setOrderBy( '' );
372
  }
373
 
374
  /**
@@ -397,7 +415,7 @@ abstract class BaseQuery {
397
  if ( empty( $sGroupByColumn ) ) {
398
  $this->sGroupBy = '';
399
  }
400
- else if ( $this->getDbH()->hasColumn( $sGroupByColumn ) ) {
401
  $this->sGroupBy = $sGroupByColumn;
402
  }
403
  return $this;
@@ -406,14 +424,18 @@ abstract class BaseQuery {
406
  /**
407
  * @param string $sOrderByColumn
408
  * @param string $sOrder
 
409
  * @return $this
410
  */
411
- public function setOrderBy( $sOrderByColumn, $sOrder = 'DESC' ) {
412
  if ( empty( $sOrderByColumn ) ) {
413
- $this->sOrderBy = '';
414
  }
415
  else {
416
- $this->sOrderBy = sprintf( 'ORDER BY `%s` %s', esc_sql( $sOrderByColumn ), esc_sql( $sOrder ) );
 
 
 
417
  }
418
  return $this;
419
  }
@@ -458,4 +480,12 @@ abstract class BaseQuery {
458
  [ '=', '<', '>', '!=', '<>', '<=', '>=', '<=>', 'IN', 'LIKE', 'NOT LIKE' ]
459
  );
460
  }
 
 
 
 
 
 
 
 
461
  }
34
 
35
  /**
36
  * @var string
37
+ * @deprecated 8.5
38
  */
39
  protected $sOrderBy;
40
 
41
+ /**
42
+ * @var array
43
+ */
44
+ protected $aOrderBys;
45
+
46
  /**
47
  * @var string
48
  */
155
  $aExtras = array_filter(
156
  [
157
  $this->getGroupBy(),
158
+ $this->buildOrderBy(),
159
  $this->buildLimitPhrase(),
160
  $this->buildOffsetPhrase(),
161
  ]
335
  /**
336
  * @return string
337
  */
338
+ protected function buildOrderBy() {
339
+ $sOrder = '';
340
+ if ( !is_array( $this->aOrderBys ) ) {
341
+ // Defaults to created_at if aOrderBys is untouched. Set to empty array for no order
342
+ $this->aOrderBys = [ 'created_at' => 'DESC' ];
343
+ }
344
+ if ( !empty( $this->aOrderBys ) ) {
345
+ $aOrders = [];
346
+ foreach ( $this->aOrderBys as $sCol => $sOrder ) {
347
+ $aOrders[] = sprintf( '`%s` %s', esc_sql( $sCol ), esc_sql( $sOrder ) );
348
+ }
349
+ $sOrder = sprintf( 'ORDER BY %s', implode( ', ', $aOrders ) );
350
+ }
351
+ return $sOrder;
352
  }
353
 
354
  /**
386
  return $this->setLimit( 0 )
387
  ->setWheres( [] )
388
  ->setPage( 1 )
389
+ ->setOrderBy( null );
390
  }
391
 
392
  /**
415
  if ( empty( $sGroupByColumn ) ) {
416
  $this->sGroupBy = '';
417
  }
418
+ elseif ( $this->getDbH()->hasColumn( $sGroupByColumn ) ) {
419
  $this->sGroupBy = $sGroupByColumn;
420
  }
421
  return $this;
424
  /**
425
  * @param string $sOrderByColumn
426
  * @param string $sOrder
427
+ * @param bool $bReplace
428
  * @return $this
429
  */
430
+ public function setOrderBy( $sOrderByColumn, $sOrder = 'DESC', $bReplace = false ) {
431
  if ( empty( $sOrderByColumn ) ) {
432
+ $this->aOrderBys = $sOrderByColumn;
433
  }
434
  else {
435
+ if ( !is_array( $this->aOrderBys ) || $bReplace ) {
436
+ $this->aOrderBys = [];
437
+ }
438
+ $this->aOrderBys[ $sOrderByColumn ] = $sOrder;
439
  }
440
  return $this;
441
  }
480
  [ '=', '<', '>', '!=', '<>', '<=', '>=', '<=>', 'IN', 'LIKE', 'NOT LIKE' ]
481
  );
482
  }
483
+
484
+ /**
485
+ * @return string
486
+ * @deprecated 8.5
487
+ */
488
+ public function getOrderBy() {
489
+ return '';
490
+ }
491
  }
src/lib/src/Databases/Base/EntryVO.php CHANGED
@@ -93,14 +93,6 @@ class EntryVO {
93
  return (int)$this->created_at;
94
  }
95
 
96
- /**
97
- * @return int
98
- * @deprecated
99
- */
100
- public function getId() {
101
- return (int)$this->id;
102
- }
103
-
104
  /**
105
  * @return bool
106
  */
93
  return (int)$this->created_at;
94
  }
95
 
 
 
 
 
 
 
 
 
96
  /**
97
  * @return bool
98
  */
src/lib/src/Databases/Base/EntryVoConsumer.php ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace FernleafSystems\Wordpress\Plugin\Shield\Databases\Base;
4
+
5
+ /**
6
+ * Trait EntryVoConsumer
7
+ * @package FernleafSystems\Wordpress\Plugin\Shield\Databases\Base
8
+ */
9
+ trait EntryVoConsumer {
10
+
11
+ /**
12
+ * @var EntryVO
13
+ */
14
+ private $oEntryVO;
15
+
16
+ /**
17
+ * @return EntryVO|mixed
18
+ */
19
+ public function getEntryVO() {
20
+ return $this->oEntryVO;
21
+ }
22
+
23
+ /**
24
+ * @param EntryVO $oE
25
+ * @return $this
26
+ */
27
+ public function setEntryVO( $oE ) {
28
+ $this->oEntryVO = $oE;
29
+ return $this;
30
+ }
31
+ }
src/lib/src/Databases/Base/Handler.php CHANGED
@@ -129,7 +129,7 @@ class Handler {
129
  }
130
 
131
  /**
132
- * @return Insert
133
  */
134
  public function getQueryInserter() {
135
  $sClass = $this->getNamespace().'Insert';
@@ -139,7 +139,7 @@ class Handler {
139
  }
140
 
141
  /**
142
- * @return Delete
143
  */
144
  public function getQueryDeleter() {
145
  $sClass = $this->getNamespace().'Delete';
@@ -149,7 +149,7 @@ class Handler {
149
  }
150
 
151
  /**
152
- * @return Select
153
  */
154
  public function getQuerySelector() {
155
  $sClass = $this->getNamespace().'Select';
@@ -160,7 +160,7 @@ class Handler {
160
  }
161
 
162
  /**
163
- * @return Update
164
  */
165
  public function getQueryUpdater() {
166
  $sClass = $this->getNamespace().'Update';
@@ -170,7 +170,7 @@ class Handler {
170
  }
171
 
172
  /**
173
- * @return EntryVO
174
  */
175
  public function getVo() {
176
  $sClass = $this->getNamespace().'EntryVO';
129
  }
130
 
131
  /**
132
+ * @return Insert|mixed
133
  */
134
  public function getQueryInserter() {
135
  $sClass = $this->getNamespace().'Insert';
139
  }
140
 
141
  /**
142
+ * @return Delete|mixed
143
  */
144
  public function getQueryDeleter() {
145
  $sClass = $this->getNamespace().'Delete';
149
  }
150
 
151
  /**
152
+ * @return Select|mixed
153
  */
154
  public function getQuerySelector() {
155
  $sClass = $this->getNamespace().'Select';
160
  }
161
 
162
  /**
163
+ * @return Update|mixed
164
  */
165
  public function getQueryUpdater() {
166
  $sClass = $this->getNamespace().'Update';
170
  }
171
 
172
  /**
173
+ * @return EntryVO|mixed
174
  */
175
  public function getVo() {
176
  $sClass = $this->getNamespace().'EntryVO';
src/lib/src/Databases/Base/Select.php CHANGED
@@ -90,16 +90,16 @@ class Select extends BaseQuery {
90
  if ( $this->isCount() ) {
91
  $sSubstitute = 'COUNT(*)';
92
  }
93
- else if ( $this->isSum() ) {
94
  $sSubstitute = sprintf( 'SUM(%s)', array_shift( $aCols ) );
95
  }
96
- else if ( $this->isDistinct() && $this->hasColumnsToSelect() ) {
97
  $sSubstitute = sprintf( 'DISTINCT %s', implode( ',', $aCols ) );
98
  }
99
- else if ( $this->hasColumnsToSelect() ) {
100
  $sSubstitute = implode( ',', $aCols );
101
  }
102
- else if ( $this->isCustomSelect() ) {
103
  $sSubstitute = $this->sCustomSelect;
104
  }
105
  else {
@@ -228,7 +228,7 @@ class Select extends BaseQuery {
228
  if ( $this->isCount() || $this->isSum() ) {
229
  $mData = $this->queryVar();
230
  }
231
- else if ( $this->isDistinct() ) {
232
  $mData = $this->queryDistinct();
233
  if ( is_array( $mData ) ) {
234
  $mData = array_map( function ( $aRecord ) {
@@ -287,6 +287,24 @@ class Select extends BaseQuery {
287
  ->clearWheres();
288
  }
289
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
290
  /**
291
  * Verifies the given columns are valid and unique
292
  * @param string[] $aColumns
90
  if ( $this->isCount() ) {
91
  $sSubstitute = 'COUNT(*)';
92
  }
93
+ elseif ( $this->isSum() ) {
94
  $sSubstitute = sprintf( 'SUM(%s)', array_shift( $aCols ) );
95
  }
96
+ elseif ( $this->isDistinct() && $this->hasColumnsToSelect() ) {
97
  $sSubstitute = sprintf( 'DISTINCT %s', implode( ',', $aCols ) );
98
  }
99
+ elseif ( $this->hasColumnsToSelect() ) {
100
  $sSubstitute = implode( ',', $aCols );
101
  }
102
+ elseif ( $this->isCustomSelect() ) {
103
  $sSubstitute = $this->sCustomSelect;
104
  }
105
  else {
228
  if ( $this->isCount() || $this->isSum() ) {
229
  $mData = $this->queryVar();
230
  }
231
+ elseif ( $this->isDistinct() ) {
232
  $mData = $this->queryDistinct();
233
  if ( is_array( $mData ) ) {
234
  $mData = array_map( function ( $aRecord ) {
287
  ->clearWheres();
288
  }
289
 
290
+ /**
291
+ * @return EntryVO|mixed|\stdClass|null
292
+ */
293
+ public function selectLatestById() {
294
+ return $this->setOrderBy( 'id' )
295
+ ->setLimit( 1 )
296
+ ->first();
297
+ }
298
+
299
+ /**
300
+ * @return EntryVO|mixed|\stdClass|null
301
+ */
302
+ public function selectFirstById() {
303
+ return $this->setOrderBy( 'id', 'ASC' )
304
+ ->setLimit( 1 )
305
+ ->first();
306
+ }
307
+
308
  /**
309
  * Verifies the given columns are valid and unique
310
  * @param string[] $aColumns
src/lib/src/Databases/Events/Insert.php CHANGED
@@ -5,4 +5,5 @@ namespace FernleafSystems\Wordpress\Plugin\Shield\Databases\Events;
5
  use FernleafSystems\Wordpress\Plugin\Shield\Databases\Base;
6
 
7
  class Insert extends Base\Insert {
 
8
  }
5
  use FernleafSystems\Wordpress\Plugin\Shield\Databases\Base;
6
 
7
  class Insert extends Base\Insert {
8
+
9
  }
src/lib/src/Databases/Events/Update.php CHANGED
@@ -5,4 +5,5 @@ namespace FernleafSystems\Wordpress\Plugin\Shield\Databases\Events;
5
  use FernleafSystems\Wordpress\Plugin\Shield\Databases\Base;
6
 
7
  class Update extends Base\Update {
 
8
  }
5
  use FernleafSystems\Wordpress\Plugin\Shield\Databases\Base;
6
 
7
  class Update extends Base\Update {
8
+
9
  }
src/lib/src/Databases/GeoIp/Select.php CHANGED
@@ -3,6 +3,7 @@
3
  namespace FernleafSystems\Wordpress\Plugin\Shield\Databases\GeoIp;
4
 
5
  use FernleafSystems\Wordpress\Plugin\Shield\Databases\Base;
 
6
 
7
  class Select extends Base\Select {
8
 
@@ -22,13 +23,11 @@ class Select extends Base\Select {
22
  * @return string[]
23
  */
24
  public function getDistinctIps() {
25
- $aIps = array_filter( array_map(
26
  function ( $sIp ) {
27
  return inet_ntop( $sIp );
28
  },
29
  $this->getDistinctForColumn( 'ip' )
30
  ) );
31
- asort( $aIps );
32
- return $aIps;
33
  }
34
  }
3
  namespace FernleafSystems\Wordpress\Plugin\Shield\Databases\GeoIp;
4
 
5
  use FernleafSystems\Wordpress\Plugin\Shield\Databases\Base;
6
+ use FernleafSystems\Wordpress\Plugin\Shield\Utilities\Tool\IpListSort;
7
 
8
  class Select extends Base\Select {
9
 
23
  * @return string[]
24
  */
25
  public function getDistinctIps() {
26
+ return IpListSort::Sort( array_map(
27
  function ( $sIp ) {
28
  return inet_ntop( $sIp );
29
  },
30
  $this->getDistinctForColumn( 'ip' )
31
  ) );
 
 
32
  }
33
  }
src/lib/src/Databases/IPs/CommonFilters.php CHANGED
@@ -12,6 +12,31 @@ trait CommonFilters {
12
  return $this->addWhereEquals( 'ip', $sIp );
13
  }
14
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
15
  /**
16
  * @param bool $bIsRange
17
  * @return $this
12
  return $this->addWhereEquals( 'ip', $sIp );
13
  }
14
 
15
+ /**
16
+ * @param bool $bIsBlocked
17
+ * @return $this
18
+ */
19
+ public function filterByBlocked( $bIsBlocked ) {
20
+ return $this->addWhere( 'blocked_at', 0, $bIsBlocked ? '>' : '=' );
21
+ }
22
+
23
+ /**
24
+ * @return $this
25
+ */
26
+ public function filterByBlacklist() {
27
+ return $this->filterByLists( [
28
+ \ICWP_WPSF_FeatureHandler_Ips::LIST_AUTO_BLACK,
29
+ \ICWP_WPSF_FeatureHandler_Ips::LIST_MANUAL_BLACK
30
+ ] );
31
+ }
32
+
33
+ /**
34
+ * @return $this
35
+ */
36
+ public function filterByWhitelist() {
37
+ return $this->filterByList( \ICWP_WPSF_FeatureHandler_Ips::LIST_MANUAL_WHITE );
38
+ }
39
+
40
  /**
41
  * @param bool $bIsRange
42
  * @return $this
src/lib/src/Databases/IPs/Delete.php CHANGED
@@ -30,11 +30,8 @@ class Delete extends Base\Delete {
30
  public function deleteIpFromBlacklists( $sIp ) {
31
  $this->reset();
32
  if ( Services::IP()->isValidIpOrRange( $sIp ) ) {
33
- $this->addWhereEquals( 'ip', $sIp )
34
- ->addWhereIn( 'list', [
35
- \ICWP_WPSF_FeatureHandler_Ips::LIST_MANUAL_BLACK,
36
- \ICWP_WPSF_FeatureHandler_Ips::LIST_AUTO_BLACK
37
- ] );
38
  }
39
  return $this->hasWheres() ? $this->query() : false;
40
  }
30
  public function deleteIpFromBlacklists( $sIp ) {
31
  $this->reset();
32
  if ( Services::IP()->isValidIpOrRange( $sIp ) ) {
33
+ $this->filterByIp( $sIp )
34
+ ->filterByBlacklist();
 
 
 
35
  }
36
  return $this->hasWheres() ? $this->query() : false;
37
  }
src/lib/src/Databases/IPs/EntryVO.php CHANGED
@@ -6,17 +6,19 @@ use FernleafSystems\Wordpress\Plugin\Shield\Databases\Base;
6
 
7
  /**
8
  * Class EntryVO
9
- * @property string ip
10
- * @property bool is_range
11
- * @property string label
12
- * @property string list
13
- * @property int last_access_at
14
- * @property int transgressions
 
15
  */
16
  class EntryVO extends Base\EntryVO {
17
 
18
  /**
19
  * @return string
 
20
  */
21
  public function getLabel() {
22
  return (string)$this->label;
@@ -24,6 +26,7 @@ class EntryVO extends Base\EntryVO {
24
 
25
  /**
26
  * @return int
 
27
  */
28
  public function getLastAccessAt() {
29
  return (int)$this->last_access_at;
@@ -31,6 +34,7 @@ class EntryVO extends Base\EntryVO {
31
 
32
  /**
33
  * @return string
 
34
  */
35
  public function getList() {
36
  return (string)$this->list;
@@ -38,6 +42,7 @@ class EntryVO extends Base\EntryVO {
38
 
39
  /**
40
  * @return int
 
41
  */
42
  public function getTransgressions() {
43
  return (int)$this->transgressions;
@@ -45,15 +50,9 @@ class EntryVO extends Base\EntryVO {
45
 
46
  /**
47
  * @return bool
 
48
  */
49
  public function hasTransgressions() {
50
- return $this->getTransgressions() > 0;
51
- }
52
-
53
- /**
54
- * @return bool
55
- */
56
- public function isIpRange() {
57
- return (bool)$this->is_range;
58
  }
59
  }
6
 
7
  /**
8
  * Class EntryVO
9
+ * @property string $ip
10
+ * @property int $transgressions
11
+ * @property bool $is_range
12
+ * @property string $label
13
+ * @property string $list
14
+ * @property int $last_access_at
15
+ * @property int $blocked_at
16
  */
17
  class EntryVO extends Base\EntryVO {
18
 
19
  /**
20
  * @return string
21
+ * @deprecated 8.5
22
  */
23
  public function getLabel() {
24
  return (string)$this->label;
26
 
27
  /**
28
  * @return int
29
+ * @deprecated 8.5
30
  */
31
  public function getLastAccessAt() {
32
  return (int)$this->last_access_at;
34
 
35
  /**
36
  * @return string
37
+ * @deprecated 8.5
38
  */
39
  public function getList() {
40
  return (string)$this->list;
42
 
43
  /**
44
  * @return int
45
+ * @deprecated 8.5
46
  */
47
  public function getTransgressions() {
48
  return (int)$this->transgressions;
50
 
51
  /**
52
  * @return bool
53
+ * @deprecated 8.5
54
  */
55
  public function hasTransgressions() {
56
+ return (int)$this->transgressions > 0;
 
 
 
 
 
 
 
57
  }
58
  }
src/lib/src/Databases/IPs/Handler.php CHANGED
@@ -15,7 +15,7 @@ class Handler extends Base\Handler {
15
  $oOpts = $oMod->getOptions();
16
  /** @var Delete $oDel */
17
  $oDel = $this->getQueryDeleter();
18
- $oDel->filterByLists( [ $oMod::LIST_AUTO_BLACK, $oMod::LIST_MANUAL_BLACK ] )
19
  ->filterByLastAccessBefore( Services::Request()->ts() - $oOpts->getAutoExpireTime() )
20
  ->query();
21
  }
@@ -57,11 +57,12 @@ class Handler extends Base\Handler {
57
  id int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
58
  ip varchar(40) NOT NULL DEFAULT '',
59
  label varchar(255) NOT NULL DEFAULT '',
 
60
  list varchar(4) NOT NULL DEFAULT '',
61
  ip6 tinyint(1) NOT NULL DEFAULT 0,
62
  is_range tinyint(1) UNSIGNED NOT NULL DEFAULT 0,
63
- transgressions tinyint(1) UNSIGNED NOT NULL DEFAULT 0,
64
  last_access_at int(15) UNSIGNED NOT NULL DEFAULT 0,
 
65
  created_at int(15) UNSIGNED NOT NULL DEFAULT 0,
66
  deleted_at int(15) UNSIGNED NOT NULL DEFAULT 0,
67
  PRIMARY KEY (id)
15
  $oOpts = $oMod->getOptions();
16
  /** @var Delete $oDel */
17
  $oDel = $this->getQueryDeleter();
18
+ $oDel->filterByBlacklist()
19
  ->filterByLastAccessBefore( Services::Request()->ts() - $oOpts->getAutoExpireTime() )
20
  ->query();
21
  }
57
  id int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
58
  ip varchar(40) NOT NULL DEFAULT '',
59
  label varchar(255) NOT NULL DEFAULT '',
60
+ transgressions smallint(1) UNSIGNED NOT NULL DEFAULT 0,
61
  list varchar(4) NOT NULL DEFAULT '',
62
  ip6 tinyint(1) NOT NULL DEFAULT 0,
63
  is_range tinyint(1) UNSIGNED NOT NULL DEFAULT 0,
 
64
  last_access_at int(15) UNSIGNED NOT NULL DEFAULT 0,
65
+ blocked_at int(15) UNSIGNED NOT NULL DEFAULT 0,
66
  created_at int(15) UNSIGNED NOT NULL DEFAULT 0,
67
  deleted_at int(15) UNSIGNED NOT NULL DEFAULT 0,
68
  PRIMARY KEY (id)
src/lib/src/Databases/IPs/Select.php CHANGED
@@ -11,26 +11,43 @@ class Select extends Base\Select {
11
  /**
12
  * @param string $sIp
13
  * @return bool
 
14
  */
15
  public function getIpOnBlackLists( $sIp ) {
16
  return $this->reset()
17
  ->filterByIp( $sIp )
18
- ->filterByLists( [
19
- \ICWP_WPSF_FeatureHandler_Ips::LIST_AUTO_BLACK,
20
- \ICWP_WPSF_FeatureHandler_Ips::LIST_MANUAL_BLACK
21
- ] )
22
  ->first();
23
  }
24
 
 
 
 
 
 
 
 
 
 
 
 
25
  /**
26
  * @param string $sList
27
  * @return EntryVO[]
 
28
  */
29
  public function allFromList( $sList ) {
30
  /** @var EntryVO[] $aRes */
31
- $aRes = $this->reset()
32
- ->filterByList( $sList )
33
- ->query();
34
- return $aRes;
 
 
 
 
 
 
 
35
  }
36
  }
11
  /**
12
  * @param string $sIp
13
  * @return bool
14
+ * @deprecated 8.5
15
  */
16
  public function getIpOnBlackLists( $sIp ) {
17
  return $this->reset()
18
  ->filterByIp( $sIp )
19
+ ->filterByBlacklist()
 
 
 
20
  ->first();
21
  }
22
 
23
+ /**
24
+ * @return EntryVO[]
25
+ */
26
+ public function getAllBlocked() {
27
+ /** @var EntryVO[] $aRes */
28
+ return $this->reset()
29
+ ->filterByBlocked( true )
30
+ ->filterByBlacklist()
31
+ ->query();
32
+ }
33
+
34
  /**
35
  * @param string $sList
36
  * @return EntryVO[]
37
+ * @deprecated 8.5
38
  */
39
  public function allFromList( $sList ) {
40
  /** @var EntryVO[] $aRes */
41
+ return $this->reset()
42
+ ->filterByList( $sList )
43
+ ->query();
44
+ }
45
+
46
+ /**
47
+ * @return string[]
48
+ * @deprecated 8.5
49
+ */
50
+ public function getDistinctIps() {
51
+ return $this->getDistinct_FilterAndSort( 'ip' );
52
  }
53
  }
src/lib/src/Databases/IPs/Update.php CHANGED
@@ -14,7 +14,7 @@ class Update extends Base\Update {
14
  * @return bool
15
  */
16
  public function incrementTransgressions( $oIp, $nIncrement = 1 ) {
17
- return $this->updateTransgressions( $oIp, $oIp->getTransgressions() + $nIncrement );
18
  }
19
 
20
  /**
@@ -49,4 +49,12 @@ class Update extends Base\Update {
49
  public function updateLastAccessAt( $oIp ) {
50
  return $this->updateEntry( $oIp, [ 'last_access_at' => Services::Request()->ts() ] );
51
  }
 
 
 
 
 
 
 
 
52
  }
14
  * @return bool
15
  */
16
  public function incrementTransgressions( $oIp, $nIncrement = 1 ) {
17
+ return $this->updateTransgressions( $oIp, $oIp->transgressions + $nIncrement );
18
  }
19
 
20
  /**
49
  public function updateLastAccessAt( $oIp ) {
50
  return $this->updateEntry( $oIp, [ 'last_access_at' => Services::Request()->ts() ] );
51
  }
52
+
53
+ /**
54
+ * @param EntryVO $oIp
55
+ * @return bool
56
+ */
57
+ public function setBlocked( $oIp ) {
58
+ return $this->updateEntry( $oIp, [ 'blocked_at' => Services::Request()->ts() ] );
59
+ }
60
  }
src/lib/src/Databases/ScanQueue/Update.php CHANGED
@@ -7,6 +7,15 @@ use FernleafSystems\Wordpress\Services\Services;
7
 
8
  class Update extends Base\Update {
9
 
 
 
 
 
 
 
 
 
 
10
  /**
11
  * @param EntryVO $oEntry
12
  * @return bool
7
 
8
  class Update extends Base\Update {
9
 
10
+ /**
11
+ * @param EntryVO $oEntry
12
+ * @return bool
13
+ */
14
+ public function storeResults( $oEntry ) {
15
+ return isset( $oEntry->results ) &&
16
+ $this->updateEntry( $oEntry, [ 'results' => gzcompress( $oEntry->getRawDataAsArray()[ 'results' ] ) ] );
17
+ }
18
+
19
  /**
20
  * @param EntryVO $oEntry
21
  * @return bool
src/lib/src/Databases/Scanner/Common.php ADDED
@@ -0,0 +1,82 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace FernleafSystems\Wordpress\Plugin\Shield\Databases\Scanner;
4
+
5
+ use FernleafSystems\Wordpress\Services\Services;
6
+
7
+ trait Common {
8
+
9
+ /**
10
+ * @param string $sHash
11
+ * @return $this
12
+ */
13
+ public function filterByHash( $sHash ) {
14
+ if ( !empty( $sHash ) ) {
15
+ $this->filterByHashes( [ $sHash ] );
16
+ }
17
+ return $this;
18
+ }
19
+
20
+ /**
21
+ * @param string[] $aHashes
22
+ * @return $this
23
+ */
24
+ public function filterByHashes( $aHashes ) {
25
+ return $this->addWhereIn( 'hash', $aHashes );
26
+ }
27
+
28
+ /**
29
+ * @return $this
30
+ */
31
+ public function filterByIgnored() {
32
+ return $this->addWhereNewerThan( 0, 'ignored_at' );
33
+ }
34
+
35
+ /**
36
+ * @return $this
37
+ */
38
+ public function filterByNotIgnored() {
39
+ return $this->addWhereEquals( 'ignored_at', 0 );
40
+ }
41
+
42
+ /**
43
+ * @param int $nInterval
44
+ * @return $this
45
+ */
46
+ public function filterByNotRecentlyNotified( $nInterval = null ) {
47
+ if ( is_null( $nInterval ) ) {
48
+ $nInterval = WEEK_IN_SECONDS;
49
+ }
50
+ return $this->addWhereOlderThan( Services::Request()->ts() - $nInterval, 'notified_at' );
51
+ }
52
+
53
+ /**
54
+ * @param int $nInterval
55
+ * @return $this
56
+ */
57
+ public function filterByIsRecentlyNotified( $nInterval = null ) {
58
+ if ( is_null( $nInterval ) ) {
59
+ $nInterval = WEEK_IN_SECONDS;
60
+ }
61
+ return $this->addWhereNewerThan( Services::Request()->ts() - $nInterval, 'notified_at' );
62
+ }
63
+
64
+ /**
65
+ * @param string $sScan
66
+ * @return $this
67
+ */
68
+ public function filterByScan( $sScan ) {
69
+ if ( !empty( $sScan ) ) {
70
+ $this->filterByScans( [ $sScan ] );
71
+ }
72
+ return $this;
73
+ }
74
+
75
+ /**
76
+ * @param string[] $aScans
77
+ * @return $this
78
+ */
79
+ public function filterByScans( $aScans ) {
80
+ return $this->addWhereIn( 'scan', array_map( 'strtolower', $aScans ) );
81
+ }
82
+ }
src/lib/src/Databases/Scanner/Delete.php CHANGED
@@ -6,27 +6,7 @@ use FernleafSystems\Wordpress\Plugin\Shield\Databases\Base;
6
 
7
  class Delete extends Base\Delete {
8
 
9
- /**
10
- * @param string $sHash
11
- * @return $this
12
- */
13
- public function filterByHash( $sHash ) {
14
- if ( !empty( $sHash ) ) {
15
- $this->addWhereEquals( 'hash', $sHash );
16
- }
17
- return $this;
18
- }
19
-
20
- /**
21
- * @param string $sScan
22
- * @return $this
23
- */
24
- public function filterByScan( $sScan ) {
25
- if ( !empty( $sScan ) ) {
26
- $this->addWhereEquals( 'scan', $sScan );
27
- }
28
- return $this;
29
- }
30
 
31
  /**
32
  * @param string $sScan
6
 
7
  class Delete extends Base\Delete {
8
 
9
+ use Common;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10
 
11
  /**
12
  * @param string $sScan
src/lib/src/Databases/Scanner/EntryVO.php CHANGED
@@ -6,13 +6,13 @@ use FernleafSystems\Wordpress\Plugin\Shield\Databases\Base;
6
 
7
  /**
8
  * Class EntryVO
9
- * @property string hash
10
- * @property array meta
11
- * @property string scan
12
- * @property int severity
13
- * @property int discovered_at
14
- * @property int ignored_at
15
- * @property int notified_at
16
  */
17
  class EntryVO extends Base\EntryVO {
18
 
6
 
7
  /**
8
  * Class EntryVO
9
+ * @property string $hash
10
+ * @property array $meta
11
+ * @property string $scan
12
+ * @property int $severity
13
+ * @property int $discovered_at
14
+ * @property int $ignored_at
15
+ * @property int $notified_at
16
  */
17
  class EntryVO extends Base\EntryVO {
18
 
src/lib/src/Databases/Scanner/Select.php CHANGED
@@ -3,67 +3,10 @@
3
  namespace FernleafSystems\Wordpress\Plugin\Shield\Databases\Scanner;
4
 
5
  use FernleafSystems\Wordpress\Plugin\Shield\Databases\Base;
6
- use FernleafSystems\Wordpress\Services\Services;
7
 
8
  class Select extends Base\Select {
9
 
10
- /**
11
- * @param string $sHash
12
- * @return $this
13
- */
14
- public function filterByHash( $sHash ) {
15
- if ( !empty( $sHash ) ) {
16
- $this->addWhereEquals( 'hash', $sHash );
17
- }
18
- return $this;
19
- }
20
-
21
- /**
22
- * @return $this
23
- */
24
- public function filterByIgnored() {
25
- return $this->addWhereNewerThan( 0, 'ignored_at' );
26
- }
27
-
28
- /**
29
- * @return $this
30
- */
31
- public function filterByNotIgnored() {
32
- return $this->addWhereEquals( 'ignored_at', 0 );
33
- }
34
-
35
- /**
36
- * @param int $nInterval
37
- * @return $this
38
- */
39
- public function filterByNotRecentlyNotified( $nInterval = null ) {
40
- if ( is_null( $nInterval ) ) {
41
- $nInterval = WEEK_IN_SECONDS;
42
- }
43
- return $this->addWhereOlderThan( Services::Request()->ts() - $nInterval, 'notified_at' );
44
- }
45
-
46
- /**
47
- * @param int $nInterval
48
- * @return $this
49
- */
50
- public function filterByIsRecentlyNotified( $nInterval = null ) {
51
- if ( is_null( $nInterval ) ) {
52
- $nInterval = WEEK_IN_SECONDS;
53
- }
54
- return $this->addWhereNewerThan( Services::Request()->ts() - $nInterval, 'notified_at' );
55
- }
56
-
57
- /**
58
- * @param string $sScan
59
- * @return $this
60
- */
61
- public function filterByScan( $sScan ) {
62
- if ( !empty( $sScan ) ) {
63
- $this->addWhereEquals( 'scan', strtolower( $sScan ) );
64
- }
65
- return $this;
66
- }
67
 
68
  /**
69
  * @param int $nNotifiedInterval
@@ -74,13 +17,6 @@ class Select extends Base\Select {
74
  ->filterByNotIgnored();
75
  }
76
 
77
- /**
78
- * @return string[]
79
- */
80
- public function getDistinctSeverity() {
81
- return $this->getDistinct_FilterAndSort( 'severity' );
82
- }
83
-
84
  /**
85
  * @param string $sScan
86
  * @return int
3
  namespace FernleafSystems\Wordpress\Plugin\Shield\Databases\Scanner;
4
 
5
  use FernleafSystems\Wordpress\Plugin\Shield\Databases\Base;
 
6
 
7
  class Select extends Base\Select {
8
 
9
+ use Common;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10
 
11
  /**
12
  * @param int $nNotifiedInterval
17
  ->filterByNotIgnored();
18
  }
19
 
 
 
 
 
 
 
 
20
  /**
21
  * @param string $sScan
22
  * @return int
src/lib/src/Databases/Scanner/Update.php CHANGED
@@ -7,6 +7,44 @@ use FernleafSystems\Wordpress\Services\Services;
7
 
8
  class Update extends Base\Update {
9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10
  /**
11
  * @param EntryVO $oEntry
12
  * @return bool
7
 
8
  class Update extends Base\Update {
9
 
10
+ /**
11
+ * @param string $sScan
12
+ * @return bool
13
+ */
14
+ public function clearIgnoredAtForScan( $sScan ) {
15
+ return $this->setUpdateWheres( [ 'scan' => $sScan ] )
16
+ ->setUpdateData( [ 'ignored_at' => 0 ] )
17
+ ->query() !== false;
18
+ }
19
+
20
+ /**
21
+ * @param string $sScan
22
+ * @return bool
23
+ */
24
+ public function clearNotifiedAtForScan( $sScan ) {
25
+ return $this->setUpdateWheres( [ 'scan' => $sScan ] )
26
+ ->setUpdateData( [ 'notified_at' => 0 ] )
27
+ ->query() !== false;
28
+ }
29
+
30
+ /**
31
+ * @param string $sScan
32
+ * @return bool
33
+ */
34
+ public function setAllNotifiedForScan( $sScan ) {
35
+ return $this
36
+ ->setUpdateWheres(
37
+ [
38
+ 'scan' => $sScan,
39
+ 'ignored_at' => 0,
40
+ ]
41
+ )
42
+ ->setUpdateData(
43
+ [ 'notified_at' => Services::Request()->ts() ]
44
+ )
45
+ ->query() !== false;
46
+ }
47
+
48
  /**
49
  * @param EntryVO $oEntry
50
  * @return bool
src/lib/src/Databases/Session/Insert.php CHANGED
@@ -16,6 +16,7 @@ class Insert extends Base\Insert {
16
  $aData = [
17
  'session_id' => $sSessionId,
18
  'wp_username' => $sUsername,
 
19
  ];
20
  return $this->setInsertData( $aData )->query() === 1;
21
  }
@@ -35,16 +36,19 @@ class Insert extends Base\Insert {
35
  throw new \Exception( 'WP Username not provided' );
36
  }
37
 
38
- $oReq = Services::Request();
39
- $nTimeStamp = $oReq->ts();
 
 
 
40
 
 
41
  $aData = array_merge(
42
  [
43
  'browser' => md5( $oReq->getUserAgent() ),
44
- 'ip' => Services::IP()->getRequestIp(), // TODO: SHA1
45
- 'logged_in_at' => $nTimeStamp,
46
- 'last_activity_at' => $nTimeStamp,
47
- 'last_activity_uri' => $oReq->server( 'REQUEST_URI' ),
48
  'login_intent_expires_at' => 0,
49
  'secadmin_at' => 0,
50
  ],
16
  $aData = [
17
  'session_id' => $sSessionId,
18
  'wp_username' => $sUsername,
19
+ 'ip' => Services::IP()->getRequestIp()
20
  ];
21
  return $this->setInsertData( $aData )->query() === 1;
22
  }
36
  throw new \Exception( 'WP Username not provided' );
37
  }
38
 
39
+ $oIP = Services::IP();
40
+ if ( empty( $aData[ 'ip' ] ) || !$oIP->isValidIp( $aData[ 'ip' ] ) ) {
41
+ $sReqIP = $oIP->getRequestIp();
42
+ $aData[ 'ip' ] = $oIP->isValidIp( $sReqIP ) ? $sReqIP : '';
43
+ }
44
 
45
+ $oReq = Services::Request();
46
  $aData = array_merge(
47
  [
48
  'browser' => md5( $oReq->getUserAgent() ),
49
+ 'logged_in_at' => $oReq->ts(),
50
+ 'last_activity_at' => $oReq->ts(),
51
+ 'last_activity_uri' => $oReq->getRequestUri(),
 
52
  'login_intent_expires_at' => 0,
53
  'secadmin_at' => 0,
54
  ],
src/lib/src/Databases/Session/Select.php CHANGED
@@ -3,6 +3,7 @@
3
  namespace FernleafSystems\Wordpress\Plugin\Shield\Databases\Session;
4
 
5
  use FernleafSystems\Wordpress\Plugin\Shield\Databases\Base;
 
6
  use FernleafSystems\Wordpress\Services\Services;
7
 
8
  class Select extends Base\Select {
@@ -11,7 +12,7 @@ class Select extends Base\Select {
11
  * @return string[]
12
  */
13
  public function getDistinctIps() {
14
- return $this->getDistinct_FilterAndSort( 'ip' );
15
  }
16
 
17
  /**
3
  namespace FernleafSystems\Wordpress\Plugin\Shield\Databases\Session;
4
 
5
  use FernleafSystems\Wordpress\Plugin\Shield\Databases\Base;
6
+ use FernleafSystems\Wordpress\Plugin\Shield\Utilities\Tool\IpListSort;
7
  use FernleafSystems\Wordpress\Services\Services;
8
 
9
  class Select extends Base\Select {
12
  * @return string[]
13
  */
14
  public function getDistinctIps() {
15
+ return IpListSort::Sort( $this->getDistinctForColumn( 'ip' ) );
16
  }
17
 
18
  /**
src/lib/src/Databases/Tally/Insert.php CHANGED
@@ -13,7 +13,7 @@ class Insert extends Base\Insert {
13
  */
14
  public function insert( $oTally ) {
15
  $bSuccess = false;
16
- if ( preg_match( '#[a-z]{1,}\.[a-z]{1,}#i', $oTally->stat_key )
17
  && is_numeric( $oTally->tally ) && $oTally->tally > 0 ) {
18
  $bSuccess = parent::insert( $oTally );
19
  }
13
  */
14
  public function insert( $oTally ) {
15
  $bSuccess = false;
16
+ if ( preg_match( '#[a-z]+\.[a-z]+#i', $oTally->stat_key )
17
  && is_numeric( $oTally->tally ) && $oTally->tally > 0 ) {
18
  $bSuccess = parent::insert( $oTally );
19
  }
src/lib/src/Databases/Traffic/Insert.php CHANGED
@@ -6,4 +6,18 @@ use FernleafSystems\Wordpress\Plugin\Shield\Databases\Base;
6
 
7
  class Insert extends Base\Insert {
8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
  }
6
 
7
  class Insert extends Base\Insert {
8
 
9
+ /**
10
+ * @return $this
11
+ * @throws \Exception
12
+ */
13
+ protected function verifyInsertData() {
14
+ parent::verifyInsertData();
15
+ $aData = $this->getInsertData();
16
+
17
+ if ( empty( $aData[ 'ip' ] ) ) {
18
+ throw new \Exception( 'IP address provided is not valid' );
19
+ }
20
+
21
+ return $this->setInsertData( $aData );
22
+ }
23
  }
src/lib/src/Databases/Traffic/Select.php CHANGED
@@ -3,6 +3,7 @@
3
  namespace FernleafSystems\Wordpress\Plugin\Shield\Databases\Traffic;
4
 
5
  use FernleafSystems\Wordpress\Plugin\Shield\Databases\Base;
 
6
  use FernleafSystems\Wordpress\Services\Services;
7
 
8
  class Select extends Base\Select {
@@ -13,14 +14,12 @@ class Select extends Base\Select {
13
  * @return string[]
14
  */
15
  public function getDistinctIps() {
16
- $aIps = array_filter( array_map(
17
- function ( $sIp ) {
18
- return inet_ntop( $sIp );
19
  },
20
  $this->getDistinctForColumn( 'ip' )
21
  ) );
22
- asort( $aIps );
23
- return $aIps;
24
  }
25
 
26
  /**
3
  namespace FernleafSystems\Wordpress\Plugin\Shield\Databases\Traffic;
4
 
5
  use FernleafSystems\Wordpress\Plugin\Shield\Databases\Base;
6
+ use FernleafSystems\Wordpress\Plugin\Shield\Utilities\Tool\IpListSort;
7
  use FernleafSystems\Wordpress\Services\Services;
8
 
9
  class Select extends Base\Select {
14
  * @return string[]
15
  */
16
  public function getDistinctIps() {
17
+ return IpListSort::Sort( array_map(
18
+ function ( $sIpBinary ) {
19
+ return inet_ntop( $sIpBinary );
20
  },
21
  $this->getDistinctForColumn( 'ip' )
22
  ) );
 
 
23
  }
24
 
25
  /**
src/lib/src/Deprecated/Foundation.php CHANGED
@@ -19,23 +19,11 @@ class Foundation {
19
  return self::DEFAULT_SERVICE_PREFIX.$sSuffix;
20
  }
21
 
22
- /**
23
- * @return \ICWP_WPSF_DataProcessor
24
- * @deprecated 8.4.0
25
- */
26
- static public function loadDP() {
27
- $sKey = 'icwp-data';
28
- if ( !self::isServiceReady( $sKey ) ) {
29
- self::setService( $sKey, \ICWP_WPSF_DataProcessor::GetInstance() );
30
- }
31
- return self::getService( $sKey );
32
- }
33
-
34
  /**
35
  * @return \ICWP_WPSF_WpCron
36
- * @deprecated
37
  */
38
- static public function loadWpCronProcessor() {
39
  $sKey = 'icwp-wpcron';
40
  if ( !self::isServiceReady( $sKey ) ) {
41
  self::setService( $sKey, \ICWP_WPSF_WpCron::GetInstance() );
@@ -45,6 +33,7 @@ class Foundation {
45
 
46
  /**
47
  * @return \ICWP_WPSF_ServiceProviders
 
48
  */
49
  public function loadServiceProviders() {
50
  $sKey = 'icwp-serviceproviders';
@@ -57,7 +46,7 @@ class Foundation {
57
  /**
58
  * @return array
59
  */
60
- static private function getDic() {
61
  if ( !is_array( self::$aDic ) ) {
62
  self::$aDic = [];
63
  }
@@ -68,7 +57,7 @@ class Foundation {
68
  * @param string $sService
69
  * @return mixed
70
  */
71
- static private function getService( $sService ) {
72
  $aDic = self::getDic();
73
  return $aDic[ $sService ];
74
  }
@@ -77,7 +66,7 @@ class Foundation {
77
  * @param string $sService
78
  * @return bool
79
  */
80
- static private function isServiceReady( $sService ) {
81
  $aDic = self::getDic();
82
  return !empty( $aDic[ $sService ] );
83
  }
@@ -86,7 +75,7 @@ class Foundation {
86
  * @param string $sServiceKey
87
  * @param mixed $oService
88
  */
89
- static private function setService( $sServiceKey, $oService ) {
90
  $aDic = self::getDic();
91
  $aDic[ $sServiceKey ] = $oService;
92
  self::$aDic = $aDic;
19
  return self::DEFAULT_SERVICE_PREFIX.$sSuffix;
20
  }
21
 
 
 
 
 
 
 
 
 
 
 
 
 
22
  /**
23
  * @return \ICWP_WPSF_WpCron
24
+ * @deprecated 8.5
25
  */
26
+ public static function loadWpCronProcessor() {
27
  $sKey = 'icwp-wpcron';
28
  if ( !self::isServiceReady( $sKey ) ) {
29
  self::setService( $sKey, \ICWP_WPSF_WpCron::GetInstance() );
33
 
34
  /**
35
  * @return \ICWP_WPSF_ServiceProviders
36
+ * @deprecated 8.5.2
37
  */
38
  public function loadServiceProviders() {
39
  $sKey = 'icwp-serviceproviders';
46
  /**
47
  * @return array
48
  */
49
+ private static function getDic() {
50
  if ( !is_array( self::$aDic ) ) {
51
  self::$aDic = [];
52
  }
57
  * @param string $sService
58
  * @return mixed
59
  */
60
+ private static function getService( $sService ) {
61
  $aDic = self::getDic();
62
  return $aDic[ $sService ];
63
  }
66
  * @param string $sService
67
  * @return bool
68
  */
69
+ private static function isServiceReady( $sService ) {
70
  $aDic = self::getDic();
71
  return !empty( $aDic[ $sService ] );
72
  }
75
  * @param string $sServiceKey
76
  * @param mixed $oService
77
  */
78
+ private static function setService( $sServiceKey, $oService ) {
79
  $aDic = self::getDic();
80
  $aDic[ $sServiceKey ] = $oService;
81
  self::$aDic = $aDic;
src/lib/src/Modules/AuditTrail/Auditors/Base.php CHANGED
@@ -7,5 +7,4 @@ use FernleafSystems\Wordpress\Plugin\Shield\Modules;
7
  class Base {
8
 
9
  use Modules\ModConsumer;
10
-
11
  }
7
  class Base {
8
 
9
  use Modules\ModConsumer;
 
10
  }
src/lib/src/Modules/AuditTrail/Auditors/Posts.php CHANGED
@@ -39,10 +39,10 @@ class Posts extends Base {
39
  if ( $sNewStatus == 'trash' ) {
40
  $sEvent = 'post_trashed';
41
  }
42
- else if ( $sOldStatus == 'trash' && $sNewStatus != 'trash' ) {
43
  $sEvent = 'post_recovered';
44
  }
45
- else if ( in_array( $sNewStatus, [ 'publish', 'private' ] ) ) {
46
 
47
  if ( in_array( $sOldStatus, [ 'publish', 'private' ] ) ) {
48
  $sEvent = 'post_updated';
@@ -51,7 +51,7 @@ class Posts extends Base {
51
  $sEvent = 'post_published';
52
  }
53
  }
54
- else if ( in_array( $sOldStatus, [ 'publish', 'private' ] ) && $sNewStatus == 'draft' ) {
55
  $sEvent = 'post_unpublished';
56
  }
57
  else {
39
  if ( $sNewStatus == 'trash' ) {
40
  $sEvent = 'post_trashed';
41
  }
42
+ elseif ( $sOldStatus == 'trash' && $sNewStatus != 'trash' ) {
43
  $sEvent = 'post_recovered';
44
  }
45
+ elseif ( in_array( $sNewStatus, [ 'publish', 'private' ] ) ) {
46
 
47
  if ( in_array( $sOldStatus, [ 'publish', 'private' ] ) ) {
48
  $sEvent = 'post_updated';
51
  $sEvent = 'post_published';
52
  }
53
  }
54
+ elseif ( in_array( $sOldStatus, [ 'publish', 'private' ] ) && $sNewStatus == 'draft' ) {
55
  $sEvent = 'post_unpublished';
56
  }
57
  else {
src/lib/src/Modules/AuditTrail/Auditors/Users.php CHANGED
@@ -21,7 +21,7 @@ class Users extends Base {
21
  'user_login',
22
  [
23
  'audit' => [
24
- 'user' => sanitize_user( $sUsername ),
25
  ]
26
  ]
27
  );
@@ -72,7 +72,7 @@ class Users extends Base {
72
  'user_deleted_reassigned',
73
  [
74
  'audit' => [
75
- 'user' => sanitize_user( $oReassignedUser->user_login ),
76
  ]
77
  ]
78
  );
21
  'user_login',
22
  [
23
  'audit' => [
24
+ 'user' => sanitize_user( $sUsername ),
25
  ]
26
  ]
27
  );
72
  'user_deleted_reassigned',
73
  [
74
  'audit' => [
75
+ 'user' => sanitize_user( $oReassignedUser->user_login ),
76
  ]
77
  ]
78
  );
src/lib/src/Modules/AuditTrail/Lib/AuditWriter.php ADDED
@@ -0,0 +1,72 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace FernleafSystems\Wordpress\Plugin\Shield\Modules\AuditTrail\Lib;
4
+
5
+ use FernleafSystems\Wordpress\Plugin\Shield\Databases\AuditTrail;
6
+ use FernleafSystems\Wordpress\Plugin\Shield\Databases\Base\HandlerConsumer;
7
+ use FernleafSystems\Wordpress\Plugin\Shield\Modules\AuditTrail\Lib\Ops\Commit;
8
+ use FernleafSystems\Wordpress\Plugin\Shield\Modules\Events\Lib\EventsListener;
9
+
10
+ class AuditWriter extends EventsListener {
11
+
12
+ use HandlerConsumer;
13
+
14
+ /**
15
+ * @var AuditTrail\EntryVO[]
16
+ */
17
+ private $aAuditLogs;
18
+
19
+ /**
20
+ * @param string $sEvent
21
+ * @param array $aMeta
22
+ */
23
+ protected function captureEvent( $sEvent, $aMeta = [] ) {
24
+ $oCon = $this->getCon();
25
+ $aDef = $oCon->loadEventsService()->getEventDef( $sEvent );
26
+ if ( $aDef[ 'audit' ] && empty( $aMeta[ 'suppress_audit' ] ) ) { // only audit if it's an auditable event
27
+ $oEntry = new AuditTrail\EntryVO();
28
+ $oEntry->rid = $this->getCon()->getShortRequestId();
29
+ $oEntry->event = $sEvent;
30
+ $oEntry->category = $aDef[ 'cat' ];
31
+ $oEntry->context = $aDef[ 'context' ];
32
+ $oEntry->meta = isset( $aMeta[ 'audit' ] ) ? $aMeta[ 'audit' ] : [];
33
+
34
+ $aLogs = $this->getLogs();
35
+
36
+ // cater for where certain events may happen more than once in the same request
37
+ if ( !empty( $aDef[ 'audit_multiple' ] ) ) {
38
+ $aLogs[] = $oEntry;
39
+ }
40
+ else {
41
+ $aLogs[ $sEvent ] = $oEntry;
42
+ }
43
+
44
+ $this->setLogs( $aLogs );
45
+ }
46
+ }
47
+
48
+ protected function onShutdown() {
49
+ if ( !$this->getCon()->isPluginDeleting() ) {
50
+ ( new Commit() )
51
+ ->setDbHandler( $this->getDbHandler() )
52
+ ->commitAudits( $this->getLogs() );
53
+ $this->setLogs();
54
+ }
55
+ }
56
+
57
+ /**
58
+ * @return AuditTrail\EntryVO[]
59
+ */
60
+ public function getLogs() {
61
+ return is_array( $this->aAuditLogs ) ? $this->aAuditLogs : [];
62
+ }
63
+
64
+ /**
65
+ * @param AuditTrail\EntryVO[] $aLogs
66
+ * @return $this
67
+ */
68
+ public function setLogs( $aLogs = [] ) {
69
+ $this->aAuditLogs = $aLogs;
70
+ return $this;
71
+ }
72
+ }
src/lib/src/Modules/AuditTrail/Lib/Ops/Commit.php ADDED
@@ -0,0 +1,108 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace FernleafSystems\Wordpress\Plugin\Shield\Modules\AuditTrail\Lib\Ops;
4
+
5
+ use FernleafSystems\Wordpress\Plugin\Shield\Databases\AuditTrail;
6
+ use FernleafSystems\Wordpress\Plugin\Shield\Databases\Base\HandlerConsumer;
7
+ use FernleafSystems\Wordpress\Services\Services;
8
+
9
+ class Commit {
10
+
11
+ use HandlerConsumer;
12
+
13
+ /**
14
+ * @var AuditTrail\EntryVO|null
15
+ */
16
+ private $oLatest;
17
+
18
+ /**
19
+ * @param AuditTrail\EntryVO[] $aEvents
20
+ */
21
+ public function commitAudits( $aEvents ) {
22
+ if ( is_array( $aEvents ) ) {
23
+ foreach ( $aEvents as $oEntry ) {
24
+ if ( $oEntry instanceof AuditTrail\EntryVO ) {
25
+ $this->commitAudit( $oEntry );
26
+ }
27
+ }
28
+ }
29
+ }
30
+
31
+ /**
32
+ * @param AuditTrail\EntryVO $oEntry
33
+ */
34
+ public function commitAudit( $oEntry ) {
35
+ $oWp = Services::WpGeneral();
36
+ $oWpUsers = Services::WpUsers();
37
+
38
+ if ( empty( $oEntry->ip ) ) {
39
+ $oEntry->ip = Services::IP()->getRequestIp();
40
+ }
41
+ if ( empty( $oEntry->message ) ) {
42
+ $oEntry->message = '';
43
+ }
44
+ if ( empty( $oEntry->wp_username ) ) {
45
+ if ( $oWpUsers->isUserLoggedIn() ) {
46
+ $sUser = $oWpUsers->getCurrentWpUsername();
47
+ }
48
+ elseif ( $oWp->isCron() ) {
49
+ $sUser = 'WP Cron';
50
+ }
51
+ elseif ( $oWp->isWpCli() ) {
52
+ $sUser = 'WP CLI';
53
+ }
54
+ else {
55
+ $sUser = '-';
56
+ }
57
+ $oEntry->wp_username = $sUser;
58
+ }
59
+
60
+ $oLatest = null;
61
+ $bCanCount = in_array( $oEntry->event, $this->getCanCountEvents() );
62
+ if ( $bCanCount ) {
63
+ $oLatest = $this->latest();
64
+ if ( $oLatest instanceof AuditTrail\EntryVO ) {
65
+ foreach ( [ 'event', 'ip' ] as $sCol ) {
66
+ $bCanCount = $bCanCount && ( $oLatest->{$sCol} === $oEntry->{$sCol} );
67
+ }
68
+ }
69
+ else {
70
+ $bCanCount = false;
71
+ }
72
+ }
73
+
74
+ if ( $bCanCount && $oLatest instanceof AuditTrail\EntryVO ) {
75
+ /** @var AuditTrail\Update $oQU */
76
+ $oQU = $this->getDbHandler()->getQueryUpdater();
77
+ $oQU->updateCount( $oLatest );
78
+ }
79
+ else {
80
+ /** @var AuditTrail\Insert $oQI */
81
+ $oQI = $this->getDbHandler()->getQueryInserter();
82
+ $oQI->insert( $oEntry );
83
+ }
84
+ }
85
+
86
+ /**
87
+ * TODO: This should be a config
88
+ * @return string[]
89
+ */
90
+ private function getCanCountEvents() {
91
+ return [ 'conn_kill' ];
92
+ }
93
+
94
+ /**
95
+ * @return AuditTrail\EntryVO|false
96
+ */
97
+ private function latest() {
98
+ if ( is_null( $this->oLatest ) ) {
99
+ $this->oLatest = $this->getDbHandler()
100
+ ->getQuerySelector()
101
+ ->selectLatestById();
102
+ if ( empty( $this->oLatest ) ) {
103
+ $this->oLatest = false;
104
+ }
105
+ }
106
+ return $this->oLatest;
107
+ }
108
+ }
src/lib/src/Modules/Autoupdates/Options.php CHANGED
@@ -56,6 +56,13 @@ class Options extends Base\ShieldOptions {
56
  return $this->getOpt( 'autoupdate_plugin_self' );
57
  }
58
 
 
 
 
 
 
 
 
59
  /**
60
  * @return bool
61
  */
@@ -67,7 +74,7 @@ class Options extends Base\ShieldOptions {
67
  * @return bool
68
  */
69
  public function isAutoUpdateCoreMinor() {
70
- return !$this->isOpt( 'autoupdate_core', 'core_never' );
71
  }
72
 
73
  /**
56
  return $this->getOpt( 'autoupdate_plugin_self' );
57
  }
58
 
59
+ /**
60
+ * @return bool
61
+ */
62
+ public function isAutoUpdateCoreNever() {
63
+ return $this->isOpt( 'autoupdate_core', 'core_never' );
64
+ }
65
+
66
  /**
67
  * @return bool
68
  */
74
  * @return bool
75
  */
76
  public function isAutoUpdateCoreMinor() {
77
+ return !$this->isAutoUpdateCoreNever();
78
  }
79
 
80
  /**
src/lib/src/Modules/Base/BaseModCon.php CHANGED
@@ -22,7 +22,7 @@ class BaseModCon extends Deprecated\Foundation {
22
  protected $sModSlug;
23
 
24
  /**
25
- * @var boolean
26
  */
27
  protected $bImportExportWhitelistNotify = false;
28
 
@@ -32,7 +32,7 @@ class BaseModCon extends Deprecated\Foundation {
32
  private static $oEmailHandler;
33
 
34
  /**
35
- * @var \ICWP_WPSF_Processor_Base
36
  */
37
  private $oProcessor;
38
 
@@ -62,17 +62,15 @@ class BaseModCon extends Deprecated\Foundation {
62
  private $aDbHandlers;
63
 
64
  /**
65
- * @param Shield\Controller\Controller $oPluginController
66
  * @param array $aMod
67
  * @throws \Exception
68
  */
69
- public function __construct( $oPluginController, $aMod = [] ) {
70
- if ( empty( self::$oPluginController ) ) {
71
- if ( !$oPluginController instanceof Shield\Controller\Controller ) {
72
- throw new \Exception( 'Plugin controller not supplied to Module' );
73
- }
74
- $this->setCon( $oPluginController );
75
  }
 
76
 
77
  if ( empty( $aMod[ 'storage_key' ] ) && empty( $aMod[ 'slug' ] ) ) {
78
  throw new \Exception( 'Module storage key AND slug are undefined' );
@@ -130,11 +128,17 @@ class BaseModCon extends Deprecated\Foundation {
130
  add_action( $this->prefix( 'hourly_cron' ), [ $this, 'runHourlyCron' ] );
131
 
132
  // supply our supported plugin events for this module
133
- add_filter( $this->prefix( 'is_event_supported' ), function ( $bSupported, $sEventTag ) {
134
- return $bSupported || $this->isSupportedEvent( $sEventTag );
135
- }, 10, 2 );
136
  add_filter( $this->prefix( 'get_all_events' ), function ( $aEvents ) {
137
- return array_merge( $aEvents, $this->getEvents() );
 
 
 
 
 
 
 
 
 
138
  } );
139
 
140
  add_action( 'admin_enqueue_scripts', [ $this, 'onWpEnqueueAdminJs' ], 100 );
@@ -227,72 +231,6 @@ class BaseModCon extends Deprecated\Foundation {
227
  return is_array( $aCls ) ? $aCls : [];
228
  }
229
 
230
- /**
231
- * @param string $sKey
232
- * @return array|null
233
- */
234
- public function getEventDef( $sKey ) {
235
- return $this->isSupportedEvent( $sKey ) ? $this->getEvents()[ $sKey ] : null;
236
- }
237
-
238
- /**
239
- * @return array[]
240
- */
241
- public function getEvents() {
242
- $aEvts = $this->getSupportedEvents();
243
-
244
- $aDefaults = [
245
- 'context' => $this->getSlug(),
246
- 'cat' => 1,
247
- 'stat' => true,
248
- 'audit' => true,
249
- 'recent' => false, // whether to show in the recent events logs
250
- 'offense' => false, // whether to mark offense against IP
251
- 'audit_multiple' => false, // allow multiple audit entries in the same request
252
- ];
253
- foreach ( $aEvts as $sKey => $aEvt ) {
254
- $aEvts[ $sKey ] = array_merge( $aDefaults, $aEvt );
255
- $aEvts[ $sKey ][ 'key' ] = $sKey;
256
- }
257
- return $aEvts;
258
- }
259
-
260
- /**
261
- * @return array[]
262
- */
263
- public function getStatEvents_Recent() {
264
- return array_filter(
265
- $this->getEvents(),
266
- function ( $aEvt ) {
267
- return $aEvt[ 'recent' ];
268
- }
269
- );
270
- }
271
-
272
- /**
273
- * @return array[]
274
- */
275
- protected function getSupportedEvents() {
276
- $aEvts = $this->getDef( 'events' );
277
- return is_array( $aEvts ) ? $aEvts : [];
278
- }
279
-
280
- /**
281
- * @param string $sKey
282
- * @return bool
283
- */
284
- public function isSupportedEvent( $sKey ) {
285
- return array_key_exists( $sKey, $this->getSupportedEvents() );
286
- }
287
-
288
- /**
289
- * @param string $sKey
290
- * @return bool
291
- */
292
- public function isOffenseEvent( $sKey ) {
293
- return $this->isSupportedEvent( $sKey ) && $this->getEvents()[ $sKey ][ 'offense' ];
294
- }
295
-
296
  /**
297
  * Should be over-ridden by each new class to handle upgrades.
298
  * Called upon construction and after plugin options are initialized.
@@ -394,7 +332,7 @@ class BaseModCon extends Deprecated\Foundation {
394
  if ( !empty( $aOptions ) && is_array( $aOptions ) && array_key_exists( $this->getOptionsStorageKey(), $aOptions ) ) {
395
  $this->getOptions()
396
  ->setMultipleOptions( $aOptions[ $this->getOptionsStorageKey() ] );
397
- $this->savePluginOptions();
398
  }
399
  }
400
 
@@ -500,7 +438,7 @@ class BaseModCon extends Deprecated\Foundation {
500
  // cleanup databases randomly just in-case cron doesn't run.
501
  $this->cleanupDatabases();
502
  }
503
- $this->savePluginOptions();
504
  }
505
  }
506
 
@@ -533,7 +471,7 @@ class BaseModCon extends Deprecated\Foundation {
533
  * @param string $sOptKey
534
  * @return string
535
  */
536
- protected function getUrl_DirectLinkToOption( $sOptKey ) {
537
  $sUrl = $this->getUrl_AdminPage();
538
  $aDef = $this->getOptions()->getOptDefinition( $sOptKey );
539
  if ( !empty( $aDef[ 'section' ] ) ) {
@@ -586,18 +524,20 @@ class BaseModCon extends Deprecated\Foundation {
586
  */
587
  public function isModuleEnabled() {
588
  $oOpts = $this->getOptions();
 
 
589
 
590
  if ( $this->getOptions()->getFeatureProperty( 'auto_enabled' ) === true ) {
591
  // Auto enabled modules always run regardless
592
  $bEnabled = true;
593
  }
594
- else if ( apply_filters( $this->prefix( 'globally_disabled' ), false ) ) {
595
  $bEnabled = false;
596
  }
597
- else if ( $this->getCon()->getIfForceOffActive() ) {
598
  $bEnabled = false;
599
  }
600
- else if ( $oOpts->getFeatureProperty( 'premium' ) === true && !$this->isPremium() ) {
601
  $bEnabled = false;
602
  }
603
  else {
@@ -786,21 +726,21 @@ class BaseModCon extends Deprecated\Foundation {
786
  }
787
 
788
  /**
789
- * @return boolean
790
  */
791
  public function getIfShowModuleMenuItem() {
792
  return (bool)$this->getOptions()->getFeatureProperty( 'show_module_menu_item' );
793
  }
794
 
795
  /**
796
- * @return boolean
797
  */
798
  public function getIfShowModuleLink() {
799
  return (bool)$this->getOptions()->getFeatureProperty( 'show_module_options' );
800
  }
801
 
802
  /**
803
- * @return boolean
804
  */
805
  public function getIfUseSessions() {
806
  return $this->getOptions()->getFeatureProperty( 'use_sessions' );
@@ -852,9 +792,9 @@ class BaseModCon extends Deprecated\Foundation {
852
  }
853
 
854
  /**
855
- * @param string $sOptionKey
856
- * @param mixed $mValueToTest
857
- * @param boolean $bStrict
858
  * @return bool
859
  */
860
  public function isOpt( $sOptionKey, $mValueToTest, $bStrict = false ) {
@@ -997,11 +937,9 @@ class BaseModCon extends Deprecated\Foundation {
997
  }
998
 
999
  /**
1000
- * Saves the options to the WordPress Options store.
1001
- * It will also update the stored plugin options version.
1002
- * @return void
1003
  */
1004
- public function savePluginOptions() {
1005
  $this->doPrePluginOptionsSave();
1006
  if ( apply_filters( $this->prefix( 'force_options_resave' ), false ) ) {
1007
  $this->getOptions()
@@ -1011,6 +949,7 @@ class BaseModCon extends Deprecated\Foundation {
1011
  // we set the flag that options have been updated. (only use this flag if it's a MANUAL options update)
1012
  $this->bImportExportWhitelistNotify = $this->getOptions()->getNeedSave();
1013
  $this->store();
 
1014
  }
1015
 
1016
  private function store() {
@@ -1297,13 +1236,13 @@ class BaseModCon extends Deprecated\Foundation {
1297
  if ( in_array( $sOptType, [ 'text', 'email' ] ) ) { //text box, and it's null, don't update
1298
  continue;
1299
  }
1300
- else if ( $sOptType == 'checkbox' ) { //if it was a checkbox, and it's null, it means 'N'
1301
  $sOptionValue = 'N';
1302
  }
1303
- else if ( $sOptType == 'integer' ) { //if it was a integer, and it's null, it means '0'
1304
  $sOptionValue = 0;
1305
  }
1306
- else if ( $sOptType == 'multiple_select' ) {
1307
  $sOptionValue = [];
1308
  }
1309
  }
@@ -1315,7 +1254,7 @@ class BaseModCon extends Deprecated\Foundation {
1315
  if ( $sOptType == 'integer' ) {
1316
  $sOptionValue = intval( $sOptionValue );
1317
  }
1318
- else if ( $sOptType == 'password' ) {
1319
  $sTempValue = trim( $sOptionValue );
1320
  if ( empty( $sTempValue ) ) {
1321
  continue;
@@ -1328,13 +1267,13 @@ class BaseModCon extends Deprecated\Foundation {
1328
 
1329
  $sOptionValue = md5( $sTempValue );
1330
  }
1331
- else if ( $sOptType == 'array' ) { //arrays are textareas, where each is separated by newline
1332
  $sOptionValue = array_filter( explode( "\n", esc_textarea( $sOptionValue ) ), 'trim' );
1333
  }
1334
- else if ( $sOptType == 'comma_separated_lists' ) {
1335
  $sOptionValue = Services::Data()->extractCommaSeparatedList( $sOptionValue );
1336
  }
1337
- else if ( $sOptType == 'multiple_select' ) {
1338
  }
1339
  }
1340
 
@@ -1344,7 +1283,7 @@ class BaseModCon extends Deprecated\Foundation {
1344
  }
1345
  }
1346
 
1347
- $this->savePluginOptions();
1348
 
1349
  // only use this flag when the options are being updated with a MANUAL save.
1350
  if ( isset( $this->bImportExportWhitelistNotify ) && $this->bImportExportWhitelistNotify ) {
@@ -1459,7 +1398,7 @@ class BaseModCon extends Deprecated\Foundation {
1459
  ]
1460
  ]
1461
  );
1462
- return $this->renderTemplate( 'access_restricted.php', $aData );
1463
  }
1464
 
1465
  /**
@@ -1638,7 +1577,7 @@ class BaseModCon extends Deprecated\Foundation {
1638
  }
1639
 
1640
  /**
1641
- * @return boolean
1642
  */
1643
  protected function getIsShowMarketing() {
1644
  return apply_filters( $this->prefix( 'show_marketing' ), !$this->isPremium() );
@@ -1937,13 +1876,6 @@ class BaseModCon extends Deprecated\Foundation {
1937
  return $this->oStrings;
1938
  }
1939
 
1940
- /**
1941
- * @return Shield\Databases\Base\Handler|mixed|false
1942
- */
1943
- protected function loadDbHandler() {
1944
- return false;
1945
- }
1946
-
1947
  /**
1948
  * @return $this;
1949
  */
22
  protected $sModSlug;
23
 
24
  /**
25
+ * @var bool
26
  */
27
  protected $bImportExportWhitelistNotify = false;
28
 
32
  private static $oEmailHandler;
33
 
34
  /**
35
+ * @var BaseProcessor
36
  */
37
  private $oProcessor;
38
 
62
  private $aDbHandlers;
63
 
64
  /**
65
+ * @param Shield\Controller\Controller $oPlugCon
66
  * @param array $aMod
67
  * @throws \Exception
68
  */
69
+ public function __construct( $oPlugCon, $aMod = [] ) {
70
+ if ( !$oPlugCon instanceof Shield\Controller\Controller ) {
71
+ throw new \Exception( 'Plugin controller not supplied to Module' );
 
 
 
72
  }
73
+ $this->setCon( $oPlugCon );
74
 
75
  if ( empty( $aMod[ 'storage_key' ] ) && empty( $aMod[ 'slug' ] ) ) {
76
  throw new \Exception( 'Module storage key AND slug are undefined' );
128
  add_action( $this->prefix( 'hourly_cron' ), [ $this, 'runHourlyCron' ] );
129
 
130
  // supply our supported plugin events for this module
 
 
 
131
  add_filter( $this->prefix( 'get_all_events' ), function ( $aEvents ) {
132
+ return array_merge(
133
+ is_array( $aEvents ) ? $aEvents : [],
134
+ array_map(
135
+ function ( $aEvt ) {
136
+ $aEvt[ 'context' ] = $this->getSlug();
137
+ return $aEvt;
138
+ },
139
+ is_array( $this->getDef( 'events' ) ) ? $this->getDef( 'events' ) : []
140
+ )
141
+ );
142
  } );
143
 
144
  add_action( 'admin_enqueue_scripts', [ $this, 'onWpEnqueueAdminJs' ], 100 );
231
  return is_array( $aCls ) ? $aCls : [];
232
  }
233
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
234
  /**
235
  * Should be over-ridden by each new class to handle upgrades.
236
  * Called upon construction and after plugin options are initialized.
332
  if ( !empty( $aOptions ) && is_array( $aOptions ) && array_key_exists( $this->getOptionsStorageKey(), $aOptions ) ) {
333
  $this->getOptions()
334
  ->setMultipleOptions( $aOptions[ $this->getOptionsStorageKey() ] );
335
+ $this->saveModOptions();
336
  }
337
  }
338
 
438
  // cleanup databases randomly just in-case cron doesn't run.
439
  $this->cleanupDatabases();
440
  }
441
+ $this->saveModOptions();
442
  }
443
  }
444
 
471
  * @param string $sOptKey
472
  * @return string
473
  */
474
+ public function getUrl_DirectLinkToOption( $sOptKey ) {
475
  $sUrl = $this->getUrl_AdminPage();
476
  $aDef = $this->getOptions()->getOptDefinition( $sOptKey );
477
  if ( !empty( $aDef[ 'section' ] ) ) {
524
  */
525
  public function isModuleEnabled() {
526
  $oOpts = $this->getOptions();
527
+ /** @var Shield\Modules\Plugin\Options $oPluginOpts */
528
+ $oPluginOpts = $this->getCon()->getModule_Plugin()->getOptions();
529
 
530
  if ( $this->getOptions()->getFeatureProperty( 'auto_enabled' ) === true ) {
531
  // Auto enabled modules always run regardless
532
  $bEnabled = true;
533
  }
534
+ elseif ( $oPluginOpts->isPluginGloballyDisabled() ) {
535
  $bEnabled = false;
536
  }
537
+ elseif ( $this->getCon()->getIfForceOffActive() ) {
538
  $bEnabled = false;
539
  }
540
+ elseif ( $oOpts->getFeatureProperty( 'premium' ) === true && !$this->isPremium() ) {
541
  $bEnabled = false;
542
  }
543
  else {
726
  }
727
 
728
  /**
729
+ * @return bool
730
  */
731
  public function getIfShowModuleMenuItem() {
732
  return (bool)$this->getOptions()->getFeatureProperty( 'show_module_menu_item' );
733
  }
734
 
735
  /**
736
+ * @return bool
737
  */
738
  public function getIfShowModuleLink() {
739
  return (bool)$this->getOptions()->getFeatureProperty( 'show_module_options' );
740
  }
741
 
742
  /**
743
+ * @return bool
744
  */
745
  public function getIfUseSessions() {
746
  return $this->getOptions()->getFeatureProperty( 'use_sessions' );
792
  }
793
 
794
  /**
795
+ * @param string $sOptionKey
796
+ * @param mixed $mValueToTest
797
+ * @param bool $bStrict
798
  * @return bool
799
  */
800
  public function isOpt( $sOptionKey, $mValueToTest, $bStrict = false ) {
937
  }
938
 
939
  /**
940
+ * @return $this
 
 
941
  */
942
+ public function saveModOptions() {
943
  $this->doPrePluginOptionsSave();
944
  if ( apply_filters( $this->prefix( 'force_options_resave' ), false ) ) {
945
  $this->getOptions()
949
  // we set the flag that options have been updated. (only use this flag if it's a MANUAL options update)
950
  $this->bImportExportWhitelistNotify = $this->getOptions()->getNeedSave();
951
  $this->store();
952
+ return $this;
953
  }
954
 
955
  private function store() {
1236
  if ( in_array( $sOptType, [ 'text', 'email' ] ) ) { //text box, and it's null, don't update
1237
  continue;
1238
  }
1239
+ elseif ( $sOptType == 'checkbox' ) { //if it was a checkbox, and it's null, it means 'N'
1240
  $sOptionValue = 'N';
1241
  }
1242
+ elseif ( $sOptType == 'integer' ) { //if it was a integer, and it's null, it means '0'
1243
  $sOptionValue = 0;
1244
  }
1245
+ elseif ( $sOptType == 'multiple_select' ) {
1246
  $sOptionValue = [];
1247
  }
1248
  }
1254
  if ( $sOptType == 'integer' ) {
1255
  $sOptionValue = intval( $sOptionValue );
1256
  }
1257
+ elseif ( $sOptType == 'password' ) {
1258
  $sTempValue = trim( $sOptionValue );
1259
  if ( empty( $sTempValue ) ) {
1260
  continue;
1267
 
1268
  $sOptionValue = md5( $sTempValue );
1269
  }
1270
+ elseif ( $sOptType == 'array' ) { //arrays are textareas, where each is separated by newline
1271
  $sOptionValue = array_filter( explode( "\n", esc_textarea( $sOptionValue ) ), 'trim' );
1272
  }
1273
+ elseif ( $sOptType == 'comma_separated_lists' ) {
1274
  $sOptionValue = Services::Data()->extractCommaSeparatedList( $sOptionValue );
1275
  }
1276
+ elseif ( $sOptType == 'multiple_select' ) {
1277
  }
1278
  }
1279
 
1283
  }
1284
  }
1285
 
1286
+ $this->saveModOptions();
1287
 
1288
  // only use this flag when the options are being updated with a MANUAL save.
1289
  if ( isset( $this->bImportExportWhitelistNotify ) && $this->bImportExportWhitelistNotify ) {
1398
  ]
1399
  ]
1400
  );
1401
+ return $this->renderTemplate( '/wpadmin_pages/security_admin/index.twig', $aData, true );
1402
  }
1403
 
1404
  /**
1577
  }
1578
 
1579
  /**
1580
+ * @return bool
1581
  */
1582
  protected function getIsShowMarketing() {
1583
  return apply_filters( $this->prefix( 'show_marketing' ), !$this->isPremium() );
1876
  return $this->oStrings;
1877
  }
1878
 
 
 
 
 
 
 
 
1879
  /**
1880
  * @return $this;
1881
  */
src/lib/src/Modules/Base/Lib/BaseService.php ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace FernleafSystems\Wordpress\Plugin\Shield\Modules\Base;
4
+
5
+ use FernleafSystems\Wordpress\Services\Services;
6
+
7
+ class BaseService {
8
+
9
+ /**
10
+ * @var static
11
+ */
12
+ private static $oInst;
13
+
14
+ /**
15
+ * @return static
16
+ */
17
+ public static function Instance() {
18
+ if ( !isset( self::$oInst ) ) {
19
+ self::$oInst = new static();
20
+ }
21
+ return self::$oInst;
22
+ }
23
+
24
+ /**
25
+ * BaseService constructor.
26
+ */
27
+ protected function __construct() {
28
+ $this->start();
29
+ }
30
+
31
+ /**
32
+ *
33
+ */
34
+ protected function start() {
35
+ }
36
+ }
src/lib/src/Modules/Base/Options.php CHANGED
@@ -25,12 +25,12 @@ class Options {
25
  protected $aRawOptionsConfigData;
26
 
27
  /**
28
- * @var boolean
29
  */
30
  protected $bNeedSave;
31
 
32
  /**
33
- * @var boolean
34
  */
35
  protected $bRebuildFromFile = false;
36
 
@@ -181,7 +181,7 @@ class Options {
181
  }
182
 
183
  /**
184
- * @return boolean
185
  */
186
  public function getIfLoadOptionsFromStorage() {
187
  return $this->bLoadFromSaved;
@@ -190,7 +190,7 @@ class Options {
190
  /**
191
  * Determines whether the given option key is a valid option
192
  * @param string
193
- * @return boolean
194
  */
195
  public function isValidOptionKey( $sOptionKey ) {
196
  return in_array( $sOptionKey, $this->getOptionsKeys() );
@@ -465,9 +465,9 @@ class Options {
465
  }
466
 
467
  /**
468
- * @param string $sKey
469
- * @param mixed $mValueToTest
470
- * @param boolean $bStrict
471
  * @return bool
472
  */
473
  public function isOpt( $sKey, $mValueToTest, $bStrict = false ) {
@@ -605,7 +605,7 @@ class Options {
605
  }
606
 
607
  /**
608
- * @return boolean
609
  */
610
  public function getRebuildFromFile() {
611
  return $this->bRebuildFromFile;
@@ -709,7 +709,7 @@ class Options {
709
  }
710
 
711
  /**
712
- * @param boolean $bLoadFromSaved
713
  * @return $this
714
  */
715
  public function setIfLoadOptionsFromStorage( $bLoadFromSaved ) {
@@ -718,14 +718,14 @@ class Options {
718
  }
719
 
720
  /**
721
- * @param boolean $bNeed
722
  */
723
  public function setNeedSave( $bNeed ) {
724
  $this->bNeedSave = $bNeed;
725
  }
726
 
727
  /**
728
- * @param boolean $bRebuild
729
  * @return $this
730
  */
731
  public function setRebuildFromFile( $bRebuild ) {
@@ -815,15 +815,28 @@ class Options {
815
  * @return mixed
816
  */
817
  private function ensureOptValueState( $sOptKey, $mValue ) {
818
- switch ( $this->getOptionType( $sOptKey ) ) {
819
- case 'integer':
820
- $mValue = (int)$mValue;
821
- break;
 
 
822
 
823
- case 'text':
824
- case 'email':
825
- $mValue = (string)$mValue;
826
- break;
 
 
 
 
 
 
 
 
 
 
 
827
  }
828
  return $mValue;
829
  }
@@ -1021,13 +1034,4 @@ class Options {
1021
  $this->sPathToConfig = $sPathToConfig;
1022
  return $this;
1023
  }
1024
-
1025
- /**
1026
- * @param string
1027
- * @return mixed|null
1028
- * @deprecated 8.4
1029
- */
1030
- public function getFeatureDefinition( $sDefinition ) {
1031
- return $this->getDef( $sDefinition );
1032
- }
1033
  }
25
  protected $aRawOptionsConfigData;
26
 
27
  /**
28
+ * @var bool
29
  */
30
  protected $bNeedSave;
31
 
32
  /**
33
+ * @var bool
34
  */
35
  protected $bRebuildFromFile = false;
36
 
181
  }
182
 
183
  /**
184
+ * @return bool
185
  */
186
  public function getIfLoadOptionsFromStorage() {
187
  return $this->bLoadFromSaved;
190
  /**
191
  * Determines whether the given option key is a valid option
192
  * @param string
193
+ * @return bool
194
  */
195
  public function isValidOptionKey( $sOptionKey ) {
196
  return in_array( $sOptionKey, $this->getOptionsKeys() );
465
  }
466
 
467
  /**
468
+ * @param string $sKey
469
+ * @param mixed $mValueToTest
470
+ * @param bool $bStrict
471
  * @return bool
472
  */
473
  public function isOpt( $sKey, $mValueToTest, $bStrict = false ) {
605
  }
606
 
607
  /**
608
+ * @return bool
609
  */
610
  public function getRebuildFromFile() {
611
  return $this->bRebuildFromFile;
709
  }
710
 
711
  /**
712
+ * @param bool $bLoadFromSaved
713
  * @return $this
714
  */
715
  public function setIfLoadOptionsFromStorage( $bLoadFromSaved ) {
718
  }
719
 
720
  /**
721
+ * @param bool $bNeed
722
  */
723
  public function setNeedSave( $bNeed ) {
724
  $this->bNeedSave = $bNeed;
725
  }
726
 
727
  /**
728
+ * @param bool $bRebuild
729
  * @return $this
730
  */
731
  public function setRebuildFromFile( $bRebuild ) {
815
  * @return mixed
816
  */
817
  private function ensureOptValueState( $sOptKey, $mValue ) {
818
+ $sType = $this->getOptionType( $sOptKey );
819
+ if ( !empty( $sType ) ) {
820
+ switch ( $sType ) {
821
+ case 'integer':
822
+ $mValue = (int)$mValue;
823
+ break;
824
 
825
+ case 'text':
826
+ case 'email':
827
+ $mValue = (string)$mValue;
828
+ break;
829
+
830
+ case 'array':
831
+ case 'multiple_select':
832
+ if ( !is_array( $mValue ) ) {
833
+ $mValue = $this->getOptDefault( $sOptKey );
834
+ }
835
+ break;
836
+
837
+ default:
838
+ break;
839
+ }
840
  }
841
  return $mValue;
842
  }
1034
  $this->sPathToConfig = $sPathToConfig;
1035
  return $this;
1036
  }
 
 
 
 
 
 
 
 
 
1037
  }
src/lib/src/Modules/Base/Strings.php CHANGED
@@ -94,6 +94,8 @@ class Strings {
94
  'join_thousands_H' => __( "Join The 1,000s Who've Already Upgraded Their WordPress Security To Better Protect Their Sites.", 'wp-simple-firewall' ),
95
  'join_thousands_P' => implode( ', ', $aProFeaturesDisplay ),
96
  'get_pro_protection' => __( 'Upgrade To Pro Protection', 'wp-simple-firewall' ),
 
 
97
  ],
98
  $this->getAdditionalDisplayStrings()
99
  );
94
  'join_thousands_H' => __( "Join The 1,000s Who've Already Upgraded Their WordPress Security To Better Protect Their Sites.", 'wp-simple-firewall' ),
95
  'join_thousands_P' => implode( ', ', $aProFeaturesDisplay ),
96
  'get_pro_protection' => __( 'Upgrade To Pro Protection', 'wp-simple-firewall' ),
97
+
98
+ 'page_title' => 'Twig Page',
99
  ],
100
  $this->getAdditionalDisplayStrings()
101
  );
src/lib/src/Modules/CommentsFilter/Scan/Bot.php CHANGED
@@ -33,21 +33,21 @@ class Bot {
33
  $sKey = 'checkbox';
34
  }
35
  // honeypot check
36
- else if ( !empty( $sFieldHoney ) ) {
37
  $sExplanation = sprintf( __( 'Failed Bot Test (%s)', 'wp-simple-firewall' ), __( 'honeypot', 'wp-simple-firewall' ) );
38
  $sKey = 'honeypot';
39
  }
40
- else if ( $nCooldown > 0 || $nExpire > 0 ) {
41
 
42
  if ( $nCooldown > 0 && $oReq->ts() < ( $nCommentTs + $nCooldown ) ) {
43
  $sExplanation = sprintf( __( 'Failed Bot Test (%s)', 'wp-simple-firewall' ), __( 'cooldown', 'wp-simple-firewall' ) );
44
  $sKey = 'cooldown';
45
  }
46
- else if ( $nExpire > 0 && $oReq->ts() > ( $nCommentTs + $nExpire ) ) {
47
  $sExplanation = sprintf( __( 'Failed Bot Test (%s)', 'wp-simple-firewall' ), __( 'expired', 'wp-simple-firewall' ) );
48
  $sKey = 'expired';
49
  }
50
- else if ( !$this->checkTokenHash( $sCommentToken, $nCommentTs, $nPostId ) ) {
51
  $sExplanation = sprintf( __( 'Failed Bot Test (%s)', 'wp-simple-firewall' ), __( 'token', 'wp-simple-firewall' ) );
52
  $sKey = 'token';
53
  }
33
  $sKey = 'checkbox';
34
  }
35
  // honeypot check
36
+ elseif ( !empty( $sFieldHoney ) ) {
37
  $sExplanation = sprintf( __( 'Failed Bot Test (%s)', 'wp-simple-firewall' ), __( 'honeypot', 'wp-simple-firewall' ) );
38
  $sKey = 'honeypot';
39
  }
40
+ elseif ( $nCooldown > 0 || $nExpire > 0 ) {
41
 
42
  if ( $nCooldown > 0 && $oReq->ts() < ( $nCommentTs + $nCooldown ) ) {
43
  $sExplanation = sprintf( __( 'Failed Bot Test (%s)', 'wp-simple-firewall' ), __( 'cooldown', 'wp-simple-firewall' ) );
44
  $sKey = 'cooldown';
45
  }
46
+ elseif ( $nExpire > 0 && $oReq->ts() > ( $nCommentTs + $nExpire ) ) {
47
  $sExplanation = sprintf( __( 'Failed Bot Test (%s)', 'wp-simple-firewall' ), __( 'expired', 'wp-simple-firewall' ) );
48
  $sKey = 'expired';
49
  }
50
+ elseif ( !$this->checkTokenHash( $sCommentToken, $nCommentTs, $nPostId ) ) {
51
  $sExplanation = sprintf( __( 'Failed Bot Test (%s)', 'wp-simple-firewall' ), __( 'token', 'wp-simple-firewall' ) );
52
  $sKey = 'token';
53
  }
src/lib/src/Modules/CommentsFilter/Scan/Human.php CHANGED
@@ -87,7 +87,8 @@ class Human {
87
  $oFs = Services::WpFs();
88
  $sBLFile = $oMod->getSpamBlacklistFile();
89
  if ( !$oFs->exists( $sBLFile ) ) {
90
- $sRawList = Services::HttpRequest()->getContent( $this->getOptions()->getDef( 'url_spam_blacklist_terms' ) );
 
91
  $sList = '';
92
  if ( !empty( $sRawList ) ) {
93
  $sList = implode( "\n", array_map( 'base64_encode', array_filter( array_map( 'trim', explode( "\n", $sRawList ) ) ) ) );
87
  $oFs = Services::WpFs();
88
  $sBLFile = $oMod->getSpamBlacklistFile();
89
  if ( !$oFs->exists( $sBLFile ) ) {
90
+ $sRawList = Services::HttpRequest()->getContent( $this->getOptions()
91
+ ->getDef( 'url_spam_blacklist_terms' ) );
92
  $sList = '';
93
  if ( !empty( $sRawList ) ) {
94
  $sList = implode( "\n", array_map( 'base64_encode', array_filter( array_map( 'trim', explode( "\n", $sRawList ) ) ) ) );
src/lib/src/Modules/CommentsFilter/Token/Create.php CHANGED
@@ -25,9 +25,6 @@ class Create {
25
  $sToken,
26
  $oMod->getTokenExpireInterval()
27
  );
28
- error_log( $nTs );
29
- error_log( $nPostId );
30
- error_log( $sToken );
31
 
32
  return $sToken;
33
  }
25
  $sToken,
26
  $oMod->getTokenExpireInterval()
27
  );
 
 
 
28
 
29
  return $sToken;
30
  }
src/lib/src/Modules/Email/Options.php CHANGED
@@ -5,4 +5,5 @@ namespace FernleafSystems\Wordpress\Plugin\Shield\Modules\Email;
5
  use FernleafSystems\Wordpress\Plugin\Shield\Modules\Base;
6
 
7
  class Options extends Base\ShieldOptions {
 
8
  }
5
  use FernleafSystems\Wordpress\Plugin\Shield\Modules\Base;
6
 
7
  class Options extends Base\ShieldOptions {
8
+
9
  }
src/lib/src/Modules/Events/Lib/EventsListener.php ADDED
@@ -0,0 +1,61 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace FernleafSystems\Wordpress\Plugin\Shield\Modules\Events\Lib;
4
+
5
+ use FernleafSystems\Wordpress\Plugin\Shield\Controller;
6
+ use FernleafSystems\Wordpress\Plugin\Shield\Modules\PluginControllerConsumer;
7
+
8
+ abstract class EventsListener {
9
+
10
+ use PluginControllerConsumer;
11
+
12
+ /**
13
+ * @var bool
14
+ */
15
+ private $bCommit = false;
16
+
17
+ /**
18
+ * EventsListener constructor.
19
+ * @param Controller\Controller $oCon
20
+ */
21
+ public function __construct( $oCon ) {
22
+ $this->setCon( $oCon );
23
+
24
+ add_action( $oCon->prefix( 'event' ),
25
+ function ( $sEvent, $aMeta = [] ) use ( $oCon ) {
26
+ if ( $oCon->loadEventsService()->isSupportedEvent( $sEvent ) ) {
27
+ $this->captureEvent( $sEvent, $aMeta );
28
+ }
29
+ }, 10, 2 );
30
+
31
+ add_action( $oCon->prefix( 'plugin_shutdown' ), function () {
32
+ $this->onShutdown();
33
+ }, 100 );
34
+ }
35
+
36
+ /**
37
+ * @param string $sEvent
38
+ * @param array $aMeta
39
+ */
40
+ abstract protected function captureEvent( $sEvent, $aMeta = [] );
41
+
42
+ protected function onShutdown() {
43
+
44
+ }
45
+
46
+ /**
47
+ * @return bool
48
+ */
49
+ public function isCommit() {
50
+ return (bool)$this->bCommit;
51
+ }
52
+
53
+ /**
54
+ * @param bool $bCommit
55
+ * @return $this
56
+ */
57
+ public function setIfCommit( $bCommit ) {
58
+ $this->bCommit = $bCommit;
59
+ return $this;
60
+ }
61
+ }
src/lib/src/Modules/Events/Lib/EventsService.php ADDED
@@ -0,0 +1,82 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace FernleafSystems\Wordpress\Plugin\Shield\Modules\Events\Lib;
4
+
5
+ use FernleafSystems\Wordpress\Plugin\Shield\Modules\PluginControllerConsumer;
6
+
7
+ class EventsService {
8
+
9
+ use PluginControllerConsumer;
10
+
11
+ /**
12
+ * @var array[]
13
+ */
14
+ private $aEvents;
15
+
16
+ /**
17
+ * @param string $sEventTag
18
+ * @param array $aMetaData
19
+ * @return $this
20
+ */
21
+ public function fireEvent( $sEventTag, $aMetaData = [] ) {
22
+ if ( $this->isSupportedEvent( $sEventTag ) ) {
23
+ do_action( $this->getCon()->prefix( 'event' ), $sEventTag, $aMetaData );
24
+ }
25
+ return $this;
26
+ }
27
+
28
+ /**
29
+ * @return array[]
30
+ */
31
+ public function getEvents() {
32
+ if ( empty( $this->aEvents ) ) {
33
+ $aEvts = apply_filters( $this->getCon()->prefix( 'get_all_events' ), [] );
34
+ $this->aEvents = is_array( $aEvts ) ? $this->buildEvents( $aEvts ) : [];
35
+ }
36
+ return $this->aEvents;
37
+ }
38
+
39
+ /**
40
+ * @param string $sEventKey
41
+ * @return array|null
42
+ */
43
+ public function getEventDef( $sEventKey ) {
44
+ return $this->isSupportedEvent( $sEventKey ) ? $this->getEvents()[ $sEventKey ] : null;
45
+ }
46
+
47
+ /**
48
+ * @return string[]
49
+ */
50
+ public function getEventKeys() {
51
+ return array_keys( $this->getEvents() );
52
+ }
53
+
54
+ /**
55
+ * @param string $sEventKey
56
+ * @return bool
57
+ */
58
+ public function isSupportedEvent( $sEventKey ) {
59
+ return in_array( $sEventKey, $this->getEventKeys() );
60
+ }
61
+
62
+ /**
63
+ * @param array[] $aEvents
64
+ * @return array[]
65
+ */
66
+ protected function buildEvents( $aEvents ) {
67
+ $aDefaults = [
68
+ 'cat' => 1,
69
+ 'stat' => true,
70
+ 'audit' => true,
71
+ 'recent' => false, // whether to show in the recent events logs
72
+ 'offense' => false, // whether to mark offense against IP
73
+ 'audit_multiple' => false, // allow multiple audit entries in the same request
74
+ 'suppress_offense' => false, // events that normally trigger offense can be forcefully suppressed
75
+ ];
76
+ foreach ( $aEvents as $sEventKey => $aEvt ) {
77
+ $aEvents[ $sEventKey ] = array_merge( $aDefaults, $aEvt );
78
+ $aEvents[ $sEventKey ][ 'key' ] = $sEventKey;
79
+ }
80
+ return $aEvents;
81
+ }
82
+ }
src/lib/src/Modules/Events/Lib/StatsWriter.php ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace FernleafSystems\Wordpress\Plugin\Shield\Modules\Events\Lib;
4
+
5
+ use FernleafSystems\Wordpress\Plugin\Shield\Databases\Base\HandlerConsumer;
6
+ use FernleafSystems\Wordpress\Plugin\Shield\Databases\Events\Handler;
7
+ use FernleafSystems\Wordpress\Services\Services;
8
+
9
+ class StatsWriter extends EventsListener {
10
+
11
+ use HandlerConsumer;
12
+
13
+ /**
14
+ * @var int[] - key: event; value: timestamp
15
+ */
16
+ private $aEventStats;
17
+
18
+ /**
19
+ * @param string $sEvent
20
+ * @param array $aMeta
21
+ */
22
+ protected function captureEvent( $sEvent, $aMeta = [] ) {
23
+ $aStats = $this->getEventStats();
24
+ $aStats[ $sEvent ] = isset( $aMeta[ 'ts' ] ) ? $aMeta[ 'ts' ] : Services::Request()->ts();
25
+ $this->setEventStats( $aStats );
26
+ }
27
+
28
+ protected function onShutdown() {
29
+ if ( !$this->getCon()->isPluginDeleting() ) {
30
+ /** @var Handler $oDbH */
31
+ $oDbH = $this->getDbHandler();
32
+ $oDbH->commitEvents( $this->getEventStats() );
33
+ $this->setEventStats();
34
+ }
35
+ }
36
+
37
+ /**
38
+ * @return int[]
39
+ */
40
+ public function getEventStats() {
41
+ return is_array( $this->aEventStats ) ? $this->aEventStats : [];
42
+ }
43
+
44
+ /**
45
+ * @param int[] $aStats
46
+ * @return $this
47
+ */
48
+ public function setEventStats( $aStats = [] ) {
49
+ $this->aEventStats = $aStats;
50
+ return $this;
51
+ }
52
+ }
src/lib/src/Modules/Events/Strings.php CHANGED
@@ -167,8 +167,8 @@ class Strings extends Base\Strings {
167
  'hide_login_url' => __( '', 'wp-simple-firewall' ),
168
  '2fa_success' => __( '', 'wp-simple-firewall' ),
169
  'check_skip' => __( '', 'wp-simple-firewall' ),
170
- 'fw_email_fail' => __( '', 'wp-simple-firewall' ),
171
- 'fw_email_success' => __( '', 'wp-simple-firewall' ),
172
  'firewall_block' => __( 'Firewall Block', 'wp-simple-firewall' ),
173
  'blockparam_dirtraversal' => sprintf( '%s: %s',
174
  __( 'Firewall', 'wp-simple-firewall' ),
167
  'hide_login_url' => __( '', 'wp-simple-firewall' ),
168
  '2fa_success' => __( '', 'wp-simple-firewall' ),
169
  'check_skip' => __( '', 'wp-simple-firewall' ),
170
+ 'fw_email_fail' => __( 'Firewall Block Email Fail', 'wp-simple-firewall' ),
171
+ 'fw_email_success' => __( 'Firewall Block Email Success', 'wp-simple-firewall' ),
172
  'firewall_block' => __( 'Firewall Block', 'wp-simple-firewall' ),
173
  'blockparam_dirtraversal' => sprintf( '%s: %s',
174
  __( 'Firewall', 'wp-simple-firewall' ),
src/lib/src/Modules/Firewall/Options.php CHANGED
@@ -5,4 +5,11 @@ namespace FernleafSystems\Wordpress\Plugin\Shield\Modules\Firewall;
5
  use FernleafSystems\Wordpress\Plugin\Shield\Modules\Base;
6
 
7
  class Options extends Base\ShieldOptions {
 
 
 
 
 
 
 
8
  }
5
  use FernleafSystems\Wordpress\Plugin\Shield\Modules\Base;
6
 
7
  class Options extends Base\ShieldOptions {
8
+
9
+ /**
10
+ * @return bool
11
+ */
12
+ public function isSendBlockEmail() {
13
+ return $this->isOpt( 'block_send_email', 'Y' );
14
+ }
15
  }
src/lib/src/Modules/HackGuard/AjaxHandler.php CHANGED
@@ -14,6 +14,7 @@ class AjaxHandler extends Shield\Modules\Base\AjaxHandlerShield {
14
  */
15
  protected function processAjaxAction( $sAction ) {
16
 
 
17
  switch ( $sAction ) {
18
 
19
  case 'scans_start':
@@ -24,11 +25,14 @@ class AjaxHandler extends Shield\Modules\Base\AjaxHandlerShield {
24
  $aResponse = $this->ajaxExec_CheckScans();
25
  break;
26
 
 
 
 
 
27
  case 'bulk_action':
28
- $aResponse = $this->ajaxExec_ScanItemAction( Services::Request()->post( 'bulk_action' ) );
29
  break;
30
 
31
- case 'item_asset_accept':
32
  case 'item_asset_deactivate':
33
  case 'item_asset_reinstall':
34
  case 'item_delete':
@@ -62,6 +66,10 @@ class AjaxHandler extends Shield\Modules\Base\AjaxHandlerShield {
62
  $sScanSlug = Services::Request()->post( 'fScan' );
63
  switch ( $sScanSlug ) {
64
 
 
 
 
 
65
  case 'apc':
66
  $oTableBuilder = new Shield\Tables\Build\ScanApc();
67
  break;
@@ -91,13 +99,12 @@ class AjaxHandler extends Shield\Modules\Base\AjaxHandlerShield {
91
  }
92
 
93
  if ( empty( $oTableBuilder ) ) {
94
- $sHtml = 'SCAN SLUG NOT SPECIFIED';
95
  }
96
  else {
97
  $sHtml = $oTableBuilder
98
  ->setMod( $oMod )
99
  ->setDbHandler( $oMod->getDbHandler_ScanResults() )
100
- ->setScanActionVO( ( new Scan\ScanActionFromSlug() )->getAction( $sScanSlug ) )
101
  ->buildTable();
102
  }
103
 
@@ -111,6 +118,7 @@ class AjaxHandler extends Shield\Modules\Base\AjaxHandlerShield {
111
  * @return array
112
  */
113
  private function ajaxExec_PluginReinstall() {
 
114
  $oMod = $this->getMod();
115
  $oReq = Services::Request();
116
 
@@ -119,12 +127,9 @@ class AjaxHandler extends Shield\Modules\Base\AjaxHandlerShield {
119
  $sFile = sanitize_text_field( wp_unslash( $oReq->post( 'file' ) ) );
120
 
121
  if ( $bReinstall ) {
122
- /** @var \ICWP_WPSF_Processor_HackProtect $oP */
123
- $oP = $oMod->getProcessor();
124
- $bActivate = $oP->getSubProScanner()
125
- ->getSubProcessorPtg()
126
- ->reinstall( $sFile )
127
- && $bActivate;
128
  }
129
 
130
  if ( $bActivate ) {
@@ -136,70 +141,77 @@ class AjaxHandler extends Shield\Modules\Base\AjaxHandlerShield {
136
 
137
  /**
138
  * @param string $sAction
 
139
  * @return array
140
  */
141
- private function ajaxExec_ScanItemAction( $sAction ) {
142
  /** @var \ICWP_WPSF_FeatureHandler_HackProtect $oMod */
143
  $oMod = $this->getMod();
144
- $oScanCon = $oMod->getScanController();
145
- $oReq = Services::Request();
146
 
147
  $bSuccess = false;
148
 
149
- $sItemId = $oReq->post( 'rid' );
150
- $aItemIds = $oReq->post( 'ids' );
151
- $sScanSlug = $oReq->post( 'fScan' );
152
-
153
- /** @var \ICWP_WPSF_Processor_HackProtect $oP */
154
- $oP = $oMod->getProcessor();
155
- $oScanner = $oP->getSubProScanner();
156
- $oTablePro = $oScanner->getScannerFromSlug( $sScanSlug );
157
-
158
- if ( empty( $oTablePro ) ) {
159
- $sMessage = __( 'Unsupported scanner', 'wp-simple-firewall' );
160
- }
161
- else if ( empty( $sItemId ) && ( empty( $aItemIds ) || !is_array( $aItemIds ) ) ) {
162
- $sMessage = __( 'Unsupported item(s) selected', 'wp-simple-firewall' );
163
  }
164
  else {
165
- if ( empty( $aItemIds ) ) {
166
- $aItemIds = [ $sItemId ];
167
  }
 
 
 
 
 
168
 
169
- try {
170
- $aSuccessfulItems = [];
171
-
172
- foreach ( $aItemIds as $sId ) {
173
- if ( $oTablePro->executeItemAction( $sId, $sAction ) ) {
174
- $aSuccessfulItems[] = $sId;
 
 
 
 
 
 
 
 
 
 
 
 
175
  }
176
- }
177
 
178
- if ( count( $aSuccessfulItems ) === count( $aItemIds ) ) {
179
- $bSuccess = true;
180
- $sMessage = __( 'Action successful.' );
181
- }
182
- else {
183
- $sMessage = __( 'An error occurred.' ).' '.__( 'Some items may not have been processed.' );
184
- }
185
 
186
- // We don't rescan for ignores.
187
- if ( !in_array( $sAction, [ 'ignore' ] ) ) {
188
- $oScanCon->startScans( [ $sScanSlug ] );
189
- $sMessage .= ' '.__( 'Rescanning', 'wp-simple-firewall' ).' ...';
 
 
 
 
 
190
  }
191
- else {
192
- $sMessage .= ' '.__( 'Reloading', 'wp-simple-firewall' ).' ...';
193
  }
194
  }
195
- catch ( \Exception $oE ) {
196
- $sMessage = $oE->getMessage();
197
- }
198
  }
199
 
200
  return [
201
  'success' => $bSuccess,
202
- 'page_reload' => true,
203
  'message' => $sMessage,
204
  ];
205
  }
@@ -210,13 +222,10 @@ class AjaxHandler extends Shield\Modules\Base\AjaxHandlerShield {
210
  private function ajaxExec_CheckScans() {
211
  /** @var \ICWP_WPSF_FeatureHandler_HackProtect $oMod */
212
  $oMod = $this->getMod();
213
- /** @var \ICWP_WPSF_Processor_HackProtect $oP */
214
- $oP = $oMod->getProcessor();
215
  /** @var Strings $oStrings */
216
  $oStrings = $oMod->getStrings();
217
- $oDbH = $oMod->getDbHandler_ScanQueue();
218
  /** @var Shield\Databases\ScanQueue\Select $oSel */
219
- $oSel = $oDbH->getQuerySelector();
220
 
221
  $oQueCon = $oMod->getScanController();
222
  $sCurrent = $oSel->getCurrentScan();
@@ -261,9 +270,6 @@ class AjaxHandler extends Shield\Modules\Base\AjaxHandlerShield {
261
  $sMessage = __( 'No scans were selected', 'wp-simple-firewall' );
262
  $aFormParams = $this->getAjaxFormParams();
263
 
264
- /** @var \ICWP_WPSF_Processor_HackProtect $oP */
265
- $oP = $oMod->getProcessor();
266
- $oScanner = $oP->getSubProScanner();
267
  $oScanCon = $oMod->getScanController();
268
 
269
  if ( !empty( $aFormParams ) ) {
@@ -275,26 +281,21 @@ class AjaxHandler extends Shield\Modules\Base\AjaxHandlerShield {
275
 
276
  $aScansToStart = [];
277
  foreach ( $aSelectedScans as $sScanSlug ) {
 
 
278
 
279
- $oTablePro = $oScanner->getScannerFromSlug( $sScanSlug );
280
-
281
- if ( !empty( $oTablePro ) && $oTablePro->isAvailable() ) {
282
- $bAsync = true;
283
  $aScansToStart[] = $sScanSlug;
284
 
285
  if ( isset( $aFormParams[ 'opt_clear_ignore' ] ) ) {
286
- $oTablePro->resetIgnoreStatus();
287
  }
288
  if ( isset( $aFormParams[ 'opt_clear_notification' ] ) ) {
289
- $oTablePro->resetNotifiedStatus();
290
  }
291
 
292
  $bSuccess = true;
293
  $bPageReload = true;
294
- $sMessage = $bAsync ?
295
- __( 'Scans started.', 'wp-simple-firewall' ).' '.__( 'Please wait, as this will take a few moments.', 'wp-simple-firewall' )
296
- : __( 'Scans completed.', 'wp-simple-firewall' ).' '.__( 'Reloading page', 'wp-simple-firewall' );
297
-
298
  }
299
  }
300
  $oScanCon->startScans( $aScansToStart );
14
  */
15
  protected function processAjaxAction( $sAction ) {
16
 
17
+ $oReq = Services::Request();
18
  switch ( $sAction ) {
19
 
20
  case 'scans_start':
25
  $aResponse = $this->ajaxExec_CheckScans();
26
  break;
27
 
28
+ case 'item_action':
29
+ $aResponse = $this->ajaxExec_ScanItemAction( $oReq->post( 'item_action' ), false );
30
+ break;
31
+
32
  case 'bulk_action':
33
+ $aResponse = $this->ajaxExec_ScanItemAction( $oReq->post( 'bulk_action' ), true );
34
  break;
35
 
 
36
  case 'item_asset_deactivate':
37
  case 'item_asset_reinstall':
38
  case 'item_delete':
66
  $sScanSlug = Services::Request()->post( 'fScan' );
67
  switch ( $sScanSlug ) {
68
 
69
+ case 'aggregate':
70
+ $oTableBuilder = new Shield\Tables\Build\ScanAggregate();
71
+ break;
72
+
73
  case 'apc':
74
  $oTableBuilder = new Shield\Tables\Build\ScanApc();
75
  break;
99
  }
100
 
101
  if ( empty( $oTableBuilder ) ) {
102
+ $sHtml = '<div class="alert alert-danger m-0">SCAN SLUG NOT SUPPORTED</div>';
103
  }
104
  else {
105
  $sHtml = $oTableBuilder
106
  ->setMod( $oMod )
107
  ->setDbHandler( $oMod->getDbHandler_ScanResults() )
 
108
  ->buildTable();
109
  }
110
 
118
  * @return array
119
  */
120
  private function ajaxExec_PluginReinstall() {
121
+ /** @var \ICWP_WPSF_FeatureHandler_HackProtect $oMod */
122
  $oMod = $this->getMod();
123
  $oReq = Services::Request();
124
 
127
  $sFile = sanitize_text_field( wp_unslash( $oReq->post( 'file' ) ) );
128
 
129
  if ( $bReinstall ) {
130
+ /** @var Scan\Controller\Ptg $oPtgScan */
131
+ $oPtgScan = $oMod->getScanCon( 'ptg' );
132
+ $bActivate = $oPtgScan->actionPluginReinstall( $sFile );
 
 
 
133
  }
134
 
135
  if ( $bActivate ) {
141
 
142
  /**
143
  * @param string $sAction
144
+ * @param bool $bIsBulkAction
145
  * @return array
146
  */
147
+ private function ajaxExec_ScanItemAction( $sAction, $bIsBulkAction = false ) {
148
  /** @var \ICWP_WPSF_FeatureHandler_HackProtect $oMod */
149
  $oMod = $this->getMod();
 
 
150
 
151
  $bSuccess = false;
152
 
153
+ if ( $sAction == 'download' ) {
154
+ // A special case since this action is handled using Javascript
155
+ $bSuccess = true;
156
+ $sMessage = __( 'File download has started.', 'wp-simple-firewall' );
 
 
 
 
 
 
 
 
 
 
157
  }
158
  else {
159
+ if ( $bIsBulkAction ) {
160
+ $aItemIdsToProcess = (array)Services::Request()->post( 'ids', [] );
161
  }
162
+ else {
163
+ $aItemIdsToProcess = [ Services::Request()->post( 'rid' ) ];
164
+ }
165
+ /** @var int[] $aItemIdsToProcess */
166
+ $aItemIdsToProcess = array_filter( array_map( 'intval', $aItemIdsToProcess ) );
167
 
168
+ if ( empty( $aItemIdsToProcess ) ) {
169
+ $sMessage = __( 'Unsupported item(s) selected', 'wp-simple-firewall' );
170
+ }
171
+ else {
172
+ try {
173
+ $aScanSlugs = [];
174
+ $aSuccessfulItems = [];
175
+ foreach ( $aItemIdsToProcess as $nId ) {
176
+ /** @var Shield\Databases\Scanner\EntryVO $oEntry */
177
+ $oEntry = $oMod->getDbHandler_ScanResults()
178
+ ->getQuerySelector()
179
+ ->byId( $nId );
180
+ if ( $oEntry instanceof Shield\Databases\Scanner\EntryVO ) {
181
+ $aScanSlugs[] = $oEntry->scan;
182
+ if ( $oMod->getScanCon( $oEntry->scan )->executeItemAction( $nId, $sAction ) ) {
183
+ $aSuccessfulItems[] = $nId;
184
+ }
185
+ }
186
  }
 
187
 
188
+ if ( count( $aSuccessfulItems ) === count( $aItemIdsToProcess ) ) {
189
+ $bSuccess = true;
190
+ $sMessage = __( 'Action successful.' );
191
+ }
192
+ else {
193
+ $sMessage = __( 'An error occurred.' ).' '.__( 'Some items may not have been processed.' );
194
+ }
195
 
196
+ // We don't rescan for ignores.
197
+ if ( in_array( $sAction, [ 'ignore' ] ) ) {
198
+ $sMessage .= ' '.__( 'Reloading', 'wp-simple-firewall' ).' ...';
199
+ }
200
+ else {
201
+ // rescan
202
+ $oMod->getScanController()->startScans( $aScanSlugs );
203
+ $sMessage .= ' '.__( 'Rescanning', 'wp-simple-firewall' ).' ...';
204
+ }
205
  }
206
+ catch ( \Exception $oE ) {
207
+ $sMessage = $oE->getMessage();
208
  }
209
  }
 
 
 
210
  }
211
 
212
  return [
213
  'success' => $bSuccess,
214
+ 'page_reload' => !in_array( $sAction, [ 'download' ] ),
215
  'message' => $sMessage,
216
  ];
217
  }
222
  private function ajaxExec_CheckScans() {
223
  /** @var \ICWP_WPSF_FeatureHandler_HackProtect $oMod */
224
  $oMod = $this->getMod();
 
 
225
  /** @var Strings $oStrings */
226
  $oStrings = $oMod->getStrings();
 
227
  /** @var Shield\Databases\ScanQueue\Select $oSel */
228
+ $oSel = $oMod->getDbHandler_ScanQueue()->getQuerySelector();
229
 
230
  $oQueCon = $oMod->getScanController();
231
  $sCurrent = $oSel->getCurrentScan();
270
  $sMessage = __( 'No scans were selected', 'wp-simple-firewall' );
271
  $aFormParams = $this->getAjaxFormParams();
272
 
 
 
 
273
  $oScanCon = $oMod->getScanController();
274
 
275
  if ( !empty( $aFormParams ) ) {
281
 
282
  $aScansToStart = [];
283
  foreach ( $aSelectedScans as $sScanSlug ) {
284
+ $oThisScanCon = $oMod->getScanCon( $sScanSlug );
285
+ if ( !empty( $oThisScanCon ) && $oThisScanCon->isScanningAvailable() ) {
286
 
 
 
 
 
287
  $aScansToStart[] = $sScanSlug;
288
 
289
  if ( isset( $aFormParams[ 'opt_clear_ignore' ] ) ) {
290
+ $oThisScanCon->resetIgnoreStatus();
291
  }
292
  if ( isset( $aFormParams[ 'opt_clear_notification' ] ) ) {
293
+ $oThisScanCon->resetNotifiedStatus();
294
  }
295
 
296
  $bSuccess = true;
297
  $bPageReload = true;
298
+ $sMessage = __( 'Scans started.', 'wp-simple-firewall' ).' '.__( 'Please wait, as this will take a few moments.', 'wp-simple-firewall' );
 
 
 
299
  }
300
  }
301
  $oScanCon->startScans( $aScansToStart );
src/lib/src/Modules/HackGuard/Lib/Snapshots/Build/BuildHashesForAsset.php ADDED
@@ -0,0 +1,48 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace FernleafSystems\Wordpress\Plugin\Shield\Modules\HackGuard\Lib\Snapshots\Build;
4
+
5
+ use FernleafSystems\Wordpress\Plugin\Shield\Modules\HackGuard\Lib\Snapshots\Build\BuildHashesFromDir;
6
+ use FernleafSystems\Wordpress\Services\Core\VOs\WpPluginVo;
7
+ use FernleafSystems\Wordpress\Services\Core\VOs\WpThemeVo;
8
+
9
+ /**
10
+ * Class BuildHashesForAsset
11
+ * @package FernleafSystems\Wordpress\Plugin\Shield\Modules\HackGuard\Lib\Snapshots\Build
12
+ */
13
+ class BuildHashesForAsset {
14
+
15
+ /**
16
+ * @var string
17
+ */
18
+ private $sHashAlgo = 'md5';
19
+
20
+ /**
21
+ * All file keys are their normalised file paths, with the ABSPATH stripped from it.
22
+ * @param WpPluginVo|WpThemeVo $oAsset
23
+ * @return string[]
24
+ */
25
+ public function build( $oAsset ) {
26
+ return ( new BuildHashesFromDir() )
27
+ ->setHashAlgo( $this->getHashAlgo() )
28
+ ->setDepth( 0 )
29
+ ->setFileExts( [] )
30
+ ->build( $oAsset->getInstallDir() );
31
+ }
32
+
33
+ /**
34
+ * @return string
35
+ */
36
+ public function getHashAlgo() {
37
+ return empty( $this->sHashAlgo ) ? 'md5' : $this->sHashAlgo;
38
+ }
39
+
40
+ /**
41
+ * @param string $sHashAlgo
42
+ * @return static
43
+ */
44
+ public function setHashAlgo( $sHashAlgo ) {
45
+ $this->sHashAlgo = $sHashAlgo;
46
+ return $this;
47
+ }
48
+ }
src/lib/src/Modules/HackGuard/Lib/Snapshots/Build/BuildHashesFromApi.php ADDED
@@ -0,0 +1,88 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace FernleafSystems\Wordpress\Plugin\Shield\Modules\HackGuard\Lib\Snapshots\Build;
4
+
5
+ use FernleafSystems\Wordpress\Services\Core\VOs;
6
+ use FernleafSystems\Wordpress\Services\Utilities\Integrations\WpHashes\Hashes;
7
+
8
+ /**
9
+ * Class BuildHashesFromApi
10
+ * @package FernleafSystems\Wordpress\Plugin\Shield\Modules\HackGuard\Lib\Snapshots\Build
11
+ */
12
+ class BuildHashesFromApi {
13
+
14
+ /**
15
+ * All file keys are their normalised file paths, with the ABSPATH stripped from it.
16
+ * @param VOs\WpPluginVo|VOs\WpThemeVo $oAsset
17
+ * @return string[] - keys are file paths relative to ABSPATH
18
+ * @throws \Exception
19
+ */
20
+ public function build( $oAsset ) {
21
+ if ( !$oAsset->isWpOrg() ) {
22
+
23
+ $bApiSupport = false;
24
+
25
+ $aApiInfo = ( new Hashes\ApiInfo() )
26
+ ->setUseQueryCache( true )
27
+ ->getInfo();
28
+ if ( is_array( $aApiInfo ) && !empty( $aApiInfo[ 'supported_premium' ] ) ) {
29
+ if ( $oAsset instanceof VOs\WpPluginVo ) {
30
+ $sSlug = $oAsset->slug;
31
+ $sFile = $oAsset->file;
32
+ $sName = $oAsset->Name;
33
+ $aItems = $aApiInfo[ 'supported_premium' ][ 'plugins' ];
34
+ }
35
+ else {
36
+ $sSlug = $oAsset->stylesheet;
37
+ $sFile = $oAsset->stylesheet;
38
+ $sName = $oAsset->wp_theme->get( 'Name' );
39
+ $aItems = $aApiInfo[ 'supported_premium' ][ 'themes' ];
40
+ }
41
+
42
+ foreach ( $aItems as $aMaybeItem ) {
43
+
44
+ if ( $aMaybeItem[ 'slug' ] == $sSlug
45
+ || $aMaybeItem[ 'name' ] == $sName || $aMaybeItem[ 'file' ] == $sFile ) {
46
+ $bApiSupport = true;
47
+ if ( $oAsset instanceof VOs\WpPluginVo && empty( $oAsset->slug ) ) {
48
+ $oAsset->slug = $aMaybeItem[ 'slug' ];
49
+ }
50
+ break;
51
+ }
52
+ }
53
+ }
54
+
55
+ if ( !$bApiSupport ) {
56
+ throw new \Exception( 'Not a WordPress.org asset.' );
57
+ }
58
+ }
59
+ return $this->retrieveForAsset( $oAsset );
60
+ }
61
+
62
+ /**
63
+ * @param VOs\WpPluginVo|VOs\WpThemeVo $oAsset
64
+ * @return string[]|null
65
+ * @throws \Exception
66
+ */
67
+ private function retrieveForAsset( $oAsset ) {
68
+
69
+ if ( $oAsset instanceof VOs\WpPluginVo ) {
70
+ $aHashes = ( new Hashes\Plugin() )
71
+ ->setUseQueryCache( true )
72
+ ->getHashes( $oAsset->slug, $oAsset->Version, 'md5' );
73
+ }
74
+ elseif ( $oAsset instanceof VOs\WpThemeVo ) {
75
+ if ( $oAsset->is_child ) {
76
+ throw new \Exception( 'Live hashes are not supported for child themes.' );
77
+ }
78
+ $aHashes = ( new Hashes\Theme() )
79
+ ->setUseQueryCache( true )
80
+ ->getHashes( $oAsset->stylesheet, $oAsset->version, 'md5' );
81
+ }
82
+ else {
83
+ throw new \Exception( 'Not a supported asset type' );
84
+ }
85
+
86
+ return $aHashes;
87
+ }
88
+ }
src/lib/src/Modules/HackGuard/Lib/Snapshots/Build/BuildHashesFromDir.php ADDED
@@ -0,0 +1,84 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace FernleafSystems\Wordpress\Plugin\Shield\Modules\HackGuard\Lib\Snapshots\Build;
4
+
5
+ use FernleafSystems\Wordpress\Plugin\Shield\Scans\Helpers\StandardDirectoryIterator;
6
+
7
+ /**
8
+ * Class BuildHashesFromDir
9
+ * @package FernleafSystems\Wordpress\Plugin\Shield\Modules\HackGuard\Lib\Snapshots\Build
10
+ */
11
+ class BuildHashesFromDir {
12
+
13
+ /**
14
+ * @var int
15
+ */
16
+ protected $nDepth = 0;
17
+
18
+ /**
19
+ * @var string[]
20
+ */
21
+ protected $aFileExts = [];
22
+
23
+ /**
24
+ * @var string
25
+ */
26
+ private $sHashAlgo = 'md5';
27
+
28
+ /**
29
+ * All file keys are their normalised file paths, with the ABSPATH stripped from it.
30
+ * @param string $sDir
31
+ * @return string[]
32
+ */
33
+ public function build( $sDir ) {
34
+ $aSnaps = [];
35
+ try {
36
+ $sDir = wp_normalize_path( $sDir );
37
+ $sAlgo = $this->getHashAlgo();
38
+ $oDirIt = StandardDirectoryIterator::create( $sDir, $this->nDepth, $this->aFileExts );
39
+ foreach ( $oDirIt as $oFile ) {
40
+ /** @var \SplFileInfo $oFile */
41
+ $sFullPath = $oFile->getPathname();
42
+ $sKey = str_replace( $sDir, '', wp_normalize_path( $sFullPath ) );
43
+ $aSnaps[ $sKey ] = hash_file( $sAlgo, $sFullPath );
44
+ }
45
+ }
46
+ catch ( \Exception $oE ) {
47
+ }
48
+ return $aSnaps;
49
+ }
50
+
51
+ /**
52
+ * @return string
53
+ */
54
+ public function getHashAlgo() {
55
+ return empty( $this->sHashAlgo ) ? 'md5' : $this->sHashAlgo;
56
+ }
57
+
58
+ /**
59
+ * @param int $nDepth
60
+ * @return $this
61
+ */
62
+ public function setDepth( $nDepth ) {
63
+ $this->nDepth = max( 0, (int)$nDepth );
64
+ return $this;
65
+ }
66
+
67
+ /**
68
+ * @param string[] $aExts
69
+ * @return $this
70
+ */
71
+ public function setFileExts( $aExts ) {
72
+ $this->aFileExts = $aExts;
73
+ return $this;
74
+ }
75
+
76
+ /**
77
+ * @param string $sHashAlgo
78
+ * @return static
79
+ */
80
+ public function setHashAlgo( $sHashAlgo ) {
81
+ $this->sHashAlgo = $sHashAlgo;
82
+ return $this;
83
+ }
84
+ }
src/lib/src/Modules/HackGuard/Lib/Snapshots/FindAssetsToSnap.php ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace FernleafSystems\Wordpress\Plugin\Shield\Modules\HackGuard\Lib\Snapshots;
4
+
5
+ use FernleafSystems\Wordpress\Plugin\Shield\Modules\ModConsumer;
6
+ use FernleafSystems\Wordpress\Services\Core\VOs;
7
+ use FernleafSystems\Wordpress\Services\Services;
8
+
9
+ class FindAssetsToSnap {
10
+
11
+ use ModConsumer;
12
+
13
+ /**
14
+ * @return VOs\WpPluginVo[]|VOs\WpThemeVo[]
15
+ */
16
+ public function run() {
17
+ $aAssets = [];
18
+
19
+ foreach ( Services::WpPlugins()->getPluginsAsVo() as $oAsset ) {
20
+ if ( $oAsset->active ) {
21
+ $aAssets[] = $oAsset;
22
+ }
23
+ }
24
+
25
+ $oWPT = Services::WpThemes();
26
+ $oAsset = $oWPT->getThemeAsVo( $oWPT->getCurrent()->get_stylesheet() );
27
+ $aAssets[] = $oAsset;
28
+
29
+ if ( $oWPT->isActiveThemeAChild() ) {
30
+ $oAsset = $oWPT->getThemeAsVo( $oAsset->wp_theme->get_template() );
31
+ $aAssets[] = $oAsset;
32
+ }
33
+
34
+ return $aAssets;
35
+ }
36
+ }
src/lib/src/Modules/HackGuard/Lib/Snapshots/Store.php ADDED
@@ -0,0 +1,277 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace FernleafSystems\Wordpress\Plugin\Shield\Modules\HackGuard\Lib\Snapshots;
4
+
5
+ use FernleafSystems\Wordpress\Services\Core\VOs\WpPluginVo;
6
+ use FernleafSystems\Wordpress\Services\Core\VOs\WpThemeVo;
7
+ use FernleafSystems\Wordpress\Services\Services;
8
+
9
+ class Store {
10
+
11
+ const SEPARATOR = '=::=';
12
+
13
+ /**
14
+ * @var array
15
+ */
16
+ private $aSnapMeta;
17
+
18
+ /**
19
+ * @var array
20
+ */
21
+ private $aSnapData;
22
+
23
+ /**
24
+ * @var WpPluginVo|WpThemeVo
25
+ */
26
+ private $oAsset;
27
+
28
+ /**
29
+ * @var string
30
+ */
31
+ protected $sWorkingDir;
32
+
33
+ /**
34
+ * Store constructor.
35
+ * @param WpPluginVo|WpThemeVo $oAsset
36
+ */
37
+ public function __construct( $oAsset ) {
38
+ $this->oAsset = $oAsset;
39
+ }
40
+
41
+ /**
42
+ * @return WpPluginVo|WpThemeVo
43
+ */
44
+ public function getAsset() {
45
+ return $this->oAsset;
46
+ }
47
+
48
+ /**
49
+ * @return string
50
+ */
51
+ public function getContext() {
52
+ return ( $this->getAsset() instanceof WpPluginVo ) ? 'plugins' : 'themes';
53
+ }
54
+
55
+ /**
56
+ * @return string
57
+ */
58
+ public function getSnapStorePath() {
59
+ return $this->getBaseSnapPath().'.txt';
60
+ }
61
+
62
+ /**
63
+ * @return string
64
+ */
65
+ public function getSnapStoreMetaPath() {
66
+ return $this->getBaseSnapPath().'_meta'.'.txt';
67
+ }
68
+
69
+ /**
70
+ * @return string
71
+ */
72
+ private function getBaseSnapPath() {
73
+ return path_join( $this->getWorkingDir(), path_join( $this->getContext(), $this->getSlug() ) );
74
+ }
75
+
76
+ /**
77
+ * @return string
78
+ */
79
+ public function getWorkingDir() {
80
+ return $this->sWorkingDir;
81
+ }
82
+
83
+ /**
84
+ * @return string
85
+ */
86
+ protected function getSlug() {
87
+ $oAs = $this->getAsset();
88
+ return ( $oAs instanceof WpPluginVo ) ? dirname( $oAs->file ) : $oAs->stylesheet;
89
+ }
90
+
91
+ /**
92
+ * @return string[]
93
+ */
94
+ public function getSnapData() {
95
+ if ( !is_array( $this->aSnapData ) ) {
96
+ $this->loadSnapDataIfExists();
97
+ }
98
+ return is_array( $this->aSnapData ) ? $this->aSnapData : [];
99
+ }
100
+
101
+ /**
102
+ * @return array[]
103
+ */
104
+ public function getSnapMeta() {
105
+ if ( empty( $this->aSnapMeta ) ) {
106
+ $this->loadSnapMetaIfExists();
107
+ }
108
+ return is_array( $this->aSnapMeta ) ? $this->aSnapMeta : [];
109
+ }
110
+
111
+ /**
112
+ * @return $this
113
+ */
114
+ private function loadSnapDataIfExists() {
115
+ try {
116
+ $this->aSnapData = $this->readSnapData();
117
+ }
118
+ catch ( \Exception $oE ) {
119
+ $this->aSnapData = [];
120
+ }
121
+ return $this;
122
+ }
123
+
124
+ /**
125
+ * @return $this
126
+ */
127
+ private function loadSnapMetaIfExists() {
128
+ try {
129
+ $this->aSnapMeta = $this->readSnapMeta();
130
+ }
131
+ catch ( \Exception $oE ) {
132
+ $this->aSnapMeta = [];
133
+ }
134
+ return $this;
135
+ }
136
+
137
+ /**
138
+ * @throws \Exception
139
+ */
140
+ private function readSnapData() {
141
+ $oFS = Services::WpFs();
142
+
143
+ if ( $this->isReady() && !$this->getSnapStoreExists() ) {
144
+ throw new \Exception( sprintf( 'Snapshot store does not exist: "%s"', $this->getSnapStorePath() ) );
145
+ }
146
+
147
+ $sEncoded = $oFS->getFileContent( $this->getSnapStorePath(), true );
148
+ if ( !empty( $sEncoded ) ) {
149
+ $aSnap = [];
150
+ foreach ( array_map( 'trim', explode( "\n", $sEncoded ) ) as $sLine ) {
151
+ list( $sFile, $sHash ) = explode( self::SEPARATOR, $sLine, 2 );
152
+ $aSnap[ $sFile ] = $sHash;
153
+ }
154
+ }
155
+ if ( empty( $aSnap ) ) {
156
+ throw new \Exception( 'Snapshot data could not be decoded' );
157
+ }
158
+
159
+ return $aSnap;
160
+ }
161
+
162
+ /**
163
+ * @throws \Exception
164
+ */
165
+ private function readSnapMeta() {
166
+ $oFS = Services::WpFs();
167
+
168
+ if ( $this->isReady() && !$this->getSnapStoreExists() ) {
169
+ throw new \Exception( sprintf( 'Snapshot store does not exist: "%s"', $this->getSnapStorePath() ) );
170
+ }
171
+
172
+ $sEncoded = $oFS->getFileContent( $this->getSnapStoreMetaPath(), true );
173
+ if ( !empty( $sEncoded ) ) {
174
+ $aData = json_decode( $sEncoded, true );
175
+ }
176
+ if ( empty( $aData ) || !is_array( $aData ) ) {
177
+ throw new \Exception( 'Snapshot data could not be decoded' );
178
+ }
179
+
180
+ return $aData;
181
+ }
182
+
183
+ /**
184
+ * @return $this
185
+ * @throws \Exception
186
+ */
187
+ public function save() {
188
+ if ( $this->isReady() ) {
189
+ $aToWrite = [];
190
+ foreach ( $this->getSnapData() as $sFile => $sHash ) {
191
+ $aToWrite[] = sprintf( '%s%s%s', $sFile, self::SEPARATOR, $sHash );
192
+ }
193
+ Services::WpFs()->putFileContent(
194
+ $this->getSnapStorePath(),
195
+ implode( "\n", $aToWrite ),
196
+ true
197
+ );
198
+ Services::WpFs()->putFileContent(
199
+ $this->getSnapStoreMetaPath(),
200
+ json_encode( $this->getSnapMeta() ),
201
+ true
202
+ );
203
+ }
204
+ return $this;
205
+ }
206
+
207
+ /**
208
+ * @return bool
209
+ * @throws \Exception
210
+ */
211
+ protected function isReady() {
212
+ $oFS = Services::WpFs();
213
+ $sDir = dirname( $this->getSnapStorePath() );
214
+
215
+ if ( strlen( $this->getContext() ) < 1 ) {
216
+ throw new \Exception( 'Context has not been specified' );
217
+ }
218
+ if ( !$oFS->mkdir( $sDir ) ) {
219
+ throw new \Exception( sprintf( 'Store directory could not be created: %s', $sDir ) );
220
+ }
221
+ if ( !$oFS->exists( $sDir ) ) {
222
+ throw new \Exception( sprintf( 'Store directory path does not exist: %s', $sDir ) );
223
+ }
224
+ return true;
225
+ }
226
+
227
+ /**
228
+ * @return bool
229
+ */
230
+ public function getSnapStoreExists() {
231
+ return Services::WpFs()->exists( $this->getSnapStorePath() ) && $this->isSnapStoreRelevant();
232
+ }
233
+
234
+ /**
235
+ * We try to capture periods wherein which the plugin may have been deactivated and tracking has paused.
236
+ * @return bool
237
+ */
238
+ private function isSnapStoreRelevant() {
239
+ $bRelevant = true;
240
+ $oFs = Services::WpFs();
241
+ $mTime = Services::Request()->ts() - $oFs->getModifiedTime( $this->getSnapStorePath() );
242
+ if ( $mTime > DAY_IN_SECONDS ) {
243
+ $bRelevant = false;
244
+ }
245
+ elseif ( $mTime > DAY_IN_SECONDS/2 ) {
246
+ $oFs->touch( $this->getSnapStorePath() );
247
+ }
248
+ return $bRelevant;
249
+ }
250
+
251
+ /**
252
+ * @param array $aData
253
+ * @return $this
254
+ */
255
+ public function setSnapData( $aData ) {
256
+ $this->aSnapData = $aData;
257
+ return $this;
258
+ }
259
+
260
+ /**
261
+ * @param array $aMeta
262
+ * @return $this
263
+ */
264
+ public function setSnapMeta( $aMeta ) {
265
+ $this->aSnapMeta = $aMeta;
266
+ return $this;
267
+ }
268
+
269
+ /**
270
+ * @param string $sDir
271
+ * @return $this
272
+ */
273
+ public function setWorkingDir( $sDir ) {
274
+ $this->sWorkingDir = $sDir;
275
+ return $this;
276
+ }
277
+ }
src/lib/src/Modules/HackGuard/Lib/Snapshots/StoreAction/BaseAction.php ADDED
@@ -0,0 +1,48 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace FernleafSystems\Wordpress\Plugin\Shield\Modules\HackGuard\Lib\Snapshots\StoreAction;
4
+
5
+ use FernleafSystems\Wordpress\Plugin\Shield\Modules\ModConsumer;
6
+ use FernleafSystems\Wordpress\Plugin\Shield\Modules\HackGuard\Lib\Snapshots;
7
+ use FernleafSystems\Wordpress\Services\Core\VOs\WpPluginVo;
8
+ use FernleafSystems\Wordpress\Services\Core\VOs\WpThemeVo;
9
+
10
+ class BaseAction {
11
+
12
+ use ModConsumer;
13
+
14
+ /**
15
+ * @var WpPluginVo|WpThemeVo
16
+ */
17
+ private $oAsset;
18
+
19
+ public function __construct() {
20
+ }
21
+
22
+ /**
23
+ * @return WpPluginVo|WpThemeVo
24
+ */
25
+ public function getAsset() {
26
+ return $this->oAsset;
27
+ }
28
+
29
+ /**
30
+ * @param WpPluginVo|WpThemeVo $oAsset
31
+ * @return static
32
+ */
33
+ public function setAsset( $oAsset ) {
34
+ $this->oAsset = $oAsset;
35
+ return $this;
36
+ }
37
+
38
+ /**
39
+ * @return Snapshots\Store
40
+ * @throws \Exception
41
+ */
42
+ protected function getNewStore() {
43
+ /** @var \ICWP_WPSF_FeatureHandler_HackProtect $oMod */
44
+ $oMod = $this->getMod();
45
+ return ( new Snapshots\Store( $this->getAsset() ) )
46
+ ->setWorkingDir( $oMod->getPtgSnapsBaseDir() );
47
+ }
48
+ }
src/lib/src/Modules/HackGuard/Lib/Snapshots/StoreAction/BaseBulk.php ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace FernleafSystems\Wordpress\Plugin\Shield\Modules\HackGuard\Lib\Snapshots\StoreAction;
4
+
5
+ use FernleafSystems\Wordpress\Plugin\Shield\Modules\ModConsumer;
6
+
7
+ class BaseBulk {
8
+
9
+ use ModConsumer;
10
+ }
src/lib/src/Modules/HackGuard/Lib/Snapshots/StoreAction/Build.php ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace FernleafSystems\Wordpress\Plugin\Shield\Modules\HackGuard\Lib\Snapshots\StoreAction;
4
+
5
+ use FernleafSystems\Wordpress\Plugin\Shield\Modules\HackGuard\Lib\Snapshots;
6
+ use FernleafSystems\Wordpress\Services\Core\VOs\WpPluginVo;
7
+ use FernleafSystems\Wordpress\Services\Services;
8
+
9
+ class Build extends BaseAction {
10
+
11
+ /**
12
+ * @throws \Exception
13
+ */
14
+ public function run() {
15
+ $oAsset = $this->getAsset();
16
+ try {
17
+ $aHashes = ( new Snapshots\Build\BuildHashesFromApi() )->build( $oAsset );
18
+ }
19
+ catch ( \Exception $oE ) {
20
+ }
21
+
22
+ $aMeta = $this->generateMeta();
23
+ if ( empty( $aHashes ) ) {
24
+ $aHashes = ( new Snapshots\Build\BuildHashesForAsset() )
25
+ ->setHashAlgo( 'md5' )
26
+ ->build( $oAsset );
27
+ $aMeta[ 'live_hashes' ] = false;
28
+ }
29
+ else {
30
+ $aMeta[ 'live_hashes' ] = true;
31
+ }
32
+
33
+ if ( !empty( $aHashes ) ) {
34
+ /** @var \ICWP_WPSF_FeatureHandler_HackProtect $oMod */
35
+ $oMod = $this->getMod();
36
+ $oStore = ( new CreateNew() )
37
+ ->setMod( $oMod )
38
+ ->setAsset( $oAsset )
39
+ ->run();
40
+ $oStore->setSnapData( $aHashes )
41
+ ->setSnapMeta( $aMeta )
42
+ ->save();
43
+ }
44
+ }
45
+
46
+ /**
47
+ * @return array
48
+ */
49
+ private function generateMeta() {
50
+ $oAsset = $this->getAsset();
51
+ $aMeta = [
52
+ 'ts' => Services::Request()->ts(),
53
+ 'snap_version' => $this->getCon()->getVersion(),
54
+ ];
55
+ $aMeta[ 'unique_id' ] = ( $oAsset instanceof WpPluginVo ) ?
56
+ $oAsset->file
57
+ : $oAsset->stylesheet;
58
+ $aMeta[ 'name' ] = ( $oAsset instanceof WpPluginVo ) ?
59
+ $oAsset->Name
60
+ : $oAsset->wp_theme->get( 'Name' );
61
+ $aMeta[ 'version' ] = $oAsset->version;
62
+ return $aMeta;
63
+ }
64
+ }
src/lib/src/Modules/HackGuard/Lib/Snapshots/StoreAction/BuildAll.php ADDED
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace FernleafSystems\Wordpress\Plugin\Shield\Modules\HackGuard\Lib\Snapshots\StoreAction;
4
+
5
+ use FernleafSystems\Wordpress\Plugin\Shield\Modules\HackGuard\Lib\Snapshots\FindAssetsToSnap;
6
+ use FernleafSystems\Wordpress\Services\Core\VOs;
7
+
8
+ /**
9
+ * Class BuildAll
10
+ * @package FernleafSystems\Wordpress\Plugin\Shield\Modules\HackGuard\Lib\Snapshots\StoreAction
11
+ * @deprecated 8.5.2
12
+ */
13
+ class BuildAll extends BaseBulk {
14
+
15
+ public function build() {
16
+ forea