Version Description
- Improvement: Added an "unsubscribe" link to plugin-generated alerts.
- Improvement: Added some additional flags.
- Change: Removed some unnecessary files from the bundled GeoIP library.
- Change: Updated wording in the Terms of Use/Privacy Policy agreement UI.
- Change: The minimum "Lock out after how many login failures" is now 2.
- Change: The diagnostics report now includes the scan issues for easier debugging.
- Fix: Multiple improvements to automatic updating to avoid broken updates on sites with low resources or slow file systems.
- Fix: Better text wrapping in the top failed logins widget.
- Fix: Onboarding CSS/JS is now correctly enqueued for multisite installations.
- Fix: Fixed a missing asset with the bundled jQueryUI library.
- Fix: Fixed memory calculation when using PHP's supported shorthand syntax.
- Fix: Better wrapping behavior on the reason column in the blocks table.
- Fix: Fixed an issue with an internal data structure to prevent error log entries when using mbstring functions.
- Fix: Improved bot detection when no user agent is sent.
Download this release
Release Info
Developer | wfryan |
Plugin | Wordfence Security – Firewall & Malware Scan |
Version | 7.1.9 |
Comparing to | |
See all releases |
Code changes from version 7.1.8 to 7.1.9
- css/{activity-report-widget.1530033614.css → activity-report-widget.1531408399.css} +0 -0
- css/{diff.1530033614.css → diff.1531408399.css} +0 -0
- css/{dt_table.1530033614.css → dt_table.1531408399.css} +0 -0
- css/{fullLog.1530033614.css → fullLog.1531408399.css} +0 -0
- css/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
- css/images/ui-bg_flat_100_1997c7_40x100.png +0 -0
- css/images/ui-bg_flat_100_222_40x100.png +0 -0
- css/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
- css/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
- css/images/ui-bg_highlight-soft_75_a5a5a5_1x100.png +0 -0
- css/images/ui-icons_222222_256x240.png +0 -0
- css/images/ui-icons_444444_256x240.png +0 -0
- css/images/ui-icons_555555_256x240.png +0 -0
- css/images/{ui-icons_fbe569_256x240.png → ui-icons_777620_256x240.png} +0 -0
- css/images/ui-icons_777777_256x240.png +0 -0
- css/images/{ui-icons_cd0a0a_256x240.png → ui-icons_cc0000_256x240.png} +0 -0
- css/images/{ui-icons_fff_256x240.png → ui-icons_ffffff_256x240.png} +0 -0
- css/{iptraf.1530033614.css → iptraf.1531408399.css} +0 -0
- css/{jquery-ui-timepicker-addon.1530033614.css → jquery-ui-timepicker-addon.1531408399.css} +0 -0
- css/{jquery-ui.min.1530033614.css → jquery-ui.min.1531408399.css} +4 -4
- css/{jquery-ui.structure.min.1530033614.css → jquery-ui.structure.min.1531408399.css} +2 -2
- css/jquery-ui.theme.min.1530033614.css +0 -5
- css/jquery-ui.theme.min.1531408399.css +5 -0
- css/{main.1530033614.css → main.1531408399.css} +0 -0
- css/{phpinfo.1530033614.css → phpinfo.1531408399.css} +0 -0
- css/{wf-adminbar.1530033614.css → wf-adminbar.1531408399.css} +0 -0
- css/{wf-colorbox.1530033614.css → wf-colorbox.1531408399.css} +0 -0
- css/{wf-font-awesome.1530033614.css → wf-font-awesome.1531408399.css} +0 -0
- css/{wf-ionicons.1530033614.css → wf-ionicons.1531408399.css} +0 -0
- css/{wf-onboarding.1530033614.css → wf-onboarding.1531408399.css} +0 -0
- css/{wf-roboto-font.1530033614.css → wf-roboto-font.1531408399.css} +0 -0
- css/{wfselect2.min.1530033614.css → wfselect2.min.1531408399.css} +0 -0
- css/{wordfenceBox.1530033614.css → wordfenceBox.1531408399.css} +0 -0
- images/flags/bl.png +0 -0
- images/flags/bq.png +0 -0
- images/flags/hm.png +0 -0
- images/flags/mf.png +0 -0
- images/flags/sj.png +0 -0
- images/flags/ss.png +0 -0
- images/flags/sx.png +0 -0
- images/flags/un.png +0 -0
- js/{Chart.bundle.min.1530033614.js → Chart.bundle.min.1531408399.js} +0 -0
- js/{admin.1530033614.js → admin.1531408399.js} +0 -0
- js/{admin.ajaxWatcher.1530033614.js → admin.ajaxWatcher.1531408399.js} +0 -0
- js/{admin.liveTraffic.1530033614.js → admin.liveTraffic.1531408399.js} +0 -0
- js/{date.1530033614.js → date.1531408399.js} +0 -0
- js/{jquery-ui-timepicker-addon.1530033614.js → jquery-ui-timepicker-addon.1531408399.js} +0 -0
- js/{jquery.colorbox-min.1530033614.js → jquery.colorbox-min.1531408399.js} +0 -0
- js/{jquery.colorbox.1530033614.js → jquery.colorbox.1531408399.js} +0 -0
- js/{jquery.dataTables.min.1530033614.js → jquery.dataTables.min.1531408399.js} +0 -0
- js/{jquery.qrcode.min.1530033614.js → jquery.qrcode.min.1531408399.js} +0 -0
- js/{jquery.tmpl.min.1530033614.js → jquery.tmpl.min.1531408399.js} +0 -0
- js/{jquery.tools.min.1530033614.js → jquery.tools.min.1531408399.js} +0 -0
- js/{knockout-3.3.0.1530033614.js → knockout-3.3.0.1531408399.js} +0 -0
- js/{perf.1530033614.js → perf.1531408399.js} +0 -0
- js/{wfdashboard.1530033614.js → wfdashboard.1531408399.js} +0 -0
- js/{wfdropdown.1530033614.js → wfdropdown.1531408399.js} +0 -0
- js/{wfglobal.1530033614.js → wfglobal.1531408399.js} +0 -0
- js/{wfpopover.1530033614.js → wfpopover.1531408399.js} +0 -0
- js/{wfselect2.min.1530033614.js → wfselect2.min.1531408399.js} +0 -0
- lib/email_newIssues.php +1 -0
- lib/email_unsubscribeRequest.php +8 -0
- lib/menu_tools_diagnostic.php +33 -0
- lib/wfActivityReport.php +13 -1
- lib/wfArray.php +7 -7
- lib/wfConfig.php +46 -15
- lib/wfIssues.php +7 -2
- lib/wfLog.php +1 -1
- lib/wfOnboardingController.php +1 -1
- lib/wfUtils.php +73 -0
- lib/wordfenceClass.php +164 -3
- models/common/wfGeoIP2.php +11 -1
- readme.txt +18 -2
- vendor/composer/ca-bundle/README.md +0 -85
- vendor/geoip2/geoip2/CHANGELOG.md +0 -257
- vendor/geoip2/geoip2/README.md +0 -401
- vendor/maxmind-db/reader/CHANGELOG.md +0 -108
- vendor/maxmind-db/reader/README.md +0 -139
- vendor/maxmind-db/reader/ext/config.m4 +0 -19
- vendor/maxmind-db/reader/ext/maxminddb.c +0 -564
- vendor/maxmind-db/reader/ext/php_maxminddb.h +0 -24
- vendor/maxmind-db/reader/ext/tests/001-load.phpt +0 -12
- vendor/maxmind-db/reader/ext/tests/002-final.phpt +0 -13
- vendor/maxmind/web-service-common/CHANGELOG.md +0 -74
- vendor/maxmind/web-service-common/README.md +0 -26
- views/blocking/block-list.php +9 -1
- views/common/unsubscribe.php +130 -0
- views/gdpr/banner.php +1 -1
- views/reports/activity-report-email-inline.php +5 -1
- views/reports/activity-report.php +1 -1
- views/waf/options-group-brute-force.php +1 -1
- waf/wfWAFGeoIP2.php +12 -2
- wordfence.php +14 -6
css/{activity-report-widget.1530033614.css → activity-report-widget.1531408399.css}
RENAMED
File without changes
|
css/{diff.1530033614.css → diff.1531408399.css}
RENAMED
File without changes
|
css/{dt_table.1530033614.css → dt_table.1531408399.css}
RENAMED
File without changes
|
css/{fullLog.1530033614.css → fullLog.1531408399.css}
RENAMED
File without changes
|
css/images/ui-bg_flat_0_aaaaaa_40x100.png
DELETED
Binary file
|
css/images/ui-bg_flat_100_1997c7_40x100.png
DELETED
Binary file
|
css/images/ui-bg_flat_100_222_40x100.png
DELETED
Binary file
|
css/images/ui-bg_flat_75_ffffff_40x100.png
DELETED
Binary file
|
css/images/ui-bg_glass_95_fef1ec_1x400.png
DELETED
Binary file
|
css/images/ui-bg_highlight-soft_75_a5a5a5_1x100.png
DELETED
Binary file
|
css/images/ui-icons_222222_256x240.png
DELETED
Binary file
|
css/images/ui-icons_444444_256x240.png
ADDED
Binary file
|
css/images/ui-icons_555555_256x240.png
ADDED
Binary file
|
css/images/{ui-icons_fbe569_256x240.png → ui-icons_777620_256x240.png}
RENAMED
Binary file
|
css/images/ui-icons_777777_256x240.png
ADDED
Binary file
|
css/images/{ui-icons_cd0a0a_256x240.png → ui-icons_cc0000_256x240.png}
RENAMED
Binary file
|
css/images/{ui-icons_fff_256x240.png → ui-icons_ffffff_256x240.png}
RENAMED
File without changes
|
css/{iptraf.1530033614.css → iptraf.1531408399.css}
RENAMED
File without changes
|
css/{jquery-ui-timepicker-addon.1530033614.css → jquery-ui-timepicker-addon.1531408399.css}
RENAMED
File without changes
|
css/{jquery-ui.min.1530033614.css → jquery-ui.min.1531408399.css}
RENAMED
@@ -1,7 +1,7 @@
|
|
1 |
-
/*! jQuery UI - v1.11.4 -
|
2 |
* http://jqueryui.com
|
3 |
* Includes: core.css, draggable.css, resizable.css, selectable.css, sortable.css, accordion.css, autocomplete.css, button.css, datepicker.css, dialog.css, menu.css, progressbar.css, selectmenu.css, slider.css, spinner.css, tabs.css, tooltip.css, theme.css
|
4 |
-
* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=
|
5 |
-
* Copyright
|
6 |
|
7 |
-
.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;min-height:0;font-size:100%}.ui-accordion .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-icons .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-header .ui-accordion-header-icon{position:absolute;left:.5em;top:50%;margin-top:-8px}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-button{display:inline-block;position:relative;padding:0;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2.2em}button.ui-button-icon-only{width:2.4em}.ui-button-icons-only{width:3.4em}button.ui-button-icons-only{width:3.7em}.ui-button .ui-button-text{display:block;line-height:normal}.ui-button-text-only .ui-button-text{padding:.4em 1em}.ui-button-icon-only .ui-button-text,.ui-button-icons-only .ui-button-text{padding:.4em;text-indent:-9999999px}.ui-button-text-icon-primary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 1em .4em 2.1em}.ui-button-text-icon-secondary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 2.1em .4em 1em}.ui-button-text-icons .ui-button-text{padding-left:2.1em;padding-right:2.1em}input.ui-button{padding:.4em 1em}.ui-button-icon-only .ui-icon,.ui-button-text-icon-primary .ui-icon,.ui-button-text-icon-secondary .ui-icon,.ui-button-text-icons .ui-icon,.ui-button-icons-only .ui-icon{position:absolute;top:50%;margin-top:-8px}.ui-button-icon-only .ui-icon{left:50%;margin-left:-8px}.ui-button-text-icon-primary .ui-button-icon-primary,.ui-button-text-icons .ui-button-icon-primary,.ui-button-icons-only .ui-button-icon-primary{left:.5em}.ui-button-text-icon-secondary .ui-button-icon-secondary,.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em}.ui-buttonset{margin-right:7px}.ui-buttonset .ui-button{margin-left:0;margin-right:-.3em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-dialog{overflow:hidden;position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-se{width:12px;height:12px;right:-5px;bottom:-5px;background-position:16px 16px}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:none}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{position:relative;margin:0;padding:3px 1em 3px .4em;cursor:pointer;min-height:0;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-button{display:inline-block;overflow:hidden;position:relative;text-decoration:none;cursor:pointer}.ui-selectmenu-button span.ui-icon{right:0.5em;left:auto;margin-top:-8px;position:absolute;top:50%}.ui-selectmenu-button span.ui-selectmenu-text{text-align:left;padding:0.4em 2.1em 0.4em 1em;display:block;line-height:1.4;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:22px}.ui-spinner-button{width:16px;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top:none;border-bottom:none;border-right:none}.ui-spinner .ui-icon{position:absolute;margin-top:-8px;top:50%;left:0}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-spinner .ui-icon-triangle-1-s{background-position:-65px -16px}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px;-webkit-box-shadow:0 0 5px #aaa;box-shadow:0 0 5px #aaa}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Verdana,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Verdana,Arial,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #aaa;background:#fff url("images/ui-bg_flat_75_ffffff_40x100.png") 50% 50% repeat-x;color:#222}.ui-widget-content a{color:#222}.ui-widget-header{border:1px solid #474747;background:#222 url("images/ui-bg_flat_100_222_40x100.png") 50% 50% repeat-x;color:#fff;font-weight:bold}.ui-widget-header a{color:#fff}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #9f9f9f;background:#a5a5a5 url("images/ui-bg_highlight-soft_75_a5a5a5_1x100.png") 50% 50% repeat-x;font-weight:normal;color:#fff}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#fff;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #198cb7;background:#1997c7 url("images/ui-bg_flat_100_1997c7_40x100.png") 50% 50% repeat-x;font-weight:normal;color:#fff}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited{color:#fff;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #198cb7;background:#1997c7 url("images/ui-bg_flat_100_1997c7_40x100.png") 50% 50% repeat-x;font-weight:normal;color:#fff}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#fff;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #eac500;background:#fffaba url("images/ui-bg_flat_100_fffaba_40x100.png") 50% 50% repeat-x;color:#222}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#222}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#fef1ec url("images/ui-bg_glass_95_fef1ec_1x400.png") 50% 50% repeat-x;color:#cd0a0a}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#cd0a0a}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#cd0a0a}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_222222_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_fff_256x240.png")}.ui-state-default .ui-icon{background-image:url("images/ui-icons_fff_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url("images/ui-icons_fff_256x240.png")}.ui-state-active .ui-icon{background-image:url("images/ui-icons_fff_256x240.png")}.ui-state-highlight .ui-icon{background-image:url("images/ui-icons_ec882f_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_cd0a0a_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:3px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:3px}.ui-widget-overlay{background:#aaa url("images/ui-bg_flat_0_aaaaaa_40x100.png") 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{margin:-8px 0 0 -8px;padding:8px;background:#aaa url("images/ui-bg_flat_0_aaaaaa_40x100.png") 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity=30);border-radius:8px}
|
1 |
+
/*! jQuery UI - v1.11.4 - 2018-06-29
|
2 |
* http://jqueryui.com
|
3 |
* Includes: core.css, draggable.css, resizable.css, selectable.css, sortable.css, accordion.css, autocomplete.css, button.css, datepicker.css, dialog.css, menu.css, progressbar.css, selectmenu.css, slider.css, spinner.css, tabs.css, tooltip.css, theme.css
|
4 |
+
* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Arial%2CHelvetica%2Csans-serif&fsDefault=1em&fwDefault=normal&cornerRadius=3px&bgColorHeader=e9e9e9&bgTextureHeader=flat&borderColorHeader=dddddd&fcHeader=333333&iconColorHeader=444444&bgColorContent=ffffff&bgTextureContent=flat&borderColorContent=dddddd&fcContent=333333&iconColorContent=444444&bgColorDefault=f6f6f6&bgTextureDefault=flat&borderColorDefault=c5c5c5&fcDefault=454545&iconColorDefault=777777&bgColorHover=ededed&bgTextureHover=flat&borderColorHover=cccccc&fcHover=2b2b2b&iconColorHover=555555&bgColorActive=007fff&bgTextureActive=flat&borderColorActive=003eff&fcActive=ffffff&iconColorActive=ffffff&bgColorHighlight=fffa90&bgTextureHighlight=flat&borderColorHighlight=dad55e&fcHighlight=777620&iconColorHighlight=777620&bgColorError=fddfdf&bgTextureError=flat&borderColorError=f1a899&fcError=5f3f3f&iconColorError=cc0000&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=666666&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=5px&offsetTopShadow=0px&offsetLeftShadow=0px&cornerRadiusShadow=8px
|
5 |
+
* Copyright jQuery Foundation and other contributors; Licensed MIT */
|
6 |
|
7 |
+
.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;min-height:0;font-size:100%}.ui-accordion .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-icons .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-header .ui-accordion-header-icon{position:absolute;left:.5em;top:50%;margin-top:-8px}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-button{display:inline-block;position:relative;padding:0;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2.2em}button.ui-button-icon-only{width:2.4em}.ui-button-icons-only{width:3.4em}button.ui-button-icons-only{width:3.7em}.ui-button .ui-button-text{display:block;line-height:normal}.ui-button-text-only .ui-button-text{padding:.4em 1em}.ui-button-icon-only .ui-button-text,.ui-button-icons-only .ui-button-text{padding:.4em;text-indent:-9999999px}.ui-button-text-icon-primary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 1em .4em 2.1em}.ui-button-text-icon-secondary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 2.1em .4em 1em}.ui-button-text-icons .ui-button-text{padding-left:2.1em;padding-right:2.1em}input.ui-button{padding:.4em 1em}.ui-button-icon-only .ui-icon,.ui-button-text-icon-primary .ui-icon,.ui-button-text-icon-secondary .ui-icon,.ui-button-text-icons .ui-icon,.ui-button-icons-only .ui-icon{position:absolute;top:50%;margin-top:-8px}.ui-button-icon-only .ui-icon{left:50%;margin-left:-8px}.ui-button-text-icon-primary .ui-button-icon-primary,.ui-button-text-icons .ui-button-icon-primary,.ui-button-icons-only .ui-button-icon-primary{left:.5em}.ui-button-text-icon-secondary .ui-button-icon-secondary,.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em}.ui-buttonset{margin-right:7px}.ui-buttonset .ui-button{margin-left:0;margin-right:-.3em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-dialog{overflow:hidden;position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-se{width:12px;height:12px;right:-5px;bottom:-5px;background-position:16px 16px}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:none}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{position:relative;margin:0;padding:3px 1em 3px .4em;cursor:pointer;min-height:0;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-button{display:inline-block;overflow:hidden;position:relative;text-decoration:none;cursor:pointer}.ui-selectmenu-button span.ui-icon{right:0.5em;left:auto;margin-top:-8px;position:absolute;top:50%}.ui-selectmenu-button span.ui-selectmenu-text{text-align:left;padding:0.4em 2.1em 0.4em 1em;display:block;line-height:1.4;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:22px}.ui-spinner-button{width:16px;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top:none;border-bottom:none;border-right:none}.ui-spinner .ui-icon{position:absolute;margin-top:-8px;top:50%;left:0}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-spinner .ui-icon-triangle-1-s{background-position:-65px -16px}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px;-webkit-box-shadow:0 0 5px #aaa;box-shadow:0 0 5px #aaa}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #ddd;background:#fff;color:#333}.ui-widget-content a{color:#333}.ui-widget-header{border:1px solid #ddd;background:#e9e9e9;color:#333;font-weight:bold}.ui-widget-header a{color:#333}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #c5c5c5;background:#f6f6f6;font-weight:normal;color:#454545}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#454545;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #ccc;background:#ededed;font-weight:normal;color:#2b2b2b}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited{color:#2b2b2b;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #003eff;background:#007fff;font-weight:normal;color:#fff}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#fff;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #dad55e;background:#fffa90;color:#777620}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#777620}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #f1a899;background:#fddfdf;color:#5f3f3f}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#5f3f3f}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#5f3f3f}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_444444_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_444444_256x240.png")}.ui-state-default .ui-icon{background-image:url("images/ui-icons_777777_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url("images/ui-icons_555555_256x240.png")}.ui-state-active .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-highlight .ui-icon{background-image:url("images/ui-icons_777620_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_cc0000_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:3px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:3px}.ui-widget-overlay{background:#aaa;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{margin:0 0 0 0;padding:5px;background:#666;opacity:.3;filter:Alpha(Opacity=30);border-radius:8px}
|
css/{jquery-ui.structure.min.1530033614.css → jquery-ui.structure.min.1531408399.css}
RENAMED
@@ -1,5 +1,5 @@
|
|
1 |
-
/*! jQuery UI - v1.11.4 -
|
2 |
* http://jqueryui.com
|
3 |
-
* Copyright
|
4 |
|
5 |
.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;min-height:0;font-size:100%}.ui-accordion .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-icons .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-header .ui-accordion-header-icon{position:absolute;left:.5em;top:50%;margin-top:-8px}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-button{display:inline-block;position:relative;padding:0;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2.2em}button.ui-button-icon-only{width:2.4em}.ui-button-icons-only{width:3.4em}button.ui-button-icons-only{width:3.7em}.ui-button .ui-button-text{display:block;line-height:normal}.ui-button-text-only .ui-button-text{padding:.4em 1em}.ui-button-icon-only .ui-button-text,.ui-button-icons-only .ui-button-text{padding:.4em;text-indent:-9999999px}.ui-button-text-icon-primary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 1em .4em 2.1em}.ui-button-text-icon-secondary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 2.1em .4em 1em}.ui-button-text-icons .ui-button-text{padding-left:2.1em;padding-right:2.1em}input.ui-button{padding:.4em 1em}.ui-button-icon-only .ui-icon,.ui-button-text-icon-primary .ui-icon,.ui-button-text-icon-secondary .ui-icon,.ui-button-text-icons .ui-icon,.ui-button-icons-only .ui-icon{position:absolute;top:50%;margin-top:-8px}.ui-button-icon-only .ui-icon{left:50%;margin-left:-8px}.ui-button-text-icon-primary .ui-button-icon-primary,.ui-button-text-icons .ui-button-icon-primary,.ui-button-icons-only .ui-button-icon-primary{left:.5em}.ui-button-text-icon-secondary .ui-button-icon-secondary,.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em}.ui-buttonset{margin-right:7px}.ui-buttonset .ui-button{margin-left:0;margin-right:-.3em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-dialog{overflow:hidden;position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-se{width:12px;height:12px;right:-5px;bottom:-5px;background-position:16px 16px}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:none}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{position:relative;margin:0;padding:3px 1em 3px .4em;cursor:pointer;min-height:0;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-button{display:inline-block;overflow:hidden;position:relative;text-decoration:none;cursor:pointer}.ui-selectmenu-button span.ui-icon{right:0.5em;left:auto;margin-top:-8px;position:absolute;top:50%}.ui-selectmenu-button span.ui-selectmenu-text{text-align:left;padding:0.4em 2.1em 0.4em 1em;display:block;line-height:1.4;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:22px}.ui-spinner-button{width:16px;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top:none;border-bottom:none;border-right:none}.ui-spinner .ui-icon{position:absolute;margin-top:-8px;top:50%;left:0}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-spinner .ui-icon-triangle-1-s{background-position:-65px -16px}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px;-webkit-box-shadow:0 0 5px #aaa;box-shadow:0 0 5px #aaa}body .ui-tooltip{border-width:2px}
|
1 |
+
/*! jQuery UI - v1.11.4 - 2018-06-29
|
2 |
* http://jqueryui.com
|
3 |
+
* Copyright jQuery Foundation and other contributors; Licensed MIT */
|
4 |
|
5 |
.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;min-height:0;font-size:100%}.ui-accordion .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-icons .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-header .ui-accordion-header-icon{position:absolute;left:.5em;top:50%;margin-top:-8px}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-button{display:inline-block;position:relative;padding:0;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2.2em}button.ui-button-icon-only{width:2.4em}.ui-button-icons-only{width:3.4em}button.ui-button-icons-only{width:3.7em}.ui-button .ui-button-text{display:block;line-height:normal}.ui-button-text-only .ui-button-text{padding:.4em 1em}.ui-button-icon-only .ui-button-text,.ui-button-icons-only .ui-button-text{padding:.4em;text-indent:-9999999px}.ui-button-text-icon-primary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 1em .4em 2.1em}.ui-button-text-icon-secondary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 2.1em .4em 1em}.ui-button-text-icons .ui-button-text{padding-left:2.1em;padding-right:2.1em}input.ui-button{padding:.4em 1em}.ui-button-icon-only .ui-icon,.ui-button-text-icon-primary .ui-icon,.ui-button-text-icon-secondary .ui-icon,.ui-button-text-icons .ui-icon,.ui-button-icons-only .ui-icon{position:absolute;top:50%;margin-top:-8px}.ui-button-icon-only .ui-icon{left:50%;margin-left:-8px}.ui-button-text-icon-primary .ui-button-icon-primary,.ui-button-text-icons .ui-button-icon-primary,.ui-button-icons-only .ui-button-icon-primary{left:.5em}.ui-button-text-icon-secondary .ui-button-icon-secondary,.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em}.ui-buttonset{margin-right:7px}.ui-buttonset .ui-button{margin-left:0;margin-right:-.3em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-dialog{overflow:hidden;position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-se{width:12px;height:12px;right:-5px;bottom:-5px;background-position:16px 16px}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:none}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{position:relative;margin:0;padding:3px 1em 3px .4em;cursor:pointer;min-height:0;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-button{display:inline-block;overflow:hidden;position:relative;text-decoration:none;cursor:pointer}.ui-selectmenu-button span.ui-icon{right:0.5em;left:auto;margin-top:-8px;position:absolute;top:50%}.ui-selectmenu-button span.ui-selectmenu-text{text-align:left;padding:0.4em 2.1em 0.4em 1em;display:block;line-height:1.4;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:22px}.ui-spinner-button{width:16px;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top:none;border-bottom:none;border-right:none}.ui-spinner .ui-icon{position:absolute;margin-top:-8px;top:50%;left:0}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-spinner .ui-icon-triangle-1-s{background-position:-65px -16px}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px;-webkit-box-shadow:0 0 5px #aaa;box-shadow:0 0 5px #aaa}body .ui-tooltip{border-width:2px}
|
css/jquery-ui.theme.min.1530033614.css
DELETED
@@ -1,5 +0,0 @@
|
|
1 |
-
/*! jQuery UI - v1.11.4 - 2015-10-13
|
2 |
-
* http://jqueryui.com
|
3 |
-
* Copyright 2015 jQuery Foundation and other contributors; Licensed MIT */
|
4 |
-
|
5 |
-
.ui-widget{font-family:Verdana,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Verdana,Arial,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #aaa;background:#fff url("images/ui-bg_flat_75_ffffff_40x100.png") 50% 50% repeat-x;color:#222}.ui-widget-content a{color:#222}.ui-widget-header{border:1px solid #474747;background:#222 url("images/ui-bg_flat_100_222_40x100.png") 50% 50% repeat-x;color:#fff;font-weight:bold}.ui-widget-header a{color:#fff}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #9f9f9f;background:#a5a5a5 url("images/ui-bg_highlight-soft_75_a5a5a5_1x100.png") 50% 50% repeat-x;font-weight:normal;color:#fff}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#fff;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #198cb7;background:#1997c7 url("images/ui-bg_flat_100_1997c7_40x100.png") 50% 50% repeat-x;font-weight:normal;color:#fff}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited{color:#fff;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #198cb7;background:#1997c7 url("images/ui-bg_flat_100_1997c7_40x100.png") 50% 50% repeat-x;font-weight:normal;color:#fff}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#fff;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #eac500;background:#fffaba url("images/ui-bg_flat_100_fffaba_40x100.png") 50% 50% repeat-x;color:#222}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#222}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#fef1ec url("images/ui-bg_glass_95_fef1ec_1x400.png") 50% 50% repeat-x;color:#cd0a0a}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#cd0a0a}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#cd0a0a}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_222222_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_fff_256x240.png")}.ui-state-default .ui-icon{background-image:url("images/ui-icons_fff_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url("images/ui-icons_fff_256x240.png")}.ui-state-active .ui-icon{background-image:url("images/ui-icons_fff_256x240.png")}.ui-state-highlight .ui-icon{background-image:url("images/ui-icons_ec882f_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_cd0a0a_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:3px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:3px}.ui-widget-overlay{background:#aaa url("images/ui-bg_flat_0_aaaaaa_40x100.png") 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{margin:-8px 0 0 -8px;padding:8px;background:#aaa url("images/ui-bg_flat_0_aaaaaa_40x100.png") 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity=30);border-radius:8px}
|
|
|
|
|
|
|
|
|
|
css/jquery-ui.theme.min.1531408399.css
ADDED
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/*! jQuery UI - v1.11.4 - 2018-06-29
|
2 |
+
* http://jqueryui.com
|
3 |
+
* Copyright jQuery Foundation and other contributors; Licensed MIT */
|
4 |
+
|
5 |
+
.ui-widget{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #ddd;background:#fff;color:#333}.ui-widget-content a{color:#333}.ui-widget-header{border:1px solid #ddd;background:#e9e9e9;color:#333;font-weight:bold}.ui-widget-header a{color:#333}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #c5c5c5;background:#f6f6f6;font-weight:normal;color:#454545}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#454545;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #ccc;background:#ededed;font-weight:normal;color:#2b2b2b}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited{color:#2b2b2b;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #003eff;background:#007fff;font-weight:normal;color:#fff}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#fff;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #dad55e;background:#fffa90;color:#777620}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#777620}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #f1a899;background:#fddfdf;color:#5f3f3f}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#5f3f3f}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#5f3f3f}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_444444_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_444444_256x240.png")}.ui-state-default .ui-icon{background-image:url("images/ui-icons_777777_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url("images/ui-icons_555555_256x240.png")}.ui-state-active .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-highlight .ui-icon{background-image:url("images/ui-icons_777620_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_cc0000_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:3px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:3px}.ui-widget-overlay{background:#aaa;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{margin:0 0 0 0;padding:5px;background:#666;opacity:.3;filter:Alpha(Opacity=30);border-radius:8px}
|
css/{main.1530033614.css → main.1531408399.css}
RENAMED
File without changes
|
css/{phpinfo.1530033614.css → phpinfo.1531408399.css}
RENAMED
File without changes
|
css/{wf-adminbar.1530033614.css → wf-adminbar.1531408399.css}
RENAMED
File without changes
|
css/{wf-colorbox.1530033614.css → wf-colorbox.1531408399.css}
RENAMED
File without changes
|
css/{wf-font-awesome.1530033614.css → wf-font-awesome.1531408399.css}
RENAMED
File without changes
|
css/{wf-ionicons.1530033614.css → wf-ionicons.1531408399.css}
RENAMED
File without changes
|
css/{wf-onboarding.1530033614.css → wf-onboarding.1531408399.css}
RENAMED
File without changes
|
css/{wf-roboto-font.1530033614.css → wf-roboto-font.1531408399.css}
RENAMED
File without changes
|
css/{wfselect2.min.1530033614.css → wfselect2.min.1531408399.css}
RENAMED
File without changes
|
css/{wordfenceBox.1530033614.css → wordfenceBox.1531408399.css}
RENAMED
File without changes
|
images/flags/bl.png
ADDED
Binary file
|
images/flags/bq.png
ADDED
Binary file
|
images/flags/hm.png
ADDED
Binary file
|
images/flags/mf.png
ADDED
Binary file
|
images/flags/sj.png
ADDED
Binary file
|
images/flags/ss.png
ADDED
Binary file
|
images/flags/sx.png
ADDED
Binary file
|
images/flags/un.png
ADDED
Binary file
|
js/{Chart.bundle.min.1530033614.js → Chart.bundle.min.1531408399.js}
RENAMED
File without changes
|
js/{admin.1530033614.js → admin.1531408399.js}
RENAMED
File without changes
|
js/{admin.ajaxWatcher.1530033614.js → admin.ajaxWatcher.1531408399.js}
RENAMED
File without changes
|
js/{admin.liveTraffic.1530033614.js → admin.liveTraffic.1531408399.js}
RENAMED
File without changes
|
js/{date.1530033614.js → date.1531408399.js}
RENAMED
File without changes
|
js/{jquery-ui-timepicker-addon.1530033614.js → jquery-ui-timepicker-addon.1531408399.js}
RENAMED
File without changes
|
js/{jquery.colorbox-min.1530033614.js → jquery.colorbox-min.1531408399.js}
RENAMED
File without changes
|
js/{jquery.colorbox.1530033614.js → jquery.colorbox.1531408399.js}
RENAMED
File without changes
|
js/{jquery.dataTables.min.1530033614.js → jquery.dataTables.min.1531408399.js}
RENAMED
File without changes
|
js/{jquery.qrcode.min.1530033614.js → jquery.qrcode.min.1531408399.js}
RENAMED
File without changes
|
js/{jquery.tmpl.min.1530033614.js → jquery.tmpl.min.1531408399.js}
RENAMED
File without changes
|
js/{jquery.tools.min.1530033614.js → jquery.tools.min.1531408399.js}
RENAMED
File without changes
|
js/{knockout-3.3.0.1530033614.js → knockout-3.3.0.1531408399.js}
RENAMED
File without changes
|
js/{perf.1530033614.js → perf.1531408399.js}
RENAMED
File without changes
|
js/{wfdashboard.1530033614.js → wfdashboard.1531408399.js}
RENAMED
File without changes
|
js/{wfdropdown.1530033614.js → wfdropdown.1531408399.js}
RENAMED
File without changes
|
js/{wfglobal.1530033614.js → wfglobal.1531408399.js}
RENAMED
File without changes
|
js/{wfpopover.1530033614.js → wfpopover.1531408399.js}
RENAMED
File without changes
|
js/{wfselect2.min.1530033614.js → wfselect2.min.1531408399.js}
RENAMED
File without changes
|
lib/email_newIssues.php
CHANGED
@@ -110,5 +110,6 @@
|
|
110 |
<p><?php _e('Click here to upgrade to Wordfence Premium:', 'wordfence'); ?><br><a href="https://www.wordfence.com/zz2/wordfence-signup/">https://www.wordfence.com/zz2/wordfence-signup/</a></p>
|
111 |
<?php } ?>
|
112 |
|
|
|
113 |
|
114 |
|
110 |
<p><?php _e('Click here to upgrade to Wordfence Premium:', 'wordfence'); ?><br><a href="https://www.wordfence.com/zz2/wordfence-signup/">https://www.wordfence.com/zz2/wordfence-signup/</a></p>
|
111 |
<?php } ?>
|
112 |
|
113 |
+
<p><!-- ##UNSUBSCRIBE## --></p>
|
114 |
|
115 |
|
lib/email_unsubscribeRequest.php
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php if (!defined('WORDFENCE_VERSION')) { exit; } ?>
|
2 |
+
<?php printf(__('Either you or someone at IP address <b>%s</b> requested an alert unsubscribe link for the website <a href="%s"><b>%s</b></a>.', 'wordfence'), esc_html($IP), esc_attr($siteURL), esc_html($siteName)); ?>
|
3 |
+
<br><br>
|
4 |
+
<?php printf(__('Request was generated at: %s', 'wordfence'), wfUtils::localHumanDate()); ?>
|
5 |
+
<br><br>
|
6 |
+
<?php _e('If you did not request this, you can safely ignore it.', 'wordfence'); ?>
|
7 |
+
<br><br>
|
8 |
+
<?php printf(__('<a href="%s" target="_blank">Click here</a> to stop receiving security alerts.', 'wordfence'), wfUtils::getSiteBaseURL() . '?_wfsf=removeAlertEmail&jwt=' . $jwt); ?>
|
lib/menu_tools_diagnostic.php
CHANGED
@@ -795,6 +795,39 @@ if (!isset($sendingDiagnosticEmail)) {
|
|
795 |
</div>
|
796 |
</div>
|
797 |
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
798 |
|
799 |
<?php if (!empty($inEmail)): ?>
|
800 |
<?php phpinfo(); ?>
|
795 |
</div>
|
796 |
</div>
|
797 |
</div>
|
798 |
+
|
799 |
+
<?php
|
800 |
+
if (!empty($inEmail)) {
|
801 |
+
echo '<h1>' . __('Scan Issues', 'wordfence') . "</h1>\n";
|
802 |
+
$issues = wfIssues::shared()->getIssues(0, 50, 0, 50);
|
803 |
+
$issueCounts = array_merge(array('new' => 0, 'ignoreP' => 0, 'ignoreC' => 0), wfIssues::shared()->getIssueCounts());
|
804 |
+
$issueTypes = wfIssues::validIssueTypes();
|
805 |
+
|
806 |
+
echo '<h2>' . sprintf(__('New Issues (%d total)', 'wordfence'), $issueCounts['new']) . "</h2>\n";
|
807 |
+
if (isset($issues['new']) && count($issues['new'])) {
|
808 |
+
foreach ($issues['new'] as $i) {
|
809 |
+
if (!in_array($i['type'], $issueTypes)) {
|
810 |
+
continue;
|
811 |
+
}
|
812 |
+
|
813 |
+
$viewContent = '';
|
814 |
+
try {
|
815 |
+
$viewContent = wfView::create('scanner/issue-' . $i['type'], array('textOutput' => $i))->render();
|
816 |
+
}
|
817 |
+
catch (wfViewNotFoundException $e) {
|
818 |
+
//Ignore -- should never happen since we validate the type
|
819 |
+
}
|
820 |
+
|
821 |
+
if (!empty($viewContent)) {
|
822 |
+
echo nl2br($viewContent) . "<br><br>\n";
|
823 |
+
}
|
824 |
+
}
|
825 |
+
}
|
826 |
+
else {
|
827 |
+
echo '<h1>' . __('No New Issues', 'wordfence') . "</h1>\n";
|
828 |
+
}
|
829 |
+
}
|
830 |
+
?>
|
831 |
|
832 |
<?php if (!empty($inEmail)): ?>
|
833 |
<?php phpinfo(); ?>
|
lib/wfActivityReport.php
CHANGED
@@ -539,7 +539,19 @@ SQL
|
|
539 |
*/
|
540 |
public function sendReportViaEmail($email_addresses) {
|
541 |
$shortSiteURL = preg_replace('/^https?:\/\//i', '', site_url());
|
542 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
543 |
}
|
544 |
|
545 |
/**
|
539 |
*/
|
540 |
public function sendReportViaEmail($email_addresses) {
|
541 |
$shortSiteURL = preg_replace('/^https?:\/\//i', '', site_url());
|
542 |
+
|
543 |
+
$content = $this->toEmailView()->__toString();
|
544 |
+
|
545 |
+
$success = true;
|
546 |
+
if (is_string($email_addresses)) { $email_addresses = explode(',', $email_addresses); }
|
547 |
+
foreach ($email_addresses as $email) {
|
548 |
+
$uniqueContent = str_replace('<!-- ##UNSUBSCRIBE## -->', sprintf(__('No longer an administrator for this site? <a href="%s" target="_blank">Click here</a> to stop receiving security alerts.', 'wordfence'), wfUtils::getSiteBaseURL() . '?_wfsf=removeAlertEmail&jwt=' . wfUtils::generateJWT(array('email' => $email))), $content);
|
549 |
+
if (!wp_mail($email, 'Wordfence activity for ' . date_i18n(get_option('date_format')) . ' on ' . $shortSiteURL, $uniqueContent, 'Content-Type: text/html')) {
|
550 |
+
$success = false;
|
551 |
+
}
|
552 |
+
}
|
553 |
+
|
554 |
+
return $success;
|
555 |
}
|
556 |
|
557 |
/**
|
lib/wfArray.php
CHANGED
@@ -8,21 +8,21 @@ class wfArray {
|
|
8 |
}
|
9 |
public function push($val){ //associative array with keys that match those given to constructor
|
10 |
foreach($this->keys as $key){
|
11 |
-
$this->data .= pack('N', strlen($val[$key])) . $val[$key];
|
12 |
}
|
13 |
$this->size++;
|
14 |
}
|
15 |
public function shift(){ //If you alternately call push and shift you must periodically call collectGarbage() or ->data will keep growing
|
16 |
$arr = array();
|
17 |
-
if(strlen($this->data) < 1){ return null; }
|
18 |
-
if($this->shiftPtr == strlen($this->data)){ return null; }
|
19 |
foreach($this->keys as $key){
|
20 |
-
$len = unpack('N', substr($this->data, $this->shiftPtr, 4));
|
21 |
$len = $len[1];
|
22 |
-
$arr[$key] = substr($this->data, $this->shiftPtr + 4, $len);
|
23 |
$this->shiftPtr += 4 + $len;
|
24 |
}
|
25 |
-
if($this->shiftPtr == strlen($this->data)){ //garbage collection
|
26 |
$this->data = ""; //we don't shorten with substr() because the assignment doubles peak mem
|
27 |
$this->shiftPtr = 0;
|
28 |
}
|
@@ -31,7 +31,7 @@ class wfArray {
|
|
31 |
}
|
32 |
public function collectGarbage(){ //only call collectGarbage if you're alternating between pushes and shifts and never emptying the array.
|
33 |
//If you don't collect garbage then the data that is shifted is never freed
|
34 |
-
$this->data = substr($this->data, $this->shiftPtr); //at this point memory usage doubles because of the = assignment (string copy is made), so try not to call collect garbage unless you have to.
|
35 |
$this->shiftPtr = 0;
|
36 |
}
|
37 |
public function zero(){ //Rather call this instead of collect garbage because it's way more mem efficient.
|
8 |
}
|
9 |
public function push($val){ //associative array with keys that match those given to constructor
|
10 |
foreach($this->keys as $key){
|
11 |
+
$this->data .= pack('N', wfUtils::strlen($val[$key])) . $val[$key];
|
12 |
}
|
13 |
$this->size++;
|
14 |
}
|
15 |
public function shift(){ //If you alternately call push and shift you must periodically call collectGarbage() or ->data will keep growing
|
16 |
$arr = array();
|
17 |
+
if(wfUtils::strlen($this->data) < 1){ return null; }
|
18 |
+
if($this->shiftPtr == wfUtils::strlen($this->data)){ return null; }
|
19 |
foreach($this->keys as $key){
|
20 |
+
$len = unpack('N', wfUtils::substr($this->data, $this->shiftPtr, 4));
|
21 |
$len = $len[1];
|
22 |
+
$arr[$key] = wfUtils::substr($this->data, $this->shiftPtr + 4, $len);
|
23 |
$this->shiftPtr += 4 + $len;
|
24 |
}
|
25 |
+
if($this->shiftPtr == wfUtils::strlen($this->data)){ //garbage collection
|
26 |
$this->data = ""; //we don't shorten with substr() because the assignment doubles peak mem
|
27 |
$this->shiftPtr = 0;
|
28 |
}
|
31 |
}
|
32 |
public function collectGarbage(){ //only call collectGarbage if you're alternating between pushes and shifts and never emptying the array.
|
33 |
//If you don't collect garbage then the data that is shifted is never freed
|
34 |
+
$this->data = wfUtils::substr($this->data, $this->shiftPtr); //at this point memory usage doubles because of the = assignment (string copy is made), so try not to call collect garbage unless you have to.
|
35 |
$this->shiftPtr = 0;
|
36 |
}
|
37 |
public function zero(){ //Rather call this instead of collect garbage because it's way more mem efficient.
|
lib/wfConfig.php
CHANGED
@@ -217,6 +217,7 @@ class wfConfig {
|
|
217 |
'supportHash' => array('value' => '', 'autoload' => self::DONT_AUTOLOAD, 'validation' => array('type' => self::TYPE_STRING)),
|
218 |
'touppPromptNeeded' => array('value' => false, 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_BOOL)),
|
219 |
'touppBypassNextCheck' => array('value' => false, 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_BOOL)),
|
|
|
220 |
),
|
221 |
);
|
222 |
public static $serializedOptions = array('lastAdminLogin', 'scanSched', 'emailedIssuesList', 'wf_summaryItems', 'adminUserList', 'twoFactorUsers', 'alertFreqTrack', 'wfStatusStartMsgs', 'vulnerabilities_plugin', 'vulnerabilities_theme', 'dashboardData', 'malwarePrefixes', 'coreHashes', 'noc1ScanSchedule', 'allScansScheduled', 'disclosureStates', 'scanStageStatuses', 'adminNoticeQueue');
|
@@ -251,6 +252,7 @@ class wfConfig {
|
|
251 |
}
|
252 |
}
|
253 |
self::set('encKey', substr(wfUtils::bigRandomHex(), 0, 16));
|
|
|
254 |
if (self::get('maxMem', false) === false) {
|
255 |
self::set('maxMem', '256');
|
256 |
}
|
@@ -883,22 +885,51 @@ class wfConfig {
|
|
883 |
return $result;
|
884 |
}
|
885 |
public static function autoUpdate(){
|
886 |
-
|
887 |
-
|
888 |
-
|
889 |
-
|
890 |
-
|
891 |
-
|
892 |
-
|
893 |
-
|
894 |
-
|
895 |
-
|
896 |
-
|
897 |
-
|
898 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
899 |
}
|
900 |
-
return;
|
901 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
902 |
require_once(ABSPATH . 'wp-admin/includes/class-wp-upgrader.php');
|
903 |
require_once(ABSPATH . 'wp-admin/includes/misc.php');
|
904 |
/* We were creating show_message here so that WP did not write to STDOUT. This had the strange effect of throwing an error about redeclaring show_message function, but only when a crawler hit the site and triggered the cron job. Not a human. So we're now just require'ing misc.php which does generate output, but that's OK because it is a loopback cron request.
|
@@ -916,7 +947,6 @@ class wfConfig {
|
|
916 |
return;
|
917 |
}
|
918 |
|
919 |
-
wp_update_plugins();
|
920 |
ob_start();
|
921 |
$upgrader = new Plugin_Upgrader();
|
922 |
$upret = $upgrader->upgrade(WORDFENCE_BASENAME);
|
@@ -925,6 +955,7 @@ class wfConfig {
|
|
925 |
if(wfConfig::get('alertOn_update') == '1' && preg_match('/Version: (\d+\.\d+\.\d+)/', $cont, $matches) ){
|
926 |
wordfence::alert("Wordfence Upgraded to version " . $matches[1], "Your Wordfence installation has been upgraded to version " . $matches[1], '127.0.0.1');
|
927 |
}
|
|
|
928 |
}
|
929 |
$output = @ob_get_contents();
|
930 |
@ob_end_clean();
|
217 |
'supportHash' => array('value' => '', 'autoload' => self::DONT_AUTOLOAD, 'validation' => array('type' => self::TYPE_STRING)),
|
218 |
'touppPromptNeeded' => array('value' => false, 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_BOOL)),
|
219 |
'touppBypassNextCheck' => array('value' => false, 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_BOOL)),
|
220 |
+
'autoUpdateAttempts' => array('value' => 0, 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_INT)),
|
221 |
),
|
222 |
);
|
223 |
public static $serializedOptions = array('lastAdminLogin', 'scanSched', 'emailedIssuesList', 'wf_summaryItems', 'adminUserList', 'twoFactorUsers', 'alertFreqTrack', 'wfStatusStartMsgs', 'vulnerabilities_plugin', 'vulnerabilities_theme', 'dashboardData', 'malwarePrefixes', 'coreHashes', 'noc1ScanSchedule', 'allScansScheduled', 'disclosureStates', 'scanStageStatuses', 'adminNoticeQueue');
|
252 |
}
|
253 |
}
|
254 |
self::set('encKey', substr(wfUtils::bigRandomHex(), 0, 16));
|
255 |
+
self::set('longEncKey', bin2hex(wfWAFUtils::random_bytes(32)));
|
256 |
if (self::get('maxMem', false) === false) {
|
257 |
self::set('maxMem', '256');
|
258 |
}
|
885 |
return $result;
|
886 |
}
|
887 |
public static function autoUpdate(){
|
888 |
+
if (!wfConfig::get('other_bypassLitespeedNoabort', false) && getenv('noabort') != '1' && stristr($_SERVER['SERVER_SOFTWARE'], 'litespeed') !== false) {
|
889 |
+
$lastEmail = self::get('lastLiteSpdEmail', false);
|
890 |
+
if( (! $lastEmail) || (time() - (int)$lastEmail > (86400 * 30))){
|
891 |
+
self::set('lastLiteSpdEmail', time());
|
892 |
+
wordfence::alert("Wordfence Upgrade not run. Please modify your .htaccess", "To preserve the integrity of your website we are not running Wordfence auto-update.\n" .
|
893 |
+
"You are running the LiteSpeed web server which has been known to cause a problem with Wordfence auto-update.\n" .
|
894 |
+
"Please go to your website now and make a minor change to your .htaccess to fix this.\n" .
|
895 |
+
"You can find out how to make this change at:\n" .
|
896 |
+
wfSupportController::supportURL(wfSupportController::ITEM_DASHBOARD_OPTION_LITESPEED_WARNING) . "\n" .
|
897 |
+
"\nAlternatively you can disable auto-update on your website to stop receiving this message and upgrade Wordfence manually.\n",
|
898 |
+
'127.0.0.1'
|
899 |
+
);
|
900 |
+
}
|
901 |
+
return;
|
902 |
+
}
|
903 |
+
|
904 |
+
$runUpdate = false;
|
905 |
+
wp_update_plugins();
|
906 |
+
$update_plugins = get_site_transient('update_plugins');
|
907 |
+
if ($update_plugins && is_array($update_plugins->response) && isset($update_plugins->response[WORDFENCE_BASENAME])) {
|
908 |
+
$status = $update_plugins->response[WORDFENCE_BASENAME];
|
909 |
+
if (is_object($status) && property_exists($status, 'new_version')) {
|
910 |
+
$runUpdate = (version_compare($status->new_version, WORDFENCE_VERSION) > 0);
|
911 |
+
}
|
912 |
+
}
|
913 |
+
|
914 |
+
if ($runUpdate) {
|
915 |
+
try {
|
916 |
+
$api = new wfAPI(wfConfig::get('apiKey'), wfUtils::getWPVersion());
|
917 |
+
$response = $api->call('should_auto_update', array(), array('currentVersion' => WORDFENCE_VERSION));
|
918 |
+
if (!(is_array($response) && isset($response['ok']) && wfUtils::truthyToBoolean($response['ok']))) {
|
919 |
+
$runUpdate = false;
|
920 |
}
|
|
|
921 |
}
|
922 |
+
catch (Exception $e) {
|
923 |
+
wfConfig::inc('autoUpdateAttempts');
|
924 |
+
$runUpdate = false;
|
925 |
+
}
|
926 |
+
}
|
927 |
+
|
928 |
+
if (!$runUpdate && wfConfig::get('autoUpdateAttempts') < 7) {
|
929 |
+
return;
|
930 |
+
}
|
931 |
+
|
932 |
+
try {
|
933 |
require_once(ABSPATH . 'wp-admin/includes/class-wp-upgrader.php');
|
934 |
require_once(ABSPATH . 'wp-admin/includes/misc.php');
|
935 |
/* We were creating show_message here so that WP did not write to STDOUT. This had the strange effect of throwing an error about redeclaring show_message function, but only when a crawler hit the site and triggered the cron job. Not a human. So we're now just require'ing misc.php which does generate output, but that's OK because it is a loopback cron request.
|
947 |
return;
|
948 |
}
|
949 |
|
|
|
950 |
ob_start();
|
951 |
$upgrader = new Plugin_Upgrader();
|
952 |
$upret = $upgrader->upgrade(WORDFENCE_BASENAME);
|
955 |
if(wfConfig::get('alertOn_update') == '1' && preg_match('/Version: (\d+\.\d+\.\d+)/', $cont, $matches) ){
|
956 |
wordfence::alert("Wordfence Upgraded to version " . $matches[1], "Your Wordfence installation has been upgraded to version " . $matches[1], '127.0.0.1');
|
957 |
}
|
958 |
+
wfConfig::set('autoUpdateAttempts', 0);
|
959 |
}
|
960 |
$output = @ob_get_contents();
|
961 |
@ob_end_clean();
|
lib/wfIssues.php
CHANGED
@@ -315,6 +315,10 @@ class wfIssues {
|
|
315 |
public function emailNewIssues($timeLimitReached = false, $scanController = false){
|
316 |
$level = wfConfig::getAlertLevel();
|
317 |
$emails = wfConfig::getAlertEmails();
|
|
|
|
|
|
|
|
|
318 |
$shortSiteURL = preg_replace('/^https?:\/\//i', '', site_url());
|
319 |
$subject = "[Wordfence Alert] Problems found on $shortSiteURL";
|
320 |
|
@@ -373,8 +377,9 @@ class wfIssues {
|
|
373 |
'scanController' => ($scanController ? $scanController : wfScanner::shared()),
|
374 |
));
|
375 |
|
376 |
-
|
377 |
-
|
|
|
378 |
}
|
379 |
}
|
380 |
public function deleteIssue($id){
|
315 |
public function emailNewIssues($timeLimitReached = false, $scanController = false){
|
316 |
$level = wfConfig::getAlertLevel();
|
317 |
$emails = wfConfig::getAlertEmails();
|
318 |
+
if (!count($emails)) {
|
319 |
+
return;
|
320 |
+
}
|
321 |
+
|
322 |
$shortSiteURL = preg_replace('/^https?:\/\//i', '', site_url());
|
323 |
$subject = "[Wordfence Alert] Problems found on $shortSiteURL";
|
324 |
|
377 |
'scanController' => ($scanController ? $scanController : wfScanner::shared()),
|
378 |
));
|
379 |
|
380 |
+
foreach ($emails as $email) {
|
381 |
+
$uniqueContent = str_replace('<!-- ##UNSUBSCRIBE## -->', sprintf(__('No longer an administrator for this site? <a href="%s" target="_blank">Click here</a> to stop receiving security alerts.', 'wordfence'), wfUtils::getSiteBaseURL() . '?_wfsf=removeAlertEmail&jwt=' . wfUtils::generateJWT(array('email' => $email))), $content);
|
382 |
+
wp_mail($email, $subject, $uniqueContent, 'Content-type: text/html');
|
383 |
}
|
384 |
}
|
385 |
public function deleteIssue($id){
|
lib/wfLog.php
CHANGED
@@ -290,7 +290,7 @@ class wfLog {
|
|
290 |
}
|
291 |
}
|
292 |
}
|
293 |
-
if(isset($_SERVER['HTTP_USER_AGENT']) && wfCrawl::isCrawler($_SERVER['HTTP_USER_AGENT'])){
|
294 |
if($type == 'hit' && wfConfig::get('maxRequestsCrawlers') != 'DISABLED' && $hitsPerMinute > wfConfig::getInt('maxRequestsCrawlers')){
|
295 |
$this->takeBlockingAction('maxRequestsCrawlers', "Exceeded the maximum number of requests per minute for crawlers."); //may not exit
|
296 |
} else if($type == '404' && wfConfig::get('max404Crawlers') != 'DISABLED' && $hitsPerMinute > wfConfig::getInt('max404Crawlers')){
|
290 |
}
|
291 |
}
|
292 |
}
|
293 |
+
if((isset($_SERVER['HTTP_USER_AGENT']) && wfCrawl::isCrawler($_SERVER['HTTP_USER_AGENT'])) || empty($_SERVER['HTTP_USER_AGENT'])){
|
294 |
if($type == 'hit' && wfConfig::get('maxRequestsCrawlers') != 'DISABLED' && $hitsPerMinute > wfConfig::getInt('maxRequestsCrawlers')){
|
295 |
$this->takeBlockingAction('maxRequestsCrawlers', "Exceeded the maximum number of requests per minute for crawlers."); //may not exit
|
296 |
} else if($type == '404' && wfConfig::get('max404Crawlers') != 'DISABLED' && $hitsPerMinute > wfConfig::getInt('max404Crawlers')){
|
lib/wfOnboardingController.php
CHANGED
@@ -66,7 +66,7 @@ class wfOnboardingController {
|
|
66 |
self::shouldShowNewTour(self::TOUR_BLOCKING) || self::shouldShowUpgradeTour(self::TOUR_BLOCKING) ||
|
67 |
self::shouldShowNewTour(self::TOUR_LIVE_TRAFFIC) || self::shouldShowUpgradeTour(self::TOUR_LIVE_TRAFFIC));
|
68 |
|
69 |
-
if (wfUtils::isAdmin() && (($willShowAnyPluginOnboarding &&
|
70 |
wp_enqueue_style('wordfence-font', wfUtils::getBaseURL() . wfUtils::versionedAsset('css/wf-roboto-font.css'), '', WORDFENCE_VERSION);
|
71 |
wp_enqueue_style('wordfence-ionicons-style', wfUtils::getBaseURL() . wfUtils::versionedAsset('css/wf-ionicons.css'), '', WORDFENCE_VERSION);
|
72 |
wp_enqueue_style('wordfenceOnboardingCSS', wfUtils::getBaseURL() . wfUtils::versionedAsset('css/wf-onboarding.css'), '', WORDFENCE_VERSION);
|
66 |
self::shouldShowNewTour(self::TOUR_BLOCKING) || self::shouldShowUpgradeTour(self::TOUR_BLOCKING) ||
|
67 |
self::shouldShowNewTour(self::TOUR_LIVE_TRAFFIC) || self::shouldShowUpgradeTour(self::TOUR_LIVE_TRAFFIC));
|
68 |
|
69 |
+
if (wfUtils::isAdmin() && (($willShowAnyPluginOnboarding && preg_match('~(?:^|/)wp-admin(?:/network)?/plugins\.php~i', $_SERVER['REQUEST_URI'])) || (isset($_GET['page']) && preg_match('/^Wordfence/', @$_GET['page'])))) {
|
70 |
wp_enqueue_style('wordfence-font', wfUtils::getBaseURL() . wfUtils::versionedAsset('css/wf-roboto-font.css'), '', WORDFENCE_VERSION);
|
71 |
wp_enqueue_style('wordfence-ionicons-style', wfUtils::getBaseURL() . wfUtils::versionedAsset('css/wf-ionicons.css'), '', WORDFENCE_VERSION);
|
72 |
wp_enqueue_style('wordfenceOnboardingCSS', wfUtils::getBaseURL() . wfUtils::versionedAsset('css/wf-onboarding.css'), '', WORDFENCE_VERSION);
|
lib/wfUtils.php
CHANGED
@@ -2570,6 +2570,79 @@ class wfUtils {
|
|
2570 |
}
|
2571 |
return new DateTime($timestring);
|
2572 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2573 |
}
|
2574 |
|
2575 |
// GeoIP lib uses these as well
|
2570 |
}
|
2571 |
return new DateTime($timestring);
|
2572 |
}
|
2573 |
+
|
2574 |
+
/**
|
2575 |
+
* Base64URL-encodes the given payload. This is identical to base64_encode except it substitutes characters
|
2576 |
+
* not safe for use in URLs.
|
2577 |
+
*
|
2578 |
+
* @param string $payload
|
2579 |
+
* @return string
|
2580 |
+
*/
|
2581 |
+
public static function base64url_encode($payload) {
|
2582 |
+
$intermediate = base64_encode($payload);
|
2583 |
+
$intermediate = rtrim($intermediate, '=');
|
2584 |
+
$intermediate = str_replace('+', '-', $intermediate);
|
2585 |
+
$intermediate = str_replace('/', '_', $intermediate);
|
2586 |
+
return $intermediate;
|
2587 |
+
}
|
2588 |
+
|
2589 |
+
/**
|
2590 |
+
* Base64URL-decodes the given payload. This is identical to base64_encode except it allows for the characters
|
2591 |
+
* substituted by base64url_encode.
|
2592 |
+
*
|
2593 |
+
* @param string $payload
|
2594 |
+
* @return string
|
2595 |
+
*/
|
2596 |
+
public static function base64url_decode($payload) {
|
2597 |
+
$intermediate = str_replace('_', '/', $payload);
|
2598 |
+
$intermediate = str_replace('-', '+', $intermediate);
|
2599 |
+
$intermediate = base64_decode($intermediate);
|
2600 |
+
return $intermediate;
|
2601 |
+
}
|
2602 |
+
|
2603 |
+
/**
|
2604 |
+
* Returns a signed JWT for the given payload. Payload is expected to be an array suitable for JSON-encoding.
|
2605 |
+
*
|
2606 |
+
* @param array $payload
|
2607 |
+
* @param int $maxAge How long the JWT will be considered valid.
|
2608 |
+
* @return string
|
2609 |
+
*/
|
2610 |
+
public static function generateJWT($payload, $maxAge = 604800 /* 7 days */) {
|
2611 |
+
$payload['_exp'] = time() + $maxAge;
|
2612 |
+
$key = wfConfig::get('longEncKey');
|
2613 |
+
$header = '{"alg":"HS256","typ":"JWT"}';
|
2614 |
+
$body = self::base64url_encode($header) . '.' . self::base64url_encode(json_encode($payload));
|
2615 |
+
$signature = hash_hmac('sha256', $body, $key, true);
|
2616 |
+
return $body . '.' . self::base64url_encode($signature);
|
2617 |
+
}
|
2618 |
+
|
2619 |
+
/**
|
2620 |
+
* Decodes and returns the payload of a JWT. This also validates the signature.
|
2621 |
+
*
|
2622 |
+
* @param string $token
|
2623 |
+
* @return array|bool The decoded payload or false if the token is invalid or fails validation.
|
2624 |
+
*/
|
2625 |
+
public static function decodeJWT($token) {
|
2626 |
+
$components = explode('.', $token);
|
2627 |
+
if (count($components) != 3) {
|
2628 |
+
return false;
|
2629 |
+
}
|
2630 |
+
|
2631 |
+
$key = wfConfig::get('longEncKey');
|
2632 |
+
$body = $components[0] . '.' . $components[1];
|
2633 |
+
$signature = hash_hmac('sha256', $body, $key, true);
|
2634 |
+
$testSignature = self::base64url_decode($components[2]);
|
2635 |
+
if (!hash_equals($signature, $testSignature)) {
|
2636 |
+
return false;
|
2637 |
+
}
|
2638 |
+
|
2639 |
+
$json = self::base64url_decode($components[1]);
|
2640 |
+
$payload = @json_decode($json, true);
|
2641 |
+
if (isset($payload['_exp']) && $payload['_exp'] < time()) {
|
2642 |
+
return false;
|
2643 |
+
}
|
2644 |
+
return $payload;
|
2645 |
+
}
|
2646 |
}
|
2647 |
|
2648 |
// GeoIP lib uses these as well
|
lib/wordfenceClass.php
CHANGED
@@ -576,6 +576,7 @@ SQL
|
|
576 |
}
|
577 |
|
578 |
wfConfig::set('geoIPVersionHash', $geoIPVersionHash);
|
|
|
579 |
}
|
580 |
|
581 |
if (wfConfig::get('other_hideWPVersion')) {
|
@@ -1023,6 +1024,24 @@ SQL
|
|
1023 |
wfConfig::set('generateAllOptionsNotification', 1);
|
1024 |
}*/
|
1025 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1026 |
//Check the How does Wordfence get IPs setting
|
1027 |
wfUtils::requestDetectProxyCallback();
|
1028 |
|
@@ -1326,7 +1345,7 @@ SQL
|
|
1326 |
public static function ajax_lh_callback(){
|
1327 |
self::getLog()->canLogHit = false;
|
1328 |
$UA = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '';
|
1329 |
-
$isCrawler =
|
1330 |
if ($UA) {
|
1331 |
if (wfCrawl::isCrawler($UA) || wfCrawl::isGoogleCrawler()) {
|
1332 |
$isCrawler = true;
|
@@ -1618,12 +1637,152 @@ SQL
|
|
1618 |
}
|
1619 |
exit();
|
1620 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1621 |
|
1622 |
// Sync the WAF data with the database.
|
1623 |
if (!WFWAF_SUBDIRECTORY_INSTALL && $waf = wfWAF::getInstance()) {
|
1624 |
$homeurl = wfUtils::wpHomeURL();
|
1625 |
$siteurl = wfUtils::wpSiteURL();
|
1626 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1627 |
try {
|
1628 |
$configDefaults = array(
|
1629 |
'apiKey' => wfConfig::get('apiKey'),
|
@@ -5759,6 +5918,7 @@ HTML
|
|
5759 |
$IPMsg .= $userLoc['countryName'] . "\n";
|
5760 |
}
|
5761 |
}
|
|
|
5762 |
$content = wfUtils::tmpl('email_genericAlert.php', array(
|
5763 |
'isPaid' => wfConfig::get('isPaid'),
|
5764 |
'subject' => $subject,
|
@@ -5802,8 +5962,9 @@ HTML
|
|
5802 |
}
|
5803 |
}
|
5804 |
wfConfig::set('lastEmailHash', time() . ':' . $hash);
|
5805 |
-
|
5806 |
-
|
|
|
5807 |
}
|
5808 |
}
|
5809 |
public static function getLog(){
|
576 |
}
|
577 |
|
578 |
wfConfig::set('geoIPVersionHash', $geoIPVersionHash);
|
579 |
+
wfConfig::set('needsGeoIPSync', true, wfConfig::DONT_AUTOLOAD); //From 7.1.9 but needs same conditional
|
580 |
}
|
581 |
|
582 |
if (wfConfig::get('other_hideWPVersion')) {
|
1024 |
wfConfig::set('generateAllOptionsNotification', 1);
|
1025 |
}*/
|
1026 |
|
1027 |
+
//7.1.9
|
1028 |
+
if (wfConfig::get('loginSec_maxFailures') == 1) {
|
1029 |
+
wfConfig::set('loginSec_maxFailures', 2);
|
1030 |
+
}
|
1031 |
+
|
1032 |
+
$blocksTable = wfBlock::blocksTable();
|
1033 |
+
$patternBlocks = wfBlock::patternBlocks();
|
1034 |
+
foreach ($patternBlocks as $b) {
|
1035 |
+
if (!empty($b->ipRange) && preg_match('/^\d+\-\d+$/', $b->ipRange)) { //Old-style range block using long2ip
|
1036 |
+
$ipRange = new wfUserIPRange($b->ipRange);
|
1037 |
+
$ipRange = $ipRange->getIPString();
|
1038 |
+
|
1039 |
+
$parameters = $b->parameters;
|
1040 |
+
$parameters['ipRange'] = $ipRange;
|
1041 |
+
$wpdb->query($wpdb->prepare("UPDATE `{$blocksTable}` SET `parameters` = %s WHERE `id` = %d", json_encode($parameters), $b->id));
|
1042 |
+
}
|
1043 |
+
}
|
1044 |
+
|
1045 |
//Check the How does Wordfence get IPs setting
|
1046 |
wfUtils::requestDetectProxyCallback();
|
1047 |
|
1345 |
public static function ajax_lh_callback(){
|
1346 |
self::getLog()->canLogHit = false;
|
1347 |
$UA = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '';
|
1348 |
+
$isCrawler = empty($UA);
|
1349 |
if ($UA) {
|
1350 |
if (wfCrawl::isCrawler($UA) || wfCrawl::isGoogleCrawler()) {
|
1351 |
$isCrawler = true;
|
1637 |
}
|
1638 |
exit();
|
1639 |
}
|
1640 |
+
else if ($wfFunc == 'removeAlertEmail') {
|
1641 |
+
wfUtils::doNotCache();
|
1642 |
+
|
1643 |
+
$payloadStatus = false;
|
1644 |
+
$jwt = (isset($_GET['jwt']) && is_string($_GET['jwt'])) ? $_GET['jwt'] : '';
|
1645 |
+
if (!empty($jwt)) {
|
1646 |
+
$payload = wfUtils::decodeJWT($jwt);
|
1647 |
+
if ($payload && isset($payload['email'])) {
|
1648 |
+
$payloadStatus = true;
|
1649 |
+
}
|
1650 |
+
}
|
1651 |
+
|
1652 |
+
if (isset($_POST['resend'])) {
|
1653 |
+
$email = trim(@$_POST['email']);
|
1654 |
+
$found = false;
|
1655 |
+
$alertEmails = wfConfig::getAlertEmails();
|
1656 |
+
foreach ($alertEmails as $e) {
|
1657 |
+
if ($e == $email) {
|
1658 |
+
$found = true;
|
1659 |
+
break;
|
1660 |
+
}
|
1661 |
+
}
|
1662 |
+
|
1663 |
+
if ($found) {
|
1664 |
+
$content = wfUtils::tmpl('email_unsubscribeRequest.php', array(
|
1665 |
+
'siteName' => get_bloginfo('name', 'raw'),
|
1666 |
+
'siteURL' => wfUtils::getSiteBaseURL(),
|
1667 |
+
'IP' => wfUtils::getIP(),
|
1668 |
+
'jwt' => wfUtils::generateJWT(array('email' => $email)),
|
1669 |
+
));
|
1670 |
+
wp_mail($email, "Unsubscribe Requested", $content, "Content-Type: text/html");
|
1671 |
+
}
|
1672 |
+
|
1673 |
+
echo wfView::create('common/unsubscribe', array(
|
1674 |
+
'state' => 'resent',
|
1675 |
+
))->render();
|
1676 |
+
exit();
|
1677 |
+
}
|
1678 |
+
else if (!$payloadStatus) {
|
1679 |
+
echo wfView::create('common/unsubscribe', array(
|
1680 |
+
'state' => 'bad',
|
1681 |
+
))->render();
|
1682 |
+
exit();
|
1683 |
+
}
|
1684 |
+
else if (isset($_POST['confirm'])) {
|
1685 |
+
$confirm = wfUtils::truthyToBoolean($_POST['confirm']);
|
1686 |
+
if ($confirm) {
|
1687 |
+
$found = false;
|
1688 |
+
$alertEmails = wfConfig::getAlertEmails();
|
1689 |
+
$updatedAlertEmails = array();
|
1690 |
+
foreach ($alertEmails as $alertEmail) {
|
1691 |
+
if ($alertEmail == $payload['email']) {
|
1692 |
+
$found = true;
|
1693 |
+
}
|
1694 |
+
else {
|
1695 |
+
$updatedAlertEmails[] = $alertEmail;
|
1696 |
+
}
|
1697 |
+
}
|
1698 |
+
|
1699 |
+
if ($found) {
|
1700 |
+
wfConfig::set('alertEmails', implode(',', $updatedAlertEmails));
|
1701 |
+
}
|
1702 |
+
|
1703 |
+
echo wfView::create('common/unsubscribe', array(
|
1704 |
+
'jwt' => $_GET['jwt'],
|
1705 |
+
'email' => $payload['email'],
|
1706 |
+
'state' => 'unsubscribed',
|
1707 |
+
))->render();
|
1708 |
+
exit();
|
1709 |
+
}
|
1710 |
+
}
|
1711 |
+
|
1712 |
+
echo wfView::create('common/unsubscribe', array(
|
1713 |
+
'jwt' => $_GET['jwt'],
|
1714 |
+
'email' => $payload['email'],
|
1715 |
+
'state' => 'prompt',
|
1716 |
+
))->render();
|
1717 |
+
exit();
|
1718 |
+
}
|
1719 |
|
1720 |
// Sync the WAF data with the database.
|
1721 |
if (!WFWAF_SUBDIRECTORY_INSTALL && $waf = wfWAF::getInstance()) {
|
1722 |
$homeurl = wfUtils::wpHomeURL();
|
1723 |
$siteurl = wfUtils::wpSiteURL();
|
1724 |
|
1725 |
+
//Sync the GeoIP database if needed
|
1726 |
+
$destination = WFWAF_LOG_PATH . '/GeoLite2-Country.mmdb';
|
1727 |
+
if (!file_exists($destination) || wfConfig::get('needsGeoIPSync')) {
|
1728 |
+
$allowSync = false;
|
1729 |
+
if (wfConfig::createLock('wfSyncGeoIP')) {
|
1730 |
+
$status = get_transient('wfSyncGeoIPActive');
|
1731 |
+
if (!$status) {
|
1732 |
+
$allowSync = true;
|
1733 |
+
set_transient('wfSyncGeoIPActive', true, 3600);
|
1734 |
+
}
|
1735 |
+
wfConfig::releaseLock('wfSyncGeoIP');
|
1736 |
+
}
|
1737 |
+
|
1738 |
+
if ($allowSync) {
|
1739 |
+
$source = dirname(__FILE__) . '/GeoLite2-Country.mmdb';
|
1740 |
+
if (copy($source, $destination)) {
|
1741 |
+
$shash = '';
|
1742 |
+
$dhash = '';
|
1743 |
+
|
1744 |
+
$sp = @fopen($source, "rb");
|
1745 |
+
if ($sp) {
|
1746 |
+
$scontext = hash_init('sha256');
|
1747 |
+
while (!feof($sp)) {
|
1748 |
+
$data = fread($sp, 65536);
|
1749 |
+
if ($data === false) {
|
1750 |
+
$scontext = false;
|
1751 |
+
break;
|
1752 |
+
}
|
1753 |
+
hash_update($scontext, $data);
|
1754 |
+
}
|
1755 |
+
fclose($sp);
|
1756 |
+
if ($scontext !== false) {
|
1757 |
+
$shash = hash_final($scontext, false);
|
1758 |
+
}
|
1759 |
+
}
|
1760 |
+
|
1761 |
+
$dp = @fopen($destination, "rb");
|
1762 |
+
if ($dp) {
|
1763 |
+
$dcontext = hash_init('sha256');
|
1764 |
+
while (!feof($dp)) {
|
1765 |
+
$data = fread($dp, 65536);
|
1766 |
+
if ($data === false) {
|
1767 |
+
$dcontext = false;
|
1768 |
+
break;
|
1769 |
+
}
|
1770 |
+
hash_update($dcontext, $data);
|
1771 |
+
}
|
1772 |
+
fclose($dp);
|
1773 |
+
if ($scontext !== false) {
|
1774 |
+
$dhash = hash_final($dcontext, false);
|
1775 |
+
}
|
1776 |
+
}
|
1777 |
+
|
1778 |
+
if (hash_equals($shash, $dhash)) {
|
1779 |
+
wfConfig::remove('needsGeoIPSync');
|
1780 |
+
delete_transient('wfSyncGeoIPActive');
|
1781 |
+
}
|
1782 |
+
}
|
1783 |
+
}
|
1784 |
+
}
|
1785 |
+
|
1786 |
try {
|
1787 |
$configDefaults = array(
|
1788 |
'apiKey' => wfConfig::get('apiKey'),
|
5918 |
$IPMsg .= $userLoc['countryName'] . "\n";
|
5919 |
}
|
5920 |
}
|
5921 |
+
|
5922 |
$content = wfUtils::tmpl('email_genericAlert.php', array(
|
5923 |
'isPaid' => wfConfig::get('isPaid'),
|
5924 |
'subject' => $subject,
|
5962 |
}
|
5963 |
}
|
5964 |
wfConfig::set('lastEmailHash', time() . ':' . $hash);
|
5965 |
+
foreach ($emails as $email) {
|
5966 |
+
$uniqueContent = $content . "\n\n" . sprintf(__('No longer an administrator for this site? Click here to stop receiving security alerts: %s', 'wordfence'), wfUtils::getSiteBaseURL() . '?_wfsf=removeAlertEmail&jwt=' . wfUtils::generateJWT(array('email' => $email)));
|
5967 |
+
wp_mail($email, $subject, $uniqueContent);
|
5968 |
}
|
5969 |
}
|
5970 |
public static function getLog(){
|
models/common/wfGeoIP2.php
CHANGED
@@ -11,7 +11,7 @@ class wfGeoIP2 {
|
|
11 |
/**
|
12 |
* Returns the singleton wfGeoIP2.
|
13 |
*
|
14 |
-
* @return
|
15 |
*/
|
16 |
public static function shared() {
|
17 |
static $_geoip = null;
|
@@ -22,6 +22,16 @@ class wfGeoIP2 {
|
|
22 |
}
|
23 |
|
24 |
public function __construct() {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
25 |
$this->_reader = new Reader(__DIR__ . '/../../lib/GeoLite2-Country.mmdb'); //Can throw, but we don't catch it because it means the installation is likely corrupt and needs fixed anyway
|
26 |
}
|
27 |
|
11 |
/**
|
12 |
* Returns the singleton wfGeoIP2.
|
13 |
*
|
14 |
+
* @return wfGeoIP2
|
15 |
*/
|
16 |
public static function shared() {
|
17 |
static $_geoip = null;
|
22 |
}
|
23 |
|
24 |
public function __construct() {
|
25 |
+
try {
|
26 |
+
if (file_exists(WFWAF_LOG_PATH . '/GeoLite2-Country.mmdb')) {
|
27 |
+
$this->_reader = new Reader(WFWAF_LOG_PATH . '/GeoLite2-Country.mmdb');
|
28 |
+
return;
|
29 |
+
}
|
30 |
+
}
|
31 |
+
catch (Exception $e) {
|
32 |
+
//Fall through to bundled copy
|
33 |
+
}
|
34 |
+
|
35 |
$this->_reader = new Reader(__DIR__ . '/../../lib/GeoLite2-Country.mmdb'); //Can throw, but we don't catch it because it means the installation is likely corrupt and needs fixed anyway
|
36 |
}
|
37 |
|
readme.txt
CHANGED
@@ -3,8 +3,8 @@ Contributors: mmaunder
|
|
3 |
Tags: security, firewall, malware scanner, web application firewall, antivirus, block hackers, country blocking, clean hacked site, blacklist, waf, login security
|
4 |
Requires at least: 3.9
|
5 |
Requires PHP: 5.2
|
6 |
-
Tested up to: 4.9.
|
7 |
-
Stable tag: 7.1.
|
8 |
|
9 |
Secure your website with the most comprehensive WordPress security plugin. Firewall, malware scan, blocking, live traffic, login security & more.
|
10 |
|
@@ -172,6 +172,22 @@ Secure your website with Wordfence.
|
|
172 |
|
173 |
== Changelog ==
|
174 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
175 |
= 7.1.8 =
|
176 |
* Improvement: Better detection of removal status when uninstalling the WAF's auto-prepend file.
|
177 |
* Improvement: Switched optional mailing list signup to go directly through our servers rather than a third party.
|
3 |
Tags: security, firewall, malware scanner, web application firewall, antivirus, block hackers, country blocking, clean hacked site, blacklist, waf, login security
|
4 |
Requires at least: 3.9
|
5 |
Requires PHP: 5.2
|
6 |
+
Tested up to: 4.9.7
|
7 |
+
Stable tag: 7.1.9
|
8 |
|
9 |
Secure your website with the most comprehensive WordPress security plugin. Firewall, malware scan, blocking, live traffic, login security & more.
|
10 |
|
172 |
|
173 |
== Changelog ==
|
174 |
|
175 |
+
= 7.1.9 =
|
176 |
+
* Improvement: Added an "unsubscribe" link to plugin-generated alerts.
|
177 |
+
* Improvement: Added some additional flags.
|
178 |
+
* Change: Removed some unnecessary files from the bundled GeoIP library.
|
179 |
+
* Change: Updated wording in the Terms of Use/Privacy Policy agreement UI.
|
180 |
+
* Change: The minimum "Lock out after how many login failures" is now 2.
|
181 |
+
* Change: The diagnostics report now includes the scan issues for easier debugging.
|
182 |
+
* Fix: Multiple improvements to automatic updating to avoid broken updates on sites with low resources or slow file systems.
|
183 |
+
* Fix: Better text wrapping in the top failed logins widget.
|
184 |
+
* Fix: Onboarding CSS/JS is now correctly enqueued for multisite installations.
|
185 |
+
* Fix: Fixed a missing asset with the bundled jQueryUI library.
|
186 |
+
* Fix: Fixed memory calculation when using PHP's supported shorthand syntax.
|
187 |
+
* Fix: Better wrapping behavior on the reason column in the blocks table.
|
188 |
+
* Fix: Fixed an issue with an internal data structure to prevent error log entries when using mbstring functions.
|
189 |
+
* Fix: Improved bot detection when no user agent is sent.
|
190 |
+
|
191 |
= 7.1.8 =
|
192 |
* Improvement: Better detection of removal status when uninstalling the WAF's auto-prepend file.
|
193 |
* Improvement: Switched optional mailing list signup to go directly through our servers rather than a third party.
|
vendor/composer/ca-bundle/README.md
DELETED
@@ -1,85 +0,0 @@
|
|
1 |
-
composer/ca-bundle
|
2 |
-
==================
|
3 |
-
|
4 |
-
Small utility library that lets you find a path to the system CA bundle,
|
5 |
-
and includes a fallback to the Mozilla CA bundle.
|
6 |
-
|
7 |
-
Originally written as part of [composer/composer](https://github.com/composer/composer),
|
8 |
-
now extracted and made available as a stand-alone library.
|
9 |
-
|
10 |
-
|
11 |
-
Installation
|
12 |
-
------------
|
13 |
-
|
14 |
-
Install the latest version with:
|
15 |
-
|
16 |
-
```bash
|
17 |
-
$ composer require composer/ca-bundle
|
18 |
-
```
|
19 |
-
|
20 |
-
|
21 |
-
Requirements
|
22 |
-
------------
|
23 |
-
|
24 |
-
* PHP 5.3.2 is required but using the latest version of PHP is highly recommended.
|
25 |
-
|
26 |
-
|
27 |
-
Basic usage
|
28 |
-
-----------
|
29 |
-
|
30 |
-
# `Composer\CaBundle\CaBundle`
|
31 |
-
|
32 |
-
- `CaBundle::getSystemCaRootBundlePath()`: Returns the system CA bundle path, or a path to the bundled one as fallback
|
33 |
-
- `CaBundle::getBundledCaBundlePath()`: Returns the path to the bundled CA file
|
34 |
-
- `CaBundle::validateCaFile($filename)`: Validates a CA file using opensl_x509_parse only if it is safe to use
|
35 |
-
- `CaBundle::isOpensslParseSafe()`: Test if it is safe to use the PHP function openssl_x509_parse()
|
36 |
-
- `CaBundle::reset()`: Resets the static caches
|
37 |
-
|
38 |
-
|
39 |
-
## To use with curl
|
40 |
-
|
41 |
-
```php
|
42 |
-
$curl = curl_init("https://example.org/");
|
43 |
-
|
44 |
-
$caPathOrFile = \Composer\CaBundle\CaBundle::getSystemCaRootBundlePath();
|
45 |
-
if (is_dir($caPathOrFile) || (is_link($caPathOrFile) && is_dir(readlink($caPathOrFile)))) {
|
46 |
-
curl_setopt($curl, CURLOPT_CAPATH, $caPathOrFile);
|
47 |
-
} else {
|
48 |
-
curl_setopt($curl, CURLOPT_CAINFO, $caPathOrFile);
|
49 |
-
}
|
50 |
-
|
51 |
-
$result = curl_exec($curl);
|
52 |
-
```
|
53 |
-
|
54 |
-
## To use with php streams
|
55 |
-
|
56 |
-
```php
|
57 |
-
$opts = array(
|
58 |
-
'http' => array(
|
59 |
-
'method' => "GET"
|
60 |
-
)
|
61 |
-
);
|
62 |
-
|
63 |
-
$caPathOrFile = \Composer\CaBundle\CaBundle::getSystemCaRootBundlePath();
|
64 |
-
if (is_dir($caPathOrFile) || (is_link($caPathOrFile) && is_dir(readlink($caPathOrFile)))) {
|
65 |
-
$opts['ssl']['capath'] = $caPathOrFile;
|
66 |
-
} else {
|
67 |
-
$opts['ssl']['cafile'] = $caPathOrFile;
|
68 |
-
}
|
69 |
-
|
70 |
-
$context = stream_context_create($opts);
|
71 |
-
$result = file_get_contents('https://example.com', false, $context);
|
72 |
-
```
|
73 |
-
|
74 |
-
## To use with Guzzle
|
75 |
-
|
76 |
-
```php
|
77 |
-
$client = new \GuzzleHttp\Client([
|
78 |
-
\GuzzleHttp\RequestOptions::VERIFY => \Composer\CaBundle\CaBundle::getSystemCaRootBundlePath()
|
79 |
-
]);
|
80 |
-
```
|
81 |
-
|
82 |
-
License
|
83 |
-
-------
|
84 |
-
|
85 |
-
composer/ca-bundle is licensed under the MIT License, see the LICENSE file for details.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
vendor/geoip2/geoip2/CHANGELOG.md
DELETED
@@ -1,257 +0,0 @@
|
|
1 |
-
CHANGELOG
|
2 |
-
=========
|
3 |
-
|
4 |
-
2.8.0 (2018-01-18)
|
5 |
-
------------------
|
6 |
-
|
7 |
-
- The `isInEuropeanUnion` property was added to `GeoIp2\Record\Country`
|
8 |
-
and `GeoIp2\Record\RepresentedCountry`. This property is `true` if the
|
9 |
-
country is a member state of the European Union.
|
10 |
-
|
11 |
-
2.7.0 (2017-10-27)
|
12 |
-
------------------
|
13 |
-
|
14 |
-
* The following new anonymizer properties were added to `GeoIp2\Record\Traits`
|
15 |
-
for use with GeoIP2 Precision Insights: `isAnonymous`, `isAnonymousVpn`,
|
16 |
-
`isHostingProvider`, `isPublicProxy`, and `isTorExitNode`.
|
17 |
-
|
18 |
-
2.6.0 (2017-07-10)
|
19 |
-
-----------------
|
20 |
-
|
21 |
-
* Code clean-up and tidying.
|
22 |
-
* Set minimum required PHP version to 5.4 in `composer.json`. Previously,
|
23 |
-
5.3 would work but was not tested. Now 5.4 is hard minimum version.
|
24 |
-
|
25 |
-
2.5.0 (2017-05-08)
|
26 |
-
------------------
|
27 |
-
|
28 |
-
* Support for PHP 5.3 was dropped.
|
29 |
-
* Added support for GeoLite2 ASN database.
|
30 |
-
|
31 |
-
2.4.5 (2017-01-31)
|
32 |
-
------------------
|
33 |
-
|
34 |
-
* Additional error checking on the data returned from `MaxMind\Db\Reader`
|
35 |
-
was added to help detect corrupt databases. GitHub #83.
|
36 |
-
|
37 |
-
2.4.4 (2016-10-11)
|
38 |
-
------------------
|
39 |
-
|
40 |
-
* `isset()` on `mostSpecificSubdivision` attribute now returns the
|
41 |
-
correct value. Reported by Juan Francisco Giordana. GitHub #81.
|
42 |
-
|
43 |
-
2.4.3 (2016-10-11)
|
44 |
-
------------------
|
45 |
-
|
46 |
-
* `isset()` on `name` attribute now returns the correct value. Reported by
|
47 |
-
Juan Francisco Giordana. GitHub #79.
|
48 |
-
|
49 |
-
2.4.2 (2016-08-17)
|
50 |
-
------------------
|
51 |
-
|
52 |
-
* Updated documentation to clarify what the accuracy radius refers to.
|
53 |
-
* Upgraded `maxmind/web-service-common` to 0.3.0. This version uses
|
54 |
-
`composer/ca-bundle` rather than our own CA bundle. GitHub #75.
|
55 |
-
* Improved PHP documentation generation.
|
56 |
-
|
57 |
-
2.4.1 (2016-06-10)
|
58 |
-
------------------
|
59 |
-
|
60 |
-
* Corrected type annotations in documentation. GitHub #66.
|
61 |
-
* Updated documentation to reflect that the accuracy radius is now included
|
62 |
-
in City.
|
63 |
-
* Upgraded web service client, which supports setting a proxy. GitHub #59.
|
64 |
-
|
65 |
-
2.4.0 (2016-04-15)
|
66 |
-
------------------
|
67 |
-
|
68 |
-
* Added support for the GeoIP2 Enterprise database.
|
69 |
-
|
70 |
-
2.3.3 (2015-09-24)
|
71 |
-
------------------
|
72 |
-
|
73 |
-
* Corrected case on `JsonSerializable` interface. Reported by Axel Etcheverry.
|
74 |
-
GitHub #56.
|
75 |
-
|
76 |
-
2.3.2 (2015-09-23)
|
77 |
-
------------------
|
78 |
-
|
79 |
-
* `JsonSerializable` compatibility interface was moved to `GeoIp2\Compat`
|
80 |
-
rather than the global namespace to prevent autoloading issues. Reported by
|
81 |
-
Tomas Buteler. GitHub #54.
|
82 |
-
* Missing documentation for the `$postal` property was added to the
|
83 |
-
`GeoIp2\Model\City` class. Fix by Roy Sindre Norangshol. GitHub #51.
|
84 |
-
* In the Phar distribution, source files for this module no longer have their
|
85 |
-
documentation stripped, allowing IDE introspection to work properly.
|
86 |
-
Reported by Dominic Black. GitHub #52.
|
87 |
-
|
88 |
-
2.3.1 (2015-06-30)
|
89 |
-
------------------
|
90 |
-
|
91 |
-
* Updated `maxmind/web-service-common` to version with fixes for PHP 5.3 and
|
92 |
-
5.4.
|
93 |
-
|
94 |
-
2.3.0 (2015-06-29)
|
95 |
-
------------------
|
96 |
-
|
97 |
-
* Support for demographics fields `averageIncome` and `populationDensity` in
|
98 |
-
the `Location` record, returned by the Insights endpoint.
|
99 |
-
* The `isAnonymousProxy` and `isSatelliteProvider` properties on
|
100 |
-
`GeoIP2\Record\Traits` have been deprecated. Please use our [GeoIP2
|
101 |
-
Anonymous IP database](https://www.maxmind.com/en/geoip2-anonymous-ip-database)
|
102 |
-
to determine whether an IP address is used by an anonymizing service.
|
103 |
-
|
104 |
-
2.2.0-beta1 (2015-06-09)
|
105 |
-
------------------------
|
106 |
-
|
107 |
-
* Typo fix in documentation.
|
108 |
-
|
109 |
-
2.2.0-alpha2 (2015-06-01)
|
110 |
-
-------------------------
|
111 |
-
|
112 |
-
* `maxmind-ws/web-service-common` was renamed to `maxmind/web-service-common`.
|
113 |
-
|
114 |
-
2.2.0-alpha1 (2015-05-22)
|
115 |
-
-------------------------
|
116 |
-
|
117 |
-
* The library no longer uses Guzzle and instead uses curl directly.
|
118 |
-
* Support for `timeout` and `connectTimout` were added to the `$options` array
|
119 |
-
passed to the `GeoIp2\WebService\Client` constructor. Pull request by Will
|
120 |
-
Bradley. GitHub #36.
|
121 |
-
|
122 |
-
2.1.1 (2014-12-03)
|
123 |
-
------------------
|
124 |
-
|
125 |
-
* The 2.1.0 Phar builds included a shebang line, causing issues when loading
|
126 |
-
it as a library. This has been corrected. GitHub #33.
|
127 |
-
|
128 |
-
2.1.0 (2014-10-29)
|
129 |
-
------------------
|
130 |
-
|
131 |
-
* Update ApiGen dependency to version that isn't broken on case sensitive
|
132 |
-
file systems.
|
133 |
-
* Added support for the GeoIP2 Anonymous IP database. The
|
134 |
-
`GeoIP2\Database\Reader` class now has an `anonymousIp` method which returns
|
135 |
-
a `GeoIP2\Model\AnonymousIp` object.
|
136 |
-
* Boolean attributes like those in the `GeoIP2\Record\Traits` class now return
|
137 |
-
`false` instead of `null` when they were not true.
|
138 |
-
|
139 |
-
2.0.0 (2014-09-22)
|
140 |
-
------------------
|
141 |
-
|
142 |
-
* First production release.
|
143 |
-
|
144 |
-
0.9.0 (2014-09-15)
|
145 |
-
------------------
|
146 |
-
|
147 |
-
* IMPORTANT: The deprecated `omni()` and `cityIspOrg()` methods have been
|
148 |
-
removed from `GeoIp2\WebService\Client`.
|
149 |
-
|
150 |
-
0.8.1 (2014-09-12)
|
151 |
-
------------------
|
152 |
-
|
153 |
-
* The check added to the `GeoIP2\Database\Reader` lookup methods in 0.8.0 did
|
154 |
-
not work with the GeoIP2 City Database Subset by Continent with World
|
155 |
-
Countries. This has been fixed. Fixes GitHub issue #23.
|
156 |
-
|
157 |
-
0.8.0 (2014-09-10)
|
158 |
-
------------------
|
159 |
-
|
160 |
-
* The `GeoIp2\Database\Reader` lookup methods (e.g., `city()`, `isp()`) now
|
161 |
-
throw a `BadMethodCallException` if they are used with a database that
|
162 |
-
does not match the method. In particular, doing a `city()` lookup on a
|
163 |
-
GeoIP2 Country database will result in an exception, and vice versa.
|
164 |
-
* A `metadata()` method has been added to the `GeoIP2\Database\Reader` class.
|
165 |
-
This returns a `MaxMind\Db\Reader\Metadata` class with information about the
|
166 |
-
database.
|
167 |
-
* The name attribute was missing from the RepresentedCountry class.
|
168 |
-
|
169 |
-
0.7.0 (2014-07-22)
|
170 |
-
------------------
|
171 |
-
|
172 |
-
* The web service client API has been updated for the v2.1 release of the web
|
173 |
-
service. In particular, the `cityIspOrg` and `omni` methods on
|
174 |
-
`GeoIp2\WebService\Client` should be considered deprecated. The `city`
|
175 |
-
method now provides all of the data formerly provided by `cityIspOrg`, and
|
176 |
-
the `omni` method has been replaced by the `insights` method.
|
177 |
-
* Support was added for GeoIP2 Connection Type, Domain and ISP databases.
|
178 |
-
|
179 |
-
|
180 |
-
0.6.3 (2014-05-12)
|
181 |
-
------------------
|
182 |
-
|
183 |
-
* With the previous Phar builds, some users received `phar error: invalid url
|
184 |
-
or non-existent phar` errors. The correct alias is now used for the Phar,
|
185 |
-
and this should no longer be an issue.
|
186 |
-
|
187 |
-
0.6.2 (2014-05-08)
|
188 |
-
------------------
|
189 |
-
|
190 |
-
* The Phar build was broken with Guzzle 3.9.0+. This has been fixed.
|
191 |
-
|
192 |
-
0.6.1 (2014-05-01)
|
193 |
-
------------------
|
194 |
-
|
195 |
-
* This API now officially supports HHVM.
|
196 |
-
* The `maxmind-db/reader` dependency was updated to a version that does not
|
197 |
-
require BC Math.
|
198 |
-
* The Composer compatibility autoload rules are now targeted more narrowly.
|
199 |
-
* A `box.json` file is included to build a Phar package.
|
200 |
-
|
201 |
-
0.6.0 (2014-02-19)
|
202 |
-
------------------
|
203 |
-
|
204 |
-
* This API is now licensed under the Apache License, Version 2.0.
|
205 |
-
* Model and record classes now implement `JsonSerializable`.
|
206 |
-
* `isset` now works with model and record classes.
|
207 |
-
|
208 |
-
0.5.0 (2013-10-21)
|
209 |
-
------------------
|
210 |
-
|
211 |
-
* Renamed $languages constructor parameters to $locales for both the Client
|
212 |
-
and Reader classes.
|
213 |
-
* Documentation and code clean-up (Ben Morel).
|
214 |
-
* Added the interface `GeoIp2\ProviderInterface`, which is implemented by both
|
215 |
-
`\GeoIp2\Database\Reader` and `\GeoIp2\WebService\Client`.
|
216 |
-
|
217 |
-
0.4.0 (2013-07-16)
|
218 |
-
------------------
|
219 |
-
|
220 |
-
* This is the first release with the GeoIP2 database reader. Please see the
|
221 |
-
`README.md` file and the `\GeoIp2\Database\Reader` class.
|
222 |
-
* The general exception classes were replaced with specific exception classes
|
223 |
-
representing particular types of errors, such as an authentication error.
|
224 |
-
|
225 |
-
0.3.0 (2013-07-12)
|
226 |
-
------------------
|
227 |
-
|
228 |
-
* In namespaces and class names, "GeoIP2" was renamed to "GeoIp2" to improve
|
229 |
-
consistency.
|
230 |
-
|
231 |
-
0.2.1 (2013-06-10)
|
232 |
-
------------------
|
233 |
-
|
234 |
-
* First official beta release.
|
235 |
-
* Documentation updates and corrections.
|
236 |
-
|
237 |
-
0.2.0 (2013-05-29)
|
238 |
-
------------------
|
239 |
-
|
240 |
-
* `GenericException` was renamed to `GeoIP2Exception`.
|
241 |
-
* We now support more languages. The new languages are de, es, fr, and pt-BR.
|
242 |
-
* The REST API now returns a record with data about your account. There is
|
243 |
-
a new `GeoIP\Records\MaxMind` class for this data.
|
244 |
-
* The `continentCode` attribute on `Continent` was renamed to `code`.
|
245 |
-
* Documentation updates.
|
246 |
-
|
247 |
-
0.1.1 (2013-05-14)
|
248 |
-
------------------
|
249 |
-
|
250 |
-
* Updated Guzzle version requirement.
|
251 |
-
* Fixed Composer example in README.md.
|
252 |
-
|
253 |
-
|
254 |
-
0.1.0 (2013-05-13)
|
255 |
-
------------------
|
256 |
-
|
257 |
-
* Initial release.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
vendor/geoip2/geoip2/README.md
DELETED
@@ -1,401 +0,0 @@
|
|
1 |
-
# GeoIP2 PHP API #
|
2 |
-
|
3 |
-
## Description ##
|
4 |
-
|
5 |
-
This package provides an API for the GeoIP2
|
6 |
-
[web services](http://dev.maxmind.com/geoip/geoip2/web-services) and
|
7 |
-
[databases](http://dev.maxmind.com/geoip/geoip2/downloadable). The API also
|
8 |
-
works with the free
|
9 |
-
[GeoLite2 databases](http://dev.maxmind.com/geoip/geoip2/geolite2/).
|
10 |
-
|
11 |
-
## Install via Composer ##
|
12 |
-
|
13 |
-
We recommend installing this package with [Composer](http://getcomposer.org/).
|
14 |
-
|
15 |
-
### Download Composer ###
|
16 |
-
|
17 |
-
To download Composer, run in the root directory of your project:
|
18 |
-
|
19 |
-
```bash
|
20 |
-
curl -sS https://getcomposer.org/installer | php
|
21 |
-
```
|
22 |
-
|
23 |
-
You should now have the file `composer.phar` in your project directory.
|
24 |
-
|
25 |
-
### Install Dependencies ###
|
26 |
-
|
27 |
-
Run in your project root:
|
28 |
-
|
29 |
-
```
|
30 |
-
php composer.phar require geoip2/geoip2:~2.0
|
31 |
-
```
|
32 |
-
|
33 |
-
You should now have the files `composer.json` and `composer.lock` as well as
|
34 |
-
the directory `vendor` in your project directory. If you use a version control
|
35 |
-
system, `composer.json` should be added to it.
|
36 |
-
|
37 |
-
### Require Autoloader ###
|
38 |
-
|
39 |
-
After installing the dependencies, you need to require the Composer autoloader
|
40 |
-
from your code:
|
41 |
-
|
42 |
-
```php
|
43 |
-
require 'vendor/autoload.php';
|
44 |
-
```
|
45 |
-
|
46 |
-
## Install via Phar ##
|
47 |
-
|
48 |
-
Although we strongly recommend using Composer, we also provide a
|
49 |
-
[phar archive](http://php.net/manual/en/book.phar.php) containing most of the
|
50 |
-
dependencies for GeoIP2. Our latest phar archive is available on
|
51 |
-
[our releases page](https://github.com/maxmind/GeoIP2-php/releases).
|
52 |
-
|
53 |
-
### Install Dependencies ###
|
54 |
-
|
55 |
-
In order to use the phar archive, you must have the PHP
|
56 |
-
[Phar extension](http://php.net/manual/en/book.phar.php) installed and
|
57 |
-
enabled.
|
58 |
-
|
59 |
-
If you will be making web service requests, you must have the PHP
|
60 |
-
[cURL extension](http://php.net/manual/en/book.curl.php)
|
61 |
-
installed to use this archive. For Debian based distributions, this can
|
62 |
-
typically be found in the the `php-curl` package. For other operating
|
63 |
-
systems, please consult the relevant documentation. After installing the
|
64 |
-
extension you may need to restart your web server.
|
65 |
-
|
66 |
-
If you are missing this extension, you will see errors like the following:
|
67 |
-
|
68 |
-
```
|
69 |
-
PHP Fatal error: Uncaught Error: Call to undefined function MaxMind\WebService\curl_version()
|
70 |
-
```
|
71 |
-
|
72 |
-
### Require Package ###
|
73 |
-
|
74 |
-
To use the archive, just require it from your script:
|
75 |
-
|
76 |
-
```php
|
77 |
-
require 'geoip2.phar';
|
78 |
-
```
|
79 |
-
|
80 |
-
## Optional C Extension ##
|
81 |
-
|
82 |
-
The [MaxMind DB API](https://github.com/maxmind/MaxMind-DB-Reader-php)
|
83 |
-
includes an optional C extension that you may install to dramatically increase
|
84 |
-
the performance of lookups in GeoIP2 or GeoLite2 databases. To install, please
|
85 |
-
follow the instructions included with that API.
|
86 |
-
|
87 |
-
The extension has no effect on web-service lookups.
|
88 |
-
|
89 |
-
## IP Geolocation Usage ##
|
90 |
-
|
91 |
-
IP geolocation is inherently imprecise. Locations are often near the center of
|
92 |
-
the population. Any location provided by a GeoIP2 database or web service
|
93 |
-
should not be used to identify a particular address or household.
|
94 |
-
|
95 |
-
## Database Reader ##
|
96 |
-
|
97 |
-
### Usage ###
|
98 |
-
|
99 |
-
To use this API, you must create a new `\GeoIp2\Database\Reader` object with
|
100 |
-
the path to the database file as the first argument to the constructor. You
|
101 |
-
may then call the method corresponding to the database you are using.
|
102 |
-
|
103 |
-
If the lookup succeeds, the method call will return a model class for the
|
104 |
-
record in the database. This model in turn contains multiple container
|
105 |
-
classes for the different parts of the data such as the city in which the
|
106 |
-
IP address is located.
|
107 |
-
|
108 |
-
If the record is not found, a `\GeoIp2\Exception\AddressNotFoundException`
|
109 |
-
is thrown. If the database is invalid or corrupt, a
|
110 |
-
`\MaxMind\Db\InvalidDatabaseException` will be thrown.
|
111 |
-
|
112 |
-
See the API documentation for more details.
|
113 |
-
|
114 |
-
### City Example ###
|
115 |
-
|
116 |
-
```php
|
117 |
-
<?php
|
118 |
-
require_once 'vendor/autoload.php';
|
119 |
-
use GeoIp2\Database\Reader;
|
120 |
-
|
121 |
-
// This creates the Reader object, which should be reused across
|
122 |
-
// lookups.
|
123 |
-
$reader = new Reader('/usr/local/share/GeoIP/GeoIP2-City.mmdb');
|
124 |
-
|
125 |
-
// Replace "city" with the appropriate method for your database, e.g.,
|
126 |
-
// "country".
|
127 |
-
$record = $reader->city('128.101.101.101');
|
128 |
-
|
129 |
-
print($record->country->isoCode . "\n"); // 'US'
|
130 |
-
print($record->country->name . "\n"); // 'United States'
|
131 |
-
print($record->country->names['zh-CN'] . "\n"); // '美国'
|
132 |
-
|
133 |
-
print($record->mostSpecificSubdivision->name . "\n"); // 'Minnesota'
|
134 |
-
print($record->mostSpecificSubdivision->isoCode . "\n"); // 'MN'
|
135 |
-
|
136 |
-
print($record->city->name . "\n"); // 'Minneapolis'
|
137 |
-
|
138 |
-
print($record->postal->code . "\n"); // '55455'
|
139 |
-
|
140 |
-
print($record->location->latitude . "\n"); // 44.9733
|
141 |
-
print($record->location->longitude . "\n"); // -93.2323
|
142 |
-
|
143 |
-
```
|
144 |
-
|
145 |
-
### Anonymous IP Example ###
|
146 |
-
|
147 |
-
```php
|
148 |
-
<?php
|
149 |
-
require_once 'vendor/autoload.php';
|
150 |
-
use GeoIp2\Database\Reader;
|
151 |
-
|
152 |
-
// This creates the Reader object, which should be reused across
|
153 |
-
// lookups.
|
154 |
-
$reader = new Reader('/usr/local/share/GeoIP/GeoIP2-Anonymous-IP.mmdb');
|
155 |
-
|
156 |
-
$record = $reader->anonymousIp('128.101.101.101');
|
157 |
-
|
158 |
-
if ($record->isAnonymous) { print "anon\n"; }
|
159 |
-
print($record->ipAddress . "\n"); // '128.101.101.101'
|
160 |
-
|
161 |
-
```
|
162 |
-
|
163 |
-
### Connection-Type Example ###
|
164 |
-
|
165 |
-
```php
|
166 |
-
<?php
|
167 |
-
require_once 'vendor/autoload.php';
|
168 |
-
use GeoIp2\Database\Reader;
|
169 |
-
|
170 |
-
// This creates the Reader object, which should be reused across
|
171 |
-
// lookups.
|
172 |
-
$reader = new Reader('/usr/local/share/GeoIP/GeoIP2-Connection-Type.mmdb');
|
173 |
-
|
174 |
-
$record = $reader->connectionType('128.101.101.101');
|
175 |
-
|
176 |
-
print($record->connectionType . "\n"); // 'Corporate'
|
177 |
-
print($record->ipAddress . "\n"); // '128.101.101.101'
|
178 |
-
|
179 |
-
```
|
180 |
-
|
181 |
-
### Domain Example ###
|
182 |
-
|
183 |
-
```php
|
184 |
-
<?php
|
185 |
-
require_once 'vendor/autoload.php';
|
186 |
-
use GeoIp2\Database\Reader;
|
187 |
-
|
188 |
-
// This creates the Reader object, which should be reused across
|
189 |
-
// lookups.
|
190 |
-
$reader = new Reader('/usr/local/share/GeoIP/GeoIP2-Domain.mmdb');
|
191 |
-
|
192 |
-
$record = $reader->domain('128.101.101.101');
|
193 |
-
|
194 |
-
print($record->domain . "\n"); // 'umn.edu'
|
195 |
-
print($record->ipAddress . "\n"); // '128.101.101.101'
|
196 |
-
|
197 |
-
```
|
198 |
-
|
199 |
-
### Enterprise Example ###
|
200 |
-
|
201 |
-
```php
|
202 |
-
<?php
|
203 |
-
require_once 'vendor/autoload.php';
|
204 |
-
use GeoIp2\Database\Reader;
|
205 |
-
|
206 |
-
// This creates the Reader object, which should be reused across
|
207 |
-
// lookups.
|
208 |
-
$reader = new Reader('/usr/local/share/GeoIP/GeoIP2-Enterprise.mmdb');
|
209 |
-
|
210 |
-
// Use the ->enterprise method to do a lookup in the Enterprise database
|
211 |
-
$record = $reader->enterprise('128.101.101.101');
|
212 |
-
|
213 |
-
print($record->country->confidence . "\n"); // 99
|
214 |
-
print($record->country->isoCode . "\n"); // 'US'
|
215 |
-
print($record->country->name . "\n"); // 'United States'
|
216 |
-
print($record->country->names['zh-CN'] . "\n"); // '美国'
|
217 |
-
|
218 |
-
print($record->mostSpecificSubdivision->confidence . "\n"); // 77
|
219 |
-
print($record->mostSpecificSubdivision->name . "\n"); // 'Minnesota'
|
220 |
-
print($record->mostSpecificSubdivision->isoCode . "\n"); // 'MN'
|
221 |
-
|
222 |
-
print($record->city->confidence . "\n"); // 60
|
223 |
-
print($record->city->name . "\n"); // 'Minneapolis'
|
224 |
-
|
225 |
-
print($record->postal->code . "\n"); // '55455'
|
226 |
-
|
227 |
-
print($record->location->accuracyRadius . "\n"); // 50
|
228 |
-
print($record->location->latitude . "\n"); // 44.9733
|
229 |
-
print($record->location->longitude . "\n"); // -93.2323
|
230 |
-
|
231 |
-
```
|
232 |
-
|
233 |
-
### ISP Example ###
|
234 |
-
|
235 |
-
```php
|
236 |
-
<?php
|
237 |
-
require_once 'vendor/autoload.php';
|
238 |
-
use GeoIp2\Database\Reader;
|
239 |
-
|
240 |
-
// This creates the Reader object, which should be reused across
|
241 |
-
// lookups.
|
242 |
-
$reader = new Reader('/usr/local/share/GeoIP/GeoIP2-ISP.mmdb');
|
243 |
-
|
244 |
-
$record = $reader->isp('128.101.101.101');
|
245 |
-
|
246 |
-
print($record->autonomousSystemNumber . "\n"); // 217
|
247 |
-
print($record->autonomousSystemOrganization . "\n"); // 'University of Minnesota'
|
248 |
-
print($record->isp . "\n"); // 'University of Minnesota'
|
249 |
-
print($record->organization . "\n"); // 'University of Minnesota'
|
250 |
-
|
251 |
-
print($record->ipAddress . "\n"); // '128.101.101.101'
|
252 |
-
|
253 |
-
```
|
254 |
-
|
255 |
-
## Web Service Client ##
|
256 |
-
|
257 |
-
### Usage ###
|
258 |
-
|
259 |
-
To use this API, you must create a new `\GeoIp2\WebService\Client`
|
260 |
-
object with your `$userId` and `$licenseKey`, then you call the method
|
261 |
-
corresponding to a specific end point, passing it the IP address you want to
|
262 |
-
look up.
|
263 |
-
|
264 |
-
If the request succeeds, the method call will return a model class for the end
|
265 |
-
point you called. This model in turn contains multiple record classes, each of
|
266 |
-
which represents part of the data returned by the web service.
|
267 |
-
|
268 |
-
If there is an error, a structured exception is thrown.
|
269 |
-
|
270 |
-
See the API documentation for more details.
|
271 |
-
|
272 |
-
### Example ###
|
273 |
-
|
274 |
-
```php
|
275 |
-
<?php
|
276 |
-
require_once 'vendor/autoload.php';
|
277 |
-
use GeoIp2\WebService\Client;
|
278 |
-
|
279 |
-
// This creates a Client object that can be reused across requests.
|
280 |
-
// Replace "42" with your user ID and "license_key" with your license
|
281 |
-
// key.
|
282 |
-
$client = new Client(42, 'abcdef123456');
|
283 |
-
|
284 |
-
// Replace "city" with the method corresponding to the web service that
|
285 |
-
// you are using, e.g., "country", "insights".
|
286 |
-
$record = $client->city('128.101.101.101');
|
287 |
-
|
288 |
-
print($record->country->isoCode . "\n"); // 'US'
|
289 |
-
print($record->country->name . "\n"); // 'United States'
|
290 |
-
print($record->country->names['zh-CN'] . "\n"); // '美国'
|
291 |
-
|
292 |
-
print($record->mostSpecificSubdivision->name . "\n"); // 'Minnesota'
|
293 |
-
print($record->mostSpecificSubdivision->isoCode . "\n"); // 'MN'
|
294 |
-
|
295 |
-
print($record->city->name . "\n"); // 'Minneapolis'
|
296 |
-
|
297 |
-
print($record->postal->code . "\n"); // '55455'
|
298 |
-
|
299 |
-
print($record->location->latitude . "\n"); // 44.9733
|
300 |
-
print($record->location->longitude . "\n"); // -93.2323
|
301 |
-
|
302 |
-
```
|
303 |
-
|
304 |
-
## Values to use for Database or Array Keys ##
|
305 |
-
|
306 |
-
**We strongly discourage you from using a value from any `names` property as
|
307 |
-
a key in a database or array.**
|
308 |
-
|
309 |
-
These names may change between releases. Instead we recommend using one of the
|
310 |
-
following:
|
311 |
-
|
312 |
-
* `GeoIp2\Record\City` - `$city->geonameId`
|
313 |
-
* `GeoIp2\Record\Continent` - `$continent->code` or `$continent->geonameId`
|
314 |
-
* `GeoIp2\Record\Country` and `GeoIp2\Record\RepresentedCountry` -
|
315 |
-
`$country->isoCode` or `$country->geonameId`
|
316 |
-
* `GeoIp2\Record\Subdivision` - `$subdivision->isoCode` or `$subdivision->geonameId`
|
317 |
-
|
318 |
-
### What data is returned? ###
|
319 |
-
|
320 |
-
While many of the end points return the same basic records, the attributes
|
321 |
-
which can be populated vary between end points. In addition, while an end
|
322 |
-
point may offer a particular piece of data, MaxMind does not always have every
|
323 |
-
piece of data for any given IP address.
|
324 |
-
|
325 |
-
Because of these factors, it is possible for any end point to return a record
|
326 |
-
where some or all of the attributes are unpopulated.
|
327 |
-
|
328 |
-
See the
|
329 |
-
[GeoIP2 Precision web service docs](http://dev.maxmind.com/geoip/geoip2/web-services)
|
330 |
-
for details on what data each end point may return.
|
331 |
-
|
332 |
-
The only piece of data which is always returned is the `ipAddress`
|
333 |
-
attribute in the `GeoIp2\Record\Traits` record.
|
334 |
-
|
335 |
-
## Integration with GeoNames ##
|
336 |
-
|
337 |
-
[GeoNames](http://www.geonames.org/) offers web services and downloadable
|
338 |
-
databases with data on geographical features around the world, including
|
339 |
-
populated places. They offer both free and paid premium data. Each
|
340 |
-
feature is unique identified by a `geonameId`, which is an integer.
|
341 |
-
|
342 |
-
Many of the records returned by the GeoIP2 web services and databases
|
343 |
-
include a `geonameId` property. This is the ID of a geographical feature
|
344 |
-
(city, region, country, etc.) in the GeoNames database.
|
345 |
-
|
346 |
-
Some of the data that MaxMind provides is also sourced from GeoNames. We
|
347 |
-
source things like place names, ISO codes, and other similar data from
|
348 |
-
the GeoNames premium data set.
|
349 |
-
|
350 |
-
## Reporting data problems ##
|
351 |
-
|
352 |
-
If the problem you find is that an IP address is incorrectly mapped,
|
353 |
-
please
|
354 |
-
[submit your correction to MaxMind](http://www.maxmind.com/en/correction).
|
355 |
-
|
356 |
-
If you find some other sort of mistake, like an incorrect spelling,
|
357 |
-
please check the [GeoNames site](http://www.geonames.org/) first. Once
|
358 |
-
you've searched for a place and found it on the GeoNames map view, there
|
359 |
-
are a number of links you can use to correct data ("move", "edit",
|
360 |
-
"alternate names", etc.). Once the correction is part of the GeoNames
|
361 |
-
data set, it will be automatically incorporated into future MaxMind
|
362 |
-
releases.
|
363 |
-
|
364 |
-
If you are a paying MaxMind customer and you're not sure where to submit
|
365 |
-
a correction, please
|
366 |
-
[contact MaxMind support](http://www.maxmind.com/en/support) for help.
|
367 |
-
|
368 |
-
## Other Support ##
|
369 |
-
|
370 |
-
Please report all issues with this code using the
|
371 |
-
[GitHub issue tracker](https://github.com/maxmind/GeoIP2-php/issues).
|
372 |
-
|
373 |
-
If you are having an issue with a MaxMind service that is not specific
|
374 |
-
to the client API, please see
|
375 |
-
[our support page](http://www.maxmind.com/en/support).
|
376 |
-
|
377 |
-
## Requirements ##
|
378 |
-
|
379 |
-
This library requires PHP 5.4 or greater. This library works and is tested
|
380 |
-
with HHVM.
|
381 |
-
|
382 |
-
This library also relies on the [MaxMind DB Reader](https://github.com/maxmind/MaxMind-DB-Reader-php).
|
383 |
-
|
384 |
-
## Contributing ##
|
385 |
-
|
386 |
-
Patches and pull requests are encouraged. All code should follow the PSR-2
|
387 |
-
style guidelines. Please include unit tests whenever possible. You may obtain
|
388 |
-
the test data for the maxmind-db folder by running `git submodule update
|
389 |
-
--init --recursive` or adding `--recursive` to your initial clone, or from
|
390 |
-
https://github.com/maxmind/MaxMind-DB
|
391 |
-
|
392 |
-
## Versioning ##
|
393 |
-
|
394 |
-
The GeoIP2 PHP API uses [Semantic Versioning](http://semver.org/).
|
395 |
-
|
396 |
-
## Copyright and License ##
|
397 |
-
|
398 |
-
This software is Copyright (c) 2013-2018 by MaxMind, Inc.
|
399 |
-
|
400 |
-
This is free software, licensed under the Apache License, Version 2.0.
|
401 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
vendor/maxmind-db/reader/CHANGELOG.md
DELETED
@@ -1,108 +0,0 @@
|
|
1 |
-
CHANGELOG
|
2 |
-
=========
|
3 |
-
|
4 |
-
1.2.0 (2017-10-27)
|
5 |
-
------------------
|
6 |
-
|
7 |
-
* PHP 5.4 is now required.
|
8 |
-
* The `Reader` class for the `maxminddb` extension is no longer final.
|
9 |
-
This was change to match the behavior of the pure PHP class.
|
10 |
-
Reported and fixed by venyii. GitHub #52 & #54.
|
11 |
-
|
12 |
-
1.1.3 (2017-01-19)
|
13 |
-
------------------
|
14 |
-
|
15 |
-
* Fix incorrect version in `ext/php_maxminddb.h`. GitHub #48.
|
16 |
-
|
17 |
-
1.1.2 (2016-11-22)
|
18 |
-
------------------
|
19 |
-
|
20 |
-
* Searching for database metadata only occurs within the last 128KB
|
21 |
-
(128 * 1024 bytes) of the file, speeding detection of corrupt
|
22 |
-
datafiles. Reported by Eric Teubert. GitHub #42.
|
23 |
-
* Suggest relevant extensions when installing with Composer. GitHub #37.
|
24 |
-
|
25 |
-
1.1.1 (2016-09-15)
|
26 |
-
------------------
|
27 |
-
|
28 |
-
* Development files were added to the `.gitattributes` as `export-ignore` so
|
29 |
-
that they are not part of the Composer release. Pull request by Michele
|
30 |
-
Locati. GitHub #39.
|
31 |
-
|
32 |
-
1.1.0 (2016-01-04)
|
33 |
-
------------------
|
34 |
-
|
35 |
-
* The MaxMind DB extension now supports PHP 7. Pull request by John Boehr.
|
36 |
-
GitHub #27.
|
37 |
-
|
38 |
-
1.0.3 (2015-03-13)
|
39 |
-
------------------
|
40 |
-
|
41 |
-
* All uses of `strlen` were removed. This should prevent issues in situations
|
42 |
-
where the function is overloaded or otherwise broken.
|
43 |
-
|
44 |
-
1.0.2 (2015-01-19)
|
45 |
-
------------------
|
46 |
-
|
47 |
-
* Previously the MaxMind DB extension would cause a segfault if the Reader
|
48 |
-
object's destructor was called without first having called the constructor.
|
49 |
-
(Reported by Matthias Saou & Juan Peri. GitHub #20.)
|
50 |
-
|
51 |
-
1.0.1 (2015-01-12)
|
52 |
-
------------------
|
53 |
-
|
54 |
-
* In the last several releases, the version number in the extension was
|
55 |
-
incorrect. This release is being done to correct it. No other code changes
|
56 |
-
are included.
|
57 |
-
|
58 |
-
1.0.0 (2014-09-22)
|
59 |
-
------------------
|
60 |
-
|
61 |
-
* First production release.
|
62 |
-
* In the pure PHP reader, a string length test after `fread()` was replaced
|
63 |
-
with the difference between the start pointer and the end pointer. This
|
64 |
-
provided a 15% speed increase.
|
65 |
-
|
66 |
-
0.3.3 (2014-09-15)
|
67 |
-
------------------
|
68 |
-
|
69 |
-
* Clarified behavior of 128-bit type in documentation.
|
70 |
-
* Updated phpunit and fixed some test breakage from the newer version.
|
71 |
-
|
72 |
-
0.3.2 (2014-09-10)
|
73 |
-
------------------
|
74 |
-
|
75 |
-
* Fixed invalid reference to global class RuntimeException from namespaced
|
76 |
-
code. Fixed by Steven Don. GitHub issue #15.
|
77 |
-
* Additional documentation of `Metadata` class as well as misc. documentation
|
78 |
-
cleanup.
|
79 |
-
|
80 |
-
0.3.1 (2014-05-01)
|
81 |
-
------------------
|
82 |
-
|
83 |
-
* The API now works when `mbstring.func_overload` is set.
|
84 |
-
* BCMath is no longer required. If the decoder encounters a big integer,
|
85 |
-
it will try to use GMP and then BCMath. If both of those fail, it will
|
86 |
-
throw an exception. No databases released by MaxMind currently use big
|
87 |
-
integers.
|
88 |
-
* The API now officially supports HHVM when using the pure PHP reader.
|
89 |
-
|
90 |
-
0.3.0 (2014-02-19)
|
91 |
-
------------------
|
92 |
-
|
93 |
-
* This API is now licensed under the Apache License, Version 2.0.
|
94 |
-
* The code for the C extension was cleaned up, fixing several potential
|
95 |
-
issues.
|
96 |
-
|
97 |
-
0.2.0 (2013-10-21)
|
98 |
-
------------------
|
99 |
-
|
100 |
-
* Added optional C extension for using libmaxminddb in place of the pure PHP
|
101 |
-
reader.
|
102 |
-
* Significantly improved error handling in pure PHP reader.
|
103 |
-
* Improved performance for IPv4 lookups in an IPv6 database.
|
104 |
-
|
105 |
-
0.1.0 (2013-07-16)
|
106 |
-
------------------
|
107 |
-
|
108 |
-
* Initial release
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
vendor/maxmind-db/reader/README.md
DELETED
@@ -1,139 +0,0 @@
|
|
1 |
-
# MaxMind DB Reader PHP API #
|
2 |
-
|
3 |
-
## Description ##
|
4 |
-
|
5 |
-
This is the PHP API for reading MaxMind DB files. MaxMind DB is a binary file
|
6 |
-
format that stores data indexed by IP address subnets (IPv4 or IPv6).
|
7 |
-
|
8 |
-
## Installation ##
|
9 |
-
|
10 |
-
We recommend installing this package with [Composer](http://getcomposer.org/).
|
11 |
-
|
12 |
-
### Download Composer ###
|
13 |
-
|
14 |
-
To download Composer, run in the root directory of your project:
|
15 |
-
|
16 |
-
```bash
|
17 |
-
curl -sS https://getcomposer.org/installer | php
|
18 |
-
```
|
19 |
-
|
20 |
-
You should now have the file `composer.phar` in your project directory.
|
21 |
-
|
22 |
-
### Install Dependencies ###
|
23 |
-
|
24 |
-
Run in your project root:
|
25 |
-
|
26 |
-
```
|
27 |
-
php composer.phar require maxmind-db/reader:~1.0
|
28 |
-
```
|
29 |
-
|
30 |
-
You should now have the files `composer.json` and `composer.lock` as well as
|
31 |
-
the directory `vendor` in your project directory. If you use a version control
|
32 |
-
system, `composer.json` should be added to it.
|
33 |
-
|
34 |
-
### Require Autoloader ###
|
35 |
-
|
36 |
-
After installing the dependencies, you need to require the Composer autoloader
|
37 |
-
from your code:
|
38 |
-
|
39 |
-
```php
|
40 |
-
require 'vendor/autoload.php';
|
41 |
-
```
|
42 |
-
|
43 |
-
## Usage ##
|
44 |
-
|
45 |
-
## Example ##
|
46 |
-
|
47 |
-
```php
|
48 |
-
<?php
|
49 |
-
require_once 'vendor/autoload.php';
|
50 |
-
|
51 |
-
use MaxMind\Db\Reader;
|
52 |
-
|
53 |
-
$ipAddress = '24.24.24.24';
|
54 |
-
$databaseFile = 'GeoIP2-City.mmdb';
|
55 |
-
|
56 |
-
$reader = new Reader($databaseFile);
|
57 |
-
|
58 |
-
print_r($reader->get($ipAddress));
|
59 |
-
|
60 |
-
$reader->close();
|
61 |
-
```
|
62 |
-
|
63 |
-
## Optional PHP C Extension ##
|
64 |
-
|
65 |
-
MaxMind provides an optional C extension that is a drop-in replacement for
|
66 |
-
`MaxMind\Db\Reader`. In order to use this extension, you must install the
|
67 |
-
Reader API as described above and install the extension as described below. If
|
68 |
-
you are using an autoloader, no changes to your code should be necessary.
|
69 |
-
|
70 |
-
### Installing Extension ###
|
71 |
-
|
72 |
-
First install [libmaxminddb](https://github.com/maxmind/libmaxminddb) as
|
73 |
-
described in its [README.md
|
74 |
-
file](https://github.com/maxmind/libmaxminddb/blob/master/README.md#installing-from-a-tarball).
|
75 |
-
After successfully installing libmaxmindb, run the following commands from the
|
76 |
-
top-level directory of this distribution:
|
77 |
-
|
78 |
-
```
|
79 |
-
cd ext
|
80 |
-
phpize
|
81 |
-
./configure
|
82 |
-
make
|
83 |
-
make test
|
84 |
-
sudo make install
|
85 |
-
```
|
86 |
-
|
87 |
-
You then must load your extension. The recommend method is to add the
|
88 |
-
following to your `php.ini` file:
|
89 |
-
|
90 |
-
```
|
91 |
-
extension=maxminddb.so
|
92 |
-
```
|
93 |
-
|
94 |
-
Note: You may need to install the PHP development package on your OS such as
|
95 |
-
php5-dev for Debian-based systems or php-devel for RedHat/Fedora-based ones.
|
96 |
-
|
97 |
-
## 128-bit Integer Support ##
|
98 |
-
|
99 |
-
The MaxMind DB format includes 128-bit unsigned integer as a type. Although
|
100 |
-
no MaxMind-distributed database currently makes use of this type, both the
|
101 |
-
pure PHP reader and the C extension support this type. The pure PHP reader
|
102 |
-
requires gmp or bcmath to read databases with 128-bit unsigned integers.
|
103 |
-
|
104 |
-
The integer is currently returned as a hexadecimal string (prefixed with "0x")
|
105 |
-
by the C extension and a decimal string (no prefix) by the pure PHP reader.
|
106 |
-
Any change to make the reader implementations always return either a
|
107 |
-
hexadecimal or decimal representation of the integer will NOT be considered a
|
108 |
-
breaking change.
|
109 |
-
|
110 |
-
## Support ##
|
111 |
-
|
112 |
-
Please report all issues with this code using the [GitHub issue tracker]
|
113 |
-
(https://github.com/maxmind/MaxMind-DB-Reader-php/issues).
|
114 |
-
|
115 |
-
If you are having an issue with a MaxMind service that is not specific to the
|
116 |
-
client API, please see [our support page](http://www.maxmind.com/en/support).
|
117 |
-
|
118 |
-
## Requirements ##
|
119 |
-
|
120 |
-
This library requires PHP 5.4 or greater. The pure PHP reader included with
|
121 |
-
this library works and is tested with HHVM.
|
122 |
-
|
123 |
-
The GMP or BCMath extension may be required to read some databases
|
124 |
-
using the pure PHP API.
|
125 |
-
|
126 |
-
## Contributing ##
|
127 |
-
|
128 |
-
Patches and pull requests are encouraged. All code should follow the PSR-1 and
|
129 |
-
PSR-2 style guidelines. Please include unit tests whenever possible.
|
130 |
-
|
131 |
-
## Versioning ##
|
132 |
-
|
133 |
-
The MaxMind DB Reader PHP API uses [Semantic Versioning](http://semver.org/).
|
134 |
-
|
135 |
-
## Copyright and License ##
|
136 |
-
|
137 |
-
This software is Copyright (c) 2014-2017 by MaxMind, Inc.
|
138 |
-
|
139 |
-
This is free software, licensed under the Apache License, Version 2.0.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
vendor/maxmind-db/reader/ext/config.m4
DELETED
@@ -1,19 +0,0 @@
|
|
1 |
-
PHP_ARG_WITH(maxminddb,
|
2 |
-
[Whether to enable the MaxMind DB Reader extension],
|
3 |
-
[ --with-maxminddb Enable MaxMind DB Reader extension support])
|
4 |
-
|
5 |
-
PHP_ARG_ENABLE(maxminddb-debug, for MaxMind DB debug support,
|
6 |
-
[ --enable-maxminddb-debug Enable enable MaxMind DB deubg support], no, no)
|
7 |
-
|
8 |
-
if test $PHP_MAXMINDDB != "no"; then
|
9 |
-
PHP_CHECK_LIBRARY(maxminddb, MMDB_open)
|
10 |
-
|
11 |
-
if test $PHP_MAXMINDDB_DEBUG != "no"; then
|
12 |
-
CFLAGS="$CFLAGS -Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Werror"
|
13 |
-
fi
|
14 |
-
|
15 |
-
PHP_ADD_LIBRARY(maxminddb, 1, MAXMINDDB_SHARED_LIBADD)
|
16 |
-
PHP_SUBST(MAXMINDDB_SHARED_LIBADD)
|
17 |
-
|
18 |
-
PHP_NEW_EXTENSION(maxminddb, maxminddb.c, $ext_shared)
|
19 |
-
fi
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
vendor/maxmind-db/reader/ext/maxminddb.c
DELETED
@@ -1,564 +0,0 @@
|
|
1 |
-
/* MaxMind, Inc., licenses this file to you under the Apache License, Version
|
2 |
-
* 2.0 (the "License"); you may not use this file except in compliance with
|
3 |
-
* the License. You may obtain a copy of the License at
|
4 |
-
*
|
5 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
6 |
-
*
|
7 |
-
* Unless required by applicable law or agreed to in writing, software
|
8 |
-
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
9 |
-
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
10 |
-
* License for the specific language governing permissions and limitations
|
11 |
-
* under the License.
|
12 |
-
*/
|
13 |
-
|
14 |
-
#include "php_maxminddb.h"
|
15 |
-
|
16 |
-
#ifdef HAVE_CONFIG_H
|
17 |
-
#include "config.h"
|
18 |
-
#endif
|
19 |
-
|
20 |
-
#include <php.h>
|
21 |
-
#include <zend.h>
|
22 |
-
#include "Zend/zend_exceptions.h"
|
23 |
-
#include <maxminddb.h>
|
24 |
-
|
25 |
-
#ifdef ZTS
|
26 |
-
#include <TSRM.h>
|
27 |
-
#endif
|
28 |
-
|
29 |
-
#define __STDC_FORMAT_MACROS
|
30 |
-
#include <inttypes.h>
|
31 |
-
|
32 |
-
#define PHP_MAXMINDDB_NS ZEND_NS_NAME("MaxMind", "Db")
|
33 |
-
#define PHP_MAXMINDDB_READER_NS ZEND_NS_NAME(PHP_MAXMINDDB_NS, "Reader")
|
34 |
-
#define PHP_MAXMINDDB_READER_EX_NS \
|
35 |
-
ZEND_NS_NAME(PHP_MAXMINDDB_READER_NS, \
|
36 |
-
"InvalidDatabaseException")
|
37 |
-
|
38 |
-
#ifdef ZEND_ENGINE_3
|
39 |
-
#define Z_MAXMINDDB_P(zv) php_maxminddb_fetch_object(Z_OBJ_P(zv))
|
40 |
-
#define _ZVAL_STRING ZVAL_STRING
|
41 |
-
#define _ZVAL_STRINGL ZVAL_STRINGL
|
42 |
-
typedef size_t strsize_t;
|
43 |
-
typedef zend_object free_obj_t;
|
44 |
-
#else
|
45 |
-
#define Z_MAXMINDDB_P(zv) (maxminddb_obj *) zend_object_store_get_object(zv TSRMLS_CC)
|
46 |
-
#define _ZVAL_STRING(a, b) ZVAL_STRING(a, b, 1)
|
47 |
-
#define _ZVAL_STRINGL(a, b, c) ZVAL_STRINGL(a, b, c, 1)
|
48 |
-
typedef int strsize_t;
|
49 |
-
typedef void free_obj_t;
|
50 |
-
#endif
|
51 |
-
|
52 |
-
#ifdef ZEND_ENGINE_3
|
53 |
-
typedef struct _maxminddb_obj {
|
54 |
-
MMDB_s *mmdb;
|
55 |
-
zend_object std;
|
56 |
-
} maxminddb_obj;
|
57 |
-
#else
|
58 |
-
typedef struct _maxminddb_obj {
|
59 |
-
zend_object std;
|
60 |
-
MMDB_s *mmdb;
|
61 |
-
} maxminddb_obj;
|
62 |
-
#endif
|
63 |
-
|
64 |
-
PHP_FUNCTION(maxminddb);
|
65 |
-
|
66 |
-
static const MMDB_entry_data_list_s *handle_entry_data_list(
|
67 |
-
const MMDB_entry_data_list_s *entry_data_list,
|
68 |
-
zval *z_value
|
69 |
-
TSRMLS_DC);
|
70 |
-
static const MMDB_entry_data_list_s *handle_array(
|
71 |
-
const MMDB_entry_data_list_s *entry_data_list,
|
72 |
-
zval *z_value TSRMLS_DC);
|
73 |
-
static const MMDB_entry_data_list_s *handle_map(
|
74 |
-
const MMDB_entry_data_list_s *entry_data_list,
|
75 |
-
zval *z_value TSRMLS_DC);
|
76 |
-
static void handle_uint128(const MMDB_entry_data_list_s *entry_data_list,
|
77 |
-
zval *z_value TSRMLS_DC);
|
78 |
-
static void handle_uint64(const MMDB_entry_data_list_s *entry_data_list,
|
79 |
-
zval *z_value TSRMLS_DC);
|
80 |
-
static zend_class_entry * lookup_class(const char *name TSRMLS_DC);
|
81 |
-
|
82 |
-
#define CHECK_ALLOCATED(val) \
|
83 |
-
if (!val ) { \
|
84 |
-
zend_error(E_ERROR, "Out of memory"); \
|
85 |
-
return; \
|
86 |
-
} \
|
87 |
-
|
88 |
-
#define THROW_EXCEPTION(name, ... ) \
|
89 |
-
{ \
|
90 |
-
zend_class_entry *exception_ce = lookup_class(name TSRMLS_CC); \
|
91 |
-
zend_throw_exception_ex(exception_ce, 0 TSRMLS_CC, __VA_ARGS__); \
|
92 |
-
} \
|
93 |
-
|
94 |
-
|
95 |
-
#if PHP_VERSION_ID < 50399
|
96 |
-
#define object_properties_init(zo, class_type) \
|
97 |
-
{ \
|
98 |
-
zval *tmp; \
|
99 |
-
zend_hash_copy((*zo).properties, \
|
100 |
-
&class_type->default_properties, \
|
101 |
-
(copy_ctor_func_t)zval_add_ref, \
|
102 |
-
(void *)&tmp, \
|
103 |
-
sizeof(zval *)); \
|
104 |
-
}
|
105 |
-
#endif
|
106 |
-
|
107 |
-
static zend_object_handlers maxminddb_obj_handlers;
|
108 |
-
static zend_class_entry *maxminddb_ce;
|
109 |
-
|
110 |
-
static inline maxminddb_obj *php_maxminddb_fetch_object(zend_object *obj TSRMLS_DC){
|
111 |
-
#ifdef ZEND_ENGINE_3
|
112 |
-
return (maxminddb_obj *)((char*)(obj) - XtOffsetOf(maxminddb_obj, std));
|
113 |
-
#else
|
114 |
-
return (maxminddb_obj *)obj;
|
115 |
-
#endif
|
116 |
-
}
|
117 |
-
|
118 |
-
PHP_METHOD(MaxMind_Db_Reader, __construct){
|
119 |
-
char *db_file = NULL;
|
120 |
-
strsize_t name_len;
|
121 |
-
zval * _this_zval = NULL;
|
122 |
-
|
123 |
-
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os",
|
124 |
-
&_this_zval, maxminddb_ce, &db_file, &name_len) == FAILURE) {
|
125 |
-
THROW_EXCEPTION("InvalidArgumentException",
|
126 |
-
"The constructor takes exactly one argument.");
|
127 |
-
return;
|
128 |
-
}
|
129 |
-
|
130 |
-
if (0 != access(db_file, R_OK)) {
|
131 |
-
THROW_EXCEPTION("InvalidArgumentException",
|
132 |
-
"The file \"%s\" does not exist or is not readable.",
|
133 |
-
db_file);
|
134 |
-
return;
|
135 |
-
}
|
136 |
-
|
137 |
-
MMDB_s *mmdb = (MMDB_s *)emalloc(sizeof(MMDB_s));
|
138 |
-
uint16_t status = MMDB_open(db_file, MMDB_MODE_MMAP, mmdb);
|
139 |
-
|
140 |
-
if (MMDB_SUCCESS != status) {
|
141 |
-
THROW_EXCEPTION(
|
142 |
-
PHP_MAXMINDDB_READER_EX_NS,
|
143 |
-
"Error opening database file (%s). Is this a valid MaxMind DB file?",
|
144 |
-
db_file);
|
145 |
-
efree(mmdb);
|
146 |
-
return;
|
147 |
-
}
|
148 |
-
|
149 |
-
maxminddb_obj *mmdb_obj = Z_MAXMINDDB_P(getThis());
|
150 |
-
mmdb_obj->mmdb = mmdb;
|
151 |
-
}
|
152 |
-
|
153 |
-
PHP_METHOD(MaxMind_Db_Reader, get){
|
154 |
-
char *ip_address = NULL;
|
155 |
-
strsize_t name_len;
|
156 |
-
zval * _this_zval = NULL;
|
157 |
-
|
158 |
-
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os",
|
159 |
-
&_this_zval, maxminddb_ce, &ip_address, &name_len) == FAILURE) {
|
160 |
-
THROW_EXCEPTION("InvalidArgumentException",
|
161 |
-
"Method takes exactly one argument.");
|
162 |
-
return;
|
163 |
-
}
|
164 |
-
|
165 |
-
const maxminddb_obj *mmdb_obj =
|
166 |
-
(maxminddb_obj *)Z_MAXMINDDB_P(getThis());
|
167 |
-
|
168 |
-
MMDB_s *mmdb = mmdb_obj->mmdb;
|
169 |
-
|
170 |
-
if (NULL == mmdb) {
|
171 |
-
THROW_EXCEPTION("BadMethodCallException",
|
172 |
-
"Attempt to read from a closed MaxMind DB.");
|
173 |
-
return;
|
174 |
-
}
|
175 |
-
|
176 |
-
int gai_error = 0;
|
177 |
-
int mmdb_error = MMDB_SUCCESS;
|
178 |
-
MMDB_lookup_result_s result =
|
179 |
-
MMDB_lookup_string(mmdb, ip_address, &gai_error,
|
180 |
-
&mmdb_error);
|
181 |
-
|
182 |
-
if (MMDB_SUCCESS != gai_error) {
|
183 |
-
THROW_EXCEPTION("InvalidArgumentException",
|
184 |
-
"The value \"%s\" is not a valid IP address.",
|
185 |
-
ip_address);
|
186 |
-
return;
|
187 |
-
}
|
188 |
-
|
189 |
-
if (MMDB_SUCCESS != mmdb_error) {
|
190 |
-
char *exception_name;
|
191 |
-
if (MMDB_IPV6_LOOKUP_IN_IPV4_DATABASE_ERROR == mmdb_error) {
|
192 |
-
exception_name = "InvalidArgumentException";
|
193 |
-
} else {
|
194 |
-
exception_name = PHP_MAXMINDDB_READER_EX_NS;
|
195 |
-
}
|
196 |
-
THROW_EXCEPTION(exception_name,
|
197 |
-
"Error looking up %s. %s",
|
198 |
-
ip_address, MMDB_strerror(mmdb_error));
|
199 |
-
return;
|
200 |
-
}
|
201 |
-
|
202 |
-
MMDB_entry_data_list_s *entry_data_list = NULL;
|
203 |
-
|
204 |
-
if (!result.found_entry) {
|
205 |
-
RETURN_NULL();
|
206 |
-
}
|
207 |
-
|
208 |
-
int status = MMDB_get_entry_data_list(&result.entry, &entry_data_list);
|
209 |
-
|
210 |
-
if (MMDB_SUCCESS != status) {
|
211 |
-
THROW_EXCEPTION(PHP_MAXMINDDB_READER_EX_NS,
|
212 |
-
"Error while looking up data for %s. %s",
|
213 |
-
ip_address, MMDB_strerror(status));
|
214 |
-
MMDB_free_entry_data_list(entry_data_list);
|
215 |
-
return;
|
216 |
-
} else if (NULL == entry_data_list) {
|
217 |
-
THROW_EXCEPTION(
|
218 |
-
PHP_MAXMINDDB_READER_EX_NS,
|
219 |
-
"Error while looking up data for %s. Your database may be corrupt or you have found a bug in libmaxminddb.",
|
220 |
-
ip_address);
|
221 |
-
return;
|
222 |
-
}
|
223 |
-
|
224 |
-
handle_entry_data_list(entry_data_list, return_value TSRMLS_CC);
|
225 |
-
MMDB_free_entry_data_list(entry_data_list);
|
226 |
-
}
|
227 |
-
|
228 |
-
PHP_METHOD(MaxMind_Db_Reader, metadata){
|
229 |
-
if (ZEND_NUM_ARGS() != 0) {
|
230 |
-
THROW_EXCEPTION("InvalidArgumentException",
|
231 |
-
"Method takes no arguments.");
|
232 |
-
return;
|
233 |
-
}
|
234 |
-
|
235 |
-
const maxminddb_obj *const mmdb_obj =
|
236 |
-
(maxminddb_obj *)Z_MAXMINDDB_P(getThis());
|
237 |
-
|
238 |
-
if (NULL == mmdb_obj->mmdb) {
|
239 |
-
THROW_EXCEPTION("BadMethodCallException",
|
240 |
-
"Attempt to read from a closed MaxMind DB.");
|
241 |
-
return;
|
242 |
-
}
|
243 |
-
|
244 |
-
const char *const name = ZEND_NS_NAME(PHP_MAXMINDDB_READER_NS, "Metadata");
|
245 |
-
zend_class_entry *metadata_ce = lookup_class(name TSRMLS_CC);
|
246 |
-
|
247 |
-
object_init_ex(return_value, metadata_ce);
|
248 |
-
|
249 |
-
#ifdef ZEND_ENGINE_3
|
250 |
-
zval _metadata_array;
|
251 |
-
zval *metadata_array = &_metadata_array;
|
252 |
-
ZVAL_NULL(metadata_array);
|
253 |
-
#else
|
254 |
-
zval *metadata_array;
|
255 |
-
ALLOC_INIT_ZVAL(metadata_array);
|
256 |
-
#endif
|
257 |
-
|
258 |
-
MMDB_entry_data_list_s *entry_data_list;
|
259 |
-
MMDB_get_metadata_as_entry_data_list(mmdb_obj->mmdb, &entry_data_list);
|
260 |
-
|
261 |
-
handle_entry_data_list(entry_data_list, metadata_array TSRMLS_CC);
|
262 |
-
MMDB_free_entry_data_list(entry_data_list);
|
263 |
-
#ifdef ZEND_ENGINE_3
|
264 |
-
zend_call_method_with_1_params(return_value, metadata_ce,
|
265 |
-
&metadata_ce->constructor,
|
266 |
-
ZEND_CONSTRUCTOR_FUNC_NAME,
|
267 |
-
NULL,
|
268 |
-
metadata_array);
|
269 |
-
zval_ptr_dtor(metadata_array);
|
270 |
-
#else
|
271 |
-
zend_call_method_with_1_params(&return_value, metadata_ce,
|
272 |
-
&metadata_ce->constructor,
|
273 |
-
ZEND_CONSTRUCTOR_FUNC_NAME,
|
274 |
-
NULL,
|
275 |
-
metadata_array);
|
276 |
-
zval_ptr_dtor(&metadata_array);
|
277 |
-
#endif
|
278 |
-
}
|
279 |
-
|
280 |
-
PHP_METHOD(MaxMind_Db_Reader, close){
|
281 |
-
if (ZEND_NUM_ARGS() != 0) {
|
282 |
-
THROW_EXCEPTION("InvalidArgumentException",
|
283 |
-
"Method takes no arguments.");
|
284 |
-
return;
|
285 |
-
}
|
286 |
-
|
287 |
-
maxminddb_obj *mmdb_obj =
|
288 |
-
(maxminddb_obj *)Z_MAXMINDDB_P(getThis());
|
289 |
-
|
290 |
-
if (NULL == mmdb_obj->mmdb) {
|
291 |
-
THROW_EXCEPTION("BadMethodCallException",
|
292 |
-
"Attempt to close a closed MaxMind DB.");
|
293 |
-
return;
|
294 |
-
}
|
295 |
-
MMDB_close(mmdb_obj->mmdb);
|
296 |
-
efree(mmdb_obj->mmdb);
|
297 |
-
mmdb_obj->mmdb = NULL;
|
298 |
-
}
|
299 |
-
|
300 |
-
static const MMDB_entry_data_list_s *handle_entry_data_list(
|
301 |
-
const MMDB_entry_data_list_s *entry_data_list,
|
302 |
-
zval *z_value
|
303 |
-
TSRMLS_DC)
|
304 |
-
{
|
305 |
-
switch (entry_data_list->entry_data.type) {
|
306 |
-
case MMDB_DATA_TYPE_MAP:
|
307 |
-
return handle_map(entry_data_list, z_value TSRMLS_CC);
|
308 |
-
case MMDB_DATA_TYPE_ARRAY:
|
309 |
-
return handle_array(entry_data_list, z_value TSRMLS_CC);
|
310 |
-
case MMDB_DATA_TYPE_UTF8_STRING:
|
311 |
-
_ZVAL_STRINGL(z_value,
|
312 |
-
(char *)entry_data_list->entry_data.utf8_string,
|
313 |
-
entry_data_list->entry_data.data_size);
|
314 |
-
break;
|
315 |
-
case MMDB_DATA_TYPE_BYTES:
|
316 |
-
_ZVAL_STRINGL(z_value, (char *)entry_data_list->entry_data.bytes,
|
317 |
-
entry_data_list->entry_data.data_size);
|
318 |
-
break;
|
319 |
-
case MMDB_DATA_TYPE_DOUBLE:
|
320 |
-
ZVAL_DOUBLE(z_value, entry_data_list->entry_data.double_value);
|
321 |
-
break;
|
322 |
-
case MMDB_DATA_TYPE_FLOAT:
|
323 |
-
ZVAL_DOUBLE(z_value, entry_data_list->entry_data.float_value);
|
324 |
-
break;
|
325 |
-
case MMDB_DATA_TYPE_UINT16:
|
326 |
-
ZVAL_LONG(z_value, entry_data_list->entry_data.uint16);
|
327 |
-
break;
|
328 |
-
case MMDB_DATA_TYPE_UINT32:
|
329 |
-
ZVAL_LONG(z_value, entry_data_list->entry_data.uint32);
|
330 |
-
break;
|
331 |
-
case MMDB_DATA_TYPE_BOOLEAN:
|
332 |
-
ZVAL_BOOL(z_value, entry_data_list->entry_data.boolean);
|
333 |
-
break;
|
334 |
-
case MMDB_DATA_TYPE_UINT64:
|
335 |
-
handle_uint64(entry_data_list, z_value TSRMLS_CC);
|
336 |
-
break;
|
337 |
-
case MMDB_DATA_TYPE_UINT128:
|
338 |
-
handle_uint128(entry_data_list, z_value TSRMLS_CC);
|
339 |
-
break;
|
340 |
-
case MMDB_DATA_TYPE_INT32:
|
341 |
-
ZVAL_LONG(z_value, entry_data_list->entry_data.int32);
|
342 |
-
break;
|
343 |
-
default:
|
344 |
-
THROW_EXCEPTION(PHP_MAXMINDDB_READER_EX_NS,
|
345 |
-
"Invalid data type arguments: %d",
|
346 |
-
entry_data_list->entry_data.type);
|
347 |
-
return NULL;
|
348 |
-
}
|
349 |
-
return entry_data_list;
|
350 |
-
}
|
351 |
-
|
352 |
-
static const MMDB_entry_data_list_s *handle_map(
|
353 |
-
const MMDB_entry_data_list_s *entry_data_list,
|
354 |
-
zval *z_value TSRMLS_DC)
|
355 |
-
{
|
356 |
-
array_init(z_value);
|
357 |
-
const uint32_t map_size = entry_data_list->entry_data.data_size;
|
358 |
-
|
359 |
-
uint i;
|
360 |
-
for (i = 0; i < map_size && entry_data_list; i++ ) {
|
361 |
-
entry_data_list = entry_data_list->next;
|
362 |
-
|
363 |
-
char *key =
|
364 |
-
estrndup((char *)entry_data_list->entry_data.utf8_string,
|
365 |
-
entry_data_list->entry_data.data_size);
|
366 |
-
if (NULL == key) {
|
367 |
-
THROW_EXCEPTION(PHP_MAXMINDDB_READER_EX_NS,
|
368 |
-
"Invalid data type arguments");
|
369 |
-
return NULL;
|
370 |
-
}
|
371 |
-
|
372 |
-
entry_data_list = entry_data_list->next;
|
373 |
-
#ifdef ZEND_ENGINE_3
|
374 |
-
zval _new_value;
|
375 |
-
zval * new_value = &_new_value;
|
376 |
-
ZVAL_NULL(new_value);
|
377 |
-
#else
|
378 |
-
zval *new_value;
|
379 |
-
ALLOC_INIT_ZVAL(new_value);
|
380 |
-
#endif
|
381 |
-
entry_data_list = handle_entry_data_list(entry_data_list,
|
382 |
-
new_value TSRMLS_CC);
|
383 |
-
add_assoc_zval(z_value, key, new_value);
|
384 |
-
efree(key);
|
385 |
-
}
|
386 |
-
return entry_data_list;
|
387 |
-
}
|
388 |
-
|
389 |
-
static const MMDB_entry_data_list_s *handle_array(
|
390 |
-
const MMDB_entry_data_list_s *entry_data_list,
|
391 |
-
zval *z_value TSRMLS_DC)
|
392 |
-
{
|
393 |
-
const uint32_t size = entry_data_list->entry_data.data_size;
|
394 |
-
|
395 |
-
array_init(z_value);
|
396 |
-
|
397 |
-
uint i;
|
398 |
-
for (i = 0; i < size && entry_data_list; i++) {
|
399 |
-
entry_data_list = entry_data_list->next;
|
400 |
-
#ifdef ZEND_ENGINE_3
|
401 |
-
zval _new_value;
|
402 |
-
zval * new_value = &_new_value;
|
403 |
-
ZVAL_NULL(new_value);
|
404 |
-
#else
|
405 |
-
zval *new_value;
|
406 |
-
ALLOC_INIT_ZVAL(new_value);
|
407 |
-
#endif
|
408 |
-
entry_data_list = handle_entry_data_list(entry_data_list,
|
409 |
-
new_value TSRMLS_CC);
|
410 |
-
add_next_index_zval(z_value, new_value);
|
411 |
-
}
|
412 |
-
return entry_data_list;
|
413 |
-
}
|
414 |
-
|
415 |
-
static void handle_uint128(const MMDB_entry_data_list_s *entry_data_list,
|
416 |
-
zval *z_value TSRMLS_DC)
|
417 |
-
{
|
418 |
-
uint64_t high = 0;
|
419 |
-
uint64_t low = 0;
|
420 |
-
#if MMDB_UINT128_IS_BYTE_ARRAY
|
421 |
-
int i;
|
422 |
-
for (i = 0; i < 8; i++) {
|
423 |
-
high = (high << 8) | entry_data_list->entry_data.uint128[i];
|
424 |
-
}
|
425 |
-
|
426 |
-
for (i = 8; i < 16; i++) {
|
427 |
-
low = (low << 8) | entry_data_list->entry_data.uint128[i];
|
428 |
-
}
|
429 |
-
#else
|
430 |
-
high = entry_data_list->entry_data.uint128 >> 64;
|
431 |
-
low = (uint64_t)entry_data_list->entry_data.uint128;
|
432 |
-
#endif
|
433 |
-
|
434 |
-
char *num_str;
|
435 |
-
spprintf(&num_str, 0, "0x%016" PRIX64 "%016" PRIX64, high, low);
|
436 |
-
CHECK_ALLOCATED(num_str);
|
437 |
-
|
438 |
-
_ZVAL_STRING(z_value, num_str);
|
439 |
-
efree(num_str);
|
440 |
-
}
|
441 |
-
|
442 |
-
static void handle_uint64(const MMDB_entry_data_list_s *entry_data_list,
|
443 |
-
zval *z_value TSRMLS_DC)
|
444 |
-
{
|
445 |
-
// We return it as a string because PHP uses signed longs
|
446 |
-
char *int_str;
|
447 |
-
spprintf(&int_str, 0, "%" PRIu64,
|
448 |
-
entry_data_list->entry_data.uint64);
|
449 |
-
CHECK_ALLOCATED(int_str);
|
450 |
-
|
451 |
-
_ZVAL_STRING(z_value, int_str);
|
452 |
-
efree(int_str);
|
453 |
-
}
|
454 |
-
|
455 |
-
static zend_class_entry *lookup_class(const char *name TSRMLS_DC)
|
456 |
-
{
|
457 |
-
#ifdef ZEND_ENGINE_3
|
458 |
-
zend_string *n = zend_string_init(name, strlen(name), 0);
|
459 |
-
zend_class_entry *ce = zend_lookup_class(n);
|
460 |
-
zend_string_release(n);
|
461 |
-
if( NULL == ce ) {
|
462 |
-
zend_error(E_ERROR, "Class %s not found", name);
|
463 |
-
}
|
464 |
-
return ce;
|
465 |
-
#else
|
466 |
-
zend_class_entry **ce;
|
467 |
-
if (FAILURE ==
|
468 |
-
zend_lookup_class(name, strlen(name),
|
469 |
-
&ce TSRMLS_CC)) {
|
470 |
-
zend_error(E_ERROR, "Class %s not found", name);
|
471 |
-
}
|
472 |
-
return *ce;
|
473 |
-
#endif
|
474 |
-
}
|
475 |
-
|
476 |
-
static void maxminddb_free_storage(free_obj_t *object TSRMLS_DC)
|
477 |
-
{
|
478 |
-
maxminddb_obj *obj = php_maxminddb_fetch_object((zend_object *)object TSRMLS_CC);
|
479 |
-
if (obj->mmdb != NULL) {
|
480 |
-
MMDB_close(obj->mmdb);
|
481 |
-
efree(obj->mmdb);
|
482 |
-
}
|
483 |
-
|
484 |
-
zend_object_std_dtor(&obj->std TSRMLS_CC);
|
485 |
-
#ifndef ZEND_ENGINE_3
|
486 |
-
efree(object);
|
487 |
-
#endif
|
488 |
-
}
|
489 |
-
|
490 |
-
#ifdef ZEND_ENGINE_3
|
491 |
-
static zend_object *maxminddb_create_handler(
|
492 |
-
zend_class_entry *type TSRMLS_DC)
|
493 |
-
{
|
494 |
-
maxminddb_obj *obj = (maxminddb_obj *)ecalloc(1, sizeof(maxminddb_obj));
|
495 |
-
zend_object_std_init(&obj->std, type TSRMLS_CC);
|
496 |
-
object_properties_init(&(obj->std), type);
|
497 |
-
|
498 |
-
obj->std.handlers = &maxminddb_obj_handlers;
|
499 |
-
|
500 |
-
return &obj->std;
|
501 |
-
}
|
502 |
-
#else
|
503 |
-
static zend_object_value maxminddb_create_handler(
|
504 |
-
zend_class_entry *type TSRMLS_DC)
|
505 |
-
{
|
506 |
-
zend_object_value retval;
|
507 |
-
|
508 |
-
maxminddb_obj *obj = (maxminddb_obj *)ecalloc(1, sizeof(maxminddb_obj));
|
509 |
-
zend_object_std_init(&obj->std, type TSRMLS_CC);
|
510 |
-
object_properties_init(&(obj->std), type);
|
511 |
-
|
512 |
-
retval.handle = zend_objects_store_put(obj, NULL,
|
513 |
-
maxminddb_free_storage,
|
514 |
-
NULL TSRMLS_CC);
|
515 |
-
retval.handlers = &maxminddb_obj_handlers;
|
516 |
-
|
517 |
-
return retval;
|
518 |
-
}
|
519 |
-
#endif
|
520 |
-
|
521 |
-
/* *INDENT-OFF* */
|
522 |
-
static zend_function_entry maxminddb_methods[] = {
|
523 |
-
PHP_ME(MaxMind_Db_Reader, __construct, NULL,
|
524 |
-
ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)
|
525 |
-
PHP_ME(MaxMind_Db_Reader, close, NULL, ZEND_ACC_PUBLIC)
|
526 |
-
PHP_ME(MaxMind_Db_Reader, get, NULL, ZEND_ACC_PUBLIC)
|
527 |
-
PHP_ME(MaxMind_Db_Reader, metadata, NULL, ZEND_ACC_PUBLIC)
|
528 |
-
{ NULL, NULL, NULL }
|
529 |
-
};
|
530 |
-
/* *INDENT-ON* */
|
531 |
-
|
532 |
-
PHP_MINIT_FUNCTION(maxminddb){
|
533 |
-
zend_class_entry ce;
|
534 |
-
|
535 |
-
INIT_CLASS_ENTRY(ce, PHP_MAXMINDDB_READER_NS, maxminddb_methods);
|
536 |
-
maxminddb_ce = zend_register_internal_class(&ce TSRMLS_CC);
|
537 |
-
maxminddb_ce->create_object = maxminddb_create_handler;
|
538 |
-
memcpy(&maxminddb_obj_handlers,
|
539 |
-
zend_get_std_object_handlers(), sizeof(zend_object_handlers));
|
540 |
-
maxminddb_obj_handlers.clone_obj = NULL;
|
541 |
-
#ifdef ZEND_ENGINE_3
|
542 |
-
maxminddb_obj_handlers.offset = XtOffsetOf(maxminddb_obj, std);
|
543 |
-
maxminddb_obj_handlers.free_obj = maxminddb_free_storage;
|
544 |
-
#endif
|
545 |
-
|
546 |
-
return SUCCESS;
|
547 |
-
}
|
548 |
-
|
549 |
-
zend_module_entry maxminddb_module_entry = {
|
550 |
-
STANDARD_MODULE_HEADER,
|
551 |
-
PHP_MAXMINDDB_EXTNAME,
|
552 |
-
NULL,
|
553 |
-
PHP_MINIT(maxminddb),
|
554 |
-
NULL,
|
555 |
-
NULL,
|
556 |
-
NULL,
|
557 |
-
NULL,
|
558 |
-
PHP_MAXMINDDB_VERSION,
|
559 |
-
STANDARD_MODULE_PROPERTIES
|
560 |
-
};
|
561 |
-
|
562 |
-
#ifdef COMPILE_DL_MAXMINDDB
|
563 |
-
ZEND_GET_MODULE(maxminddb)
|
564 |
-
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
vendor/maxmind-db/reader/ext/php_maxminddb.h
DELETED
@@ -1,24 +0,0 @@
|
|
1 |
-
/* MaxMind, Inc., licenses this file to you under the Apache License, Version
|
2 |
-
* 2.0 (the "License"); you may not use this file except in compliance with
|
3 |
-
* the License. You may obtain a copy of the License at
|
4 |
-
*
|
5 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
6 |
-
*
|
7 |
-
* Unless required by applicable law or agreed to in writing, software
|
8 |
-
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
9 |
-
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
10 |
-
* License for the specific language governing permissions and limitations
|
11 |
-
* under the License.
|
12 |
-
*/
|
13 |
-
|
14 |
-
#include <zend_interfaces.h>
|
15 |
-
|
16 |
-
#ifndef PHP_MAXMINDDB_H
|
17 |
-
#define PHP_MAXMINDDB_H 1
|
18 |
-
#define PHP_MAXMINDDB_VERSION "1.2.0"
|
19 |
-
#define PHP_MAXMINDDB_EXTNAME "maxminddb"
|
20 |
-
|
21 |
-
extern zend_module_entry maxminddb_module_entry;
|
22 |
-
#define phpext_maxminddb_ptr &maxminddb_module_entry
|
23 |
-
|
24 |
-
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
vendor/maxmind-db/reader/ext/tests/001-load.phpt
DELETED
@@ -1,12 +0,0 @@
|
|
1 |
-
--TEST--
|
2 |
-
Check for maxminddb presence
|
3 |
-
--SKIPIF--
|
4 |
-
<?php if (!extension_loaded('maxminddb')) {
|
5 |
-
echo 'skip';
|
6 |
-
} ?>
|
7 |
-
--FILE--
|
8 |
-
<?php
|
9 |
-
echo 'maxminddb extension is available';
|
10 |
-
?>
|
11 |
-
--EXPECT--
|
12 |
-
maxminddb extension is available
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
vendor/maxmind-db/reader/ext/tests/002-final.phpt
DELETED
@@ -1,13 +0,0 @@
|
|
1 |
-
--TEST--
|
2 |
-
Check that Reader class is not final
|
3 |
-
--SKIPIF--
|
4 |
-
<?php if (!extension_loaded('maxminddb')) {
|
5 |
-
echo 'skip';
|
6 |
-
} ?>
|
7 |
-
--FILE--
|
8 |
-
<?php
|
9 |
-
$reflectionClass = new \ReflectionClass('MaxMind\Db\Reader');
|
10 |
-
var_dump($reflectionClass->isFinal());
|
11 |
-
?>
|
12 |
-
--EXPECT--
|
13 |
-
bool(false)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
vendor/maxmind/web-service-common/CHANGELOG.md
DELETED
@@ -1,74 +0,0 @@
|
|
1 |
-
CHANGELOG
|
2 |
-
=========
|
3 |
-
|
4 |
-
0.4.0 (2017-XX-XX)
|
5 |
-
------------------
|
6 |
-
|
7 |
-
* PHP 5.4 is now required.
|
8 |
-
|
9 |
-
0.3.1 (2016-08-10)
|
10 |
-
------------------
|
11 |
-
|
12 |
-
* On Mac OS X when using a curl built against SecureTransport, the certs
|
13 |
-
in the system's keychain will now be used instead of the CA bundle on
|
14 |
-
the file system.
|
15 |
-
|
16 |
-
0.3.0 (2016-08-09)
|
17 |
-
------------------
|
18 |
-
|
19 |
-
* This package now uses `composer/ca-bundle` by default rather than a CA
|
20 |
-
bundle distributed with this package. `composer/ca-bundle` will first try
|
21 |
-
to use the system CA bundle and will fall back to the Mozilla CA bundle
|
22 |
-
when no system bundle is available. You may still specify your own bundle
|
23 |
-
using the `caBundle` option.
|
24 |
-
|
25 |
-
0.2.1 (2016-06-13)
|
26 |
-
------------------
|
27 |
-
|
28 |
-
* Fix typo in code to copy cert to temp directory.
|
29 |
-
|
30 |
-
0.2.0 (2016-06-10)
|
31 |
-
------------------
|
32 |
-
|
33 |
-
* Added handling of additional error codes that the web service may return.
|
34 |
-
* A `USER_ID_UNKNOWN` error will now throw a
|
35 |
-
`MaxMind\Exception\AuthenticationException`.
|
36 |
-
* Added support for `proxy` option. Closes #6.
|
37 |
-
|
38 |
-
0.1.0 (2016-05-23)
|
39 |
-
------------------
|
40 |
-
|
41 |
-
* A `PERMISSION_REQUIRED` error will now throw a `PermissionRequiredException`
|
42 |
-
exception.
|
43 |
-
* Added a `.gitattributes` file to exclude tests from Composer releases.
|
44 |
-
GitHub #7.
|
45 |
-
* Updated included cert bundle.
|
46 |
-
|
47 |
-
0.0.4 (2015-07-21)
|
48 |
-
------------------
|
49 |
-
|
50 |
-
* Added extremely basic tests for the curl calls.
|
51 |
-
* Fixed broken POSTs.
|
52 |
-
|
53 |
-
0.0.3 (2015-06-30)
|
54 |
-
------------------
|
55 |
-
|
56 |
-
* Floats now work with the `timeout` and `connectTimeout` options. Fix by
|
57 |
-
Benjamin Pick. GitHub PR #2.
|
58 |
-
* `curl_error` is now used instead of `curl_strerror`. The latter is only
|
59 |
-
available for PHP 5.5 or later. Fix by Benjamin Pick. GitHub PR #1.
|
60 |
-
|
61 |
-
|
62 |
-
0.0.2 (2015-06-09)
|
63 |
-
------------------
|
64 |
-
|
65 |
-
* An exception is now immediately thrown curl error rather than letting later
|
66 |
-
status code checks throw an exception. This improves the exception message
|
67 |
-
greatly.
|
68 |
-
* If this library is inside a phar archive, the CA certs are copied out of the
|
69 |
-
archive to a temporary file so that curl can use them.
|
70 |
-
|
71 |
-
0.0.1 (2015-06-01)
|
72 |
-
------------------
|
73 |
-
|
74 |
-
* Initial release.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
vendor/maxmind/web-service-common/README.md
DELETED
@@ -1,26 +0,0 @@
|
|
1 |
-
# MaxMind Web Service Common #
|
2 |
-
|
3 |
-
This is _not_ intended for direct use by third parties. Rather, it is for
|
4 |
-
shared code between MaxMind's various web service APIs.
|
5 |
-
|
6 |
-
## Requirements ##
|
7 |
-
|
8 |
-
The library requires PHP 5.4 or greater. This library works and is tested
|
9 |
-
with HHVM.
|
10 |
-
|
11 |
-
There are several other dependencies as defined in the `composer.json` file.
|
12 |
-
|
13 |
-
## Contributing ##
|
14 |
-
|
15 |
-
Patches and pull requests are encouraged. All code should follow the PSR-2
|
16 |
-
style guidelines. Please include unit tests whenever possible.
|
17 |
-
|
18 |
-
## Versioning ##
|
19 |
-
|
20 |
-
This API uses [Semantic Versioning](http://semver.org/).
|
21 |
-
|
22 |
-
## Copyright and License ##
|
23 |
-
|
24 |
-
This software is Copyright (c) 2015-2017 by MaxMind, Inc.
|
25 |
-
|
26 |
-
This is free software, licensed under the Apache License, Version 2.0.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
views/blocking/block-list.php
CHANGED
@@ -101,7 +101,7 @@ if (!defined('WORDFENCE_VERSION')) { exit; }
|
|
101 |
<td data-column="type" data-sort="${typeSort}">${typeDisplay}</td>
|
102 |
<td data-column="detail" data-sort="${detailSort}">${detailDisplay}{{if (editable)}} <a href="#" class="wf-block-edit" data-edit-type="${editType}" data-edit-values="${editValues}"><i class="wf-ion-edit" aria-hidden="true"></i></a>{{/if}}</td>
|
103 |
<td data-column="ruleAdded" data-sort="${ruleAddedSort}">${ruleAddedDisplay}</td>
|
104 |
-
<td data-column="reason" data-sort="${reasonSort}"
|
105 |
<td data-column="expiration" data-sort="${expirationSort}">${expirationDisplay}</td>
|
106 |
<td data-column="blockCount" data-sort="${blockCountSort}">${blockCountDisplay}</td>
|
107 |
<td data-column="lastAttempt" data-sort="${lastAttemptSort}">${lastAttemptDisplay}</td>
|
@@ -277,6 +277,14 @@ if (!defined('WORDFENCE_VERSION')) { exit; }
|
|
277 |
}
|
278 |
});
|
279 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
280 |
var existing = table.find('tbody tr[data-id="' + payload['blocks'][i]['id'] + '"]');
|
281 |
if (existing.length > 0) {
|
282 |
existing.replaceWith(row);
|
101 |
<td data-column="type" data-sort="${typeSort}">${typeDisplay}</td>
|
102 |
<td data-column="detail" data-sort="${detailSort}">${detailDisplay}{{if (editable)}} <a href="#" class="wf-block-edit" data-edit-type="${editType}" data-edit-values="${editValues}"><i class="wf-ion-edit" aria-hidden="true"></i></a>{{/if}}</td>
|
103 |
<td data-column="ruleAdded" data-sort="${ruleAddedSort}">${ruleAddedDisplay}</td>
|
104 |
+
<td data-column="reason" data-sort="${reasonSort}">${reasonDisplay}</td>
|
105 |
<td data-column="expiration" data-sort="${expirationSort}">${expirationDisplay}</td>
|
106 |
<td data-column="blockCount" data-sort="${blockCountSort}">${blockCountDisplay}</td>
|
107 |
<td data-column="lastAttempt" data-sort="${lastAttemptSort}">${lastAttemptDisplay}</td>
|
277 |
}
|
278 |
});
|
279 |
|
280 |
+
var reasonDisplayChunks = payload['blocks'][i]['reasonDisplay'].split(/\s+/);
|
281 |
+
for (var n = 0; n < reasonDisplayChunks.length; n++) {
|
282 |
+
if (reasonDisplayChunks[n].length >= 50) {
|
283 |
+
row.find('[data-column="reason"]').addClass('wf-split-word');
|
284 |
+
break;
|
285 |
+
}
|
286 |
+
}
|
287 |
+
|
288 |
var existing = table.find('tbody tr[data-id="' + payload['blocks'][i]['id'] + '"]');
|
289 |
if (existing.length > 0) {
|
290 |
existing.replaceWith(row);
|
views/common/unsubscribe.php
ADDED
@@ -0,0 +1,130 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
if (!defined('WORDFENCE_VERSION')) { exit; }
|
3 |
+
|
4 |
+
/**
|
5 |
+
* Presents an unsubscribe confirmation.
|
6 |
+
*
|
7 |
+
* Expects $jwt, $email, and $state to be defined when applicable.
|
8 |
+
*
|
9 |
+
* @var string $jwt The JWT for the unsubscribe request.
|
10 |
+
* @var string $email The plaintext email address being unsubscribed.
|
11 |
+
* @var string $state The state of the confirmation. 'bad' is the bad/expired token prompt. 'resent' is the confirmation that an unsubscribe email as re-sent. 'prompt' is the confirmation prompt. 'unsubscribed' is the completion view.
|
12 |
+
*/
|
13 |
+
|
14 |
+
switch ($state) {
|
15 |
+
case 'bad':
|
16 |
+
$title = __('Unsubscribe from Security Alerts', 'wordfence');
|
17 |
+
break;
|
18 |
+
case 'resent':
|
19 |
+
$title = __('Unsubscription Confirmation Sent', 'wordfence');
|
20 |
+
break;
|
21 |
+
case 'unsubscribed':
|
22 |
+
$title = __('Unsubscribe Successful', 'wordfence');
|
23 |
+
break;
|
24 |
+
case 'prompt':
|
25 |
+
$title = __('Confirm Unsubscribe', 'wordfence');
|
26 |
+
break;
|
27 |
+
}
|
28 |
+
?>
|
29 |
+
<!DOCTYPE html>
|
30 |
+
<html>
|
31 |
+
<head>
|
32 |
+
<meta charset="UTF-8">
|
33 |
+
<title><?php echo $title; ?></title>
|
34 |
+
<style>
|
35 |
+
html {
|
36 |
+
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
|
37 |
+
font-size: 14px;
|
38 |
+
line-height: 1.42857143;
|
39 |
+
color: #333;
|
40 |
+
background-color: #fff;
|
41 |
+
}
|
42 |
+
|
43 |
+
h1, h2, h3, h4, h45, h6 {
|
44 |
+
font-weight: 500;
|
45 |
+
line-height: 1.1;
|
46 |
+
}
|
47 |
+
|
48 |
+
h1 { font-size: 36px; }
|
49 |
+
h2 { font-size: 30px; }
|
50 |
+
h3 { font-size: 24px; }
|
51 |
+
h4 { font-size: 18px; }
|
52 |
+
h5 { font-size: 14px; }
|
53 |
+
h6 { font-size: 12px; }
|
54 |
+
|
55 |
+
h1, h2, h3 {
|
56 |
+
margin-top: 20px;
|
57 |
+
margin-bottom: 10px;
|
58 |
+
}
|
59 |
+
h4, h5, h6 {
|
60 |
+
margin-top: 10px;
|
61 |
+
margin-bottom: 10px;
|
62 |
+
}
|
63 |
+
|
64 |
+
.btn {
|
65 |
+
background-color: #00709e;
|
66 |
+
border: 1px solid #09486C;
|
67 |
+
border-radius: 4px;
|
68 |
+
box-sizing: border-box;
|
69 |
+
color: #ffffff;
|
70 |
+
cursor: pointer;
|
71 |
+
display: inline-block;
|
72 |
+
font-size: 14px;
|
73 |
+
font-weight: normal;
|
74 |
+
letter-spacing: normal;
|
75 |
+
line-height: 20px;
|
76 |
+
margin: 5px 0px;
|
77 |
+
padding: 12px 6px;
|
78 |
+
text-align: center;
|
79 |
+
text-decoration: none;
|
80 |
+
vertical-align: middle;
|
81 |
+
white-space: nowrap;
|
82 |
+
word-spacing: 0px;
|
83 |
+
}
|
84 |
+
|
85 |
+
hr {
|
86 |
+
margin-top: 20px;
|
87 |
+
margin-bottom: 20px;
|
88 |
+
border: 0;
|
89 |
+
border-top: 1px solid #eee
|
90 |
+
}
|
91 |
+
|
92 |
+
.btn.disabled, .btn[disabled] {
|
93 |
+
background-color: #9f9fa0;
|
94 |
+
border: 1px solid #7E7E7F;
|
95 |
+
cursor: not-allowed;
|
96 |
+
filter: alpha(opacity=65);
|
97 |
+
-webkit-box-shadow: none;
|
98 |
+
box-shadow: none;
|
99 |
+
opacity: .65;
|
100 |
+
pointer-events: none;
|
101 |
+
}
|
102 |
+
</style>
|
103 |
+
</head>
|
104 |
+
<body>
|
105 |
+
|
106 |
+
<h3><?php echo $title; ?></h3>
|
107 |
+
|
108 |
+
<?php if ($state == 'unsubscribed'): ?>
|
109 |
+
<p><?php _e('The email address provided has been unsubscribed from future alert emails.', 'wordfence'); ?></p>
|
110 |
+
<?php elseif ($state == 'resent'): ?>
|
111 |
+
<p><?php _e('If the email address provided was on the alert email list, it has been sent an unsubscribe link.', 'wordfence'); ?></p>
|
112 |
+
<?php elseif ($state == 'bad'): ?>
|
113 |
+
<p><?php _e('Please enter an email address to unsubscribe from alerts. If this email address exists on the alert email list, it will receive a confirmation link to unsubscribe.', 'wordfence'); ?></p>
|
114 |
+
<form method="POST" action="<?php echo esc_attr(wfUtils::getSiteBaseURL() . '?_wfsf=removeAlertEmail'); ?>">
|
115 |
+
<p><input type="email" name="email" id="email" placeholder="you@example.com"></p>
|
116 |
+
<input type="hidden" name="resend" value="1">
|
117 |
+
<p><input type="submit" class="btn" value="Unsubscribe"></p>
|
118 |
+
</form>
|
119 |
+
<?php elseif ($state == 'prompt'): ?>
|
120 |
+
<p><?php printf(__('Please confirm the unsubscribe request for %s.', 'wordfence'), esc_html($email)); ?></p>
|
121 |
+
<form method="POST" action="<?php echo esc_attr(wfUtils::getSiteBaseURL() . '?_wfsf=removeAlertEmail&jwt=' . $jwt); ?>">
|
122 |
+
<input type="hidden" name="confirm" value="1">
|
123 |
+
<p><input type="submit" class="btn" value="Unsubscribe"></p>
|
124 |
+
</form>
|
125 |
+
<?php endif; ?>
|
126 |
+
|
127 |
+
<p style="color: #999999;margin-top: 2rem;"><em><?php _e('Generated by Wordfence at ', 'wordfence'); ?><?php echo gmdate('D, j M Y G:i:s T', wfWAFUtils::normalizedTime()); ?>.<br><?php _e('Your computer\'s time: ', 'wordfence'); ?><script type="application/javascript">document.write(new Date().toUTCString());</script>.</em></p>
|
128 |
+
|
129 |
+
</body>
|
130 |
+
</html>
|
views/gdpr/banner.php
CHANGED
@@ -52,7 +52,7 @@ if (!defined('WORDFENCE_VERSION')) { exit; }
|
|
52 |
</div>
|
53 |
<div class="wf-modal-footer">
|
54 |
<ul class="wf-flex-horizontal wf-full-width wf-flex-align-right">
|
55 |
-
<li class="wf-padding-add-right"><a href="https://www.wordfence.com/help/general-data-protection-regulation/#agreement-to-new-terms-and-privacy-policies" class="wf-btn wf-btn-default" target="_blank" rel="noopener noreferrer"><?php _e('
|
56 |
<li><a href="#" class="wf-btn wf-btn-primary" id="wf-toupp-changed-agree"><?php _e('Agree', 'wordfence'); ?></a></li>
|
57 |
</ul>
|
58 |
</div>
|
52 |
</div>
|
53 |
<div class="wf-modal-footer">
|
54 |
<ul class="wf-flex-horizontal wf-full-width wf-flex-align-right">
|
55 |
+
<li class="wf-padding-add-right"><a href="https://www.wordfence.com/help/general-data-protection-regulation/#agreement-to-new-terms-and-privacy-policies" class="wf-btn wf-btn-default" target="_blank" rel="noopener noreferrer"><?php _e('Learn More', 'wordfence'); ?></a></li>
|
56 |
<li><a href="#" class="wf-btn wf-btn-primary" id="wf-toupp-changed-agree"><?php _e('Agree', 'wordfence'); ?></a></li>
|
57 |
</ul>
|
58 |
</div>
|
views/reports/activity-report-email-inline.php
CHANGED
@@ -239,7 +239,7 @@ h6 a:visited { color: purple !important; }
|
|
239 |
$stripe = wfHelperString::cycle('odd', 'even');
|
240 |
?>
|
241 |
<tr class="<?php echo $stripe ?>" style="font-size: 100%; vertical-align: baseline; margin: 0; padding: 0; border: 0;">
|
242 |
-
<td style="font-size: 100%; vertical-align: baseline; font-weight: normal; text-align: left; border-collapse: collapse; margin: 0; padding: 6px 4px; border: 1px solid #cccccc
|
243 |
<td style="font-size: 100%; vertical-align: baseline; font-weight: normal; text-align: left; border-collapse: collapse; margin: 0; padding: 6px 4px; border: 1px solid #cccccc;<?php echo $bg_colors[$stripe] ?>" align="left" valign="baseline"><?php echo esc_html($row->fail_count) ?></td>
|
244 |
<td style="font-size: 100%; vertical-align: baseline; font-weight: normal; text-align: left; border-collapse: collapse; margin: 0; padding: 6px 4px; border: 1px solid #cccccc;<?php echo $bg_colors[$stripe] ?>" align="left" valign="baseline" class="<?php echo sanitize_html_class($row->is_valid_user ? 'loginFailValidUsername' : 'loginFailInvalidUsername') ?>"><?php echo $row->is_valid_user ? __('Yes', 'wordfence') : __('No', 'wordfence') ?></td>
|
245 |
</tr>
|
@@ -384,6 +384,10 @@ h6 a:visited { color: purple !important; }
|
|
384 |
<p style="font-size: 100%; vertical-align: baseline; margin: 1em 0; padding: 0; border: 0;">
|
385 |
<?php printf(__('If you would like to sign-in to <a href="%s">%s</a> please <a href="%s">click here</a> now. You can change the frequency of this email or turn it on and off by visiting your <a href="%s">Wordfence options page</a>.', 'wordfence'), network_site_url(), network_site_url(), network_admin_url(), network_admin_url('admin.php?page=Wordfence&subpage=global_options#global-options-email-summary')); ?>
|
386 |
</p>
|
|
|
|
|
|
|
|
|
387 |
</div>
|
388 |
</td>
|
389 |
</tr>
|
239 |
$stripe = wfHelperString::cycle('odd', 'even');
|
240 |
?>
|
241 |
<tr class="<?php echo $stripe ?>" style="font-size: 100%; vertical-align: baseline; margin: 0; padding: 0; border: 0;">
|
242 |
+
<td style="font-size: 100%; vertical-align: baseline; font-weight: normal; text-align: left; border-collapse: collapse; margin: 0; padding: 6px 4px; border: 1px solid #cccccc; word-wrap: break-word; word-break: break-all; <?php echo $bg_colors[$stripe] ?>" align="left" valign="baseline"><?php echo esc_html($row->username) ?></td>
|
243 |
<td style="font-size: 100%; vertical-align: baseline; font-weight: normal; text-align: left; border-collapse: collapse; margin: 0; padding: 6px 4px; border: 1px solid #cccccc;<?php echo $bg_colors[$stripe] ?>" align="left" valign="baseline"><?php echo esc_html($row->fail_count) ?></td>
|
244 |
<td style="font-size: 100%; vertical-align: baseline; font-weight: normal; text-align: left; border-collapse: collapse; margin: 0; padding: 6px 4px; border: 1px solid #cccccc;<?php echo $bg_colors[$stripe] ?>" align="left" valign="baseline" class="<?php echo sanitize_html_class($row->is_valid_user ? 'loginFailValidUsername' : 'loginFailInvalidUsername') ?>"><?php echo $row->is_valid_user ? __('Yes', 'wordfence') : __('No', 'wordfence') ?></td>
|
245 |
</tr>
|
384 |
<p style="font-size: 100%; vertical-align: baseline; margin: 1em 0; padding: 0; border: 0;">
|
385 |
<?php printf(__('If you would like to sign-in to <a href="%s">%s</a> please <a href="%s">click here</a> now. You can change the frequency of this email or turn it on and off by visiting your <a href="%s">Wordfence options page</a>.', 'wordfence'), network_site_url(), network_site_url(), network_admin_url(), network_admin_url('admin.php?page=Wordfence&subpage=global_options#global-options-email-summary')); ?>
|
386 |
</p>
|
387 |
+
|
388 |
+
<p style="font-size: 100%; vertical-align: baseline; margin: 1em 0; padding: 0; border: 0;">
|
389 |
+
<!-- ##UNSUBSCRIBE## -->
|
390 |
+
</p>
|
391 |
</div>
|
392 |
</td>
|
393 |
</tr>
|
views/reports/activity-report.php
CHANGED
@@ -108,7 +108,7 @@ if (!defined('WORDFENCE_VERSION')) { exit; }
|
|
108 |
<?php if ($top_failed_logins): ?>
|
109 |
<?php foreach ($top_failed_logins as $row): ?>
|
110 |
<tr class="<?php echo wfHelperString::cycle('odd', 'even') ?>">
|
111 |
-
<td><?php echo esc_html($row->username) ?></td>
|
112 |
<td><?php echo esc_html($row->fail_count) ?></td>
|
113 |
<td class="<?php echo sanitize_html_class($row->is_valid_user ? 'loginFailValidUsername' : 'loginFailInvalidUsername') ?>"><?php echo $row->is_valid_user ? __('Yes', 'wordfence') : __('No', 'wordfence') ?></td>
|
114 |
</tr>
|
108 |
<?php if ($top_failed_logins): ?>
|
109 |
<?php foreach ($top_failed_logins as $row): ?>
|
110 |
<tr class="<?php echo wfHelperString::cycle('odd', 'even') ?>">
|
111 |
+
<td class="wf-split-word"><?php echo esc_html($row->username) ?></td>
|
112 |
<td><?php echo esc_html($row->fail_count) ?></td>
|
113 |
<td class="<?php echo sanitize_html_class($row->is_valid_user ? 'loginFailValidUsername' : 'loginFailInvalidUsername') ?>"><?php echo $row->is_valid_user ? __('Yes', 'wordfence') : __('No', 'wordfence') ?></td>
|
114 |
</tr>
|
views/waf/options-group-brute-force.php
CHANGED
@@ -49,7 +49,7 @@ if (!isset($collapseable)) {
|
|
49 |
</li>
|
50 |
<li>
|
51 |
<?php
|
52 |
-
$breakpoints = array(
|
53 |
$options = array();
|
54 |
foreach ($breakpoints as $b) {
|
55 |
$options[] = array('value' => $b, 'label' => $b);
|
49 |
</li>
|
50 |
<li>
|
51 |
<?php
|
52 |
+
$breakpoints = array(2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30, 40, 50, 100, 200, 500);
|
53 |
$options = array();
|
54 |
foreach ($breakpoints as $b) {
|
55 |
$options[] = array('value' => $b, 'label' => $b);
|
waf/wfWAFGeoIP2.php
CHANGED
@@ -7,9 +7,9 @@ class wfWAFGeoIP2 {
|
|
7 |
private $_reader;
|
8 |
|
9 |
/**
|
10 |
-
* Returns the singleton
|
11 |
*
|
12 |
-
* @return
|
13 |
*/
|
14 |
public static function shared() {
|
15 |
static $_geoip = null;
|
@@ -20,6 +20,16 @@ class wfWAFGeoIP2 {
|
|
20 |
}
|
21 |
|
22 |
public function __construct() {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
23 |
$this->_reader = new Reader(__DIR__ . '/../lib/GeoLite2-Country.mmdb'); //Can throw, but we don't catch it because it means the installation is likely corrupt and needs fixed anyway
|
24 |
}
|
25 |
|
7 |
private $_reader;
|
8 |
|
9 |
/**
|
10 |
+
* Returns the singleton wfWAFGeoIP2.
|
11 |
*
|
12 |
+
* @return wfWAFGeoIP2
|
13 |
*/
|
14 |
public static function shared() {
|
15 |
static $_geoip = null;
|
20 |
}
|
21 |
|
22 |
public function __construct() {
|
23 |
+
try {
|
24 |
+
if (file_exists(WFWAF_LOG_PATH . '/GeoLite2-Country.mmdb')) {
|
25 |
+
$this->_reader = new Reader(WFWAF_LOG_PATH . '/GeoLite2-Country.mmdb');
|
26 |
+
return;
|
27 |
+
}
|
28 |
+
}
|
29 |
+
catch (Exception $e) {
|
30 |
+
//Fall through to bundled copy
|
31 |
+
}
|
32 |
+
|
33 |
$this->_reader = new Reader(__DIR__ . '/../lib/GeoLite2-Country.mmdb'); //Can throw, but we don't catch it because it means the installation is likely corrupt and needs fixed anyway
|
34 |
}
|
35 |
|
wordfence.php
CHANGED
@@ -4,15 +4,15 @@ Plugin Name: Wordfence Security
|
|
4 |
Plugin URI: http://www.wordfence.com/
|
5 |
Description: Wordfence Security - Anti-virus, Firewall and Malware Scan
|
6 |
Author: Wordfence
|
7 |
-
Version: 7.1.
|
8 |
Author URI: http://www.wordfence.com/
|
9 |
Network: true
|
10 |
*/
|
11 |
if(defined('WP_INSTALLING') && WP_INSTALLING){
|
12 |
return;
|
13 |
}
|
14 |
-
define('WORDFENCE_VERSION', '7.1.
|
15 |
-
define('WORDFENCE_BUILD_NUMBER', '
|
16 |
define('WORDFENCE_BASENAME', function_exists('plugin_basename') ? plugin_basename(__FILE__) :
|
17 |
basename(dirname(__FILE__)) . '/' . basename(__FILE__));
|
18 |
|
@@ -36,9 +36,17 @@ if(get_option('wordfenceActivated') != 1){
|
|
36 |
add_action('activated_plugin','wordfence_save_activation_error'); function wordfence_save_activation_error(){ update_option('wf_plugin_act_error', ob_get_contents()); }
|
37 |
}
|
38 |
if(! defined('WORDFENCE_VERSIONONLY_MODE')){ //Used to get version from file.
|
39 |
-
|
40 |
-
|
41 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
42 |
}
|
43 |
}
|
44 |
|
4 |
Plugin URI: http://www.wordfence.com/
|
5 |
Description: Wordfence Security - Anti-virus, Firewall and Malware Scan
|
6 |
Author: Wordfence
|
7 |
+
Version: 7.1.9
|
8 |
Author URI: http://www.wordfence.com/
|
9 |
Network: true
|
10 |
*/
|
11 |
if(defined('WP_INSTALLING') && WP_INSTALLING){
|
12 |
return;
|
13 |
}
|
14 |
+
define('WORDFENCE_VERSION', '7.1.9');
|
15 |
+
define('WORDFENCE_BUILD_NUMBER', '1531408399');
|
16 |
define('WORDFENCE_BASENAME', function_exists('plugin_basename') ? plugin_basename(__FILE__) :
|
17 |
basename(dirname(__FILE__)) . '/' . basename(__FILE__));
|
18 |
|
36 |
add_action('activated_plugin','wordfence_save_activation_error'); function wordfence_save_activation_error(){ update_option('wf_plugin_act_error', ob_get_contents()); }
|
37 |
}
|
38 |
if(! defined('WORDFENCE_VERSIONONLY_MODE')){ //Used to get version from file.
|
39 |
+
$maxMemory = @ini_get('memory_limit');
|
40 |
+
$last = strtolower(substr($maxMemory, -1));
|
41 |
+
$maxMemory = (int) $maxMemory;
|
42 |
+
|
43 |
+
if ($last == 'g') { $maxMemory = $maxMemory * 1024 * 1024 * 1024; }
|
44 |
+
else if ($last == 'm') { $maxMemory = $maxMemory * 1024 * 1024; }
|
45 |
+
else if ($last == 'k') { $maxMemory = $maxMemory * 1024; }
|
46 |
+
|
47 |
+
if ($maxMemory < 134217728 /* 128 MB */ && $maxMemory > 0 /* Unlimited */) {
|
48 |
+
if (strpos(ini_get('disable_functions'), 'ini_set') === false) {
|
49 |
+
@ini_set('memory_limit', '128M'); //Some hosts have ini set at as little as 32 megs. 128 is the min sane amount of memory.
|
50 |
}
|
51 |
}
|
52 |
|