IP Geo Block - Version 3.0.5

Version Description

  • New feature: Add "Live update" mode on "Logs" tab.
  • Improvement: List all the IP addresses in cache are now displayed and manageable on "Statistics" tab.
  • Improvement: Add "Either blocked or passed" as a new condition for recording logs. It enables to verify the requests "passed" from the blacklisted countries or the countries not in the whitelist.
  • Improvement: Add two new filter hooks to utilize Google APIs from native domain in China.
  • See 3.0.5 release note for some details.
Download this release

Release Info

Developer tokkonopapa
Plugin Icon 128x128 IP Geo Block
Version 3.0.5
Comparing to
See all releases

Code changes from version 3.0.4.6 to 3.0.5

Files changed (58) hide show
  1. README.txt +10 -3
  2. admin/class-ip-geo-block-admin.php +242 -92
  3. admin/css/admin-icons.css +41 -0
  4. admin/css/admin-icons.min.css +2 -0
  5. admin/css/admin.css +462 -153
  6. admin/css/admin.min.css +6 -2
  7. admin/css/fonts/icomoon.eot +0 -0
  8. admin/css/fonts/icomoon.svg +35 -0
  9. admin/css/fonts/icomoon.ttf +0 -0
  10. admin/css/fonts/icomoon.woff +0 -0
  11. admin/datatables/css/datatables-all.css +642 -0
  12. admin/datatables/css/datatables-all.min.css +13 -0
  13. admin/datatables/css/datatables.mark.css +9 -0
  14. admin/datatables/css/datatables.mark.min.css +1 -0
  15. admin/datatables/css/jquery.dataTables.css +449 -0
  16. admin/datatables/css/jquery.dataTables.min.css +1 -0
  17. admin/datatables/css/responsive.dataTables.css +182 -0
  18. admin/datatables/css/responsive.dataTables.min.css +1 -0
  19. admin/datatables/images/Sorting icons.psd +0 -0
  20. admin/datatables/images/favicon.ico +0 -0
  21. admin/datatables/images/sort_asc.png +0 -0
  22. admin/datatables/images/sort_asc_disabled.png +0 -0
  23. admin/datatables/images/sort_both.png +0 -0
  24. admin/datatables/images/sort_desc.png +0 -0
  25. admin/datatables/images/sort_desc_disabled.png +0 -0
  26. admin/datatables/js/LICENSE +21 -0
  27. admin/datatables/js/dataTables.responsive.js +1255 -0
  28. admin/datatables/js/dataTables.responsive.min.js +26 -0
  29. admin/datatables/js/datatables-all.js +17649 -0
  30. admin/datatables/js/datatables-all.min.js +204 -0
  31. admin/datatables/js/datatables.mark.js +114 -0
  32. admin/datatables/js/datatables.mark.min.js +7 -0
  33. admin/datatables/js/jquery.dataTables.js +15243 -0
  34. admin/datatables/js/jquery.dataTables.min.js +164 -0
  35. admin/datatables/js/jquery.mark.js +1034 -0
  36. admin/datatables/js/jquery.mark.min.js +7 -0
  37. admin/datatables/license.txt +20 -0
  38. admin/includes/class-admin-ajax.php +205 -43
  39. admin/includes/tab-accesslog.php +96 -84
  40. admin/includes/tab-geolocation.php +7 -3
  41. admin/includes/tab-network.php +134 -65
  42. admin/includes/tab-settings.php +89 -39
  43. admin/includes/tab-statistics.php +82 -88
  44. admin/js/admin.js +765 -174
  45. admin/js/admin.min.js +1 -1
  46. admin/js/authenticate.js +17 -0
  47. classes/class-ip-geo-block-cron.php +1 -1
  48. classes/class-ip-geo-block-logs.php +230 -58
  49. classes/class-ip-geo-block-opts.php +12 -4
  50. classes/class-ip-geo-block.php +23 -23
  51. includes/Net/DNS2/RR/NSAP.php +1 -1
  52. ip-geo-block.php +1 -1
  53. languages/ip-geo-block-ja.mo +0 -0
  54. languages/ip-geo-block-ja.po +532 -358
  55. languages/ip-geo-block.mo +0 -0
  56. languages/ip-geo-block.po +462 -298
  57. languages/ip-geo-block.pot +462 -300
  58. rewrite.php +2 -3
README.txt CHANGED
@@ -3,8 +3,8 @@ Contributors: tokkonopapa
3
Donate link:
4
Tags: security, firewall, brute force, vulnerability, login, wp-admin, admin, ajax, xmlrpc, comment, pingback, trackback, spam, IP address, geo, geolocation, buddypress, bbPress
5
Requires at least: 3.7
6
- Tested up to: 4.8.2
7
- Stable tag: 3.0.4.6
8
License: GPLv2 or later
9
License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
@@ -266,7 +266,7 @@ You can add an IP address to the `X-Forwarded-For` header to emulate the access
266
267
See more details at "[How to test prevention of attacks](http://www.ipgeoblock.com/codex/#how-to-test-prevention-of-attacks 'Codex | IP Geo Block')".
268
269
- = I was locked down. What shall I do? =
270
271
You can find the "**Emergent Functionality**" code section near the bottom of `ip-geo-block.php`. This code block can be activated by replacing `/*` (opening multi-line comment) at the top of the line to `//` (single line comment), or `*` at the end of the line to `*/` (closing multi-line comment).
272
@@ -352,6 +352,13 @@ Please refer to "[How can I fix permission troubles?](http://www.ipgeoblock.com/
352
353
== Changelog ==
354
355
= 3.0.4.6 =
356
* **Bug fix:** Fix the issue that the emergent functionality didn't work when the number of login attempts reached to the limit.
357
* **Bug fix:** Fix the issue that the result would be always `limited` when "Max number of failed login attempts per IP address" is "Disabled".
3
Donate link:
4
Tags: security, firewall, brute force, vulnerability, login, wp-admin, admin, ajax, xmlrpc, comment, pingback, trackback, spam, IP address, geo, geolocation, buddypress, bbPress
5
Requires at least: 3.7
6
+ Tested up to: 4.9
7
+ Stable tag: 3.0.5
8
License: GPLv2 or later
9
License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
266
267
See more details at "[How to test prevention of attacks](http://www.ipgeoblock.com/codex/#how-to-test-prevention-of-attacks 'Codex | IP Geo Block')".
268
269
+ = I'm locked out! What shall I do? =
270
271
You can find the "**Emergent Functionality**" code section near the bottom of `ip-geo-block.php`. This code block can be activated by replacing `/*` (opening multi-line comment) at the top of the line to `//` (single line comment), or `*` at the end of the line to `*/` (closing multi-line comment).
272
352
353
== Changelog ==
354
355
+ = 3.0.5 =
356
+ * **New feature:** Add "Live update" mode on "Logs" tab.
357
+ * **Improvement:** List all the IP addresses in cache are now displayed and manageable on "Statistics" tab.
358
+ * **Improvement:** Add "Either blocked or passed" as a new condition for recording logs. It enables to verify the requests "passed" from the blacklisted countries or the countries not in the whitelist.
359
+ * **Improvement:** Add two new filter hooks to utilize Google APIs from native domain in China.
360
+ * See [3.0.5 release note](http://www.ipgeoblock.com/changelog/release-3.0.5.html "3.0.5 Release Note | IP Geo Block") for some details.
361
+
362
= 3.0.4.6 =
363
* **Bug fix:** Fix the issue that the emergent functionality didn't work when the number of login attempts reached to the limit.
364
* **Bug fix:** Fix the issue that the result would be always `limited` when "Max number of failed login attempts per IP address" is "Disabled".
admin/class-ip-geo-block-admin.php CHANGED
@@ -11,6 +11,13 @@
11
12
class IP_Geo_Block_Admin {
13
14
/**
15
* Globals in this class
16
*
@@ -24,6 +31,10 @@ class IP_Geo_Block_Admin {
24
* and adding a settings page and menu.
25
*/
26
private function __construct() {
27
// Load plugin text domain and add body class
28
add_action( 'init', array( $this, 'admin_init' ) );
29
@@ -56,13 +67,13 @@ class IP_Geo_Block_Admin {
56
if ( is_multisite() ) {
57
add_action( 'network_admin_menu', array( $this, 'setup_admin_page' ) );
58
59
- // when a blog is created or deleted.
60
- add_action( 'wpmu_new_blog', array( $this, 'create_blog' ), 10, 6 ); // @since MU
61
- add_action( 'delete_blog', array( $this, 'delete_blog' ), 10, 2 ); // @since 3.0.0
62
-
63
// validate capability instead of nonce. @since 2.0.0 && 3.0.0
64
if ( $this->is_network = is_plugin_active_for_network( IP_GEO_BLOCK_BASE ) )
65
add_filter( IP_Geo_Block::PLUGIN_NAME . '-bypass-admins', array( $this, 'verify_network_redirect' ), 10, 2 );
66
}
67
68
// loads a plugin’s translated strings.
@@ -117,11 +128,9 @@ class IP_Geo_Block_Admin {
117
*
118
*/
119
public function verify_network_redirect( $queries, $settings ) {
120
- if ( IP_Geo_Block_Util::is_user_logged_in() && $settings['network_wide'] ) {
121
- if ( 'GET' === $_SERVER['REQUEST_METHOD'] && isset( $_GET['page'] ) ) {
122
- $queries[] = $_GET['page']; // $_GET['action'] should be checked in IP_Geo_Block::validate_admin()
123
- }
124
- }
125
126
return $queries;
127
}
@@ -143,7 +152,7 @@ class IP_Geo_Block_Admin {
143
IP_Geo_Block_Activate::activate_blog();
144
145
// Copy option from main blog.
146
- if ( is_plugin_active_for_network( IP_GEO_BLOCK_BASE ) && $settings['network_wide'] )
147
update_option( IP_Geo_Block::OPTION_NAME, $settings );
148
149
// Restore the main blog.
@@ -151,8 +160,8 @@ class IP_Geo_Block_Admin {
151
}
152
153
public function delete_blog( $blog_id, $drop ) {
154
- if ( $drop )
155
- IP_Geo_Block_Logs::delete_tables(); // blog is already switched to the target in wpmu_delete_blog()
156
}
157
158
/**
@@ -166,31 +175,44 @@ class IP_Geo_Block_Admin {
166
/**
167
* Register and enqueue plugin-specific style sheet and JavaScript.
168
*
169
*/
170
public function enqueue_admin_assets() {
171
$footer = TRUE;
172
$dependency = array( 'jquery' );
173
-
174
- // css for option page
175
- wp_enqueue_style( IP_Geo_Block::PLUGIN_NAME . '-admin-styles',
176
- plugins_url( ! defined( 'IP_GEO_BLOCK_DEBUG' ) || ! IP_GEO_BLOCK_DEBUG ?
177
- 'css/admin.min.css' : 'css/admin.css', __FILE__
178
- ),
179
- array(), IP_Geo_Block::VERSION
180
- );
181
182
switch ( $this->admin_tab ) {
183
- case 1:
184
- case 5:
185
// js for google chart
186
wp_register_script(
187
$addon = IP_Geo_Block::PLUGIN_NAME . '-google-chart',
188
- 'https://www.google.com/jsapi', array(), NULL, $footer
189
);
190
wp_enqueue_script( $addon );
191
break;
192
193
- case 2:
194
// js for google map
195
$settings = IP_Geo_Block::get_option();
196
if ( $key = $settings['api_key']['GoogleMap'] ) {
@@ -201,7 +223,8 @@ class IP_Geo_Block_Admin {
201
$dependency, IP_Geo_Block::VERSION, $footer
202
);
203
wp_enqueue_script( IP_Geo_Block::PLUGIN_NAME . '-google-map',
204
- '//maps.googleapis.com/maps/api/js' . ( 'default' !== $key ? "?key=$key" : '' ),
205
$dependency, IP_Geo_Block::VERSION, $footer
206
);
207
}
@@ -212,20 +235,22 @@ class IP_Geo_Block_Admin {
212
$dependency, IP_Geo_Block::VERSION, $footer
213
);
214
break;
215
-
216
- case 4:
217
- // footable https://github.com/bradvin/FooTable
218
- wp_enqueue_style( IP_Geo_Block::PLUGIN_NAME . '-footable-css',
219
- plugins_url( 'css/footable.core.min.css', __FILE__ ),
220
- array(), IP_Geo_Block::VERSION
221
- );
222
- wp_enqueue_script( IP_Geo_Block::PLUGIN_NAME . '-footable-js',
223
- plugins_url( 'js/footable.min.js', __FILE__ ),
224
- $dependency, IP_Geo_Block::VERSION, $footer
225
- );
226
- break;
227
}
228
229
// js for IP Geo Block admin page
230
wp_register_script(
231
$handle = IP_Geo_Block::PLUGIN_NAME . '-admin-script',
@@ -233,8 +258,7 @@ class IP_Geo_Block_Admin {
233
'js/admin.min.js' : 'js/admin.js', __FILE__
234
),
235
$dependency + ( isset( $addon ) ? array( $addon ) : array() ),
236
- IP_Geo_Block::VERSION,
237
- $footer
238
);
239
wp_localize_script( $handle,
240
'IP_GEO_BLOCK',
@@ -244,16 +268,37 @@ class IP_Geo_Block_Admin {
244
'url' => admin_url( 'admin-ajax.php' ),
245
'nonce' => IP_Geo_Block_Util::create_nonce( $this->get_ajax_action() ),
246
'msg' => array(
247
- __( 'Import settings ?', 'ip-geo-block' ),
248
- __( 'Create table ?', 'ip-geo-block' ),
249
- __( 'Delete table ?', 'ip-geo-block' ),
250
- __( 'Clear statistics ?', 'ip-geo-block' ),
251
- __( 'Clear cache ?', 'ip-geo-block' ),
252
- __( 'Clear logs ?', 'ip-geo-block' ),
253
- __( 'ajax for logged-in user', 'ip-geo-block' ),
254
- __( 'ajax for non logged-in user', 'ip-geo-block' ),
255
- __( 'This feature is available with HTML5 compliant browsers.', 'ip-geo-block' ),
256
),
257
)
258
);
259
wp_enqueue_script( $handle );
@@ -265,10 +310,9 @@ class IP_Geo_Block_Admin {
265
*/
266
public function add_plugin_meta_links( $links, $file ) {
267
if ( $file === IP_GEO_BLOCK_BASE ) {
268
- $title = __( 'Contribute at GitHub', 'ip-geo-block' );
269
array_push(
270
$links,
271
- "<a href=\"http://www.ipgeoblock.com\" title=\"$title\" target=_blank>$title</a>"
272
);
273
}
274
@@ -280,10 +324,9 @@ class IP_Geo_Block_Admin {
280
*
281
*/
282
public function add_action_links( $links ) {
283
return array_merge(
284
- array(
285
- 'settings' => '<a href="' . esc_url( admin_url( 'options-general.php?page=' . IP_Geo_Block::PLUGIN_NAME ) ) . '">' . __( 'Settings' ) . '</a>'
286
- ),
287
$links
288
);
289
}
@@ -342,13 +385,10 @@ class IP_Geo_Block_Admin {
342
$settings = IP_Geo_Block::get_option();
343
344
// Network wide or not
345
- $admin_menu = 'admin_menu' === current_filter();
346
- $this->is_network &= current_user_can( 'manage_network_options' ) && $settings['network_wide'];
347
-
348
- // Setup the tab number.
349
- $this->admin_tab = isset( $_GET['tab'] ) ? (int)$_GET['tab'] : 0;
350
- $this->admin_tab = min( 5, max( 0, $this->admin_tab ) );
351
352
if ( $this->is_network ) {
353
if ( $admin_menu ) {
354
$this->admin_tab = max( $this->admin_tab, 1 );
@@ -356,7 +396,7 @@ class IP_Geo_Block_Admin {
356
$this->admin_tab = 0;
357
}
358
} else {
359
- $this->admin_tab = min( 4, $this->admin_tab ); // exclude `Sites` in multisite.
360
}
361
362
if ( $admin_menu ) {
@@ -389,17 +429,31 @@ class IP_Geo_Block_Admin {
389
__( 'IP Geo Block', 'ip-geo-block' ),
390
'manage_network_options',
391
IP_Geo_Block::PLUGIN_NAME,
392
- array( $this, 'display_plugin_admin_page' ),
393
- 'dashicons-shield' // plugins_url( 'img/icon-72x72.png', __FILE__ )
394
);
395
- /*$hook = add_submenu_page(
396
- 'settings.php',
397
- __( 'IP Geo Block', 'ip-geo-block' ),
398
__( 'IP Geo Block', 'ip-geo-block' ),
399
'manage_network_options',
400
IP_Geo_Block::PLUGIN_NAME,
401
array( $this, 'display_plugin_admin_page' )
402
- );*/
403
}
404
405
// If successful, load admin assets only on this page.
@@ -413,7 +467,7 @@ class IP_Geo_Block_Admin {
413
*/
414
private function diagnose_admin_screen() {
415
$settings = IP_Geo_Block::get_option();
416
- $adminurl = $this->dashboard_url( FALSE );
417
418
// Check version and compatibility
419
if ( version_compare( get_bloginfo( 'version' ), '3.7.0' ) < 0 )
@@ -483,7 +537,7 @@ class IP_Geo_Block_Admin {
483
if ( defined( 'IP_GEO_BLOCK_DEBUG' ) && IP_GEO_BLOCK_DEBUG ) {
484
// Check creation of database table
485
if ( $settings['validation']['reclogs'] ) {
486
- if ( ( $warn = IP_Geo_Block_Logs::diag_tables() ) &&
487
( FALSE === IP_Geo_Block_Logs::create_tables() ) ) {
488
self::add_admin_notice( 'notice-warning', $warn );
489
}
@@ -527,14 +581,16 @@ class IP_Geo_Block_Admin {
527
* Get cookie that indicates open/close section
528
*
529
*/
530
- public function get_cookie( $name ) {
531
- $cookie = array();
532
- if ( ! empty( $_COOKIE[ $name ] ) ) {
533
- foreach ( explode( '&', $_COOKIE[ $name ] ) as $i => $v ) {
534
list( $i, $v ) = explode( '=', $v );
535
$cookie[ $i ] = str_split( $v );
536
}
537
}
538
return $cookie;
539
}
540
@@ -548,13 +604,14 @@ class IP_Geo_Block_Admin {
548
549
if ( isset( $wp_settings_sections[ $page ] ) ) {
550
$index = 0; // index of fieldset
551
- $cookie = $this->get_cookie( IP_Geo_Block::PLUGIN_NAME );
552
553
foreach ( (array) $wp_settings_sections[ $page ] as $section ) {
554
// TRUE if open ('o') or FALSE if close ('x')
555
$stat = empty( $cookie[ $tab ][ $index ] ) || 'x' !== $cookie[ $tab ][ $index ];
556
557
- echo '<fieldset id="', IP_Geo_Block::PLUGIN_NAME, '-section-', $index, '" class="', IP_Geo_Block::PLUGIN_NAME, '-field panel panel-default" data-section="', $index, '">', "\n",
558
'<legend class="panel-heading"><h3 class="', IP_Geo_Block::PLUGIN_NAME, ( $stat ? '-dropdown' : '-dropup' ), '">', $section['title'],
559
'</h3></legend>', "\n", '<div class="panel-body',
560
($stat ? ' ' . IP_Geo_Block::PLUGIN_NAME . '-border"' : '"'),
@@ -589,11 +646,12 @@ class IP_Geo_Block_Admin {
589
1 => __( 'Statistics', 'ip-geo-block' ),
590
4 => __( 'Logs', 'ip-geo-block' ),
591
2 => __( 'Search', 'ip-geo-block' ),
592
- 5 => __( 'Sites', 'ip-geo-block' ),
593
3 => __( 'Attribution', 'ip-geo-block' ),
594
);
595
596
$settings = IP_Geo_Block::get_option();
597
$title = esc_html( get_admin_page_title() );
598
599
// Target page that depends on the network multisite or not.
@@ -601,20 +659,21 @@ class IP_Geo_Block_Admin {
601
$action = 'options.php';
602
603
if ( $this->is_network ) {
604
- unset( $tabs[0], $tabs[5] ); // Settings, Sites
605
$title .= ' <span class="ip-geo-block-title-link">';
606
- $title .= ' [ <a href="' . esc_url( add_query_arg( array( 'page' => IP_Geo_Block::PLUGIN_NAME, 'tab' => 0 ), $this->dashboard_url( TRUE ) ) ) . '" target="_self">' . __( 'Settings', 'ip-geo-block' ) . '</a> ]';
607
- $title .= ' [ <a href="' . esc_url( add_query_arg( array( 'page' => IP_Geo_Block::PLUGIN_NAME, 'tab' => 5 ), $this->dashboard_url( TRUE ) ) ) . '" target="_self">' . __( 'Sites', 'ip-geo-block' ) . '</a> ]';
608
$title .= '</span>';
609
} else {
610
- unset( $tabs[5] ); // Sites
611
}
612
} else {
613
$action = 'edit.php?action=' . IP_Geo_Block::PLUGIN_NAME;
614
615
if ( $settings['network_wide'] ) {
616
unset( $tabs[1], $tabs[4], $tabs[2], $tabs[3] ); // Statistics, Logs, Search, Attribution
617
- $title .= ' <span class="ip-geo-block-title-link">[ ' . __( 'Network', 'ip-geo-block' ) . ' ]';
618
$title .= '</span>';
619
}
620
}
@@ -627,7 +686,16 @@ class IP_Geo_Block_Admin {
627
echo '<a href="?page=', IP_Geo_Block::PLUGIN_NAME, '&amp;tab=', $key, '" class="nav-tab', ($tab === $key ? ' nav-tab-active' : ''), '">', $val, '</a>';
628
} ?>
629
</h2>
630
- <p style="text-align:left">[ <a id="ip-geo-block-toggle-sections" href="javascript:void(0)"><?php _e( 'Toggle all', 'ip-geo-block' ); ?></a> ]</p>
631
<form method="post" action="<?php echo $action; ?>" id="<?php echo IP_Geo_Block::PLUGIN_NAME, '-', $tab; ?>"<?php if ( $tab ) echo " class=\"", IP_Geo_Block::PLUGIN_NAME, "-inhibit\""; ?>>
632
<?php
633
settings_fields( IP_Geo_Block::PLUGIN_NAME );
@@ -636,10 +704,10 @@ class IP_Geo_Block_Admin {
636
submit_button(); // @since 3.1
637
?>
638
</form>
639
- <?php if ( 2 === $tab ) { ?>
640
<div id="ip-geo-block-whois"></div>
641
<div id="ip-geo-block-map"></div>
642
- <?php } elseif ( 3 === $tab ) {
643
// show attribution (higher priority order)
644
$tab = array();
645
foreach ( IP_Geo_Block_Provider::get_addons() as $provider ) {
@@ -648,7 +716,6 @@ class IP_Geo_Block_Admin {
648
}
649
}
650
echo '<p>', implode( '<br />', $tab ), "</p>\n";
651
-
652
echo '<p>', __( 'Thanks for providing these great services for free.', 'ip-geo-block' ), "<br />\n";
653
echo __( '(Most browsers will redirect you to each site <a href="http://www.ipgeoblock.com/etc/referer.html" title="Referer Checker">without referrer when you click the link</a>.)', 'ip-geo-block' ), "</p>\n";
654
} ?>
@@ -767,7 +834,7 @@ class IP_Geo_Block_Admin {
767
echo ' data-desc="', $args['desc'][ $key ], '"';
768
$key === $args['value'] and $desc = $args['desc'][ $key ];
769
}
770
- echo ">$val</option>\n";
771
}
772
echo "</select>\n";
773
@@ -826,7 +893,7 @@ class IP_Geo_Block_Admin {
826
$output = IP_Geo_Block::get_option();
827
$default = IP_Geo_Block::get_default();
828
829
- // Integrate posted data into current settings because if can be a part of hole data
830
$input = array_replace_recursive(
831
$output = $this->preprocess_options( $output, $default ),
832
$input
@@ -1005,6 +1072,9 @@ class IP_Geo_Block_Admin {
1005
// 3.0.4 AS number
1006
$output['Maxmind']['use_asn'] = FALSE;
1007
1008
return $output;
1009
}
1010
@@ -1194,12 +1264,15 @@ class IP_Geo_Block_Admin {
1194
private function sync_multisite_option( $option ) {
1195
global $wpdb;
1196
$blog_ids = $wpdb->get_col( "SELECT `blog_id` FROM `$wpdb->blogs`" );
1197
1198
foreach ( $blog_ids as $id ) {
1199
switch_to_blog( $id );
1200
- update_option( IP_Geo_Block::OPTION_NAME, $option );
1201
restore_current_blog();
1202
}
1203
}
1204
1205
/**
@@ -1215,6 +1288,7 @@ class IP_Geo_Block_Admin {
1215
1216
require_once IP_GEO_BLOCK_PATH . 'admin/includes/class-admin-ajax.php';
1217
1218
$which = isset( $_POST['which'] ) ? $_POST['which'] : NULL;
1219
switch ( isset( $_POST['cmd' ] ) ? $_POST['cmd' ] : NULL ) {
1220
case 'download':
@@ -1266,7 +1340,7 @@ class IP_Geo_Block_Admin {
1266
IP_Geo_Block_Admin_Ajax::export_logs( $which );
1267
break;
1268
1269
- case 'restore':
1270
// Get logs from MySQL DB
1271
$res = IP_Geo_Block_Admin_Ajax::restore_logs( $which );
1272
break;
@@ -1288,10 +1362,9 @@ class IP_Geo_Block_Admin {
1288
1289
case 'gmap-error':
1290
// Reset Google Maps API key
1291
- $which = IP_Geo_Block::get_option();
1292
- if ( $which['api_key']['GoogleMap'] === 'default' ) {
1293
- $which['api_key']['GoogleMap'] = NULL;
1294
- update_option( IP_Geo_Block::OPTION_NAME, $which );
1295
$res = array(
1296
'page' => 'options-general.php?page=' . IP_Geo_Block::PLUGIN_NAME,
1297
'tab' => 'tab=2'
@@ -1300,6 +1373,7 @@ class IP_Geo_Block_Admin {
1300
break;
1301
1302
case 'show-info':
1303
$res = IP_Geo_Block_Admin_Ajax::get_wp_info();
1304
break;
1305
@@ -1308,6 +1382,82 @@ class IP_Geo_Block_Admin {
1308
$res = IP_Geo_Block_Util::get_registered_actions( TRUE );
1309
break;
1310
1311
case 'create-table':
1312
case 'delete-table':
1313
// Need to define `IP_GEO_BLOCK_DEBUG` to true
11
12
class IP_Geo_Block_Admin {
13
14
+ /**
15
+ * Constants for admin class
16
+ *
17
+ */
18
+ const INTERVAL_LIVE_UPDATE = 5; // interval for live update [sec]
19
+ const TIMEOUT_LIVE_UPDATE = 60; // timeout of pausing live update [sec]
20
+
21
/**
22
* Globals in this class
23
*
31
* and adding a settings page and menu.
32
*/
33
private function __construct() {
34
+ // Setup the tab number.
35
+ $this->admin_tab = isset( $_GET['tab'] ) ? (int)$_GET['tab'] : 0;
36
+ $this->admin_tab = min( 5, max( 0, $this->admin_tab ) );
37
+
38
// Load plugin text domain and add body class
39
add_action( 'init', array( $this, 'admin_init' ) );
40
67
if ( is_multisite() ) {
68
add_action( 'network_admin_menu', array( $this, 'setup_admin_page' ) );
69
70
// validate capability instead of nonce. @since 2.0.0 && 3.0.0
71
if ( $this->is_network = is_plugin_active_for_network( IP_GEO_BLOCK_BASE ) )
72
add_filter( IP_Geo_Block::PLUGIN_NAME . '-bypass-admins', array( $this, 'verify_network_redirect' ), 10, 2 );
73
+
74
+ // when a blog is created or deleted.
75
+ add_action( 'wpmu_new_blog', array( $this, 'create_blog' ), 10, 6 ); // @since MU
76
+ add_action( 'delete_blog', array( $this, 'delete_blog' ), 10, 2 ); // @since 3.0.0
77
}
78
79
// loads a plugin’s translated strings.
128
*
129
*/
130
public function verify_network_redirect( $queries, $settings ) {
131
+ // the request that is intended to show the page without any action follows authentication of core.
132
+ if ( 'GET' === $_SERVER['REQUEST_METHOD'] && isset( $_GET['page'] ) && empty( $_GET['action'] ) )
133
+ $queries[] = $_GET['page'];
134
135
return $queries;
136
}
152
IP_Geo_Block_Activate::activate_blog();
153
154
// Copy option from main blog.
155
+ if ( $this->is_network && $settings['network_wide'] )
156
update_option( IP_Geo_Block::OPTION_NAME, $settings );
157
158
// Restore the main blog.
160
}
161
162
public function delete_blog( $blog_id, $drop ) {
163
+ // blog is already switched to the target in wpmu_delete_blog()
164
+ $drop and IP_Geo_Block_Logs::delete_tables();
165
}
166
167
/**
175
/**
176
* Register and enqueue plugin-specific style sheet and JavaScript.
177
*
178
+ * @see https://developers.google.com/maps/faq#china_ws_access
179
*/
180
public function enqueue_admin_assets() {
181
$footer = TRUE;
182
$dependency = array( 'jquery' );
183
+ $version = ! defined( 'IP_GEO_BLOCK_DEBUG' ) || ! IP_GEO_BLOCK_DEBUG ?
184
+ IP_Geo_Block::VERSION :
185
+ max(
186
+ filemtime( plugin_dir_path( __FILE__ ) . 'css/admin.css' ),
187
+ filemtime( plugin_dir_path( __FILE__ ) . 'js/admin.js' )
188
+ );
189
190
switch ( $this->admin_tab ) {
191
+ case 1: /* Statistics */
192
+ case 4: /* Logs */
193
+ // css and js for DataTables
194
+ wp_enqueue_style( IP_Geo_Block::PLUGIN_NAME . '-datatables-css',
195
+ plugins_url( 'datatables/css/datatables-all.min.css', __FILE__ ),
196
+ array(), IP_Geo_Block::VERSION
197
+ );
198
+ wp_enqueue_script( IP_Geo_Block::PLUGIN_NAME . '-datatables-js',
199
+ plugins_url( 'datatables/js/datatables-all.min.js', __FILE__ ),
200
+ $dependency, IP_Geo_Block::VERSION, $footer
201
+ );
202
+ if ( 4 === $this->admin_tab )
203
+ break;
204
+
205
+ case 5: /* Site list */
206
// js for google chart
207
wp_register_script(
208
$addon = IP_Geo_Block::PLUGIN_NAME . '-google-chart',
209
+ // 'https://www.google.cn/jsapi' in china
210
+ apply_filters( 'google-jsapi', 'https://www.google.com/jsapi' ), array(), NULL, $footer
211
);
212
wp_enqueue_script( $addon );
213
break;
214
215
+ case 2: /* Search */
216
// js for google map
217
$settings = IP_Geo_Block::get_option();
218
if ( $key = $settings['api_key']['GoogleMap'] ) {
223
$dependency, IP_Geo_Block::VERSION, $footer
224
);
225
wp_enqueue_script( IP_Geo_Block::PLUGIN_NAME . '-google-map',
226
+ // 'http://maps.google.cn/maps/api/js' in china
227
+ apply_filters( 'google-maps', '//maps.googleapis.com/maps/api/js' ) . ( 'default' !== $key ? "?key=$key" : '' ),
228
$dependency, IP_Geo_Block::VERSION, $footer
229
);
230
}
235
$dependency, IP_Geo_Block::VERSION, $footer
236
);
237
break;
238
}
239
240
+ // css for option page
241
+ wp_enqueue_style( IP_Geo_Block::PLUGIN_NAME . '-admin-icons',
242
+ plugins_url( ! defined( 'IP_GEO_BLOCK_DEBUG' ) || ! IP_GEO_BLOCK_DEBUG ?
243
+ 'css/admin-icons.min.css' : 'css/admin-icons.css', __FILE__
244
+ ),
245
+ array(), IP_Geo_Block::VERSION
246
+ );
247
+ wp_enqueue_style( IP_Geo_Block::PLUGIN_NAME . '-admin-styles',
248
+ plugins_url( ! defined( 'IP_GEO_BLOCK_DEBUG' ) || ! IP_GEO_BLOCK_DEBUG ?
249
+ 'css/admin.min.css' : 'css/admin.css', __FILE__
250
+ ),
251
+ array(), $version
252
+ );
253
+
254
// js for IP Geo Block admin page
255
wp_register_script(
256
$handle = IP_Geo_Block::PLUGIN_NAME . '-admin-script',
258
'js/admin.min.js' : 'js/admin.js', __FILE__
259
),
260
$dependency + ( isset( $addon ) ? array( $addon ) : array() ),
261
+ $version, $footer
262
);
263
wp_localize_script( $handle,
264
'IP_GEO_BLOCK',
268
'url' => admin_url( 'admin-ajax.php' ),
269
'nonce' => IP_Geo_Block_Util::create_nonce( $this->get_ajax_action() ),
270
'msg' => array(
271
+ /* [ 0] */ __( 'Import settings ?', 'ip-geo-block' ),
272
+ /* [ 1] */ __( 'Create table ?', 'ip-geo-block' ),
273
+ /* [ 2] */ __( 'Delete table ?', 'ip-geo-block' ),
274
+ /* [ 3] */ __( 'Clear statistics ?', 'ip-geo-block' ),
275
+ /* [ 4] */ __( 'Clear cache ?', 'ip-geo-block' ),
276
+ /* [ 5] */ __( 'Clear logs ?', 'ip-geo-block' ),
277
+ /* [ 6] */ __( 'ajax for logged-in user', 'ip-geo-block' ),
278
+ /* [ 7] */ __( 'ajax for non logged-in user', 'ip-geo-block' ),
279
+ /* [ 8] */ __( 'This feature is available with HTML5 compliant browsers.', 'ip-geo-block' ),
280
+ /* [ 9] */ __( 'The selected row cannot be found in the visible area.', 'ip-geo-block' ),
281
+ ),
282
+ 'i18n' => array(
283
+ /* [ 0] */ '<div class="ip-geo-block-loading"></div>',
284
+ /* [ 1] */ __( 'No data available in table', 'ip-geo-block' ),
285
+ /* [ 2] */ __( 'No matching records found', 'ip-geo-block' ),
286
+ /* [ 3] */ __( 'IP address', 'ip-geo-block' ),
287
+ /* [ 4] */ __( 'Code', 'ip-geo-block' ),
288
+ /* [ 5] */ __( 'ASN', 'ip-geo-block' ),
289
+ /* [ 6] */ __( 'Host name', 'ip-geo-block' ),
290
+ /* [ 7] */ __( 'Target', 'ip-geo-block' ),
291
+ /* [ 8] */ __( 'Failure / Total', 'ip-geo-block' ),
292
+ /* [ 9] */ __( 'Elapsed[sec]', 'ip-geo-block' ),
293
+ /* [10] */ __( 'Time', 'ip-geo-block' ),
294
+ /* [11] */ __( 'Result', 'ip-geo-block' ),
295
+ /* [12] */ __( 'Request', 'ip-geo-block' ),
296
+ /* [13] */ __( 'User agent', 'ip-geo-block' ),
297
+ /* [14] */ __( 'HTTP headers', 'ip-geo-block' ),
298
+ /* [15] */ __( '$_POST data', 'ip-geo-block' ),
299
),
300
+ 'interval' => self::INTERVAL_LIVE_UPDATE, // interval for live update [sec]
301
+ 'timeout' => self::TIMEOUT_LIVE_UPDATE, // timeout of pausing live update [sec]
302
)
303
);
304
wp_enqueue_script( $handle );
310
*/
311
public function add_plugin_meta_links( $links, $file ) {
312
if ( $file === IP_GEO_BLOCK_BASE ) {
313
array_push(
314
$links,
315
+ '<a href="https://github.com/tokkonopapa/Wordpress-ip-geo-block" title="tokkonopapa/WordPress-IP-Geo-Block" target=_blank>' . __( 'Contribute on GitHub', 'ip-geo-block' ) . '</a>'
316
);
317
}
318
324
*
325
*/
326
public function add_action_links( $links ) {
327
+ // over network
328
return array_merge(
329
+ array( 'settings' => '<a href="' . esc_url_raw( add_query_arg( array( 'page' => IP_Geo_Block::PLUGIN_NAME ), $this->dashboard_url( $this->is_network ) ) ) . '">' . __( 'Settings' ) . '</a>' ),
330
$links
331
);
332
}
385
$settings = IP_Geo_Block::get_option();
386
387
// Network wide or not
388
+ $admin_menu = ( 'admin_menu' === current_filter() );
389
+ $this->is_network &= ( current_user_can( 'manage_network_options' ) && $settings['network_wide'] );
390
391
+ // Verify tab number
392
if ( $this->is_network ) {
393
if ( $admin_menu ) {
394
$this->admin_tab = max( $this->admin_tab, 1 );
396
$this->admin_tab = 0;
397
}
398
} else {
399
+ $this->admin_tab = min( 4, $this->admin_tab ); // exclude `Site List`
400
}
401
402
if ( $admin_menu ) {
429
__( 'IP Geo Block', 'ip-geo-block' ),
430
'manage_network_options',
431
IP_Geo_Block::PLUGIN_NAME,
432
+ array( $this, 'display_plugin_admin_page' )
433
);
434
+ add_submenu_page(
435
+ IP_Geo_Block::PLUGIN_NAME,
436
__( 'IP Geo Block', 'ip-geo-block' ),
437
+ __( 'Settings', 'ip-geo-block' ),
438
'manage_network_options',
439
IP_Geo_Block::PLUGIN_NAME,
440
array( $this, 'display_plugin_admin_page' )
441
+ );
442
+ add_submenu_page(
443
+ IP_Geo_Block::PLUGIN_NAME,
444
+ __( 'IP Geo Block', 'ip-geo-block' ),
445
+ __( 'Site List', 'ip-geo-block' ),
446
+ 'manage_network_options',
447
+ IP_Geo_Block::PLUGIN_NAME . '&amp;tab=5',
448
+ array( $this, 'display_plugin_admin_page' )
449
+ );
450
+
451
+ wp_enqueue_style( IP_Geo_Block::PLUGIN_NAME . '-admin-icons',
452
+ plugins_url( ! defined( 'IP_GEO_BLOCK_DEBUG' ) || ! IP_GEO_BLOCK_DEBUG ?
453
+ 'css/admin-icons.min.css' : 'css/admin-icons.css', __FILE__
454
+ ),
455
+ array(), IP_Geo_Block::VERSION
456
+ );
457
}
458
459
// If successful, load admin assets only on this page.
467
*/
468
private function diagnose_admin_screen() {
469
$settings = IP_Geo_Block::get_option();
470
+ $adminurl = $this->dashboard_url( $this->is_network );
471
472
// Check version and compatibility
473
if ( version_compare( get_bloginfo( 'version' ), '3.7.0' ) < 0 )
537
if ( defined( 'IP_GEO_BLOCK_DEBUG' ) && IP_GEO_BLOCK_DEBUG ) {
538
// Check creation of database table
539
if ( $settings['validation']['reclogs'] ) {
540
+ if ( ( $warn = IP_Geo_Block_Logs::diag_tables() ) &&
541
( FALSE === IP_Geo_Block_Logs::create_tables() ) ) {
542
self::add_admin_notice( 'notice-warning', $warn );
543
}
581
* Get cookie that indicates open/close section
582
*
583
*/
584
+ public function get_cookie() {
585
+ static $cookie = array();
586
+
587
+ if ( empty( $cookie ) && ! empty( $_COOKIE[ IP_Geo_Block::PLUGIN_NAME ] ) ) {
588
+ foreach ( explode( '&', $_COOKIE[ IP_Geo_Block::PLUGIN_NAME ] ) as $i => $v ) {
589
list( $i, $v ) = explode( '=', $v );
590
$cookie[ $i ] = str_split( $v );
591
}
592
}
593
+
594
return $cookie;
595
}
596
604
605
if ( isset( $wp_settings_sections[ $page ] ) ) {
606
$index = 0; // index of fieldset
607
+ $cookie = $this->get_cookie();
608
609
foreach ( (array) $wp_settings_sections[ $page ] as $section ) {
610
// TRUE if open ('o') or FALSE if close ('x')
611
$stat = empty( $cookie[ $tab ][ $index ] ) || 'x' !== $cookie[ $tab ][ $index ];
612
613
+ echo "\n",
614
+ '<fieldset id="', IP_Geo_Block::PLUGIN_NAME, '-section-', $index, '" class="', IP_Geo_Block::PLUGIN_NAME, '-field panel panel-default" data-section="', $index, '">', "\n",
615
'<legend class="panel-heading"><h3 class="', IP_Geo_Block::PLUGIN_NAME, ( $stat ? '-dropdown' : '-dropup' ), '">', $section['title'],
616
'</h3></legend>', "\n", '<div class="panel-body',
617
($stat ? ' ' . IP_Geo_Block::PLUGIN_NAME . '-border"' : '"'),
646
1 => __( 'Statistics', 'ip-geo-block' ),
647
4 => __( 'Logs', 'ip-geo-block' ),
648
2 => __( 'Search', 'ip-geo-block' ),
649
+ 5 => __( 'Site List', 'ip-geo-block' ),
650
3 => __( 'Attribution', 'ip-geo-block' ),
651
);
652
653
$settings = IP_Geo_Block::get_option();
654
+ $cookie = $this->get_cookie();
655
$title = esc_html( get_admin_page_title() );
656
657
// Target page that depends on the network multisite or not.
659
$action = 'options.php';
660
661
if ( $this->is_network ) {
662
+ unset( $tabs[0], $tabs[5] ); // Settings, Site List
663
$title .= ' <span class="ip-geo-block-title-link">';
664
+ $title .= ' [ <a href="' . esc_url( add_query_arg( array( 'page' => IP_Geo_Block::PLUGIN_NAME, 'tab' => 0 ), $this->dashboard_url( TRUE ) ) ) . '" target="_self">' . __( 'Settings', 'ip-geo-block' ) . '</a> ]';
665
+ $title .= ' [ <a href="' . esc_url( add_query_arg( array( 'page' => IP_Geo_Block::PLUGIN_NAME, 'tab' => 5 ), $this->dashboard_url( TRUE ) ) ) . '" target="_self">' . __( 'Site List', 'ip-geo-block' ) . '</a> ]';
666
$title .= '</span>';
667
} else {
668
+ unset( $tabs[5] ); // Site List
669
}
670
} else {
671
$action = 'edit.php?action=' . IP_Geo_Block::PLUGIN_NAME;
672
673
if ( $settings['network_wide'] ) {
674
unset( $tabs[1], $tabs[4], $tabs[2], $tabs[3] ); // Statistics, Logs, Search, Attribution
675
+ $title .= ' <span class="ip-geo-block-title-link">';
676
+ $title .= '[ ' . __( 'Network wide', 'ip-geo-block' ) . ' ]';
677
$title .= '</span>';
678
}
679
}
686
echo '<a href="?page=', IP_Geo_Block::PLUGIN_NAME, '&amp;tab=', $key, '" class="nav-tab', ($tab === $key ? ' nav-tab-active' : ''), '">', $val, '</a>';
687
} ?>
688
</h2>
689
+ <p style="text-align:left">[ <a id="ip-geo-block-toggle-sections" href="#!"><?php _e( 'Toggle all', 'ip-geo-block' ); ?></a> ]
690
+ <?php if ( 4 === $tab ) { /* Logs tab */ ?>
691
+ <input id="ip-geo-block-live-update" type="checkbox"<? checked( isset( $cookie[4][1] ) && 'o' === $cookie[4][1] ); disabled( extension_loaded( 'pdo_sqlite' ), FALSE ); ?> /><label for="ip-geo-block-live-update">
692
+ <dfn title="<?php _e( 'Independent of &#8220;Statistics and Logs settings&#8221;, you can see all the requests validated by this plugin in almost real time.', 'ip-geo-block' ); ?>"><?php _e( 'Live update', 'ip-geo-block' ); ?></dfn>
693
+ </label>
694
+ <?php } elseif (5 === $tab ) { /* Site List tab */ ?>
695
+ <input id="ip-geo-block-open-new" type="checkbox"<? checked( isset( $cookie[5][1] ) && 'o' === $cookie[5][1] );?> /><label for="ip-geo-block-open-new">
696
+ <dfn title="<?php _e( 'Open a new window on clicking the link in the chart.', 'ip-geo-block' ); ?>"><?php _e( 'Open a new window', 'ip-geo-block' ); ?></dfn>
697
+ </label>
698
+ <?php } ?></p>
699
<form method="post" action="<?php echo $action; ?>" id="<?php echo IP_Geo_Block::PLUGIN_NAME, '-', $tab; ?>"<?php if ( $tab ) echo " class=\"", IP_Geo_Block::PLUGIN_NAME, "-inhibit\""; ?>>
700
<?php
701
settings_fields( IP_Geo_Block::PLUGIN_NAME );
704
submit_button(); // @since 3.1
705
?>
706
</form>
707
+ <?php if ( 2 === $tab ) { /* Search tab */ ?>
708
<div id="ip-geo-block-whois"></div>
709
<div id="ip-geo-block-map"></div>
710
+ <?php } elseif ( 3 === $tab ) { /* Attribute tab */
711
// show attribution (higher priority order)
712
$tab = array();
713
foreach ( IP_Geo_Block_Provider::get_addons() as $provider ) {
716
}
717
}
718
echo '<p>', implode( '<br />', $tab ), "</p>\n";
719
echo '<p>', __( 'Thanks for providing these great services for free.', 'ip-geo-block' ), "<br />\n";
720
echo __( '(Most browsers will redirect you to each site <a href="http://www.ipgeoblock.com/etc/referer.html" title="Referer Checker">without referrer when you click the link</a>.)', 'ip-geo-block' ), "</p>\n";
721
} ?>
834
echo ' data-desc="', $args['desc'][ $key ], '"';
835
$key === $args['value'] and $desc = $args['desc'][ $key ];
836
}
837
+ echo '>', ( NULL === $val ? __( 'Select one', 'ip-geo-block' ) : $val ), '</option>', "\n";
838
}
839
echo "</select>\n";
840
893
$output = IP_Geo_Block::get_option();
894
$default = IP_Geo_Block::get_default();
895
896
+ // Integrate posted data into current settings because it can be a part of hole data
897
$input = array_replace_recursive(
898
$output = $this->preprocess_options( $output, $default ),
899
$input
1072
// 3.0.4 AS number
1073
$output['Maxmind']['use_asn'] = FALSE;
1074
1075
+ // 3.0.5 Live update
1076
+ $output['live_update']['in_memory'] = 0;
1077
+
1078
return $output;
1079
}
1080
1264
private function sync_multisite_option( $option ) {
1265
global $wpdb;
1266
$blog_ids = $wpdb->get_col( "SELECT `blog_id` FROM `$wpdb->blogs`" );
1267
+ $ret = TRUE;
1268
1269
foreach ( $blog_ids as $id ) {
1270
switch_to_blog( $id );
1271
+ $ret &= update_option( IP_Geo_Block::OPTION_NAME, $option );
1272
restore_current_blog();
1273
}
1274
+
1275
+ return $ret;
1276
}
1277
1278
/**
1288
1289
require_once IP_GEO_BLOCK_PATH . 'admin/includes/class-admin-ajax.php';
1290
1291
+ $settings = IP_Geo_Block::get_option();
1292
$which = isset( $_POST['which'] ) ? $_POST['which'] : NULL;
1293
switch ( isset( $_POST['cmd' ] ) ? $_POST['cmd' ] : NULL ) {
1294
case 'download':
1340
IP_Geo_Block_Admin_Ajax::export_logs( $which );
1341
break;
1342
1343
+ case 'restore-logs':
1344
// Get logs from MySQL DB
1345
$res = IP_Geo_Block_Admin_Ajax::restore_logs( $which );
1346
break;
1362
1363
case 'gmap-error':
1364
// Reset Google Maps API key
1365
+ if ( $settings['api_key']['GoogleMap'] === 'default' ) {
1366
+ $settings['api_key']['GoogleMap'] = NULL;
1367
+ update_option( IP_Geo_Block::OPTION_NAME, $settings );
1368
$res = array(
1369
'page' => 'options-general.php?page=' . IP_Geo_Block::PLUGIN_NAME,
1370
'tab' => 'tab=2'
1373
break;
1374
1375
case 'show-info':
1376
+ // Show system and debug information
1377
$res = IP_Geo_Block_Admin_Ajax::get_wp_info();
1378
break;
1379
1382
$res = IP_Geo_Block_Util::get_registered_actions( TRUE );
1383
break;
1384
1385
+ case 'restore-cache':
1386
+ // Restore cache from database and format for DataTables
1387
+ $res = IP_Geo_Block_Admin_Ajax::restore_cache( $which );
1388
+ break;
1389
+
1390
+ case 'bulk-action-remove':
1391
+ // Delete specified IP addresses from cache
1392
+ $res = IP_Geo_Block_Logs::delete_cache_entry( $which['IP'] );
1393
+ break;
1394
+
1395
+ case 'bulk-action-ip-white':
1396
+ case 'bulk-action-ip-black':
1397
+ case 'bulk-action-as-white':
1398
+ case 'bulk-action-as-black':
1399
+ // Bulk actions for registration of settings
1400
+ $src = ( FALSE !== strpos( $_POST['cmd'], '-ip-' ) ? 'IP' : 'AS' );
1401
+ $dst = ( FALSE !== strpos( $_POST['cmd'], '-white' ) ? 'white_list' : 'black_list' );
1402
+
1403
+ if ( empty( $which[ $src ] ) )
1404
+ break;
1405
+
1406
+ foreach ( array_unique( $which[ $src ] ) as $val ) {
1407
+ // replace anonymized IP address with CIDR (IPv4:256, IPv6:4096)
1408
+ $val = preg_replace(
1409
+ array( '!\.\*\*\*!', '!\*\*\*!', '![^\w\.:/]!' ),
1410
+ array( '.0/24', '000/116', '' ),
1411
+ $val
1412
+ );
1413
+ if ( FALSE === strpos( $settings['extra_ips'][ $dst ], $val ) )
1414
+ $settings['extra_ips'][ $dst ] .= "\n" . $val;
1415
+ }
1416
+
1417
+ if ( $settings['network_wide'] && is_plugin_active_for_network( IP_GEO_BLOCK_BASE ) )
1418
+ $this->sync_multisite_option( $settings );
1419
+ else
1420
+ update_option( IP_Geo_Block::OPTION_NAME, $settings );
1421
+
1422
+ $res = array(
1423
+ 'page' => 'options-general.php?page=' . IP_Geo_Block::PLUGIN_NAME,
1424
+ );
1425
+ break;
1426
+
1427
+ case 'restore-network':
1428
+ // Restore blocked per target in logs
1429
+ $res = IP_Geo_Block_Admin_Ajax::restore_network( $which, (int)$_POST['offset'], (int)$_POST['length'], FALSE );
1430
+ break;
1431
+
1432
+ case 'live-start':
1433
+ // Restore live log
1434
+ if ( ! is_wp_error( $res = IP_Geo_Block_Logs::catch_live_log() ) )
1435
+ $res = IP_Geo_Block_Admin_Ajax::restore_live_log( $which, $settings );
1436
+ else
1437
+ $res = array( 'error' => $res->get_error_message() );
1438
+ break;
1439
+
1440
+ case 'live-pause':
1441
+ // Pause live log
1442
+ if ( ! is_wp_error( $res = IP_Geo_Block_Logs::catch_live_log() ) )
1443
+ $res = array( 'data' => array() );
1444
+ else
1445
+ $res = array( 'error' => $res->get_error_message() );
1446
+ break;
1447
+
1448
+ case 'live-stop':
1449
+ // Stop live log
1450
+ if ( ! is_wp_error( $res = IP_Geo_Block_Logs::release_live_log() ) )
1451
+ $res = array( 'data' => array() );
1452
+ else
1453
+ $res = array( 'error' => $res->get_error_message() );
1454
+ break;
1455
+
1456
+ case 'reset-live':
1457
+ // Reset data source of live log
1458
+ $res = IP_Geo_Block_Admin_Ajax::reset_live_log();
1459
+ break;
1460
+
1461
case 'create-table':
1462
case 'delete-table':
1463
// Need to define `IP_GEO_BLOCK_DEBUG` to true
admin/css/admin-icons.css ADDED
@@ -0,0 +1,41 @@
1
+ /*! IP Geo Block admin icons */
2
+ @font-face {
3
+ font-family: 'icomoon';
4
+ src: url('fonts/icomoon.eot?9y580b');
5
+ src: url('fonts/icomoon.eot?9y580b#iefix') format('embedded-opentype'),
6
+ url('fonts/icomoon.ttf?9y580b') format('truetype'),
7
+ url('fonts/icomoon.woff?9y580b') format('woff'),
8
+ url('fonts/icomoon.svg?9y580b#icomoon') format('svg');
9
+ font-weight: normal;
10
+ font-style: normal;
11
+ }
12
+
13
+ [class^="ip-geo-block-icon-"], [class*=" ip-geo-block-icon-"] {
14
+ /* use !important to prevent issues with browser extensions that change fonts */
15
+ font-family: 'icomoon' !important;
16
+ speak: none;
17
+ font-style: normal;
18
+ font-weight: normal;
19
+ font-variant: normal;
20
+ text-transform: none;
21
+ line-height: 1;
22
+ /* Better Font Rendering =========== */
23
+ -webkit-font-smoothing: antialiased;
24
+ -moz-osx-font-smoothing: grayscale;
25
+ }
26
+
27
+ .ip-geo-block-icon-play3:before {
28
+ content: "\ea1c";
29
+ }
30
+ .ip-geo-block-icon-pause2:before {
31
+ content: "\ea1d";
32
+ }
33
+ .ip-geo-block-icon-stop2:before {
34
+ content: "\ea1e";
35
+ }
36
+
37
+ #toplevel_page_ip-geo-block .dashicons-admin-generic:before {
38
+ font-family: 'icomoon';
39
+ content: "\e9c9";
40
+ font-size: 18px;
41
+ }
admin/css/admin-icons.min.css ADDED
@@ -0,0 +1,2 @@
1
+ /*! IP Geo Block admin icons */
2
+ @font-face{font-family:icomoon;src:url(fonts/icomoon.eot?9y580b);src:url(fonts/icomoon.eot?9y580b#iefix) format('embedded-opentype'),url(fonts/icomoon.ttf?9y580b) format('truetype'),url(fonts/icomoon.woff?9y580b) format('woff'),url(fonts/icomoon.svg?9y580b#icomoon) format('svg');font-weight:400;font-style:normal}[class*=" ip-geo-block-icon-"],[class^=ip-geo-block-icon-]{font-family:icomoon!important;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ip-geo-block-icon-play3:before{content:"\ea1c"}.ip-geo-block-icon-pause2:before{content:"\ea1d"}.ip-geo-block-icon-stop2:before{content:"\ea1e"}#toplevel_page_ip-geo-block .dashicons-admin-generic:before{font-family:icomoon;content:"\e9c9";font-size:18px}
admin/css/admin.css CHANGED
@@ -1,4 +1,8 @@
1
- /* This stylesheet is used to style the admin option form of the plugin. */
2
dfn {
3
cursor: help;
4
border-bottom: 1px dotted #888;
@@ -88,13 +92,13 @@ fieldset.ip-geo-block-field .ip-geo-block-dropdown:before {
88
}
89
fieldset.ip-geo-block-field .ip-geo-block-dropup:before {
90
border-left: 0.4em solid #555;
91
- left: 3px;
92
- top: 15%;
93
}
94
fieldset.ip-geo-block-field .ip-geo-block-dropdown:before {
95
border-top: 0.4em solid #555;
96
- left: 0;
97
- top: 35%;
98
}
99
fieldset.ip-geo-block-field ul.ip-geo-block-dropup:before {
100
top: 0.25em;
@@ -102,13 +106,13 @@ fieldset.ip-geo-block-field ul.ip-geo-block-dropup:before {
102
fieldset.ip-geo-block-field ul.ip-geo-block-dropdown:before {
103
top: 0.45em;
104
}
105
- fieldset.ip-geo-block-field .form-table {
106
- margin: 0;
107
width: 100%;
108
}
109
fieldset.ip-geo-block-field .ip-geo-block-desc {
110
color: #666;
111
- font-size: 13px;
112
/* font-style: italic;*/
113
}
114
@@ -180,11 +184,11 @@ ul.ip-geo-block-list label {
180
}
181
}
182
183
- .ip-geo-block-loading {
184
background-size: 16px 16px;
185
background-position: center center;
186
background-repeat: no-repeat;
187
- background-image: url(data:image/gif;base64,R0lGODlhEAAQAPIGAAAAAMLCwkJCQpKSkmJiYoKCgv///wAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJCgAGACwAAAAAEAAQAAADM2i63P4wyklrC0IEKgAQnAdOmGYFBLExwboQWcG2rlHEwTDQLUsUOd2mBxkUCgNKa+dIAAAh+QQJCgAGACwAAAIACgAOAAADLWgWIqHQCABEVLPe1R4MBOFFRFNsRUNsYDFewTC8iixvQ1EMyxjEvyBLODQkAAAh+QQJCgAGACwAAAAACgAOAAADLWi6IRJrCQCECoU0ag1xxeBARuEQ0UUU5DUM7fK+qTEUYR0EcM3Ev51uB7wAEwAh+QQJCgAGACwAAAAADgAKAAADLWi6URQrLiJEkSaM0eqrkLFtAVEEAgAIylAUQ5SuSqCFNZjhWG3zmB8wOJQkAAAh+QQJCgAGACwCAAAADgAKAAADK2hqMRMrLuekCnCU8gqBDCZ2glBcYkSUxIJJgQdaUVDOtAAAAr3oPN/llgAAIfkECQoABgAsBgAAAAoADgAAAytoEdauiz0Yx5BQFTvN2EMXWNgUFETZFIJQdERLiGgZtKohAIDQ7T0RrpEAACH5BAkKAAYALAYAAgAKAA4AAAMqaKoR+609Fie1K4zhZiibNRSg1XAQUXQPIQgE835voQgAIARqh+ummSUBACH5BAUKAAYALAIABgAOAAoAAAMsaLpsES2+F9mEddEgBFbBMGACAAiMOCrlGRBFWBQD2L0dYYjfUuQZEKynSAAAOw==);
188
height: 16px;
189
width: 16px;
190
margin-left: 1em;
@@ -192,6 +196,9 @@ ul.ip-geo-block-list label {
192
display: inline-block;
193
vertical-align: middle;
194
}
195
196
.ip-geo-block-border {
197
border-top: inherit;
@@ -272,140 +279,6 @@ table.ip-geo-block-table td:first-child {
272
}
273
}
274
275
- /* for footable */
276
- #ip-geo-block-4 #ip-geo-block-section-1 .panel-body,
277
- #ip-geo-block-4 #ip-geo-block-section-2 .panel-body,
278
- #ip-geo-block-4 #ip-geo-block-section-3 .panel-body,
279
- #ip-geo-block-4 #ip-geo-block-section-4 .panel-body,
280
- #ip-geo-block-4 #ip-geo-block-section-5 .panel-body {
281
- padding: 0;
282
- display: table-cell;
283
- /* border-collapse: collapse; *//* Bug of IE10, IE11 */
284
- }
285
- .ip-geo-block-log {
286
- width: 100% !important;
287
- margin: 0.5em 0;
288
- }
289
- .ip-geo-block-log * {
290
- font-size: 13px !important;
291
- line-height: 1.5em;
292
- vertical-align: middle;
293
- }
294
- .ip-geo-block-log .pagination ul {
295
- border-radius: 4px;
296
- display: inline-block;
297
- margin: 0.5em 0 0 0;
298
- padding: 0;
299
- }
300
- .ip-geo-block-log .pagination ul > li {
301
- display: inline;
302
- }
303
- .ip-geo-block-log .pagination ul > li:first-child > a,
304
- .ip-geo-block-log .pagination ul > li:first-child > span {
305
- border-bottom-left-radius: 4px;
306
- border-left-width: 1px;
307
- border-top-left-radius: 4px;
308
- }
309
- .ip-geo-block-log .pagination ul > li:last-child > a,
310
- .ip-geo-block-log .pagination ul > li:last-child > span {
311
- border-bottom-right-radius: 4px;
312
- border-top-right-radius: 4px;
313
- }
314
- .ip-geo-block-log .pagination ul > .disabled > span,
315
- .ip-geo-block-log .pagination ul > .disabled > a,
316
- .ip-geo-block-log .pagination ul > .disabled > a:hover,
317
- .ip-geo-block-log .pagination ul > .disabled > a:focus {
318
- background-color: transparent;
319
- color: #999;
320
- cursor: default;
321
- }
322
- .ip-geo-block-log .pagination ul > li > a,
323
- .ip-geo-block-log .pagination ul > li > span {
324
- border-color: #ddd;
325
- border-image: none;
326
- border-style: solid;
327
- border-width: 1px 1px 1px 0;
328
- float: left;
329
- line-height: 20px;
330
- padding: 4px;
331
- width: 20px;
332
- text-decoration: none;
333
- }
334
- .ip-geo-block-log .pagination ul > .active > a,
335
- .ip-geo-block-log .pagination ul > .active > span {
336
- color: #999;
337
- cursor: default;
338
- }
339
- .ip-geo-block-log .pagination ul > li > a:hover,
340
- .ip-geo-block-log .pagination ul > li > a:focus,
341
- .ip-geo-block-log .pagination ul > .active > a,
342
- .ip-geo-block-log .pagination ul > .active > span {
343
- background-color: #f7f7f7;
344
- }
345
- .ip-geo-block-log .pagination-centered {
346
- text-align: center;
347
- }
348
- .ip-geo-block-log.breakpoint > tbody > tr > td > span.footable-toggle {
349
- font-size: 60% !important;
350
- position: relative;
351
- top: -1px;
352
- left: 2px;
353
- }
354
- .ip-geo-block-log > thead > tr > th,
355
- .ip-geo-block-log > tbody > tr > td {
356
- padding: 4px 0;
357
- word-wrap: break-word;
358
- width: 20%;
359
- }
360
- .ip-geo-block-log > thead > tr > th:first-child,
361
- .ip-geo-block-log > tbody > tr > td:first-child {
362
- width: 25%;
363
- }
364
- .ip-geo-block-log > thead > tr > th:first-child + th,
365
- .ip-geo-block-log > tbody > tr > td:first-child + td {
366
- width: 35%;
367
- }
368
- .ip-geo-block-log > thead > tr > th:nth-child(5),
369
- .ip-geo-block-log > tbody > tr > td:nth-child(5),
370
- .ip-geo-block-log > thead > tr > th:nth-child(5) + th,
371
- .ip-geo-block-log > tbody > tr > td:nth-child(5) + td {
372
- width: 60%;
373
- text-align: left;
374
- }
375
- @media screen and (min-width: 1024px) {
376
- .ip-geo-block-log > thead > tr > th:nth-child(3),
377
- .ip-geo-block-log > tbody > tr > td:nth-child(3),
378
- .ip-geo-block-log > thead > tr > th:nth-child(3) + th,
379
- .ip-geo-block-log > tbody > tr > td:nth-child(3) + td {
380
- width: 10%;
381
- }
382
- }
383
- .ip-geo-block-log > thead > tr > th > span.footable-sort-indicator {
384
- color: #888;
385
- }
386
- .ip-geo-block-log > tbody > tr > td {
387
- text-align: center;
388
- }
389
- .ip-geo-block-log > tbody > tr > td:first-child {
390
- text-align: left;
391
- padding-left: 0.5em;
392
- }
393
- .ip-geo-block-log .footable-row-detail-row,
394
- .ip-geo-block-log .footable-row-detail-name,
395
- .ip-geo-block-log .footable-row-detail-value {
396
- display: block;
397
- }
398
- .ip-geo-block-log .footable-row-detail-value {
399
- padding: 0 1em 4px 1em;
400
- white-space: normal;
401
- word-wrap: break-word;
402
- word-break: break-all;
403
- }
404
- input#ip_geo_block_settings_filter_logs {
405
- width: 16em;
406
- padding-top: 3px;
407
- }
408
-
409
/* Scan the country code */
410
#ip-geo-block-scan-code {
411
vertical-align: middle;
@@ -459,7 +332,7 @@ input#ip_geo_block_settings_filter_logs {
459
}
460
461
span.ip-geo-block-title-link {
462
- font-size: 13px;
463
}
464
/*span.ip-geo-block-title-link a {
465
box-shadow: none;
@@ -468,7 +341,7 @@ span.ip-geo-block-title-link {
468
dfn ~ .ip-geo-block-cycle,
469
dfn ~ .ip-geo-block-lock,
470
dfn ~ .ip-geo-block-unlock {
471
- margin-left: 0.75em;
472
}
473
.ip-geo-block-cycle,
474
.ip-geo-block-lock,
@@ -505,6 +378,9 @@ dfn ~ .ip-geo-block-unlock {
505
.ip-geo-block-unlock span {
506
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAYFBMVEXc3NyzydRzq8dRmb7I09hYnsEFdK0AcawAcqzP1toqhrYAcKvZ29wAb6oMeK8zjbqrxtQBcazBz9Zko8MVfbLF0thMmL07kbtpp8WjwtJSmL1YnL+Tu89DlL1JmMEPebBFV++UAAAAAXRSTlMAQObYZgAAAONJREFUeAG9kAWChDAMAIMmJaTFXf7/ynXflvMbnE5j8DU8Pwh8D1yEUYxEGEchWFEJEjEflESBhTQSQm2MRpIotQhZTmgKgMIg5ZlFKBmrGg7UFXJpEQKW8qIKN7YeikJdBJI2BTtXwfyx0L3XoPphvBEliNU49OoxqEa6g4cTST/OYshvi3hV8+FxSNfluG3jqxG8C6h7gF6jU+AODnTsFGSCA5O4I8wpQDq7I5CUAKWQW+AZYOYtoQPoGDeECWDaioBmWQxeBduoWURso+5WpBdw7R4ENTVDcGE435tJwT+xB+vMEnZRNB0YAAAAAElFTkSuQmCC);
507
}
508
509
/* https://developer.wordpress.org/resource/dashicons/ for WordPress 3.8
510
.ip-geo-block-cycle span:before {
@@ -524,9 +400,13 @@ dfn ~ .ip-geo-block-unlock {
524
margin:0;
525
text-align:right;
526
}
527
528
- /* embeded data for multisite */
529
- .ip-geo-block-multisite {
530
margin-bottom: 1em;
531
}
532
@@ -543,14 +423,443 @@ ol.ip-geo-block-top-list li code {
543
background: none;
544
}
545
546
- /* icon for top level menu */
547
- #toplevel_page_ip-geo-block .wp-menu-image img {
548
- height: 18px;
549
- width: 18px;
550
}
551
552
/* action for admin post */
553
.ip-geo-block-admin-post {
554
color: #c43322;
555
margin-left: 0.25em;
556
- }
1
+ /*!
2
+ * Project: WordPress IP Geo Block
3
+ * Copyright (c) 2015-2017 tokkonopapa (tokkonopapa@yahoo.com)
4
+ * This software is released under the MIT License.
5
+ */
6
dfn {
7
cursor: help;
8
border-bottom: 1px dotted #888;
92
}
93
fieldset.ip-geo-block-field .ip-geo-block-dropup:before {
94
border-left: 0.4em solid #555;
95
+ left: 2px;
96
+ top: 18%;
97
}
98
fieldset.ip-geo-block-field .ip-geo-block-dropdown:before {
99
border-top: 0.4em solid #555;
100
+ left: -2px;
101
+ top: 38%;
102
}
103
fieldset.ip-geo-block-field ul.ip-geo-block-dropup:before {
104
top: 0.25em;
106
fieldset.ip-geo-block-field ul.ip-geo-block-dropdown:before {
107
top: 0.45em;
108
}
109
+ fieldset.ip-geo-block-field table.form-table {
110
+ margin: 0 0 0.5em;
111
width: 100%;
112
}
113
fieldset.ip-geo-block-field .ip-geo-block-desc {
114
color: #666;
115
+ font-size: 13px !important;
116
/* font-style: italic;*/
117
}
118
184
}
185
}
186
187
+ .ip-geo-block-loading,
188
+ #ip-geo-block-live-loading {
189
background-size: 16px 16px;
190
background-position: center center;
191
background-repeat: no-repeat;
192
height: 16px;
193
width: 16px;
194
margin-left: 1em;
196
display: inline-block;
197
vertical-align: middle;
198
}
199
+ .ip-geo-block-loading {
200
+ background-image: url(data:image/gif;base64,R0lGODlhEAAQAPIGAAAAAMLCwkJCQpKSkmJiYoKCgv///wAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJCgAGACwAAAAAEAAQAAADM2i63P4wyklrC0IEKgAQnAdOmGYFBLExwboQWcG2rlHEwTDQLUsUOd2mBxkUCgNKa+dIAAAh+QQJCgAGACwAAAIACgAOAAADLWgWIqHQCABEVLPe1R4MBOFFRFNsRUNsYDFewTC8iixvQ1EMyxjEvyBLODQkAAAh+QQJCgAGACwAAAAACgAOAAADLWi6IRJrCQCECoU0ag1xxeBARuEQ0UUU5DUM7fK+qTEUYR0EcM3Ev51uB7wAEwAh+QQJCgAGACwAAAAADgAKAAADLWi6URQrLiJEkSaM0eqrkLFtAVEEAgAIylAUQ5SuSqCFNZjhWG3zmB8wOJQkAAAh+QQJCgAGACwCAAAADgAKAAADK2hqMRMrLuekCnCU8gqBDCZ2glBcYkSUxIJJgQdaUVDOtAAAAr3oPN/llgAAIfkECQoABgAsBgAAAAoADgAAAytoEdauiz0Yx5BQFTvN2EMXWNgUFETZFIJQdERLiGgZtKohAIDQ7T0RrpEAACH5BAkKAAYALAYAAgAKAA4AAAMqaKoR+609Fie1K4zhZiibNRSg1XAQUXQPIQgE835voQgAIARqh+ummSUBACH5BAUKAAYALAIABgAOAAoAAAMsaLpsES2+F9mEddEgBFbBMGACAAiMOCrlGRBFWBQD2L0dYYjfUuQZEKynSAAAOw==);
201
+ }
202
203
.ip-geo-block-border {
204
border-top: inherit;
279
}
280
}
281
282
/* Scan the country code */
283
#ip-geo-block-scan-code {
284
vertical-align: middle;
332
}
333
334
span.ip-geo-block-title-link {
335
+ font-size: 13px !important;
336
}
337
/*span.ip-geo-block-title-link a {
338
box-shadow: none;
341
dfn ~ .ip-geo-block-cycle,
342
dfn ~ .ip-geo-block-lock,
343
dfn ~ .ip-geo-block-unlock {
344
+ margin-left: 0.6em;
345
}
346
.ip-geo-block-cycle,
347
.ip-geo-block-lock,
378
.ip-geo-block-unlock span {
379
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAYFBMVEXc3NyzydRzq8dRmb7I09hYnsEFdK0AcawAcqzP1toqhrYAcKvZ29wAb6oMeK8zjbqrxtQBcazBz9Zko8MVfbLF0thMmL07kbtpp8WjwtJSmL1YnL+Tu89DlL1JmMEPebBFV++UAAAAAXRSTlMAQObYZgAAAONJREFUeAG9kAWChDAMAIMmJaTFXf7/ynXflvMbnE5j8DU8Pwh8D1yEUYxEGEchWFEJEjEflESBhTQSQm2MRpIotQhZTmgKgMIg5ZlFKBmrGg7UFXJpEQKW8qIKN7YeikJdBJI2BTtXwfyx0L3XoPphvBEliNU49OoxqEa6g4cTST/OYshvi3hV8+FxSNfluG3jqxG8C6h7gF6jU+AODnTsFGSCA5O4I8wpQDq7I5CUAKWQW+AZYOYtoQPoGDeECWDaioBmWQxeBduoWURso+5WpBdw7R4ENTVDcGE435tJwT+xB+vMEnZRNB0YAAAAAElFTkSuQmCC);
380
}
381
+ table.form-table th .ip-geo-block-cycle span {
382
+ vertical-align: text-bottom;
383
+ }
384
385
/* https://developer.wordpress.org/resource/dashicons/ for WordPress 3.8
386
.ip-geo-block-cycle span:before {
400
margin:0;
401
text-align:right;
402
}
403
+ #ip-geo-block-open-new,
404
+ #ip-geo-block-live-update {
405
+ margin-left: 1em;
406
+ }
407
408
+ /* embeded data for network site list */
409
+ .ip-geo-block-network {
410
margin-bottom: 1em;
411
}
412
423
background: none;
424
}
425
426
+ /* icon for top level menu ... this must be included in every admin page */
427
+ #adminmenu #toplevel_page_ip-geo-block .wp-menu-image img {
428
+ height: 20px !important;
429
+ width: 20px !important;
430
}
431
432
/* action for admin post */
433
.ip-geo-block-admin-post {
434
color: #c43322;
435
margin-left: 0.25em;
436
+ }
437
+
438
+ /* SVG in google chart */
439
+ svg a > text {
440
+ fill: #0073aa;
441
+ text-decoration: underline;
442
+ }
443
+ svg a:hover > text {
444
+ fill: #0096dd;
445
+ }
446
+
447
+ /*------------------------------------------------------------
448
+ * multi column for Site List
449
+ * https://caniuse.com/#search=flexbox
450
+ *------------------------------------------------------------*/
451
+ .ip-geo-block-container {
452
+ margin: 0 auto;
453
+ padding: 0 1em;
454
+ position: relative;
455
+ width: 100%;
456
+ }
457
+ .ip-geo-block-row {
458
+ display: flex;
459
+ flex-direction: column;
460
+ align-items: flex-start;
461
+ align-items: stretch; /* baseline */
462
+ padding: 0;
463
+ width: 100%;
464
+ }
465
+ .ip-geo-block-row .ip-geo-block-column {
466
+ display: block;
467
+ flex: 1 1 auto;
468
+ align-self: flex-start;
469
+ margin-left: 0;
470
+ max-width: 100%;
471
+ width: 100%;
472
+ }
473
+ .ip-geo-block-row .ip-geo-block-column.column-20 {
474
+ flex: 0 0 20%;
475
+ max-width: 20%;
476
+ }
477
+ .ip-geo-block-row .ip-geo-block-column.column-25 {
478
+ flex: 0 0 25%;
479
+ max-width: 25%;
480
+ }
481
+ .ip-geo-block-row .ip-geo-block-column.column-33 {
482
+ flex: 0 0 33.3333%;
483
+ max-width: 33.3333%;
484
+ }
485
+ .ip-geo-block-row .ip-geo-block-column.column-50 {
486
+ flex: 0 0 50%;
487
+ max-width: 50%;
488
+ }
489
+ @media (min-width: 40rem) {
490
+ .ip-geo-block-row {
491
+ flex-direction: row;
492
+ margin-left: -2em;
493
+ width: calc(100% + 2em);
494
+ }
495
+ .ip-geo-block-row .ip-geo-block-column {
496
+ margin-bottom: inherit;
497
+ padding: 0 1em;
498
+ }
499
+ }
500
+
501
+ /*------------------------------------------------------------
502
+ * Customizing based on jquery.dataTables.css
503
+ *------------------------------------------------------------*/
504
+ table.dataTable {
505
+ clear: none !important;
506
+ }
507
+ table.dataTable th,
508
+ table.dataTable td {
509
+ text-align: right;
510
+ }
511
+ table.dataTable th:nth-child(n+2),
512
+ table.dataTable td:nth-child(n+2) {
513
+ padding-left: 0 !important;
514
+ }
515
+ table.dataTable th {
516
+ white-space: nowrap;
517
+ }
518
+ table.dataTable > thead > tr {
519
+ line-height: 1.8em;
520
+ }
521
+ table.dataTable > tbody > tr {
522
+ cursor: pointer;
523
+ }
524
+ table.dataTable > thead > tr > th,
525
+ table.dataTable > thead > tr > td,
526
+ table.dataTable.no-footer {
527
+ border-bottom: 1px solid #ddd;
528
+ }
529
+ table.dataTable thead th,
530
+ table.dataTable thead td {
531
+ padding: 10px 16px;
532
+ }
533
+ /* country code */
534
+ #ip-geo-block-statistics-cache td:nth-child(3),
535
+ #ip-geo-block-validation-logs td:nth-child(4) {
536
+ min-width: 1.6em;
537
+ }
538
+
539
+ /* Scroll bar */
540
+ .dataTables_wrapper.no-footer .dataTables_scrollBody {
541
+ border-bottom: 1px solid #ddd;
542
+ }
543
+
544
+ /* Size of column */
545
+ table.dataTable.nowrap td,
546
+ table.dataTable > tbody > tr > td span {
547
+ white-space: normal !important;
548
+ word-wrap: break-word !important;
549
+ word-break: break-all !important;
550
+ }
551
+ table.dataTable > tbody > tr > td span {
552
+ display: inline-block;
553
+ }
554
+
555
+ /* Checkbox */
556
+ table.dataTable input[type="checkbox"] {
557
+ height: 16px;
558
+ width: 16px;
559
+ margin: 0;
560
+ }
561
+ table.dataTable > thead > tr > th:first-child,
562
+ table.dataTable > tbody > tr > td:first-child {
563
+ padding: 8px 4px 8px 18px;
564
+ text-align: left;
565
+ }
566
+
567
+ /* No data available in table */
568
+ table.dataTable > tbody > tr > td.dataTables_empty,
569
+ table.collapsed > tbody > tr > td.dataTables_empty:first-child::before {
570
+ border: none;
571
+ text-align: center;
572
+ }
573
+
574
+ /* Checkbox column */
575
+ table.dataTable thead > tr > th:first-child.sorting_asc {
576
+ background-image: none !important;
577
+ }
578
+ table.dataTable.display tbody tr.even > .sorting_1,
579
+ table.dataTable.display tbody tr.odd > .sorting_1,
580
+ table.dataTable.display tbody tr:hover > .sorting_1 {
581
+ background-color: inherit !important;
582
+ }
583
+
584
+ /* Collapsed */
585
+ table.dataTable.collapsed > tbody > tr > td:first-child {
586
+ padding: 8px 4px 8px 8px !important;
587
+ }
588
+ table.collapsed > tbody > tr > td:first-child::before,
589
+ table.collapsed > tbody > tr.parent > td:first-child::before {
590
+ content: '';
591
+ height: 0;
592
+ width: 0;
593
+ display: inline-block;
594
+ border-radius: 0;
595
+ border: 5px solid transparent;
596
+ box-shadow: none;
597
+ position: relative;
598
+ background-color: transparent;
599
+ }
600
+ table.collapsed > tbody > tr > td:first-child::before {
601
+ border-left: 5px solid #555;
602
+ top: 1px;
603
+ left: -2px;
604
+ }
605
+ table.collapsed > tbody > tr.parent > td:first-child::before {
606
+ border-top: 5px solid #555;
607
+ top: 4px;
608
+ left: -4px;
609
+ }
610
+ table.collapsed > tbody > tr.child > td:first-child::before {
611
+ border: none;
612
+ }
613
+ table.collapsed > tbody > tr.child > td.child > ul li {
614
+ border: none;
615
+ padding: 0;
616
+ margin: 0;
617
+ line-height: 1.8em;
618
+ }
619
+ table.collapsed > tbody > tr.child > td.child > ul li span.dtr-title,
620
+ table.collapsed > tbody > tr.child > td.child > ul li span.dtr-data {
621
+ font-size: 13px !important;
622
+ display: block;
623
+ white-space: normal;
624
+ word-wrap: break-word;
625
+ word-break: break-all;
626
+ }
627
+ table.collapsed > tbody > tr.child > td.child > ul li span.dtr-data {
628
+ margin-left: 1.25em;
629
+ margin-right: 0.3em;
630
+ }
631
+
632
+ /* Pagenation */
633
+ .dataTables_wrapper .dataTables_paginate {
634
+ float: none;
635
+ text-align: center;
636
+ margin-bottom: 1em;
637
+ }
638
+ .dataTables_wrapper .dataTables_paginate span.ellipsis,
639
+ .dataTables_wrapper .dataTables_paginate a.paginate_button,
640
+ .dataTables_wrapper .dataTables_paginate a.paginate_button:hover,
641
+ .dataTables_wrapper .dataTables_paginate a.paginate_button:active,
642
+ .dataTables_wrapper .dataTables_paginate a.paginate_button.current,
643
+ .dataTables_wrapper .dataTables_paginate a.paginate_button.current:hover,
644
+ .dataTables_wrapper .dataTables_paginate a.paginate_button.current:active,
645
+ .dataTables_wrapper .dataTables_paginate a.paginate_button.disabled,
646
+ .dataTables_wrapper .dataTables_paginate a.paginate_button.disabled:hover,
647
+ .dataTables_wrapper .dataTables_paginate a.paginate_button.disabled:active {
648
+ min-width: 2em;
649
+ background: inherit;
650
+ border-color: #ddd;
651
+ border-radius: 0;
652
+ border-image: none;
653
+ border-style: solid;
654
+ border-width: 1px 1px 1px 0;
655
+ box-shadow: none;
656
+ margin: 0.5em 0 0 0;
657
+ padding: 0.25em 0;
658
+ display: inline-block;
659
+ text-decoration: none;
660
+ }
661
+ .dataTables_wrapper .dataTables_paginate > a.paginate_button:first-child,
662
+ .dataTables_wrapper .dataTables_paginate:hover > a.paginate_button:first-child,
663
+ .dataTables_wrapper .dataTables_paginate:active > a.paginate_button:first-child {
664
+ border-left-width: 1px;
665
+ border-bottom-left-radius: 4px;
666
+ border-top-left-radius: 4px;
667
+ }
668
+ .dataTables_wrapper .dataTables_paginate > a.paginate_button:last-child,
669
+ .dataTables_wrapper .dataTables_paginate:hover > a.paginate_button:last-child,
670
+ .dataTables_wrapper .dataTables_paginate:active > a.paginate_button:last-child {
671
+ border-bottom-right-radius: 4px;
672
+ border-top-right-radius: 4px;
673
+ }
674
+ .dataTables_wrapper .dataTables_paginate a.paginate_button {
675
+ color: #0073aa !important;
676
+ }
677
+ .dataTables_wrapper .dataTables_paginate a.paginate_button:hover {
678
+ color: #0096dd !important;
679
+ background-color: #fff;
680
+ }
681
+ .dataTables_wrapper .dataTables_paginate span.ellipsis,
682
+ .dataTables_wrapper .dataTables_paginate a.paginate_button.disabled,
683
+ .dataTables_wrapper .dataTables_paginate a.paginate_button.disabled:hover,
684
+ .dataTables_wrapper .dataTables_paginate a.paginate_button.disabled:active {
685
+ cursor: default;
686
+ color: #999 !important;
687
+ background-color: transparent;
688
+ }
689
+ .dataTables_wrapper .dataTables_paginate a.paginate_button.current,
690
+ .dataTables_wrapper .dataTables_paginate a.paginate_button.current:hover,
691
+ .dataTables_wrapper .dataTables_paginate a.paginate_button.current:active {
692
+ cursor: default;
693
+ color: #444 !important;
694
+ background-color: #fff !important;
695
+ }
696
+
697
+ /* Alignment of table */
698
+ #ip-geo-block-1 #ip-geo-block-section-2 .panel-body,
699
+ #ip-geo-block-4 #ip-geo-block-section-0 .panel-body {
700
+ padding: 0;
701
+ }
702
+ #ip-geo-block-1 #ip-geo-block-section-2 table.form-table,
703
+ #ip-geo-block-4 #ip-geo-block-section-0 table.form-table {
704
+ margin-left: 1em;
705
+ max-width: 95%;
706
+ }
707
+
708
+ /* Select target / Period to extract */
709
+ ul#ip-geo-block-select-target,
710
+ ul#ip-geo-block-select-layout,
711
+ ul#ip-geo-block-select-duration {
712
+ margin: 0;
713
+ }
714
+ ul#ip-geo-block-select-target li,
715
+ ul#ip-geo-block-select-layout li,
716
+ ul#ip-geo-block-select-duration li {
717
+ float: left;
718
+ margin-right: 1.5em;
719
+ }
720
+ ul#ip-geo-block-select-target li label,
721
+ ul#ip-geo-block-select-duration li label {
722
+ cursor: pointer;
723
+ }
724
+
725
+ /* Filter */
726
+ input#ip_geo_block_settings_search_filter {
727
+ width: 16em;
728
+ padding-top: 3px;
729
+ }
730
+
731
+ /* Transition for new row */
732
+ table.dataTable.display tbody tr.ip-geo-block-passed {
733
+ background-color: #edf6ff !important;
734
+ }
735
+ table.dataTable.display tbody tr.ip-geo-block-blocked {
736
+ background-color: #ffefef !important;
737
+ }
738
+ .ip-geo-block-new-passed {
739
+ animation: ip-geo-block-flash-passed 1s ease-out 0s 1 normal both running;
740
+ }
741
+ .ip-geo-block-new-blocked {
742
+ animation: ip-geo-block-flash-blocked 1s ease-out 0s 1 normal both running;
743
+ }
744
+ @keyframes ip-geo-block-flash-passed {
745
+ 0% { background-color: #ffd700; }
746
+ 100% { background-color: #edf6ff; }
747
+ }
748
+ @keyframes ip-geo-block-flash-blocked {
749
+ 0% { background-color: #ffd700; }
750
+ 100% { background-color: #ffefef; }
751
+ }
752
+
753
+ /* Mark.js */
754
+ mark {
755
+ padding: 0;
756
+ background: #ffd700; // Gold
757
+ }
758
+
759
+ /* Live update log */
760
+ ul#ip-geo-block-live-log {
761
+ margin: 0;
762
+ }
763
+ ul#ip-geo-block-live-log li {
764
+ float: left;
765
+ margin-right: 3em;
766
+ }
767
+ ul#ip-geo-block-live-log li:last-child {
768
+ margin-right: 0;
769
+ }
770
+ ul#ip-geo-block-live-log li input[type=radio] {
771
+ display: none;
772
+ }
773
+ ul#ip-geo-block-live-log li input[type=radio] + label {
774
+ display:inline-block;
775
+ margin:-2px;
776
+ padding: 4px 12px;
777
+ margin-bottom: 0;
778
+ font-size: 14px;
779
+ line-height: 20px;
780
+ color: #333;
781
+ text-align: center;
782
+ text-shadow: 0 1px 1px rgba(255,255,255,0.75);
783
+ vertical-align: middle;
784
+ cursor: pointer;
785
+ background-color: #f5f5f5;
786
+ background-image: -moz-linear-gradient(top,#fff,#e6e6e6);
787
+ background-image: -webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));
788
+ background-image: -webkit-linear-gradient(top,#fff,#e6e6e6);
789
+ background-image: -o-linear-gradient(top,#fff,#e6e6e6);
790
+ background-image: linear-gradient(to bottom,#fff,#e6e6e6);
791
+ background-repeat: repeat-x;
792
+ border: 1px solid #ccc;
793
+ border-color: #e6e6e6 #e6e6e6 #bfbfbf;
794
+ border-color: rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);
795
+ border-bottom-color: #b3b3b3;
796
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0);
797
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
798
+ -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);
799
+ -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);
800
+ box-shadow: inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);
801
+ }
802
+ ul#ip-geo-block-live-log li input[type=radio]:checked + label {
803
+ background-image: none;
804
+ outline: 0;
805
+ -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);
806
+ -moz-box-shadow: inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);
807
+ box-shadow: inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);
808
+ background-color: #e0e0e0;
809
+ }
810
+
811
+ /*----------------------------------------------------------------------
812
+ * Timer animation based on https://codepen.io/paulobrien/pen/joptI
813
+ *----------------------------------------------------------------------*/
814
+ .ip-geo-block-live-timer {
815
+ height: 1em;
816
+ width: 1em;
817
+ position: relative;
818
+ top: -0.1em;
819
+ margin: 0;
820
+ }
821
+ .ip-geo-block-live-timer:before {
822
+ content: "";
823
+ display: block;
824
+ height: 1em;
825
+ width: 1em;
826
+ background: radial-gradient(#0073aa, #72777c);
827
+ position: absolute;
828
+ border-radius: 50%;
829
+ top: 0;
830
+ left: 0;
831
+ }
832
+ .ip-geo-block-live-timer:after {
833
+ display: none
834
+ }
835
+ .ip-geo-block-live-timer > div {
836
+ position: absolute;
837
+ width: 1em;
838
+ height: 1em;
839
+ clip: rect(0, 1em, 1em, .5em);
840
+ }
841
+ .ip-geo-block-live-timer > div:before {
842
+ content: " ";
843
+ position: absolute;
844
+ width: 1em;
845
+ height: 1em;
846
+ border-radius: .5em;
847
+ clip: rect(0, .5em, 1em, 0);
848
+ background-color: #f1f1f1;
849
+ transform: rotate(0deg);
850
+ }
851
+ .ip-geo-block-live-timer > div:first-child:before {
852
+ animation: 30s spin-timer linear forwards;
853
+ }
854
+ .ip-geo-block-live-timer > div:last-child {
855
+ transform: rotate(180deg);
856
+ }
857
+ .ip-geo-block-live-timer > div:last-child:before {
858
+ /* older webkit seems buggy with zero so use 0.00001 */
859
+ transform: rotate(0.00001deg);
860
+ animation: 30s spin-timer linear 30s forwards;
861
+ }
862
+ @keyframes spin-timer {
863
+ 0% {transform: rotate( 0deg);}
864
+ 100% {transform: rotate(180deg);}
865
+ }
admin/css/admin.min.css CHANGED
@@ -1,2 +1,6 @@
1
- /* This stylesheet is used to style the admin option form of the plugin. */
2
- #ip-geo-block-scan-code,.ip-geo-block-loading,.ip-geo-block-log *{vertical-align:middle}dfn{cursor:help;border-bottom:1px dotted #888}fieldset,legend{padding:0;margin:0;border:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}fieldset{min-width:0}legend{display:block;line-height:inherit;width:100%}.panel-body,label{display:inline-block}label{max-width:100%}.panel{border:1px solid #e5e5e5;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.04);-moz-box-shadow:0 1px 1px rgba(0,0,0,.04);box-shadow:0 1px 1px rgba(0,0,0,.04);background:#f5f5f5}.panel-heading{float:left!important;background:#fff}.panel-default>.panel-heading{border-color:inherit}.panel-body{width:100%;padding:0 1em;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.panel-body:after,.panel-body:before{content:" ";display:table}.panel-body:after{clear:both}fieldset.ip-geo-block-field{margin:1em 0}fieldset.ip-geo-block-field h2,fieldset.ip-geo-block-field h3{padding:0;margin:0;font-size:14px!important}fieldset.ip-geo-block-field legend.panel-heading{padding:10px}fieldset.ip-geo-block-field .ip-geo-block-dropdown,fieldset.ip-geo-block-field .ip-geo-block-dropup{cursor:pointer;position:relative;padding-left:1em}fieldset.ip-geo-block-field .ip-geo-block-dropdown:before,fieldset.ip-geo-block-field .ip-geo-block-dropup:before{content:'';height:0;width:0;border:.4em solid transparent;position:absolute}fieldset.ip-geo-block-field .ip-geo-block-dropup:before{border-left:.4em solid #555;left:3px;top:15%}fieldset.ip-geo-block-field .ip-geo-block-dropdown:before{border-top:.4em solid #555;left:0;top:35%}fieldset.ip-geo-block-field ul.ip-geo-block-dropup:before{top:.25em}fieldset.ip-geo-block-field ul.ip-geo-block-dropdown:before{top:.45em}fieldset.ip-geo-block-field .form-table{margin:0;width:100%}fieldset.ip-geo-block-field .ip-geo-block-desc{color:#666;font-size:13px}textarea.regular-text{width:25em}ul.ip-geo-block-settings-folding{margin:.5em 0}ul.ip-geo-block-settings-folding ul{margin-bottom:0}ul.ip-geo-block-settings-folding li:first-child{margin-top:.5em}.folding-disable{pointer-events:none;opacity:.5}.folding-inactive{opacity:.5;font-style:oblique!important}ul.ip-geo-block-float li{display:inline-block;width:18em}ul#ip-geo-block-actions dfn{border:none}ul#ip-geo-block-actions span.dashicons{font-size:14px}.ip-geo-block-checked{list-style-type:disc}.ip-geo-block-ip-addr{display:inline-block;padding-top:5px}.ip-geo-block-hide{display:none}.ip-geo-block-result,.ip-geo-block-sup,.ip-geo-block-title,ul.ip-geo-block-list label{display:inline-block}.ip-geo-block-sup{margin-left:.2em}ul.ip-geo-block-note{margin-top:1em;list-style:disc inside}ul.ip-geo-block-list{margin-top:.25em;margin-bottom:.25em}@media screen and (min-width:782px){ul.ip-geo-block-list .code{width:15em}}.ip-geo-block-loading{background-size:16px 16px;background-position:center center;background-repeat:no-repeat;background-image:url(data:image/gif;base64,R0lGODlhEAAQAPIGAAAAAMLCwkJCQpKSkmJiYoKCgv///wAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJCgAGACwAAAAAEAAQAAADM2i63P4wyklrC0IEKgAQnAdOmGYFBLExwboQWcG2rlHEwTDQLUsUOd2mBxkUCgNKa+dIAAAh+QQJCgAGACwAAAIACgAOAAADLWgWIqHQCABEVLPe1R4MBOFFRFNsRUNsYDFewTC8iixvQ1EMyxjEvyBLODQkAAAh+QQJCgAGACwAAAAACgAOAAADLWi6IRJrCQCECoU0ag1xxeBARuEQ0UUU5DUM7fK+qTEUYR0EcM3Ev51uB7wAEwAh+QQJCgAGACwAAAAADgAKAAADLWi6URQrLiJEkSaM0eqrkLFtAVEEAgAIylAUQ5SuSqCFNZjhWG3zmB8wOJQkAAAh+QQJCgAGACwCAAAADgAKAAADK2hqMRMrLuekCnCU8gqBDCZ2glBcYkSUxIJJgQdaUVDOtAAAAr3oPN/llgAAIfkECQoABgAsBgAAAAoADgAAAytoEdauiz0Yx5BQFTvN2EMXWNgUFETZFIJQdERLiGgZtKohAIDQ7T0RrpEAACH5BAkKAAYALAYAAgAKAA4AAAMqaKoR+609Fie1K4zhZiibNRSg1XAQUXQPIQgE835voQgAIARqh+ummSUBACH5BAUKAAYALAIABgAOAAoAAAMsaLpsES2+F9mEddEgBFbBMGACAAiMOCrlGRBFWBQD2L0dYYjfUuQZEKynSAAAOw==);height:16px;width:16px;margin-left:1em;margin-top:.2em;display:inline-block}.ip-geo-block-border{border-top:inherit}.ip-geo-block-notice{color:#dd3d36}.ip-geo-block-title{width:100px}.ip-geo-block-result{color:#2786C2}#ip-geo-block-map{height:400px;margin:1em auto}.gm-style-iw{width:18em;height:auto!important;height:100%;min-height:100%:}.gm-style-iw ul{margin:.1em}.gm-style-iw li{margin:.2em}ul.ip-geo-block-statistics-countries li{width:12em;float:left;text-align:right;padding:.2em}table.ip-geo-block-statistics-table{float:right}table.ip-geo-block-statistics-table td,table.ip-geo-block-statistics-table th{width:12em;margin:0;padding:.2em;text-align:right;line-height:1.5em;word-wrap:break-word}table.ip-geo-block-statistics-table tr:nth-child(even){background-color:#eee}table.ip-geo-block-table{margin:1em 0;white-space:normal;word-wrap:break-word;word-break:break-all}table.ip-geo-block-table td:first-child{min-width:4.3em}@media screen and (max-width:782px){#ip-geo-block-whois .panel-body{padding:0 .5em}}#ip-geo-block-4 #ip-geo-block-section-1 .panel-body,#ip-geo-block-4 #ip-geo-block-section-2 .panel-body,#ip-geo-block-4 #ip-geo-block-section-3 .panel-body,#ip-geo-block-4 #ip-geo-block-section-4 .panel-body,#ip-geo-block-4 #ip-geo-block-section-5 .panel-body{padding:0;display:table-cell}.ip-geo-block-log{width:100%!important;margin:.5em 0}.ip-geo-block-log *{font-size:13px!important;line-height:1.5em}.ip-geo-block-log .pagination ul{border-radius:4px;display:inline-block;margin:.5em 0 0;padding:0}.ip-geo-block-log .pagination ul>li{display:inline}.ip-geo-block-log .pagination ul>li:first-child>a,.ip-geo-block-log .pagination ul>li:first-child>span{border-bottom-left-radius:4px;border-left-width:1px;border-top-left-radius:4px}.ip-geo-block-log .pagination ul>li:last-child>a,.ip-geo-block-log .pagination ul>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.ip-geo-block-log .pagination ul>.disabled>a,.ip-geo-block-log .pagination ul>.disabled>a:focus,.ip-geo-block-log .pagination ul>.disabled>a:hover,.ip-geo-block-log .pagination ul>.disabled>span{background-color:transparent;color:#999;cursor:default}.ip-geo-block-log .pagination ul>li>a,.ip-geo-block-log .pagination ul>li>span{border-color:#ddd;border-image:none;border-style:solid;border-width:1px 1px 1px 0;float:left;line-height:20px;padding:4px;width:20px;text-decoration:none}.ip-geo-block-log .pagination ul>.active>a,.ip-geo-block-log .pagination ul>.active>span{color:#999;cursor:default}.ip-geo-block-log .pagination ul>.active>a,.ip-geo-block-log .pagination ul>.active>span,.ip-geo-block-log .pagination ul>li>a:focus,.ip-geo-block-log .pagination ul>li>a:hover{background-color:#f7f7f7}.ip-geo-block-log .pagination-centered{text-align:center}.ip-geo-block-log.breakpoint>tbody>tr>td>span.footable-toggle{font-size:60%!important;position:relative;top:-1px;left:2px}.ip-geo-block-log>tbody>tr>td,.ip-geo-block-log>thead>tr>th{padding:4px 0;word-wrap:break-word;width:20%}.ip-geo-block-log>tbody>tr>td:first-child,.ip-geo-block-log>thead>tr>th:first-child{width:25%}.ip-geo-block-log>tbody>tr>td:first-child+td,.ip-geo-block-log>thead>tr>th:first-child+th{width:35%}.ip-geo-block-log>tbody>tr>td:nth-child(5),.ip-geo-block-log>tbody>tr>td:nth-child(5)+td,.ip-geo-block-log>thead>tr>th:nth-child(5),.ip-geo-block-log>thead>tr>th:nth-child(5)+th{width:60%;text-align:left}@media screen and (min-width:1024px){.ip-geo-block-log>tbody>tr>td:nth-child(3),.ip-geo-block-log>tbody>tr>td:nth-child(3)+td,.ip-geo-block-log>thead>tr>th:nth-child(3),.ip-geo-block-log>thead>tr>th:nth-child(3)+th{width:10%}}.ip-geo-block-log>thead>tr>th>span.footable-sort-indicator{color:#888}.ip-geo-block-log>tbody>tr>td{text-align:center}.ip-geo-block-log>tbody>tr>td:first-child{text-align:left;padding-left:.5em}.ip-geo-block-log .footable-row-detail-name,.ip-geo-block-log .footable-row-detail-row,.ip-geo-block-log .footable-row-detail-value{display:block}.ip-geo-block-log .footable-row-detail-value{padding:0 1em 4px;white-space:normal;word-wrap:break-word;word-break:break-all}input#ip_geo_block_settings_filter_logs{width:16em;padding-top:3px}#ip-geo-block-code-list{display:none;margin-bottom:0}#ip-geo-block-chart-countries{height:200px}#ip-geo-block-chart-daily{height:240px}#ip_geo_block_settings_validation_mimetype+label{padding-top:.25em}#ip_geo_block_settings_validation_mimetype+label+ul,#ip_geo_block_settings_validation_plugins,#ip_geo_block_settings_validation_themes{margin-top:.7em}#ip_geo_block_settings_create_user{margin-bottom:.5em}#ip-geo-block-back-to-top a,#ip-geo-block-toggle-sections{box-shadow:none}#ip-geo-block-wp-info textarea{margin-top:.5em;overflow:auto;width:100%;word-wrap:normal;word-break:normal;white-space:pre}#ip-geo-block-preferred{color:#fff;background:#00838f!important;border-color:#00707a!important;text-shadow:none}#ip-geo-block-preferred:hover{background-color:#00919e!important;border-color:#00525a!important}span.ip-geo-block-title-link{font-size:13px}dfn~.ip-geo-block-cycle,dfn~.ip-geo-block-lock,dfn~.ip-geo-block-unlock{margin-left:.75em}.ip-geo-block-cycle,.ip-geo-block-lock,.ip-geo-block-unlock{cursor:pointer;box-shadow:none;text-decoration:none}.ip-geo-block-cycle:active,.ip-geo-block-lock:active,.ip-geo-block-unlock:active{position:relative;top:1px}.ip-geo-block-cycle span,.ip-geo-block-lock span,.ip-geo-block-unlock span{height:16px;width:16px;margin:0;border:none;display:inline-block;vertical-align:middle;background-size:16px 16px;background-position:center center;background-repeat:no-repeat}.ip-geo-block-cycle span{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAh1BMVEUAda2otLp+rsSHprWHr8IBd7EpfKRGhaNajqeUqrRymKuKoq5yo7prlKgAcqoVe6w8gqQmgq5Tj6wIdqsVdKIshrEMea1Uhp+Anqw0hawDdq4gfKhljqE7hqoLdKYbgbM4jLQygKUGeK8CdawQd6gVeKcad6NKkrSerrZAj7UAc6sAc6rc3NySrVGQAAAALXRSTlP//////////////////////////////////////////////////////////wCl7wv9AAACOklEQVR4Ae2W15rzKgxF9xTZzhTX9B7S/gN6/9ebYqzzGZsw/S7LV3FZgCSIwD/kQ8FVcBU8xatZUczy8luC/ABNOn0DSHEsvyZ4PgLatNCYR3efFxyhTQ8g+qQgJxgv2JefERzJXATRh4LHOUwAHD4S7OGEztRJaN86hAUxtaNWDUf/bRdDBbQMWVDAO8jn89WUhag1MeyCAh6hHofyrliLgZKggDMYgzF3eVAwFq0uCZq5KY0TezjIHDDzC0qqmkwe2ctGDOQVLMkgu+F3/rGXwb4xIPcJ6P3JgkM8wFjmfcFAWfeKQywaAz33BJVuHsUcAt09gVbuLDThAJkdR687ggLmf4gDJLIGV7BydtB8yn3u+fbtuj/LS7G9wZAd1AKK+yxJ1x+aBmibTtgCcEHGHsh0wdbOgNLek4L7lI5BigY8nWuZUQ3qGEXes9JzOKGJztPaGtLslu3lIXJirdxCWkASHGDTMqg7V1DKPplygDG61YJukLHjEErGSXqCSos6xNSOgzP3BDmsQBcchNwkoV8oiNnPA78zIefUgCdJeGIfE7LmFWXsFTCFdzTJ/RlfEMRiSGnFXXbkC7AIeqcKDu4ynseozeouKJiSEYBDwkJyIC1nRUjgblkNWp/e/1vXc2gjoAoLksYgjrrFMi0oDgjEEIDij1scBXMJSH6DAj6RNl7o8MkuLak8Co15/Pk+MRmT0xilQJV/sdWNKg2kTaeroudvNNsDjmejYjSL+e6v2/2r4Cp4BXNajr0H7hRfAAAAAElFTkSuQmCC)}.ip-geo-block-lock span{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAYFBMVEXc3Ny3y9Zzq8dRmb7M1dlXnsIFdK0AcawAcqwphrYAcKvZ29wAb6oJd680jrqlw9MBcqxmo8MUfbJLl75eoMI7kbzX2ttqp8VSmL1YnL8NeK+Tu89DlL1ImMEOebBNmL4OkqMoAAAAAXRSTlMAQObYZgAAAPlJREFUeAG9kAWyhTAQBIPOsCzufv9TPnf4Ll0CSbpmxXwNy3Yc23rz2fV8kPA99433AIQIiGDTCD0lojiOQPXCDSFJIbF16CMWItkQMkF+inZzSLYhFKLl+a9UKTZaqJTZJYtarZuo40chrv9CqJTN+behVi+Cm7RdDgRld6AMgLxrE/dxBz0BEjwBEmD/uIsWPAOAF9A+CE56ufSryr8oqfOYcBbQJ8YkES7COkFOYzTypqCDOTDo2wljaEw4vp1APYyWKd8WMBozylvCpcvmXeHQ5fCegHia4s1FgZcIVeVFeFx1M4MvYG4eBHdYWufC+addBtf8E3vdjBNhWnVQqAAAAABJRU5ErkJggg==)}.ip-geo-block-unlock span{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAYFBMVEXc3NyzydRzq8dRmb7I09hYnsEFdK0AcawAcqzP1toqhrYAcKvZ29wAb6oMeK8zjbqrxtQBcazBz9Zko8MVfbLF0thMmL07kbtpp8WjwtJSmL1YnL+Tu89DlL1JmMEPebBFV++UAAAAAXRSTlMAQObYZgAAAONJREFUeAG9kAWChDAMAIMmJaTFXf7/ynXflvMbnE5j8DU8Pwh8D1yEUYxEGEchWFEJEjEflESBhTQSQm2MRpIotQhZTmgKgMIg5ZlFKBmrGg7UFXJpEQKW8qIKN7YeikJdBJI2BTtXwfyx0L3XoPphvBEliNU49OoxqEa6g4cTST/OYshvi3hV8+FxSNfluG3jqxG8C6h7gF6jU+AODnTsFGSCA5O4I8wpQDq7I5CUAKWQW+AZYOYtoQPoGDeECWDaioBmWQxeBduoWURso+5WpBdw7R4ENTVDcGE435tJwT+xB+vMEnZRNB0YAAAAAElFTkSuQmCC)}#ip-geo-block-back-to-top{margin:0;text-align:right}.ip-geo-block-multisite{margin-bottom:1em}ol.ip-geo-block-top-list{display:inline-table;list-style-position:outside;margin:0 2em .5em 1.75em}ol.ip-geo-block-top-list h4{margin:1em 0}ol.ip-geo-block-top-list li code{background:0 0}#toplevel_page_ip-geo-block .wp-menu-image img{height:18px;width:18px}.ip-geo-block-admin-post{color:#c43322;margin-left:.25em}
1
+ /*
2
+ Project: WordPress IP Geo Block
3
+ Copyright (c) 2015-2017 tokkonopapa (tokkonopapa@yahoo.com)
4
+ This software is released under the MIT License.
5
+ */
6
+ dfn{cursor:help;border-bottom:1px dotted #888}fieldset,legend{padding:0;margin:0;border:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}fieldset{min-width:0}legend{display:block;line-height:inherit;width:100%}.panel-body,label{display:inline-block}label{max-width:100%}.panel{border:1px solid #e5e5e5;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.04);-moz-box-shadow:0 1px 1px rgba(0,0,0,.04);box-shadow:0 1px 1px rgba(0,0,0,.04);background:#f5f5f5}.panel-heading{float:left!important;background:#fff}.panel-default>.panel-heading{border-color:inherit}.panel-body{width:100%;padding:0 1em;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.panel-body:after,.panel-body:before{content:" ";display:table}.panel-body:after{clear:both}fieldset.ip-geo-block-field{margin:1em 0}fieldset.ip-geo-block-field h2,fieldset.ip-geo-block-field h3{padding:0;margin:0;font-size:14px!important}fieldset.ip-geo-block-field legend.panel-heading{padding:10px}fieldset.ip-geo-block-field .ip-geo-block-dropdown,fieldset.ip-geo-block-field .ip-geo-block-dropup{cursor:pointer;position:relative;padding-left:1em}fieldset.ip-geo-block-field .ip-geo-block-dropdown:before,fieldset.ip-geo-block-field .ip-geo-block-dropup:before{content:'';height:0;width:0;border:.4em solid transparent;position:absolute}fieldset.ip-geo-block-field .ip-geo-block-dropup:before{border-left:.4em solid #555;left:2px;top:18%}fieldset.ip-geo-block-field .ip-geo-block-dropdown:before{border-top:.4em solid #555;left:-2px;top:38%}fieldset.ip-geo-block-field ul.ip-geo-block-dropup:before{top:.25em}fieldset.ip-geo-block-field ul.ip-geo-block-dropdown:before{top:.45em}fieldset.ip-geo-block-field table.form-table{margin:0 0 .5em;width:100%}fieldset.ip-geo-block-field .ip-geo-block-desc{color:#666;font-size:13px!important}textarea.regular-text{width:25em}ul.ip-geo-block-settings-folding{margin:.5em 0}ul.ip-geo-block-settings-folding ul{margin-bottom:0}ul.ip-geo-block-settings-folding li:first-child{margin-top:.5em}.folding-disable{pointer-events:none;opacity:.5}.folding-inactive{opacity:.5;font-style:oblique!important}ul.ip-geo-block-float li{display:inline-block;width:18em}ul#ip-geo-block-actions dfn{border:none}ul#ip-geo-block-actions span.dashicons{font-size:14px}.ip-geo-block-checked{list-style-type:disc}.ip-geo-block-ip-addr{display:inline-block;padding-top:5px}.ip-geo-block-hide{display:none}.ip-geo-block-result,.ip-geo-block-sup,.ip-geo-block-title,ul.ip-geo-block-list label{display:inline-block}.ip-geo-block-sup{margin-left:.2em}ul.ip-geo-block-note{margin-top:1em;list-style:disc inside}ul.ip-geo-block-list{margin-top:.25em;margin-bottom:.25em}@media screen and (min-width:782px){ul.ip-geo-block-list .code{width:15em}}#ip-geo-block-live-loading,.ip-geo-block-loading{background-size:16px 16px;background-position:center center;background-repeat:no-repeat;height:16px;width:16px;margin-left:1em;margin-top:.2em;display:inline-block;vertical-align:middle}.ip-geo-block-loading{background-image:url(data:image/gif;base64,R0lGODlhEAAQAPIGAAAAAMLCwkJCQpKSkmJiYoKCgv///wAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJCgAGACwAAAAAEAAQAAADM2i63P4wyklrC0IEKgAQnAdOmGYFBLExwboQWcG2rlHEwTDQLUsUOd2mBxkUCgNKa+dIAAAh+QQJCgAGACwAAAIACgAOAAADLWgWIqHQCABEVLPe1R4MBOFFRFNsRUNsYDFewTC8iixvQ1EMyxjEvyBLODQkAAAh+QQJCgAGACwAAAAACgAOAAADLWi6IRJrCQCECoU0ag1xxeBARuEQ0UUU5DUM7fK+qTEUYR0EcM3Ev51uB7wAEwAh+QQJCgAGACwAAAAADgAKAAADLWi6URQrLiJEkSaM0eqrkLFtAVEEAgAIylAUQ5SuSqCFNZjhWG3zmB8wOJQkAAAh+QQJCgAGACwCAAAADgAKAAADK2hqMRMrLuekCnCU8gqBDCZ2glBcYkSUxIJJgQdaUVDOtAAAAr3oPN/llgAAIfkECQoABgAsBgAAAAoADgAAAytoEdauiz0Yx5BQFTvN2EMXWNgUFETZFIJQdERLiGgZtKohAIDQ7T0RrpEAACH5BAkKAAYALAYAAgAKAA4AAAMqaKoR+609Fie1K4zhZiibNRSg1XAQUXQPIQgE835voQgAIARqh+ummSUBACH5BAUKAAYALAIABgAOAAoAAAMsaLpsES2+F9mEddEgBFbBMGACAAiMOCrlGRBFWBQD2L0dYYjfUuQZEKynSAAAOw==)}.ip-geo-block-border{border-top:inherit}.ip-geo-block-notice{color:#dd3d36}.ip-geo-block-title{width:100px}.ip-geo-block-result{color:#2786C2}#ip-geo-block-map{height:400px;margin:1em auto}.gm-style-iw{width:18em;height:auto!important;height:100%;min-height:100%:}.gm-style-iw ul{margin:.1em}.gm-style-iw li{margin:.2em}ul.ip-geo-block-statistics-countries li{width:12em;float:left;text-align:right;padding:.2em}table.ip-geo-block-statistics-table{float:right}table.ip-geo-block-statistics-table td,table.ip-geo-block-statistics-table th{width:12em;margin:0;padding:.2em;text-align:right;line-height:1.5em;word-wrap:break-word}table.ip-geo-block-statistics-table tr:nth-child(even){background-color:#eee}table.ip-geo-block-table{margin:1em 0;white-space:normal;word-wrap:break-word;word-break:break-all}table.ip-geo-block-table td:first-child{min-width:4.3em}@media screen and (max-width:782px){#ip-geo-block-whois .panel-body{padding:0 .5em}}#ip-geo-block-scan-code{vertical-align:middle}#ip-geo-block-code-list{display:none;margin-bottom:0}#ip-geo-block-chart-countries{height:200px}#ip-geo-block-chart-daily{height:240px}#ip_geo_block_settings_validation_mimetype+label{padding-top:.25em}#ip_geo_block_settings_validation_mimetype+label+ul,#ip_geo_block_settings_validation_plugins,#ip_geo_block_settings_validation_themes{margin-top:.7em}#ip_geo_block_settings_create_user{margin-bottom:.5em}#ip-geo-block-back-to-top a,#ip-geo-block-toggle-sections{box-shadow:none}#ip-geo-block-wp-info textarea{margin-top:.5em;overflow:auto;width:100%;word-wrap:normal;word-break:normal;white-space:pre}#ip-geo-block-preferred{color:#fff;background:#00838f!important;border-color:#00707a!important;text-shadow:none}#ip-geo-block-preferred:hover{background-color:#00919e!important;border-color:#00525a!important}span.ip-geo-block-title-link{font-size:13px!important}dfn~.ip-geo-block-cycle,dfn~.ip-geo-block-lock,dfn~.ip-geo-block-unlock{margin-left:.6em}.ip-geo-block-cycle,.ip-geo-block-lock,.ip-geo-block-unlock{cursor:pointer;box-shadow:none;text-decoration:none}.ip-geo-block-cycle:active,.ip-geo-block-lock:active,.ip-geo-block-unlock:active{position:relative;top:1px}.ip-geo-block-cycle span,.ip-geo-block-lock span,.ip-geo-block-unlock span{height:16px;width:16px;margin:0;border:none;display:inline-block;vertical-align:middle;background-size:16px 16px;background-position:center center;background-repeat:no-repeat}.dataTables_wrapper.no-footer .dataTables_scrollBody,table.dataTable.no-footer,table.dataTable>thead>tr>td,table.dataTable>thead>tr>th{border-bottom:1px solid #ddd}.ip-geo-block-cycle span{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAh1BMVEUAda2otLp+rsSHprWHr8IBd7EpfKRGhaNajqeUqrRymKuKoq5yo7prlKgAcqoVe6w8gqQmgq5Tj6wIdqsVdKIshrEMea1Uhp+Anqw0hawDdq4gfKhljqE7hqoLdKYbgbM4jLQygKUGeK8CdawQd6gVeKcad6NKkrSerrZAj7UAc6sAc6rc3NySrVGQAAAALXRSTlP//////////////////////////////////////////////////////////wCl7wv9AAACOklEQVR4Ae2W15rzKgxF9xTZzhTX9B7S/gN6/9ebYqzzGZsw/S7LV3FZgCSIwD/kQ8FVcBU8xatZUczy8luC/ABNOn0DSHEsvyZ4PgLatNCYR3efFxyhTQ8g+qQgJxgv2JefERzJXATRh4LHOUwAHD4S7OGEztRJaN86hAUxtaNWDUf/bRdDBbQMWVDAO8jn89WUhag1MeyCAh6hHofyrliLgZKggDMYgzF3eVAwFq0uCZq5KY0TezjIHDDzC0qqmkwe2ctGDOQVLMkgu+F3/rGXwb4xIPcJ6P3JgkM8wFjmfcFAWfeKQywaAz33BJVuHsUcAt09gVbuLDThAJkdR687ggLmf4gDJLIGV7BydtB8yn3u+fbtuj/LS7G9wZAd1AKK+yxJ1x+aBmibTtgCcEHGHsh0wdbOgNLek4L7lI5BigY8nWuZUQ3qGEXes9JzOKGJztPaGtLslu3lIXJirdxCWkASHGDTMqg7V1DKPplygDG61YJukLHjEErGSXqCSos6xNSOgzP3BDmsQBcchNwkoV8oiNnPA78zIefUgCdJeGIfE7LmFWXsFTCFdzTJ/RlfEMRiSGnFXXbkC7AIeqcKDu4ynseozeouKJiSEYBDwkJyIC1nRUjgblkNWp/e/1vXc2gjoAoLksYgjrrFMi0oDgjEEIDij1scBXMJSH6DAj6RNl7o8MkuLak8Co15/Pk+MRmT0xilQJV/sdWNKg2kTaeroudvNNsDjmejYjSL+e6v2/2r4Cp4BXNajr0H7hRfAAAAAElFTkSuQmCC)}.ip-geo-block-lock span{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAYFBMVEXc3Ny3y9Zzq8dRmb7M1dlXnsIFdK0AcawAcqwphrYAcKvZ29wAb6oJd680jrqlw9MBcqxmo8MUfbJLl75eoMI7kbzX2ttqp8VSmL1YnL8NeK+Tu89DlL1ImMEOebBNmL4OkqMoAAAAAXRSTlMAQObYZgAAAPlJREFUeAG9kAWyhTAQBIPOsCzufv9TPnf4Ll0CSbpmxXwNy3Yc23rz2fV8kPA99433AIQIiGDTCD0lojiOQPXCDSFJIbF16CMWItkQMkF+inZzSLYhFKLl+a9UKTZaqJTZJYtarZuo40chrv9CqJTN+behVi+Cm7RdDgRld6AMgLxrE/dxBz0BEjwBEmD/uIsWPAOAF9A+CE56ufSryr8oqfOYcBbQJ8YkES7COkFOYzTypqCDOTDo2wljaEw4vp1APYyWKd8WMBozylvCpcvmXeHQ5fCegHia4s1FgZcIVeVFeFx1M4MvYG4eBHdYWufC+addBtf8E3vdjBNhWnVQqAAAAABJRU5ErkJggg==)}.ip-geo-block-unlock span{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAYFBMVEXc3NyzydRzq8dRmb7I09hYnsEFdK0AcawAcqzP1toqhrYAcKvZ29wAb6oMeK8zjbqrxtQBcazBz9Zko8MVfbLF0thMmL07kbtpp8WjwtJSmL1YnL+Tu89DlL1JmMEPebBFV++UAAAAAXRSTlMAQObYZgAAAONJREFUeAG9kAWChDAMAIMmJaTFXf7/ynXflvMbnE5j8DU8Pwh8D1yEUYxEGEchWFEJEjEflESBhTQSQm2MRpIotQhZTmgKgMIg5ZlFKBmrGg7UFXJpEQKW8qIKN7YeikJdBJI2BTtXwfyx0L3XoPphvBEliNU49OoxqEa6g4cTST/OYshvi3hV8+FxSNfluG3jqxG8C6h7gF6jU+AODnTsFGSCA5O4I8wpQDq7I5CUAKWQW+AZYOYtoQPoGDeECWDaioBmWQxeBduoWURso+5WpBdw7R4ENTVDcGE435tJwT+xB+vMEnZRNB0YAAAAAElFTkSuQmCC)}table.form-table th .ip-geo-block-cycle span{vertical-align:text-bottom}#ip-geo-block-back-to-top{margin:0;text-align:right}#ip-geo-block-live-update,#ip-geo-block-open-new{margin-left:1em}.ip-geo-block-network{margin-bottom:1em}ol.ip-geo-block-top-list{display:inline-table;list-style-position:outside;margin:0 2em .5em 1.75em}ol.ip-geo-block-top-list h4{margin:1em 0}ol.ip-geo-block-top-list li code{background:0 0}#adminmenu #toplevel_page_ip-geo-block .wp-menu-image img{height:20px!important;width:20px!important}.ip-geo-block-admin-post{color:#c43322;margin-left:.25em}svg a>text{fill:#0073aa;text-decoration:underline}svg a:hover>text{fill:#0096dd}.ip-geo-block-container{margin:0 auto;padding:0 1em;position:relative;width:100%}.ip-geo-block-row{display:flex;flex-direction:column;align-items:flex-start;align-items:stretch;padding:0;width:100%}.ip-geo-block-row .ip-geo-block-column{display:block;flex:1 1 auto;align-self:flex-start;margin-left:0;max-width:100%;width:100%}.ip-geo-block-row .ip-geo-block-column.column-20{flex:0 0 20%;max-width:20%}.ip-geo-block-row .ip-geo-block-column.column-25{flex:0 0 25%;max-width:25%}.ip-geo-block-row .ip-geo-block-column.column-33{flex:0 0 33.3333%;max-width:33.3333%}.ip-geo-block-row .ip-geo-block-column.column-50{flex:0 0 50%;max-width:50%}@media (min-width:40rem){.ip-geo-block-row{flex-direction:row;margin-left:-2em;width:calc(100% + 2em)}.ip-geo-block-row .ip-geo-block-column{margin-bottom:inherit;padding:0 1em}}table.dataTable{clear:none!important}table.dataTable td,table.dataTable th{text-align:right}table.dataTable td:nth-child(n+2),table.dataTable th:nth-child(n+2){padding-left:0!important}table.dataTable th{white-space:nowrap}table.dataTable>thead>tr{line-height:1.8em}table.dataTable>tbody>tr{cursor:pointer}table.dataTable thead td,table.dataTable thead th{padding:10px 16px}#ip-geo-block-statistics-cache td:nth-child(3),#ip-geo-block-validation-logs td:nth-child(4){min-width:1.6em}table.dataTable.nowrap td,table.dataTable>tbody>tr>td span{white-space:normal!important;word-wrap:break-word!important;word-break:break-all!important}table.dataTable>tbody>tr>td span{display:inline-block}table.dataTable input[type=checkbox]{height:16px;width:16px;margin:0}table.dataTable>tbody>tr>td:first-child,table.dataTable>thead>tr>th:first-child{padding:8px 4px 8px 18px;text-align:left}table.collapsed>tbody>tr>td.dataTables_empty:first-child::before,table.dataTable>tbody>tr>td.dataTables_empty{border:none;text-align:center}table.dataTable thead>tr>th:first-child.sorting_asc{background-image:none!important}table.dataTable.display tbody tr.even>.sorting_1,table.dataTable.display tbody tr.odd>.sorting_1,table.dataTable.display tbody tr:hover>.sorting_1{background-color:inherit!important}table.dataTable.collapsed>tbody>tr>td:first-child{padding:8px 4px 8px 8px!important}table.collapsed>tbody>tr.parent>td:first-child::before,table.collapsed>tbody>tr>td:first-child::before{content:'';height:0;width:0;display:inline-block;border-radius:0;border:5px solid transparent;box-shadow:none;position:relative;background-color:transparent}table.collapsed>tbody>tr>td:first-child::before{border-left:5px solid #555;top:1px;left:-2px}table.collapsed>tbody>tr.parent>td:first-child::before{border-top:5px solid #555;top:4px;left:-4px}table.collapsed>tbody>tr.child>td:first-child::before{border:none}table.collapsed>tbody>tr.child>td.child>ul li{border:none;padding:0;margin:0;line-height:1.8em}table.collapsed>tbody>tr.child>td.child>ul li span.dtr-data,table.collapsed>tbody>tr.child>td.child>ul li span.dtr-title{font-size:13px!important;display:block;white-space:normal;word-wrap:break-word;word-break:break-all}table.collapsed>tbody>tr.child>td.child>ul li span.dtr-data{margin-left:1.25em;margin-right:.3em}.dataTables_wrapper .dataTables_paginate{float:none;text-align:center;margin-bottom:1em}.dataTables_wrapper .dataTables_paginate a.paginate_button,.dataTables_wrapper .dataTables_paginate a.paginate_button.current,.dataTables_wrapper .dataTables_paginate a.paginate_button.current:active,.dataTables_wrapper .dataTables_paginate a.paginate_button.current:hover,.dataTables_wrapper .dataTables_paginate a.paginate_button.disabled,.dataTables_wrapper .dataTables_paginate a.paginate_button.disabled:active,.dataTables_wrapper .dataTables_paginate a.paginate_button.disabled:hover,.dataTables_wrapper .dataTables_paginate a.paginate_button:active,.dataTables_wrapper .dataTables_paginate a.paginate_button:hover,.dataTables_wrapper .dataTables_paginate span.ellipsis{min-width:2em;background:inherit;border-color:#ddd;border-radius:0;border-image:none;border-style:solid;border-width:1px 1px 1px 0;box-shadow:none;margin:.5em 0 0;padding:.25em 0;display:inline-block;text-decoration:none}#ip-geo-block-1 #ip-geo-block-section-2 .panel-body,#ip-geo-block-4 #ip-geo-block-section-0 .panel-body,mark{padding:0}.dataTables_wrapper .dataTables_paginate:active>a.paginate_button:first-child,.dataTables_wrapper .dataTables_paginate:hover>a.paginate_button:first-child,.dataTables_wrapper .dataTables_paginate>a.paginate_button:first-child{border-left-width:1px;border-bottom-left-radius:4px;border-top-left-radius:4px}.dataTables_wrapper .dataTables_paginate:active>a.paginate_button:last-child,.dataTables_wrapper .dataTables_paginate:hover>a.paginate_button:last-child,.dataTables_wrapper .dataTables_paginate>a.paginate_button:last-child{border-bottom-right-radius:4px;border-top-right-radius:4px}.dataTables_wrapper .dataTables_paginate a.paginate_button{color:#0073aa!important}.dataTables_wrapper .dataTables_paginate a.paginate_button:hover{color:#0096dd!important;background-color:#fff}.dataTables_wrapper .dataTables_paginate a.paginate_button.disabled,.dataTables_wrapper .dataTables_paginate a.paginate_button.disabled:active,.dataTables_wrapper .dataTables_paginate a.paginate_button.disabled:hover,.dataTables_wrapper .dataTables_paginate span.ellipsis{cursor:default;color:#999!important;background-color:transparent}.dataTables_wrapper .dataTables_paginate a.paginate_button.current,.dataTables_wrapper .dataTables_paginate a.paginate_button.current:active,.dataTables_wrapper .dataTables_paginate a.paginate_button.current:hover{cursor:default;color:#444!important;background-color:#fff!important}#ip-geo-block-1 #ip-geo-block-section-2 table.form-table,#ip-geo-block-4 #ip-geo-block-section-0 table.form-table{margin-left:1em;max-width:95%}ul#ip-geo-block-live-log,ul#ip-geo-block-select-duration,ul#ip-geo-block-select-layout,ul#ip-geo-block-select-target{margin:0}ul#ip-geo-block-select-duration li,ul#ip-geo-block-select-layout li,ul#ip-geo-block-select-target li{float:left;margin-right:1.5em}ul#ip-geo-block-select-duration li label,ul#ip-geo-block-select-target li label{cursor:pointer}input#ip_geo_block_settings_search_filter{width:16em;padding-top:3px}table.dataTable.display tbody tr.ip-geo-block-passed{background-color:#edf6ff!important}table.dataTable.display tbody tr.ip-geo-block-blocked{background-color:#ffefef!important}.ip-geo-block-new-passed{animation:ip-geo-block-flash-passed 1s ease-out 0s 1 normal both running}.ip-geo-block-new-blocked{animation:ip-geo-block-flash-blocked 1s ease-out 0s 1 normal both running}@keyframes ip-geo-block-flash-passed{0%{background-color:gold}100%{background-color:#edf6ff}}@keyframes ip-geo-block-flash-blocked{0%{background-color:gold}100%{background-color:#ffefef}}mark{background:gold}ul#ip-geo-block-live-log li{float:left;margin-right:3em}ul#ip-geo-block-live-log li:last-child{margin-right:0}ul#ip-geo-block-live-log li input[type=radio]{display:none}ul#ip-geo-block-live-log li input[type=radio]+label{display:inline-block;margin:-2px -2px 0;padding:4px 12px;font-size:14px;line-height:20px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #ccc;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);border-bottom-color:#b3b3b3;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05)}ul#ip-geo-block-live-log li input[type=radio]:checked+label{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05);background-color:#e0e0e0}.ip-geo-block-live-timer{height:1em;width:1em;position:relative;top:-.1em;margin:0}.ip-geo-block-live-timer:before{content:"";display:block;height:1em;width:1em;background:radial-gradient(#0073aa,#72777c);position:absolute;border-radius:50%;top:0;left:0}.ip-geo-block-live-timer:after{display:none}.ip-geo-block-live-timer>div{position:absolute;width:1em;height:1em;clip:rect(0,1em,1em,.5em)}.ip-geo-block-live-timer>div:before{content:" ";position:absolute;width:1em;height:1em;border-radius:.5em;clip:rect(0,.5em,1em,0);background-color:#f1f1f1;transform:rotate(0)}.ip-geo-block-live-timer>div:first-child:before{animation:30s spin-timer linear forwards}.ip-geo-block-live-timer>div:last-child{transform:rotate(180deg)}.ip-geo-block-live-timer>div:last-child:before{transform:rotate(.00001deg);animation:30s spin-timer linear 30s forwards}@keyframes spin-timer{0%{transform:rotate(0)}100%{transform:rotate(180deg)}}
admin/css/fonts/icomoon.eot ADDED
Binary file
admin/css/fonts/icomoon.svg ADDED
@@ -0,0 +1,35 @@
1
+ <?xml version="1.0" standalone="no"?>
2
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
3
+ <svg xmlns="http://www.w3.org/2000/svg">
4
+ <metadata>Generated by IcoMoon</metadata>
5
+ <defs>
6
+ <font id="icomoon" horiz-adv-x="1024">
7
+ <font-face units-per-em="1024" ascent="960" descent="-64" />
8
+ <missing-glyph horiz-adv-x="1024" />
9
+ <glyph unicode="&#x20;" horiz-adv-x="512" d="" />
10
+ <glyph unicode="&#xe933;" glyph-name="folder-download" d="M576 704l-128 128h-448v-832h1024v704h-448zM512 96l-224 224h160v256h128v-256h160l-224-224z" />
11
+ <glyph unicode="&#xe948;" glyph-name="location2" d="M512 960c-176.732 0-320-143.268-320-320 0-320 320-704 320-704s320 384 320 704c0 176.732-143.27 320-320 320zM512 444c-108.248 0-196 87.752-196 196s87.752 196 196 196 196-87.752 196-196-87.752-196-196-196zM388 640c0 68.483 55.517 124 124 124s124-55.517 124-124c0-68.483-55.517-124-124-124s-124 55.517-124 124z" />
12
+ <glyph unicode="&#xe94b;" glyph-name="map" d="M0 768l320 128v-768l-320-128zM384 928l320-192v-736l-320 160zM768 736l256 192v-768l-256-192z" />
13
+ <glyph unicode="&#xe964;" glyph-name="database" d="M512 960c-282.77 0-512-71.634-512-160v-128c0-88.366 229.23-160 512-160s512 71.634 512 160v128c0 88.366-229.23 160-512 160zM512 416c-282.77 0-512 71.634-512 160v-192c0-88.366 229.23-160 512-160s512 71.634 512 160v192c0-88.366-229.23-160-512-160zM512 128c-282.77 0-512 71.634-512 160v-192c0-88.366 229.23-160 512-160s512 71.634 512 160v192c0-88.366-229.23-160-512-160z" />
14
+ <glyph unicode="&#xe97b;" glyph-name="spinner2" d="M1024 448c-1.278 66.862-15.784 133.516-42.576 194.462-26.704 61-65.462 116.258-113.042 161.92-47.552 45.696-103.944 81.82-164.984 105.652-61.004 23.924-126.596 35.352-191.398 33.966-64.81-1.282-129.332-15.374-188.334-41.356-59.048-25.896-112.542-63.47-156.734-109.576-44.224-46.082-79.16-100.708-102.186-159.798-23.114-59.062-34.128-122.52-32.746-185.27 1.286-62.76 14.964-125.148 40.134-182.206 25.088-57.1 61.476-108.828 106.11-151.548 44.61-42.754 97.472-76.504 154.614-98.72 57.118-22.304 118.446-32.902 179.142-31.526 60.708 1.29 120.962 14.554 176.076 38.914 55.15 24.282 105.116 59.48 146.366 102.644 41.282 43.14 73.844 94.236 95.254 149.43 13.034 33.458 21.88 68.4 26.542 103.798 1.246-0.072 2.498-0.12 3.762-0.12 35.346 0 64 28.652 64 64 0 1.796-0.094 3.572-0.238 5.332h0.238zM922.306 278.052c-23.472-53.202-57.484-101.4-99.178-141.18-41.67-39.81-91-71.186-144.244-91.79-53.228-20.678-110.29-30.452-166.884-29.082-56.604 1.298-112.596 13.736-163.82 36.474-51.25 22.666-97.684 55.49-135.994 95.712-38.338 40.198-68.528 87.764-88.322 139.058-19.87 51.284-29.228 106.214-27.864 160.756 1.302 54.552 13.328 108.412 35.254 157.69 21.858 49.3 53.498 93.97 92.246 130.81 38.73 36.868 84.53 65.87 133.874 84.856 49.338 19.060 102.136 28.006 154.626 26.644 52.5-1.306 104.228-12.918 151.562-34.034 47.352-21.050 90.256-51.502 125.624-88.782 35.396-37.258 63.21-81.294 81.39-128.688 18.248-47.392 26.782-98.058 25.424-148.496h0.238c-0.144-1.76-0.238-3.536-0.238-5.332 0-33.012 24.992-60.174 57.086-63.624-6.224-34.822-16.53-68.818-30.78-100.992z" />
15
+ <glyph unicode="&#xe985;" glyph-name="binoculars" d="M64 960h384v-64h-384zM576 960h384v-64h-384zM952 640h-56v256h-256v-256h-256v256h-256v-256h-56c-39.6 0-72-32.4-72-72v-560c0-39.6 32.4-72 72-72h304c39.6 0 72 32.4 72 72v376h128v-376c0-39.6 32.4-72 72-72h304c39.6 0 72 32.4 72 72v560c0 39.6-32.4 72-72 72zM348 0h-248c-19.8 0-36 14.4-36 32s16.2 32 36 32h248c19.8 0 36-14.4 36-32s-16.2-32-36-32zM544 448h-64c-17.6 0-32 14.4-32 32s14.4 32 32 32h64c17.6 0 32-14.4 32-32s-14.4-32-32-32zM924 0h-248c-19.8 0-36 14.4-36 32s16.2 32 36 32h248c19.8 0 36-14.4 36-32s-16.2-32-36-32z" />
16
+ <glyph unicode="&#xe986;" glyph-name="search" d="M992.262 88.604l-242.552 206.294c-25.074 22.566-51.89 32.926-73.552 31.926 57.256 67.068 91.842 154.078 91.842 249.176 0 212.078-171.922 384-384 384-212.076 0-384-171.922-384-384s171.922-384 384-384c95.098 0 182.108 34.586 249.176 91.844-1-21.662 9.36-48.478 31.926-73.552l206.294-242.552c35.322-39.246 93.022-42.554 128.22-7.356s31.892 92.898-7.354 128.22zM384 320c-141.384 0-256 114.616-256 256s114.616 256 256 256 256-114.616 256-256-114.614-256-256-256z" />
17
+ <glyph unicode="&#xe98d;" glyph-name="key" d="M704 960c-176.73 0-320-143.268-320-320 0-20.026 1.858-39.616 5.376-58.624l-389.376-389.376v-192c0-35.346 28.654-64 64-64h64v64h128v128h128v128h128l83.042 83.042c34.010-12.316 70.696-19.042 108.958-19.042 176.73 0 320 143.268 320 320s-143.27 320-320 320zM799.874 639.874c-53.020 0-96 42.98-96 96s42.98 96 96 96 96-42.98 96-96-42.98-96-96-96z" />
18
+ <glyph unicode="&#xe98f;" glyph-name="lock" d="M592 512h-16v192c0 105.87-86.13 192-192 192h-128c-105.87 0-192-86.13-192-192v-192h-16c-26.4 0-48-21.6-48-48v-480c0-26.4 21.6-48 48-48h544c26.4 0 48 21.6 48 48v480c0 26.4-21.6 48-48 48zM192 704c0 35.29 28.71 64 64 64h128c35.29 0 64-28.71 64-64v-192h-256v192z" />
19
+ <glyph unicode="&#xe990;" glyph-name="unlocked" d="M768 896c105.87 0 192-86.13 192-192v-192h-128v192c0 35.29-28.71 64-64 64h-128c-35.29 0-64-28.71-64-64v-192h16c26.4 0 48-21.6 48-48v-480c0-26.4-21.6-48-48-48h-544c-26.4 0-48 21.6-48 48v480c0 26.4 21.6 48 48 48h400v192c0 105.87 86.13 192 192 192h128z" />
20
+ <glyph unicode="&#xe995;" glyph-name="cogs" d="M363.722 237.948l41.298 57.816-45.254 45.256-57.818-41.296c-10.722 5.994-22.204 10.774-34.266 14.192l-11.682 70.084h-64l-11.68-70.086c-12.062-3.418-23.544-8.198-34.266-14.192l-57.818 41.298-45.256-45.256 41.298-57.816c-5.994-10.72-10.774-22.206-14.192-34.266l-70.086-11.682v-64l70.086-11.682c3.418-12.060 8.198-23.544 14.192-34.266l-41.298-57.816 45.254-45.256 57.818 41.296c10.722-5.994 22.204-10.774 34.266-14.192l11.682-70.084h64l11.68 70.086c12.062 3.418 23.544 8.198 34.266 14.192l57.818-41.296 45.254 45.256-41.298 57.816c5.994 10.72 10.774 22.206 14.192 34.266l70.088 11.68v64l-70.086 11.682c-3.418 12.060-8.198 23.544-14.192 34.266zM224 96c-35.348 0-64 28.654-64 64s28.652 64 64 64 64-28.654 64-64-28.652-64-64-64zM1024 576v64l-67.382 12.25c-1.242 8.046-2.832 15.978-4.724 23.79l57.558 37.1-24.492 59.128-66.944-14.468c-4.214 6.91-8.726 13.62-13.492 20.13l39.006 56.342-45.256 45.254-56.342-39.006c-6.512 4.766-13.22 9.276-20.13 13.494l14.468 66.944-59.128 24.494-37.1-57.558c-7.812 1.892-15.744 3.482-23.79 4.724l-12.252 67.382h-64l-12.252-67.382c-8.046-1.242-15.976-2.832-23.79-4.724l-37.098 57.558-59.128-24.492 14.468-66.944c-6.91-4.216-13.62-8.728-20.13-13.494l-56.342 39.006-45.254-45.254 39.006-56.342c-4.766-6.51-9.278-13.22-13.494-20.13l-66.944 14.468-24.492-59.128 57.558-37.1c-1.892-7.812-3.482-15.742-4.724-23.79l-67.384-12.252v-64l67.382-12.25c1.242-8.046 2.832-15.978 4.724-23.79l-57.558-37.1 24.492-59.128 66.944 14.468c4.216-6.91 8.728-13.618 13.494-20.13l-39.006-56.342 45.254-45.256 56.342 39.006c6.51-4.766 13.22-9.276 20.13-13.492l-14.468-66.944 59.128-24.492 37.102 57.558c7.81-1.892 15.742-3.482 23.788-4.724l12.252-67.384h64l12.252 67.382c8.044 1.242 15.976 2.832 23.79 4.724l37.1-57.558 59.128 24.492-14.468 66.944c6.91 4.216 13.62 8.726 20.13 13.492l56.342-39.006 45.256 45.256-39.006 56.342c4.766 6.512 9.276 13.22 13.492 20.13l66.944-14.468 24.492 59.13-57.558 37.1c1.892 7.812 3.482 15.742 4.724 23.79l67.382 12.25zM672 468.8c-76.878 0-139.2 62.322-139.2 139.2s62.32 139.2 139.2 139.2 139.2-62.322 139.2-139.2c0-76.878-62.32-139.2-139.2-139.2z" />
21
+ <glyph unicode="&#xe99a;" glyph-name="pie-chart" d="M448 384v448c-247.424 0-448-200.576-448-448s200.576-448 448-448 448 200.576 448 448c0 72.034-17.028 140.084-47.236 200.382l-400.764-200.382zM912.764 712.382c-73.552 146.816-225.374 247.618-400.764 247.618v-448l400.764 200.382z" />
22
+ <glyph unicode="&#xe99b;" glyph-name="stats-dots" d="M128 64h896v-128h-1024v1024h128zM288 128c-53.020 0-96 42.98-96 96s42.98 96 96 96c2.828 0 5.622-0.148 8.388-0.386l103.192 171.986c-9.84 15.070-15.58 33.062-15.58 52.402 0 53.020 42.98 96 96 96s96-42.98 96-96c0-19.342-5.74-37.332-15.58-52.402l103.192-171.986c2.766 0.238 5.56 0.386 8.388 0.386 2.136 0 4.248-0.094 6.35-0.23l170.356 298.122c-10.536 15.408-16.706 34.036-16.706 54.11 0 53.020 42.98 96 96 96s96-42.98 96-96c0-53.020-42.98-96-96-96-2.14 0-4.248 0.094-6.35 0.232l-170.356-298.124c10.536-15.406 16.706-34.036 16.706-54.11 0-53.020-42.98-96-96-96s-96 42.98-96 96c0 19.34 5.74 37.332 15.578 52.402l-103.19 171.984c-2.766-0.238-5.56-0.386-8.388-0.386s-5.622 0.146-8.388 0.386l-103.192-171.986c9.84-15.068 15.58-33.060 15.58-52.4 0-53.020-42.98-96-96-96z" />
23
+ <glyph unicode="&#xe99c;" glyph-name="stats-bars" d="M0 128h1024v-128h-1024zM128 384h128v-192h-128zM320 640h128v-448h-128zM512 448h128v-256h-128zM704 832h128v-640h-128z" />
24
+ <glyph unicode="&#xe99d;" glyph-name="stats-bars2" d="M288 576h-192c-17.6 0-32-14.4-32-32v-576c0-17.6 14.4-32 32-32h192c17.6 0 32 14.4 32 32v576c0 17.6-14.4 32-32 32zM288 0h-192v256h192v-256zM608 704h-192c-17.6 0-32-14.4-32-32v-704c0-17.6 14.4-32 32-32h192c17.6 0 32 14.4 32 32v704c0 17.6-14.4 32-32 32zM608 0h-192v320h192v-320zM928 832h-192c-17.6 0-32-14.4-32-32v-832c0-17.6 14.4-32 32-32h192c17.6 0 32 14.4 32 32v832c0 17.6-14.4 32-32 32zM928 0h-192v384h192v-384z" />
25
+ <glyph unicode="&#xe9b4;" glyph-name="shield" d="M960 960l-448-128-448 128c0 0-4.5-51.698 0-128l448-140.090 448 140.090c4.498 76.302 0 128 0 128zM72.19 764.894c23.986-250.696 113.49-672.234 439.81-828.894 326.32 156.66 415.824 578.198 439.81 828.894l-439.81-165.358-439.81 165.358z" />
26
+ <glyph unicode="&#xe9b6;" glyph-name="switch" d="M640 813.412v-135.958c36.206-15.804 69.5-38.408 98.274-67.18 60.442-60.44 93.726-140.8 93.726-226.274s-33.286-165.834-93.726-226.274c-60.44-60.44-140.798-93.726-226.274-93.726s-165.834 33.286-226.274 93.726c-60.44 60.44-93.726 140.8-93.726 226.274s33.286 165.834 93.726 226.274c28.774 28.774 62.068 51.378 98.274 67.182v135.956c-185.048-55.080-320-226.472-320-429.412 0-247.424 200.578-448 448-448 247.424 0 448 200.576 448 448 0 202.94-134.95 374.332-320 429.412zM448 960h128v-512h-128z" />
27
+ <glyph unicode="&#xe9b7;" glyph-name="power-cord" d="M1024 677.5l-90.506 90.5-178.746-178.752-101.5 101.502 178.75 178.75-90.5 90.5-178.75-178.75-114.748 114.75-86.626-86.624 512.002-512 86.624 86.622-114.752 114.752 178.752 178.75zM794.040 286.21l-443.824 443.824c-95.818-114.904-204.52-292.454-129.396-445.216l-132.248-132.248c-31.112-31.114-31.112-82.024 0-113.136l14.858-14.858c31.114-31.114 82.026-31.114 113.138 0l132.246 132.244c152.764-75.132 330.318 33.566 445.226 129.39z" />
28
+ <glyph unicode="&#xe9c9;" glyph-name="sphere" d="M480 896c-265.096 0-480-214.904-480-480 0-265.098 214.904-480 480-480 265.098 0 480 214.902 480 480 0 265.096-214.902 480-480 480zM751.59 256c8.58 40.454 13.996 83.392 15.758 128h127.446c-3.336-44.196-13.624-87.114-30.68-128h-112.524zM208.41 576c-8.58-40.454-13.996-83.392-15.758-128h-127.444c3.336 44.194 13.622 87.114 30.678 128h112.524zM686.036 576c9.614-40.962 15.398-83.854 17.28-128h-191.316v128h174.036zM512 640v187.338c14.59-4.246 29.044-11.37 43.228-21.37 26.582-18.74 52.012-47.608 73.54-83.486 14.882-24.802 27.752-52.416 38.496-82.484h-155.264zM331.232 722.484c21.528 35.878 46.956 64.748 73.54 83.486 14.182 10 28.638 17.124 43.228 21.37v-187.34h-155.264c10.746 30.066 23.616 57.68 38.496 82.484zM448 576v-128h-191.314c1.88 44.146 7.666 87.038 17.278 128h174.036zM95.888 256c-17.056 40.886-27.342 83.804-30.678 128h127.444c1.762-44.608 7.178-87.546 15.758-128h-112.524zM256.686 384h191.314v-128h-174.036c-9.612 40.96-15.398 83.854-17.278 128zM448 192v-187.34c-14.588 4.246-29.044 11.372-43.228 21.37-26.584 18.74-52.014 47.61-73.54 83.486-14.882 24.804-27.75 52.418-38.498 82.484h155.266zM628.768 109.516c-21.528-35.876-46.958-64.746-73.54-83.486-14.184-9.998-28.638-17.124-43.228-21.37v187.34h155.266c-10.746-30.066-23.616-57.68-38.498-82.484zM512 256v128h191.314c-1.88-44.146-7.666-87.040-17.28-128h-174.034zM767.348 448c-1.762 44.608-7.178 87.546-15.758 128h112.524c17.056-40.886 27.344-83.806 30.68-128h-127.446zM830.658 640h-95.9c-18.638 58.762-44.376 110.294-75.316 151.428 42.536-20.34 81.058-47.616 114.714-81.272 21.48-21.478 40.362-44.938 56.502-70.156zM185.844 710.156c33.658 33.658 72.18 60.932 114.714 81.272-30.942-41.134-56.676-92.666-75.316-151.428h-95.898c16.138 25.218 35.022 48.678 56.5 70.156zM129.344 192h95.898c18.64-58.762 44.376-110.294 75.318-151.43-42.536 20.34-81.058 47.616-114.714 81.274-21.48 21.478-40.364 44.938-56.502 70.156zM774.156 121.844c-33.656-33.658-72.18-60.934-114.714-81.274 30.942 41.134 56.678 92.668 75.316 151.43h95.9c-16.14-25.218-35.022-48.678-56.502-70.156z" />
29
+ <glyph unicode="&#xe9ca;" glyph-name="earth" d="M512 960c-282.77 0-512-229.23-512-512s229.23-512 512-512 512 229.23 512 512-229.23 512-512 512zM512-0.002c-62.958 0-122.872 13.012-177.23 36.452l233.148 262.29c5.206 5.858 8.082 13.422 8.082 21.26v96c0 17.674-14.326 32-32 32-112.99 0-232.204 117.462-233.374 118.626-6 6.002-14.14 9.374-22.626 9.374h-128c-17.672 0-32-14.328-32-32v-192c0-12.122 6.848-23.202 17.69-28.622l110.31-55.156v-187.886c-116.052 80.956-192 215.432-192 367.664 0 68.714 15.49 133.806 43.138 192h116.862c8.488 0 16.626 3.372 22.628 9.372l128 128c6 6.002 9.372 14.14 9.372 22.628v77.412c40.562 12.074 83.518 18.588 128 18.588 70.406 0 137.004-16.26 196.282-45.2-4.144-3.502-8.176-7.164-12.046-11.036-36.266-36.264-56.236-84.478-56.236-135.764s19.97-99.5 56.236-135.764c36.434-36.432 85.218-56.264 135.634-56.26 3.166 0 6.342 0.080 9.518 0.236 13.814-51.802 38.752-186.656-8.404-372.334-0.444-1.744-0.696-3.488-0.842-5.224-81.324-83.080-194.7-134.656-320.142-134.656z" />
30
+ <glyph unicode="&#xea1c;" glyph-name="play3" d="M192 832l640-384-640-384z" />
31
+ <glyph unicode="&#xea1d;" glyph-name="pause2" d="M128 832h320v-768h-320zM576 832h320v-768h-320z" />
32
+ <glyph unicode="&#xea1e;" glyph-name="stop2" d="M128 832h768v-768h-768z" />
33
+ <glyph unicode="&#xea25;" glyph-name="eject" d="M0 192h1024v-128h-1024zM512 832l512-512h-1024z" />
34
+ <glyph unicode="&#xea7e;" glyph-name="new-tab" d="M192 896v-768h768v768h-768zM896 192h-640v640h640v-640zM128 64v672l-64 64v-800h800l-64 64h-672zM352 704l160-160-192-192 96-96 192 192 160-160v416z" />
35
+ </font></defs></svg>
admin/css/fonts/icomoon.ttf ADDED
Binary file
admin/css/fonts/icomoon.woff ADDED
Binary file
admin/datatables/css/datatables-all.css ADDED
@@ -0,0 +1,642 @@
1
+ /*! DataTables 1.10.16
2
+ * 2008-2017 SpryMedia Ltd - datatables.net/license
3
+ */
4
+
5
+ table.dataTable {
6
+ width: 100%;
7
+ margin: 0 auto;
8
+ clear: both;
9
+ border-collapse: separate;
10
+ border-spacing: 0;
11
+ /*
12
+ * Header and footer styles
13
+ */
14
+ /*
15
+ * Body styles
16
+ */
17
+ }
18
+ table.dataTable thead th,
19
+ table.dataTable tfoot th {
20
+ font-weight: bold;
21
+ }
22
+ table.dataTable thead th,
23
+ table.dataTable thead td {
24
+ padding: 10px 18px;
25
+ border-bottom: 1px solid #111;
26
+ }
27
+ table.dataTable thead th:active,
28
+ table.dataTable thead td:active {
29
+ outline: none;
30
+ }
31
+ table.dataTable tfoot th,
32
+ table.dataTable tfoot td {
33
+ padding: 10px 18px 6px 18px;
34
+ border-top: 1px solid #111;
35
+ }
36
+ table.dataTable thead .sorting,
37
+ table.dataTable thead .sorting_asc,
38
+ table.dataTable thead .sorting_desc,
39
+ table.dataTable thead .sorting_asc_disabled,
40
+ table.dataTable thead .sorting_desc_disabled {
41
+ cursor: pointer;
42
+ *cursor: hand;
43
+ background-repeat: no-repeat;
44
+ background-position: center right;
45
+ }
46
+ table.dataTable thead .sorting {
47
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAATCAYAAACZZ43PAAAAN0lEQVR4AWO4c+cORZhmBvyH4QEx4D86pqsB/3Fjwgb8J4RpaQBhPES8gE/z0ElI9M9MA1+gAAD5jWGc4eZ87AAAAABJRU5ErkJggg==); /*url("../images/sort_both.png");*/
48
+ }
49
+ table.dataTable thead .sorting_asc {
50
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAATCAIAAAAWBRqYAAAABnRSTlMA3ADcANwpVcdiAAAAdUlEQVR4AWO4QyKgWMONG3eWrrh76xbRGtZvulPTdHfzVuI0nDl7p7XrblXD3Y7eu+fPE6FhwWKgaihasuIuAQ2Hj95pbENoqG+9e/QYbg3Xr9+ZPB2iFIGmzrp78yYODdt3gvxa24yCgCK79pAcD8NEw6gGAPv5+lejjyPQAAAAAElFTkSuQmCC); /*url("../images/sort_asc.png");*/
51
+ }
52
+ table.dataTable thead .sorting_desc {
53
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAATCAIAAAAWBRqYAAAABnRSTlMA3ADcANwpVcdiAAAAcklEQVR4AWO4QyIY2hpGNezac6em6W5tMwoCimzfiUPDzZt3ps66W9WAgiZPv3v9Om4nHT12p74Vobqx7e7ho4T8sGQFQsOCxXcJe/r8+TsdvSDVrV13z5wlLpQ2bwX5fv0mooP11q07S1fcvXFjACMOAM7v+leNDkNAAAAAAElFTkSuQmCC); /*url("../images/sort_desc.png");*/
54
+ }
55
+ table.dataTable thead .sorting_asc_disabled {
56
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAATCAYAAACZZ43PAAAALklEQVR4AWO4c+cORZhmBvyH4QEx4D86pqsB/3Fjwgb8J4RpZsDAJ6RRA0YNAAAd2DjFaOCLnQAAAABJRU5ErkJggg==); /*url("../images/sort_asc_disabled.png");*/
57
+ }
58
+ table.dataTable thead .sorting_desc_disabled {
59
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAATCAYAAACZZ43PAAAALUlEQVR4AWO4c+cORZjqBowaMGrAf0KYlgYQNoToMMClma4GMKBrpqsB9E9IAFTzOMWpD7f6AAAAAElFTkSuQmCC); /*url("../images/sort_desc_disabled.png");*/
60
+ }
61
+ table.dataTable tbody tr {
62
+ background-color: #ffffff;
63
+ }
64
+ table.dataTable tbody tr.selected {
65
+ background-color: #B0BED9;
66
+ }
67
+ table.dataTable tbody th,
68
+ table.dataTable tbody td {
69
+ padding: 8px 10px;
70
+ }
71
+ table.dataTable.row-border tbody th, table.dataTable.row-border tbody td, table.dataTable.display tbody th, table.dataTable.display tbody td {
72
+ border-top: 1px solid #ddd;
73
+ }
74
+ table.dataTable.row-border tbody tr:first-child th,
75
+ table.dataTable.row-border tbody tr:first-child td, table.dataTable.display tbody tr:first-child th,
76
+ table.dataTable.display tbody tr:first-child td {
77
+ border-top: none;
78
+ }
79
+ table.dataTable.cell-border tbody th, table.dataTable.cell-border tbody td {
80
+ border-top: 1px solid #ddd;
81
+ border-right: 1px solid #ddd;
82
+ }
83
+ table.dataTable.cell-border tbody tr th:first-child,
84
+ table.dataTable.cell-border tbody tr td:first-child {
85
+ border-left: 1px solid #ddd;
86
+ }
87
+ table.dataTable.cell-border tbody tr:first-child th,
88
+ table.dataTable.cell-border tbody tr:first-child td {
89
+ border-top: none;
90
+ }
91
+ table.dataTable.stripe tbody tr.odd, table.dataTable.display tbody tr.odd {
92
+ background-color: #f9f9f9;
93
+ }
94
+ table.dataTable.stripe tbody tr.odd.selected, table.dataTable.display tbody tr.odd.selected {
95
+ background-color: #acbad4;
96
+ }
97
+ table.dataTable.hover tbody tr:hover, table.dataTable.display tbody tr:hover {
98
+ background-color: #f6f6f6;
99
+ }
100
+ table.dataTable.hover tbody tr:hover.selected, table.dataTable.display tbody tr:hover.selected {
101
+ background-color: #aab7d1;
102
+ }
103
+ table.dataTable.order-column tbody tr > .sorting_1,
104
+ table.dataTable.order-column tbody tr > .sorting_2,
105
+ table.dataTable.order-column tbody tr > .sorting_3, table.dataTable.display tbody tr > .sorting_1,
106
+ table.dataTable.display tbody tr > .sorting_2,
107
+ table.dataTable.display tbody tr > .sorting_3 {
108
+ background-color: #fafafa;
109
+ }
110
+ table.dataTable.order-column tbody tr.selected > .sorting_1,
111
+ table.dataTable.order-column tbody tr.selected > .sorting_2,
112
+ table.dataTable.order-column tbody tr.selected > .sorting_3, table.dataTable.display tbody tr.selected > .sorting_1,
113
+ table.dataTable.display tbody tr.selected > .sorting_2,
114
+ table.dataTable.display tbody tr.selected > .sorting_3 {
115
+ background-color: #acbad5;
116
+ }
117
+ table.dataTable.display tbody tr.odd > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd > .sorting_1 {
118
+ background-color: #f1f1f1;
119
+ }
120
+ table.dataTable.display tbody tr.odd > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd > .sorting_2 {
121
+ background-color: #f3f3f3;
122
+ }
123
+ table.dataTable.display tbody tr.odd > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd > .sorting_3 {
124
+ background-color: whitesmoke;
125
+ }
126
+ table.dataTable.display tbody tr.odd.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_1 {
127
+ background-color: #a6b4cd;
128
+ }
129
+ table.dataTable.display tbody tr.odd.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_2 {
130
+ background-color: #a8b5cf;
131
+ }
132
+ table.dataTable.display tbody tr.odd.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_3 {
133
+ background-color: #a9b7d1;
134
+ }
135
+ table.dataTable.display tbody tr.even > .sorting_1, table.dataTable.order-column.stripe tbody tr.even > .sorting_1 {
136
+ background-color: #fafafa;
137
+ }
138
+ table.dataTable.display tbody tr.even > .sorting_2, table.dataTable.order-column.stripe tbody tr.even > .sorting_2 {
139
+ background-color: #fcfcfc;
140
+ }
141
+ table.dataTable.display tbody