Wordfence Security – Firewall & Malware Scan - Version 3.6.1

Version Description

  • Major new release that includes the much asked for IP Range blocking with ISP blocking ability and browser blocking.
  • Added feature: WHOIS for IP's and Domains. Supports all registries and local rWhois
  • Added feature: Advanced Blocking to block IP ranges and browser patterns.
  • Added feature: WHOIS on live traffic pages.
  • Added feature: network blocking links on live traffic pages.
  • Fixed bug where W3 Total Cache and WP Super Cache cache blocked pages.
  • Added explanation of how caching affects live traffic logging if we detect a caching plugin.
  • Fixed AJAX loading to deal with multiple parallel ajax requests.
  • Updated tour to include info on new WHOIS and Advanced Blocking features.
  • Changed manual IP blocks to be permanent by default.
  • Fixed issue that caused live traffic page not to reload when IP is unblocked.
  • Modified "How does your site get IP's" config to avoid confusing new users.
  • Changed 503 block message to be more helpful with link to FAQ on how to unblock.
  • Removed redundant code in wfAPI.php
  • Optimized code by moving firewall specific code to execute only if firewall is enabled.
  • Fixed issue that caused "last attempted access" to show over 500 months ago.
  • Fixed issue that was causing warning in getIP() code.
  • Upgraded to Wordfence API version 2.6.
Download this release

Release Info

Developer mmaunder
Plugin Icon 128x128 Wordfence Security – Firewall & Malware Scan
Version 3.6.1
Comparing to
See all releases

Code changes from version 3.5.2 to 3.6.1

Files changed (146) hide show
  1. js/admin.js +178 -9
  2. lib/menu_activity.php +14 -1
  3. lib/menu_blockedIPs.php +1 -1
  4. lib/menu_options.php +4 -6
  5. lib/menu_rangeBlocking.php +93 -0
  6. lib/menu_scan.php +34 -0
  7. lib/menu_whois.php +66 -0
  8. lib/wf503.php +12 -8
  9. lib/wfAPI.php +1 -6
  10. lib/wfConfig.php +5 -0
  11. lib/wfLockedOut.php +1 -1
  12. lib/wfLog.php +111 -22
  13. lib/wfScanEngine.php +16 -1
  14. lib/wfSchema.php +9 -0
  15. lib/wfUnlockMsg.php +1 -1
  16. lib/wfUtils.php +22 -1
  17. lib/whois/.htaccess +2 -0
  18. lib/whois/LICENSE +340 -0
  19. lib/whois/handler.template.php +40 -0
  20. lib/whois/npdata.ser +1 -0
  21. lib/whois/whois.ae.php +58 -0
  22. lib/whois/whois.aero.php +45 -0
  23. lib/whois/whois.ag.php +45 -0
  24. lib/whois/whois.asia.php +44 -0
  25. lib/whois/whois.at.php +102 -0
  26. lib/whois/whois.au.php +63 -0
  27. lib/whois/whois.be.php +76 -0
  28. lib/whois/whois.biz.php +45 -0
  29. lib/whois/whois.br.php +84 -0
  30. lib/whois/whois.ca.php +76 -0
  31. lib/whois/whois.cat.php +47 -0
  32. lib/whois/whois.ch.php +82 -0
  33. lib/whois/whois.cl.php +56 -0
  34. lib/whois/whois.client.php +595 -0
  35. lib/whois/whois.cn.php +91 -0
  36. lib/whois/whois.co.php +43 -0
  37. lib/whois/whois.co.za.php +73 -0
  38. lib/whois/whois.coop.php +106 -0
  39. lib/whois/whois.cz.php +73 -0
  40. lib/whois/whois.de.php +78 -0
  41. lib/whois/whois.edu.php +62 -0
  42. lib/whois/whois.eu.php +85 -0
  43. lib/whois/whois.fi.php +57 -0
  44. lib/whois/whois.fj.php +67 -0
  45. lib/whois/whois.fm.php +80 -0
  46. lib/whois/whois.fr.php +78 -0
  47. lib/whois/whois.gtld.afternic.php +51 -0
  48. lib/whois/whois.gtld.alldomains.php +49 -0
  49. lib/whois/whois.gtld.ascio.php +51 -0
  50. lib/whois/whois.gtld.assorted.php +51 -0
  51. lib/whois/whois.gtld.corporatedomains.php +53 -0
  52. lib/whois/whois.gtld.directnic.php +53 -0
  53. lib/whois/whois.gtld.domaindiscover.php +51 -0
  54. lib/whois/whois.gtld.domainpeople.php +59 -0
  55. lib/whois/whois.gtld.dotster.php +53 -0
  56. lib/whois/whois.gtld.dreamhost.php +54 -0
  57. lib/whois/whois.gtld.enom.php +62 -0
  58. lib/whois/whois.gtld.fabulous.php +54 -0
  59. lib/whois/whois.gtld.fastdomain.php +78 -0
  60. lib/whois/whois.gtld.gandi.php +56 -0
  61. lib/whois/whois.gtld.genericb.php +40 -0
  62. lib/whois/whois.gtld.godaddy.php +56 -0
  63. lib/whois/whois.gtld.iana.php +51 -0
  64. lib/whois/whois.gtld.interdomain.php +80 -0
  65. lib/whois/whois.gtld.itsyourdomain.php +52 -0
  66. lib/whois/whois.gtld.joker.php +78 -0
  67. lib/whois/whois.gtld.markmonitor.php +55 -0
  68. lib/whois/whois.gtld.melbourneit.php +59 -0
  69. lib/whois/whois.gtld.moniker.php +52 -0
  70. lib/whois/whois.gtld.namejuice.php +53 -0
  71. lib/whois/whois.gtld.nameking.php +70 -0
  72. lib/whois/whois.gtld.names4ever.php +54 -0
  73. lib/whois/whois.gtld.namevault.php +52 -0
  74. lib/whois/whois.gtld.networksolutions.php +50 -0
  75. lib/whois/whois.gtld.nicco.php +62 -0
  76. lib/whois/whois.gtld.nicline.php +51 -0
  77. lib/whois/whois.gtld.onlinenic.php +83 -0
  78. lib/whois/whois.gtld.opensrs.php +58 -0
  79. lib/whois/whois.gtld.ovh.php +51 -0
  80. lib/whois/whois.gtld.php +81 -0
  81. lib/whois/whois.gtld.psiusa.php +90 -0
  82. lib/whois/whois.gtld.publicdomainregistry.php +57 -0
  83. lib/whois/whois.gtld.register.php +62 -0
  84. lib/whois/whois.gtld.rrpproxy.php +92 -0
  85. lib/whois/whois.gtld.schlund.php +86 -0
  86. lib/whois/whois.gtld.srsplus.php +51 -0
  87. lib/whois/whois.gtld.tmagnic.php +52 -0
  88. lib/whois/whois.gtld.tvcorp.php +50 -0
  89. lib/whois/whois.gtld.wildwestdomains.php +52 -0
  90. lib/whois/whois.hu.php +95 -0
  91. lib/whois/whois.icon.png +0 -0
  92. lib/whois/whois.idna.php +969 -0
  93. lib/whois/whois.ie.php +64 -0
  94. lib/whois/whois.in.php +45 -0
  95. lib/whois/whois.info.php +45 -0
  96. lib/whois/whois.int.php +44 -0
  97. lib/whois/whois.ip.afrinic.php +77 -0
  98. lib/whois/whois.ip.apnic.php +122 -0
  99. lib/whois/whois.ip.arin.php +78 -0
  100. lib/whois/whois.ip.krnic.php +112 -0
  101. lib/whois/whois.ip.lacnic.php +79 -0
  102. lib/whois/whois.ip.lib.php +120 -0
  103. lib/whois/whois.ip.php +285 -0
  104. lib/whois/whois.ip.ripe.php +85 -0
  105. lib/whois/whois.ir.php +60 -0
  106. lib/whois/whois.is.php +69 -0
  107. lib/whois/whois.it.php +78 -0
  108. lib/whois/whois.jp.php +111 -0
  109. lib/whois/whois.lt.php +64 -0
  110. lib/whois/whois.lu.php +78 -0
  111. lib/whois/whois.ly.php +72 -0
  112. lib/whois/whois.main.php +327 -0
  113. lib/whois/whois.me.php +45 -0
  114. lib/whois/whois.mobi.php +47 -0
  115. lib/whois/whois.museum.php +45 -0
  116. lib/whois/whois.mx.php +70 -0
  117. lib/whois/whois.name.php +45 -0
  118. lib/whois/whois.nl.php +88 -0
  119. lib/whois/whois.nu.php +90 -0
  120. lib/whois/whois.nz.php +102 -0
  121. lib/whois/whois.org.php +47 -0
  122. lib/whois/whois.org.za.php +64 -0
  123. lib/whois/whois.parser.php +873 -0
  124. lib/whois/whois.pl.php +54 -0
  125. lib/whois/whois.pro.php +43 -0
  126. lib/whois/whois.pt.php +81 -0
  127. lib/whois/whois.ro.php +99 -0
  128. lib/whois/whois.ru.php +63 -0
  129. lib/whois/whois.rwhois.php +58 -0
  130. lib/whois/whois.sc.php +45 -0
  131. lib/whois/whois.se.php +58 -0
  132. lib/whois/whois.servers.php +252 -0
  133. lib/whois/whois.si.php +55 -0
  134. lib/whois/whois.su.php +63 -0
  135. lib/whois/whois.tel.php +45 -0
  136. lib/whois/whois.travel.php +43 -0
  137. lib/whois/whois.uk.php +72 -0
  138. lib/whois/whois.us.php +44 -0
  139. lib/whois/whois.utils.php +152 -0
  140. lib/whois/whois.ve.php +75 -0
  141. lib/whois/whois.ws.php +76 -0
  142. lib/whois/whois.zanet.php +90 -0
  143. lib/wordfenceClass.php +89 -20
  144. lib/wordfenceConstants.php +1 -1
  145. readme.txt +31 -6
  146. wordfence.php +4 -4
js/admin.js CHANGED
@@ -1,6 +1,7 @@
1
if(! window['wordfenceAdmin']){
2
window['wordfenceAdmin'] = {
3
loading16: '<div class="wfLoading16"></div>',
4
actUpdateInterval: 2000,
5
dbCheckTables: [],
6
dbCheckCount_ok: 0,
@@ -92,13 +93,32 @@ window['wordfenceAdmin'] = {
92
var self = this;
93
this.tour('wfWelcomeContentCntBlk', 'wfHeading', 'top', 'left', "Learn how to Schedule Scans", function(){ self.tourRedir('WordfenceScanSchedule'); });
94
}
95
} else if(jQuery('#wordfenceMode_scanScheduling').length > 0){
96
this.mode = 'scanScheduling';
97
startTicker = false;
98
this.sched_modeChange();
99
if(! this.tourClosed){
100
var self = this;
101
- this.tour('wfWelcomeContentScanSched', 'wfHeading', 'top', 'left', "Learn how to Customize Wordfence", function(){ self.tourRedir('WordfenceSecOpt'); });
102
}
103
} else {
104
this.mode = false;
@@ -165,11 +185,16 @@ window['wordfenceAdmin'] = {
165
this.scanTourStart();
166
},
167
showLoading: function(){
168
- this.removeLoading();
169
- jQuery('<div id="wordfenceWorking">Wordfence is working...</div>').appendTo('body');
170
},
171
removeLoading: function(){
172
- jQuery('#wordfenceWorking').remove();
173
},
174
startActivityLogUpdates: function(){
175
var self = this;
@@ -563,7 +588,9 @@ window['wordfenceAdmin'] = {
563
dataType: "json",
564
data: data,
565
success: function(json){
566
- self.removeLoading();
567
if(json && json.nonce){
568
self.nonce = json.nonce;
569
}
@@ -572,7 +599,12 @@ window['wordfenceAdmin'] = {
572
}
573
cb(json);
574
},
575
- error: function(){ self.removeLoading(); cbErr(); }
576
});
577
},
578
colorbox: function(width, heading, body){
@@ -840,6 +872,117 @@ window['wordfenceAdmin'] = {
840
return m1 + ' ' + t1;
841
}
842
},
843
blockIP: function(IP, reason){
844
var self = this;
845
this.ajax('wordfence_blockIP', {
@@ -853,11 +996,12 @@ window['wordfenceAdmin'] = {
853
}
854
});
855
},
856
- blockIPTwo: function(IP, reason){
857
var self = this;
858
this.ajax('wordfence_blockIP', {
859
IP: IP,
860
- reason: reason
861
}, function(res){
862
if(res.errorMsg){
863
return;
@@ -876,7 +1020,9 @@ window['wordfenceAdmin'] = {
876
var self = this;
877
this.ajax('wordfence_unblockIP', {
878
IP: IP
879
- }, function(res){ self.staticTabChanged(); });
880
},
881
permBlockIP: function(IP){
882
var self = this;
@@ -1113,6 +1259,29 @@ window['wordfenceAdmin'] = {
1113
jQuery('.wfAjax24').hide();
1114
self.pulse('.wfSaveMsg');
1115
});
1116
}
1117
};
1118
window['WFAD'] = window['wordfenceAdmin'];
1
if(! window['wordfenceAdmin']){
2
window['wordfenceAdmin'] = {
3
loading16: '<div class="wfLoading16"></div>',
4
+ loadingCount: 0,
5
actUpdateInterval: 2000,
6
dbCheckTables: [],
7
dbCheckCount_ok: 0,
93
var self = this;
94
this.tour('wfWelcomeContentCntBlk', 'wfHeading', 'top', 'left', "Learn how to Schedule Scans", function(){ self.tourRedir('WordfenceScanSchedule'); });
95
}
96
+ } else if(jQuery('#wordfenceMode_rangeBlocking').length > 0){
97
+ this.mode = 'rangeBlocking';
98
+ startTicker = false;
99
+ if(! this.tourClosed){
100
+ var self = this;
101
+ this.tour('wfWelcomeContentRangeBlocking', 'wfHeading', 'top', 'left', "Learn how to Customize Wordfence", function(){ self.tourRedir('WordfenceSecOpt'); });
102
+ }
103
+ this.calcRangeTotal();
104
+ this.loadBlockRanges();
105
+ } else if(jQuery('#wordfenceMode_whois').length > 0){
106
+ this.mode = 'whois';
107
+ startTicker = false;
108
+ if(! this.tourClosed){
109
+ var self = this;
110
+ this.tour('wfWelcomeContentWhois', 'wfHeading', 'top', 'left', "Learn how to use Advanced Blocking", function(){ self.tourRedir('WordfenceRangeBlocking'); });
111
+ }
112
+ this.calcRangeTotal();
113
+ this.loadBlockRanges();
114
+
115
} else if(jQuery('#wordfenceMode_scanScheduling').length > 0){
116
this.mode = 'scanScheduling';
117
startTicker = false;
118
this.sched_modeChange();
119
if(! this.tourClosed){
120
var self = this;
121
+ this.tour('wfWelcomeContentScanSched', 'wfHeading', 'top', 'left', "Learn about WHOIS", function(){ self.tourRedir('WordfenceWhois'); });
122
}
123
} else {
124
this.mode = false;
185
this.scanTourStart();
186
},
187
showLoading: function(){
188
+ this.loadingCount++;
189
+ if(this.loadingCount == 1){
190
+ jQuery('<div id="wordfenceWorking">Wordfence is working...</div>').appendTo('body');
191
+ }
192
},
193
removeLoading: function(){
194
+ this.loadingCount--;
195
+ if(this.loadingCount == 0){
196
+ jQuery('#wordfenceWorking').remove();
197
+ }
198
},
199
startActivityLogUpdates: function(){
200
var self = this;
588
dataType: "json",
589
data: data,
590
success: function(json){
591
+ if(! noLoading){
592
+ self.removeLoading();
593
+ }
594
if(json && json.nonce){
595
self.nonce = json.nonce;
596
}
599
}
600
cb(json);
601
},
602
+ error: function(){
603
+ if(! noLoading){
604
+ self.removeLoading();
605
+ }
606
+ cbErr();
607
+ }
608
});
609
},
610
colorbox: function(width, heading, body){
872
return m1 + ' ' + t1;
873
}
874
},
875
+ calcRangeTotal: function(){
876
+ var range = jQuery('#ipRange').val();
877
+ if(! range){ return; }
878
+ range = range.replace(/ /g, '');
879
+ if(range && /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\s*\-\s*\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}#x2F;.test(range)){
880
+ var ips = range.split('-');
881
+ var total = this.inet_aton(ips[1]) - this.inet_aton(ips[0]) + 1;
882
+ if(total < 1){
883
+ jQuery('#wfShowRangeTotal').html("<span style=\"color: #F00;\">Invalid. Starting IP is greater than ending IP.</span>");
884
+ return;
885
+ }
886
+ jQuery('#wfShowRangeTotal').html("<span style=\"color: #0A0;\">Valid: " + total + " addresses in range.</span>");
887
+ } else {
888
+ jQuery('#wfShowRangeTotal').empty();
889
+ }
890
+ },
891
+ loadBlockRanges: function(){
892
+ var self = this;
893
+ this.ajax('wordfence_loadBlockRanges', {}, function(res){ self.completeLoadBlockRanges(res); });
894
+
895
+ },
896
+ completeLoadBlockRanges: function(res){
897
+ jQuery('#currentBlocks').empty();
898
+ if(res.results && res.results.length > 0){
899
+ jQuery('#wfBlockedRangesTmpl').tmpl(res).prependTo('#currentBlocks');
900
+ } else {
901
+ jQuery('#currentBlocks').html("You have not blocked any IP ranges or other patterns yet.");
902
+ }
903
+ },
904
+ whois: function(val){
905
+ val = val.replace(' ','');
906
+ if( ! /\w+/.test(val)){
907
+ this.colorbox('300px', "Enter a valid IP or domain", "Please enter a valid IP address or domain name for your whois lookup.");
908
+ return;
909
+ }
910
+ var self = this;
911
+ jQuery('#whoisbutton').attr('disabled', 'disabled');
912
+ jQuery('#whoisbutton').attr('value', 'Loading...');
913
+ this.ajax('wordfence_whois', {
914
+ val: val,
915
+ }, function(res){
916
+ jQuery('#whoisbutton').removeAttr('disabled');
917
+ jQuery('#whoisbutton').attr('value', 'Look up IP or Domain');
918
+ if(res.ok){
919
+ self.completeWhois(res);
920
+ }
921
+ });
922
+ },
923
+ completeWhois: function(res){
924
+ if(res.ok && res.result && res.result.rawdata && res.result.rawdata.length > 0){
925
+ var rawhtml = "";
926
+ for(var i = 0; i < res.result.rawdata.length; i++){
927
+ res.result.rawdata[i] = res.result.rawdata[i].replace(/([^\s\t\r\n:;]+@[^\s\t\r\n:;\.]+\.[^\s\t\r\n:;]+)/, "<a href=\"mailto:$1\">$1<\/a>");
928
+ res.result.rawdata[i] = res.result.rawdata[i].replace(/(https?:\/\/[^\/]+[^\s\r\n\t]+)/, "<a target=\"_blank\" href=\"$1\">$1<\/a>");
929
+ var redStyle = "";
930
+ if(this.getQueryParam('wfnetworkblock')){
931
+ redStyle = " style=\"color: #F00;\"";
932
+ }
933
+ var self = this;
934
+ function wfm21(str, ipRange, offset, str){
935
+ var ips = ipRange.split(/\s*\-\s*/);
936
+ var ip1num = self.inet_aton(ips[0]);
937
+ var ip2num = self.inet_aton(ips[1]);
938
+ var totalIPs = ip2num - ip1num + 1;
939
+ return "<a href=\"admin.php?page=WordfenceRangeBlocking&wfBlockRange=" + ipRange + "\"" + redStyle + ">" + ipRange + " [<strong>" + totalIPs + "</strong> addresses in this network. Click to block this network]<\/a>";
940
+ }
941
+
942
+ res.result.rawdata[i] = res.result.rawdata[i].replace(/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} - \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/, wfm21);
943
+ rawhtml += res.result.rawdata[i] + "<br />";
944
+ }
945
+ jQuery('#wfrawhtml').html(rawhtml);
946
+ } else {
947
+ jQuery('#wfrawhtml').html('<span style="color: #F00;">Sorry, but no data for that IP or domain was found.</span>');
948
+ }
949
+ },
950
+ blockIPUARange: function(ipRange, uaRange, reason){
951
+ if(! /\w+/.test(reason)){
952
+ this.colorbox('300px', "Please specify a reason", "You forgot to include a reason you're blocking this IP range. We ask you to include this for your own record keeping.");
953
+ return;
954
+ }
955
+ ipRange = ipRange.replace(/ /g, '');
956
+ if(ipRange){
957
+ if(! /^\d+\.\d+\.\d+\.\d+\-\d+\.\d+\.\d+\.\d+#x2F;.test(ipRange)){
958
+ this.colorbox('300px', 'Specify a valid IP range', "Please specify a valid IP address range in the form of \"1.2.3.4 - 1.2.3.5\" without quotes. Make sure the dash between the IP addresses in a normal dash (a minus sign on your keyboard) and not another character that looks like a dash.");
959
+ return;
960
+ }
961
+ }
962
+ if( ! (/\w+/.test(ipRange) || /\w+/.test(uaRange))){
963
+ this.colorbox('300px', 'Specify an IP range or Browser pattern', "Please specify either an IP address range or a web browser pattern to match.");
964
+ return;
965
+ }
966
+ var self = this;
967
+ this.ajax('wordfence_blockIPUARange', {
968
+ ipRange: ipRange,
969
+ uaRange: uaRange,
970
+ reason: reason,
971
+ }, function(res){
972
+ if(res.ok){
973
+ self.loadBlockRanges();
974
+ return;
975
+ }
976
+ });
977
+ },
978
+ unblockRange: function(id){
979
+ var self = this;
980
+ this.ajax('wordfence_unblockRange', {
981
+ id: id
982
+ }, function(res){
983
+ self.loadBlockRanges();
984
+ });
985
+ },
986
blockIP: function(IP, reason){
987
var self = this;
988
this.ajax('wordfence_blockIP', {
996
}
997
});
998
},
999
+ blockIPTwo: function(IP, reason, perm){
1000
var self = this;
1001
this.ajax('wordfence_blockIP', {
1002
IP: IP,
1003
+ reason: reason,
1004
+ perm: (perm ? '1' : '0')
1005
}, function(res){
1006
if(res.errorMsg){
1007
return;
1020
var self = this;
1021
this.ajax('wordfence_unblockIP', {
1022
IP: IP
1023
+ }, function(res){
1024
+ self.reloadActivities();
1025
+ });
1026
},
1027
permBlockIP: function(IP){
1028
var self = this;
1259
jQuery('.wfAjax24').hide();
1260
self.pulse('.wfSaveMsg');
1261
});
1262
+ },
1263
+ getQueryParam: function(name){
1264
+ name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
1265
+ var regexS = "[\\?&]" + name + "=([^&#]*)";
1266
+ var regex = new RegExp(regexS);
1267
+ var results = regex.exec(window.location.search);
1268
+ if(results == null){
1269
+ return "";
1270
+ } else {
1271
+ return decodeURIComponent(results[1].replace(/\+/g, " "));
1272
+ }
1273
+ },
1274
+ inet_aton: function(dot) {
1275
+ var d = dot.split('.');
1276
+ return ((((((+d[0])*256)+(+d[1]))*256)+(+d[2]))*256)+(+d[3]);i
1277
+ },
1278
+ inet_ntoa: function(num){
1279
+ var d = num % 256;
1280
+ for(var i = 3; i > 0; i--) {
1281
+ num = Math.floor(num/256);
1282
+ d = num%256 + '.' + d;
1283
+ }
1284
+ return d;
1285
}
1286
};
1287
window['WFAD'] = window['wordfenceAdmin'];
lib/menu_activity.php CHANGED
@@ -157,6 +157,18 @@
157
</td></tr>
158
{{if browser && browser.browser != 'Default Browser'}}<tr><td><strong>Browser:</strong> ${browser.browser}{{if browser.version}} version ${browser.version}{{/if}}{{if browser.platform && browser.platform != 'unknown'}} running on ${browser.platform}{{/if}}</td></tr>{{/if}}
159
<tr><td style="color: #AAA;">${UA}</td></tr>
160
<tr><td></td></tr>
161
</table>
162
</div>
@@ -181,7 +193,8 @@
181
<p>
182
Start by looking at "All Hits" because you may notice that a single IP address is generating most of your traffic.
183
This could be a denial of service attack, someone stealing your content or a hacker probing for weaknesses.
184
- If you see a suspicious pattern, simply block that IP address.
185
</p>
186
<p>
187
If you don't see any clear patterns of attack, take a look at "Top 404s" which will show you IP addresses that are generating excessive page not found errors.
157
</td></tr>
158
{{if browser && browser.browser != 'Default Browser'}}<tr><td><strong>Browser:</strong> ${browser.browser}{{if browser.version}} version ${browser.version}{{/if}}{{if browser.platform && browser.platform != 'unknown'}} running on ${browser.platform}{{/if}}</td></tr>{{/if}}
159
<tr><td style="color: #AAA;">${UA}</td></tr>
160
+ <tr><td>
161
+ {{if blocked}}
162
+ [<a href="#" onclick="WFAD.unblockIP('${IP}'); return false;">Unblock this IP</a>]
163
+ {{else}}
164
+ [<a href="#" onclick="WFAD.blockIP('${IP}', 'Manual block by administrator'); return false;">Block this IP</a>]
165
+ {{/if}}
166
+ &nbsp;&nbsp;&mdash;&nbsp;&nbsp;
167
+ [<a href="admin.php?page=WordfenceWhois&whoisval=${IP}&wfnetworkblock=1">Block this network</a>]
168
+ &nbsp;&nbsp;&mdash;&nbsp;&nbsp;
169
+ [<a href="admin.php?page=WordfenceWhois&whoisval=${IP}">Run WHOIS on ${IP}</a>]
170
+ &nbsp;&nbsp;&mdash;&nbsp;&nbsp;
171
+ [<a href="#">See recent traffic</a>]
172
<tr><td></td></tr>
173
</table>
174
</div>
193
<p>
194
Start by looking at "All Hits" because you may notice that a single IP address is generating most of your traffic.
195
This could be a denial of service attack, someone stealing your content or a hacker probing for weaknesses.
196
+ If you see a suspicious pattern, simply block that IP address. If they attack from a different IP on the same network, simply block that network.
197
+ You can also run a WHOIS on any IP address to find the host and report abuse via email.
198
</p>
199
<p>
200
If you don't see any clear patterns of attack, take a look at "Top 404s" which will show you IP addresses that are generating excessive page not found errors.
lib/menu_blockedIPs.php CHANGED
@@ -8,7 +8,7 @@
8
</div>
9
<div class="wordfenceWrap" style="margin: 20px 20px 20px 30px;">
10
<a href="#" onclick="WFAD.clearAllBlocked('blocked'); return false;">Clear all blocked IP addresses</a>&nbsp;&nbsp;|&nbsp;&nbsp;<a href="#" onclick="WFAD.clearAllBlocked('locked'); return false;">Clear all locked out IP addresses</a><br />
11
- You can manually block an IP by entering the address here: <input type="text" id="wfManualBlock" size="20" maxlength="40" value="" />&nbsp;<input type="button" name="but1" value="Manually block IP" onclick="WFAD.blockIPTwo(jQuery('#wfManualBlock').val(), 'Manual block by administrator'); return false;" />
12
</div>
13
<div class="wordfenceWrap">
14
<div>
8
</div>
9
<div class="wordfenceWrap" style="margin: 20px 20px 20px 30px;">
10
<a href="#" onclick="WFAD.clearAllBlocked('blocked'); return false;">Clear all blocked IP addresses</a>&nbsp;&nbsp;|&nbsp;&nbsp;<a href="#" onclick="WFAD.clearAllBlocked('locked'); return false;">Clear all locked out IP addresses</a><br />
11
+ You can manually (and permanently) block an IP by entering the address here: <input type="text" id="wfManualBlock" size="20" maxlength="40" value="" onkeydown="if(event.keyCode == 13){ WFAD.blockIPTwo(jQuery('#wfManualBlock').val(), 'Manual block by administrator', true); return false; }" />&nbsp;<input type="button" name="but1" value="Manually block IP" onclick="WFAD.blockIPTwo(jQuery('#wfManualBlock').val(), 'Manual block by administrator', true); return false;" />
12
</div>
13
<div class="wordfenceWrap">
14
<div>
lib/menu_options.php CHANGED
@@ -36,17 +36,14 @@ var WFSLevels = <?php echo json_encode(wfConfig::$securityLevels); ?>;
36
<option value="CUSTOM"<?php $w->sel('securityLevel', 'CUSTOM'); ?>>Custom settings</option>
37
</select>
38
</td></tr>
39
- <?php if(! wfConfig::get('howGetIPs', false)){ ?>
40
- <tr><td colspan="2" style="color: #F00;"><strong>Please set this now to avoid spoofing attacks:</strong></td></tr>
41
- <?php } ?>
42
- <tr><th>How does Wordfence get IPs:</td><td>
43
<select id="howGetIPs" name="howGetIPs">
44
- <option value="">This is not set. We STRONGLY recommend you set this by choosing an option and hitting "Save" for a more secure site.</option>
45
<option value="REMOTE_ADDR"<?php $w->sel('howGetIPs', 'REMOTE_ADDR'); ?>>Use PHP's built in REMOTE_ADDR. Use this if you're not using Nginx or any separate front-end proxy or firewall. Try this first.</option>
46
<option value="HTTP_X_REAL_IP"<?php $w->sel('howGetIPs', 'HTTP_X_REAL_IP'); ?>>Use the X-Real-IP HTTP header which my Nginx, firewall or front-end proxy is setting. Try this next.</option>
47
<option value="HTTP_X_FORWARDED_FOR"<?php $w->sel('howGetIPs', 'HTTP_X_FORWARDED_FOR'); ?>>Use the X-Forwarded-For HTTP header which my Nginx, firewall or front-end proxy is setting.</option>
48
<option value="HTTP_CF_CONNECTING_IP"<?php $w->sel('howGetIPs', 'HTTP_CF_CONNECTING_IP'); ?>>I'm using Cloudflare so use the "CF-Connecting-IP" HTTP header to get a visitor IP</option>
49
- </select><br /><span style="color: #999;">Check the status messages at the top of this page and your "Live Traffic" view to verify this is set correctly.</span>
50
</td></tr>
51
</table>
52
<p><table border="0" cellpadding="0" cellspacing="0"><tr><td><input type="button" id="button1" name="button1" class="button-primary" value="Save Changes" onclick="WFAD.saveConfig();" /></td><td style="height: 24px;"><div class="wfAjax24"></div><span class="wfSavedMsg">&nbsp;Your changes have been saved!</span></td></tr></table></p>
@@ -102,6 +99,7 @@ var WFSLevels = <?php echo json_encode(wfConfig::$securityLevels); ?>;
102
<tr><th>Scan comments for known dangerous URLs and suspicious content</th><td><input type="checkbox" id="scansEnabled_comments" class="wfConfigElem" name="scansEnabled_comments" value="1" <?php $w->cb('scansEnabled_comments'); ?>/></td></tr>
103
<tr><th>Scan for out of date plugins, themes and WordPress versions</th><td><input type="checkbox" id="scansEnabled_oldVersions" class="wfConfigElem" name="scansEnabled_oldVersions" value="1" <?php $w->cb('scansEnabled_oldVersions'); ?>/></td></tr>
104
<tr><th>Check the strength of passwords</th><td><input type="checkbox" id="scansEnabled_passwds" class="wfConfigElem" name="scansEnabled_passwds" value="1" <?php $w->cb('scansEnabled_passwds'); ?>/></td></tr>
105
<tr><th>Monitor disk space</th><td><input type="checkbox" id="scansEnabled_diskSpace" class="wfConfigElem" name="scansEnabled_diskSpace" value="1" <?php $w->cb('scansEnabled_diskSpace'); ?>/></td></tr>
106
<tr><th>Scan for unauthorized DNS changes</th><td><input type="checkbox" id="scansEnabled_dns" class="wfConfigElem" name="scansEnabled_dns" value="1" <?php $w->cb('scansEnabled_dns'); ?>/></td></tr>
107
<tr><th>Scan files outside your WordPress installation</th><td><input type="checkbox" id="other_scanOutside" class="wfConfigElem" name="other_scanOutside" value="1" <?php $w->cb('other_scanOutside'); ?> /></td></tr>
36
<option value="CUSTOM"<?php $w->sel('securityLevel', 'CUSTOM'); ?>>Custom settings</option>
37
</select>
38
</td></tr>
39
+ <tr><th>How does Wordfence get IPs:</th><td>
40
<select id="howGetIPs" name="howGetIPs">
41
+ <option value="">Set this option if you're seeing visitors from fake IP addresses or who appear to be from your internal network but aren't.</option>
42
<option value="REMOTE_ADDR"<?php $w->sel('howGetIPs', 'REMOTE_ADDR'); ?>>Use PHP's built in REMOTE_ADDR. Use this if you're not using Nginx or any separate front-end proxy or firewall. Try this first.</option>
43
<option value="HTTP_X_REAL_IP"<?php $w->sel('howGetIPs', 'HTTP_X_REAL_IP'); ?>>Use the X-Real-IP HTTP header which my Nginx, firewall or front-end proxy is setting. Try this next.</option>
44
<option value="HTTP_X_FORWARDED_FOR"<?php $w->sel('howGetIPs', 'HTTP_X_FORWARDED_FOR'); ?>>Use the X-Forwarded-For HTTP header which my Nginx, firewall or front-end proxy is setting.</option>
45
<option value="HTTP_CF_CONNECTING_IP"<?php $w->sel('howGetIPs', 'HTTP_CF_CONNECTING_IP'); ?>>I'm using Cloudflare so use the "CF-Connecting-IP" HTTP header to get a visitor IP</option>
46
+ </select>
47
</td></tr>
48
</table>
49
<p><table border="0" cellpadding="0" cellspacing="0"><tr><td><input type="button" id="button1" name="button1" class="button-primary" value="Save Changes" onclick="WFAD.saveConfig();" /></td><td style="height: 24px;"><div class="wfAjax24"></div><span class="wfSavedMsg">&nbsp;Your changes have been saved!</span></td></tr></table></p>
99
<tr><th>Scan comments for known dangerous URLs and suspicious content</th><td><input type="checkbox" id="scansEnabled_comments" class="wfConfigElem" name="scansEnabled_comments" value="1" <?php $w->cb('scansEnabled_comments'); ?>/></td></tr>
100
<tr><th>Scan for out of date plugins, themes and WordPress versions</th><td><input type="checkbox" id="scansEnabled_oldVersions" class="wfConfigElem" name="scansEnabled_oldVersions" value="1" <?php $w->cb('scansEnabled_oldVersions'); ?>/></td></tr>
101
<tr><th>Check the strength of passwords</th><td><input type="checkbox" id="scansEnabled_passwds" class="wfConfigElem" name="scansEnabled_passwds" value="1" <?php $w->cb('scansEnabled_passwds'); ?>/></td></tr>
102
+ <tr><th>Scan options table</th><td><input type="checkbox" id="scansEnabled_options" class="wfConfigElem" name="scansEnabled_options" value="1" <?php $w->cb('scansEnabled_options'); ?>/></td></tr>
103
<tr><th>Monitor disk space</th><td><input type="checkbox" id="scansEnabled_diskSpace" class="wfConfigElem" name="scansEnabled_diskSpace" value="1" <?php $w->cb('scansEnabled_diskSpace'); ?>/></td></tr>
104
<tr><th>Scan for unauthorized DNS changes</th><td><input type="checkbox" id="scansEnabled_dns" class="wfConfigElem" name="scansEnabled_dns" value="1" <?php $w->cb('scansEnabled_dns'); ?>/></td></tr>
105
<tr><th>Scan files outside your WordPress installation</th><td><input type="checkbox" id="other_scanOutside" class="wfConfigElem" name="other_scanOutside" value="1" <?php $w->cb('other_scanOutside'); ?> /></td></tr>
lib/menu_rangeBlocking.php ADDED
@@ -0,0 +1,93 @@
1
+ <div class="wordfenceModeElem" id="wordfenceMode_rangeBlocking"></div>
2
+ <div class="wrap" id="paidWrap">
3
+ <div class="wordfence-lock-icon wordfence-icon32"><br /></div><h2 id="wfHeading">Advanced Pattern Blocking</h2>
4
+ <div class="wordfenceWrap" style="margin: 20px 20px 20px 30px;">
5
+ <p>
6
+ <div style="width: 600px; margin-bottom: 15px;">
7
+ This page lets you block visitors who are from a range of IP addresses or are using a certain web browser or browser pattern.
8
+ You can also block a certain web browser that is visiting your site from a certain range of IP addresses. This can be useful when
9
+ blocking someone pretending to be Google and using a specific Internet Service Provider or Web Host.<br /><br />
10
+ <ul style="list-style-type:circle;">
11
+ <li>To block a range of IP addresses, enter the range and leave the User-Agent field blank.</li>
12
+ <li>To block a certain kind of web browser, enter the browser or browser pattern in the User-Agent field and leave the IP range blank</li>
13
+ <li>To block a certain kind of web browser that is accessing your site from a certain range of IP addresses, enter both the IP address range and the pattern to use to match the web browser</li>
14
+ </ul>
15
+ </div>
16
+ <table class="wfConfigForm">
17
+ <tr><th>Block anyone that has an IP address in this range:</th><td><input id="ipRange" type="text" size="30" maxlength="255" value="<?php if($_GET['wfBlockRange']){ echo $_GET['wfBlockRange']; } ?>" onkeyup="WFAD.calcRangeTotal();">&nbsp;<span id="wfShowRangeTotal"></span></td></tr>
18
+ <tr><td></td><td style="padding-bottom: 15px;"><strong>Examples:</strong> 192.168.200.200 - 192.168.200.220</td></tr>
19
+ <tr><th>...you can also enter a User-Agent (browser) that matches:</th><td><input id="uaRange" type="text" size="30" maxlength="255" >&nbsp;(Case insensitive)</td></tr>
20
+ <tr><td></td><td style="padding-bottom: 15px;"><strong>Examples:</strong> *containsBadRobot*, startsWithBadRobot*, *endsWithBadRobot</td></tr>
21
+ <tr><th>Enter a reason you're blocking this visitor pattern:</th><td><input id="wfReason" type="text" size="30" maxlength="255"></td></tr>
22
+ <tr><td></td><td style="padding-bottom: 15px;"><strong>Why a reason:</strong> The reason you specify above is for your own record keeping.</td></tr>
23
+ <tr><td colspan="2" style="padding-top: 15px;">
24
+ <input type="button" name="but3" class="button-primary" value="Block Visitors Matching this Pattern" onclick="WFAD.blockIPUARange(jQuery('#ipRange').val(), jQuery('#uaRange').val(), jQuery('#wfReason').val()); return false;" />
25
+ </td></tr>
26
+ </table>
27
+ </p>
28
+ <p>
29
+ <h2>Current list of ranges and patterns you've blocked</h2>
30
+ <div id="currentBlocks"></div>
31
+ </p>
32
+ </div>
33
+ </div>
34
+ <script type="text/javascript">
35
+ <?php
36
+ if( (! wfConfig::get('isPaid')) && (wfConfig::get('tourClosed', 0) == '1') ){
37
+ echo 'WFAD.paidUsersOnly("Range and Internet Service Provider blocking is only available to paid members.");';
38
+ }
39
+ ?>
40
+ </script>
41
+
42
+ <script type="text/x-jquery-template" id="wfBlockedRangesTmpl">
43
+ <div>
44
+ <div style="border-bottom: 1px solid #CCC; padding-bottom: 10px; margin-bottom: 10px;">
45
+ <table border="0" style="width: 100%">
46
+ {{each(idx, elem) results}}
47
+ <tr><td>
48
+ <div>
49
+ <strong>IP Range:</strong>&nbsp;${ipPattern}
50
+ </div>
51
+ <div>
52
+ <strong>Browser Pattern:</strong>&nbsp;${browserPattern}
53
+ </div>
54
+ <div>
55
+ <strong>Reason:</strong>&nbsp;${reason}
56
+ </div>
57
+ <div><a href="#" onclick="WFAD.unblockRange('${id}'); return false;">Delete this blocking pattern</a></div>
58
+ </td>
59
+ <td style="color: #999;">
60
+ <ul>
61
+ <li>${totalBlocked} blocked hits</li>
62
+ {{if lastBlockedAgo}}
63
+ <li>Last blocked: ${lastBlockedAgo}</li>
64
+ {{/if}}
65
+ </ul>
66
+ </td></tr>
67
+ {{/each}}
68
+ </table>
69
+ </div>
70
+ </div>
71
+ </script>
72
+ <script type="text/x-jquery-template" id="wfWelcomeContentRangeBlocking">
73
+ <div>
74
+ <h3>Block Networks &amp; Browsers</h3>
75
+ <strong><p>Easily block advanced attacks</p></strong>
76
+ <p>
77
+ Advanced Blocking is a new feature in Wordfence that lets you block whole networks and certain types of web browsers.
78
+ You'll sometimes find a smart attacker will change their IP address frequently to make it harder to identify and block
79
+ the attack. Usually those attackers stick to a certain network or IP address range.
80
+ Wordfence lets you block entire networks using Advanced blocking to easily defeat advanced attacks.
81
+ </p>
82
+ <p>
83
+ You may also find an attacker that is identifying themselves as a certain kind of web browser that your
84
+ normal visitors don't use. You can use our User-Agent or Browser ID blocking feature to easily block
85
+ attacks like this.
86
+ </p>
87
+ <p>
88
+ You can also block any combination of network address range and User-Agent by specifying both in Wordfence Advanced Blocking.
89
+ As always we keep track of how many attacks have been blocked and when the last attack occured so that you know
90
+ when it's safe to remove the blocking rule.
91
+ </p>
92
+ </div>
93
+ </script>
lib/menu_scan.php CHANGED
@@ -243,6 +243,40 @@
243
</div>
244
</div>
245
</script>
246
247
<script type="text/x-jquery-template" id="issueTmpl_diskSpace">
248
<div>
243
</div>
244
</div>
245
</script>
246
+ <script type="text/x-jquery-template" id="issueTmpl_badOption">
247
+ <div>
248
+ <div class="wfIssue">
249
+ <h2>${shortMsg}</h2>
250
+ <p>
251
+ <table border="0" class="wfIssue" cellspacing="0" cellpadding="0">
252
+ <tr><th>Severity:</th><td>{{if severity == '1'}}Critical{{else}}Warning{{/if}}</td></tr>
253
+ {{if data.isMultisite}}
254
+ <tr><th>Multisite Blog ID:</th><td>${data.blog_id}</td></tr>
255
+ <tr><th>Multisite Blog Domain:</th><td>${data.domain}</td></tr>
256
+ <tr><th>Multisite Blog Path:</th><td>${data.path}</td></tr>
257
+ {{/if}}
258
+ <tr><th>Status</th><td>
259
+ {{if status == 'new' }}New{{/if}}
260
+ {{if status == 'ignoreP' || status == 'ignoreC' }}Ignoring all alerts related to this option{{/if}}
261
+ </td></tr>
262
+ </table>
263
+ </p>
264
+ <p>
265
+ {{html longMsg}}
266
+ </p>
267
+ <div class="wfIssueOptions">
268
+ {{if (status == 'new')}}
269
+ <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</span>
270
+ <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreP'); return false;">Ignore issues related to this option</span>
271
+ {{/if}}
272
+ {{if status == 'ignoreP' || status == 'ignoreC'}}
273
+ <a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring issues related to this option</a>
274
+ {{/if}}
275
+ </div>
276
+ </div>
277
+ </div>
278
+ </script>
279
+
280
281
<script type="text/x-jquery-template" id="issueTmpl_diskSpace">
282
<div>
lib/menu_whois.php ADDED
@@ -0,0 +1,66 @@
1
+ <div class="wordfenceModeElem" id="wordfenceMode_whois"></div>
2
+ <div class="wrap" id="paidWrap">
3
+ <div class="wordfence-lock-icon wordfence-icon32"><br /></div><h2 id="wfHeading">WHOIS Facility: Look up the owner of an IP Address or Domain Name</h2>
4
+ <div class="wordfenceWrap" style="margin: 20px 20px 20px 30px;">
5
+ <p style="width: 600px;">
6
+ Wordfence WHOIS queries the WHOIS servers on the Internet and gets information about domain name or IP address owners. This helps you determine who is hacking your site and helps you report them to the relevant authorities. If you see a malicious IP address, do a WHOIS lookup, find out who is responsible for that IP address and send an email reporting them to the 'abuse' email address provided.<br /><br />
7
+ </p>
8
+ <p>
9
+ <input type="text" name="whois" id="wfwhois" value="" size="40" maxlength="255" onkeydown="if(event.keyCode == 13){ WFAD.whois(jQuery('#wfwhois').val()); }" />&nbsp;<input type="button" name="whoisbutton" id="whoisbutton" class="button-primary" value="Look up IP or Domain" onclick="WFAD.whois(jQuery('#wfwhois').val());" />
10
+
11
+ </p>
12
+ <?php if($_GET['wfnetworkblock']){ ?>
13
+ <h2>How to block a network</h2>
14
+ <p style="width: 600px;">
15
+ You've chosen to block the network that <span style="color: #F00;"><?php echo $_GET['whoisval']; ?></span> is part of.
16
+ We've marked the networks we found that this IP address belongs to in red below.
17
+ Make sure you read all the WHOIS information so that you see all networks this IP belongs to. We recommend blocking the network with the lowest number of addresses.
18
+ You may find this is listed at the end as part of the 'rWHOIS' query which contacts
19
+ the local WHOIS server that is run by the network administrator.
20
+ </p>
21
+ <?php } ?>
22
+ <div id="wfrawhtml">
23
+ </div>
24
+ </div>
25
+ </div>
26
+ <script type="text/x-jquery-template" id="wfBlockedRangesTmpl">
27
+ <div>
28
+ <div style="border-bottom: 1px solid #CCC; padding-bottom: 10px; margin-bottom: 10px;">
29
+ <table border="0" style="width: 100%">
30
+ {{each(idx, elem) results}}
31
+ <tr><td></td></tr>
32
+ {{/each}}
33
+ </table>
34
+ </div>
35
+ </div>
36
+ </script>
37
+ <script type="text/javascript">
38
+ var whoisval = "<?php echo $_GET['whoisval']; ?>";
39
+ if(whoisval){
40
+ jQuery(function(){
41
+ jQuery('#wfwhois').val(whoisval);
42
+ WFAD.whois(whoisval);
43
+ });
44
+ }
45
+ </script>
46
+ <script type="text/x-jquery-template" id="wfWelcomeContentWhois">
47
+ <div>
48
+ <h3>WHOIS: Look up domains and IP owners</h3>
49
+ <strong><p>Find out who's attacking you and report them!</p></strong>
50
+ <p>
51
+ Wordfence includes a new feature called "WHOIS". This feature works hand-in-glove with our
52
+ new "Advanced Blocking". Using WHOIS you can look up the owner of an IP address.
53
+ The owner information includes which networks the IP is part of. This information empowers you to do
54
+ several things.
55
+ </p>
56
+ <p>
57
+ Firstly you can report any malicious IP address to the network that owns it using the abuse email addresses provided. Secondly, you can simply
58
+ click on the network ranges in the whois information and block that entire network.
59
+ </p>
60
+ <p>
61
+ Wordfence WHOIS queries in real-time the WHOIS servers belonging to the Regional Internet Registries ARIN, RIPE, APNIC, AFRINIC and LACNIC.
62
+ We then do a further query to any local WHOIS servers that administer the networks we find and this data is returned as a rWHOIS record
63
+ at the bottom of the WHOIS result.
64
+ </p>
65
+ </div>
66
+ </script>
lib/wf503.php CHANGED
@@ -1,20 +1,24 @@
1
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
2
<html><head>
3
- <title>Wordfence has limited your access</title>
4
</head><body>
5
- <h1>Wordfence has limited your access to this site</h1>
6
<p>Your access to this service has been temporarily limited. Please try again in a few minutes. (HTTP response code 503)</p>
7
<p>Reason: <span style="color: #F00;"><?php echo $reason; ?></span></p>
8
- <p><b>Important note for site admins: </b>If you are the administrator of this website note that your access has been limited because you broke one of the Wordfence firewall rules.
9
- The reason you access was limited is: <b>"<?php echo $reason; ?>"</b>. If this is a false positive, meaning that your access to your own site has been limited incorrectly, then you
10
will need to regain access to your site, go to the Wordfence "options" page, go to the section for Firewall Rules and disable the rule that caused you to be blocked. For example,
11
if you were blocked because it was detected that you are a fake Google crawler, then disable the rule that blocks fake google crawlers. Or if you were blocked because you
12
- were accessing your site too quickly, then increase the number of accesses allowed per minute. If you're still having trouble, then simply disable the Wordfence firwall and you will
13
- still benefit from the other security features that Wordfence provides. You will find instructions below on how to regain access if you are a site administrator.
14
- </p>
15
16
- <hr>
17
<br /><br />
18
<?php require('wfUnlockMsg.php'); ?>
19
<address>This response was generated by Wordfence.</address>
20
</body></html>
1
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
2
<html><head>
3
+ <title>Your access to this site has been limited</title>
4
</head><body>
5
+ <h1>Your access to this site has been limited</h1>
6
<p>Your access to this service has been temporarily limited. Please try again in a few minutes. (HTTP response code 503)</p>
7
<p>Reason: <span style="color: #F00;"><?php echo $reason; ?></span></p>
8
+ <p style="width: 600px;"><b>Important note for site admins: </b>If you are the administrator of this website note that your access has been limited because you broke one of the Wordfence firewall rules.
9
+ The reason you access was limited is: <b>"<?php echo $reason; ?>"</b>.
10
+ <br /><br />
11
+ If this is a false positive, meaning that your access to your own site has been limited incorrectly, then you
12
will need to regain access to your site, go to the Wordfence "options" page, go to the section for Firewall Rules and disable the rule that caused you to be blocked. For example,
13
if you were blocked because it was detected that you are a fake Google crawler, then disable the rule that blocks fake google crawlers. Or if you were blocked because you
14
+ were accessing your site too quickly, then increase the number of accesses allowed per minute.
15
+ <br /><br />
16
+ If you're still having trouble, then simply disable the Wordfence firwall and you will
17
+ still benefit from the other security features that Wordfence provides.
18
19
<br /><br />
20
<?php require('wfUnlockMsg.php'); ?>
21
+
22
+ </p>
23
<address>This response was generated by Wordfence.</address>
24
</body></html>
lib/wfAPI.php CHANGED
@@ -4,7 +4,6 @@ require_once('wordfenceClass.php');
4
class wfAPI {
5
public $lastHTTPStatus = '';
6
public $lastCurlErrorNo = '';
7
- private $curlDataWritten = 0;
8
private $curlContent = 0;
9
private $APIKey = '';
10
private $wordpressVersion = '';
@@ -37,11 +36,7 @@ class wfAPI {
37
}
38
public function curlWrite($h, $d){
39
$this->curlContent .= $d;
40
- if($this->curlDataWritten > 10000000){ //10 megs
41
- return 0;
42
- } else {
43
- return strlen($d);
44
- }
45
}
46
protected function getURL($url, $postParams = array()){
47
if(function_exists('curl_init')){
4
class wfAPI {
5
public $lastHTTPStatus = '';
6
public $lastCurlErrorNo = '';
7
private $curlContent = 0;
8
private $APIKey = '';
9
private $wordpressVersion = '';
36
}
37
public function curlWrite($h, $d){
38
$this->curlContent .= $d;
39
+ return strlen($d);
40
}
41
protected function getURL($url, $postParams = array()){
42
if(function_exists('curl_init')){
lib/wfConfig.php CHANGED
@@ -29,6 +29,7 @@ class wfConfig {
29
"scansEnabled_comments" => false,
30
"scansEnabled_passwds" => false,
31
"scansEnabled_diskSpace" => false,
32
"scansEnabled_dns" => false,
33
"scansEnabled_oldVersions" => false,
34
"firewallEnabled" => false,
@@ -92,6 +93,7 @@ class wfConfig {
92
"scansEnabled_comments" => true,
93
"scansEnabled_passwds" => true,
94
"scansEnabled_diskSpace" => true,
95
"scansEnabled_dns" => true,
96
"scansEnabled_oldVersions" => true,
97
"firewallEnabled" => false,
@@ -155,6 +157,7 @@ class wfConfig {
155
"scansEnabled_comments" => true,
156
"scansEnabled_passwds" => true,
157
"scansEnabled_diskSpace" => true,
158
"scansEnabled_dns" => true,
159
"scansEnabled_oldVersions" => true,
160
"firewallEnabled" => false,
@@ -218,6 +221,7 @@ class wfConfig {
218
"scansEnabled_comments" => true,
219
"scansEnabled_passwds" => true,
220
"scansEnabled_diskSpace" => true,
221
"scansEnabled_dns" => true,
222
"scansEnabled_oldVersions" => true,
223
"firewallEnabled" => true,
@@ -281,6 +285,7 @@ class wfConfig {
281
"scansEnabled_comments" => true,
282
"scansEnabled_passwds" => true,
283
"scansEnabled_diskSpace" => true,
284
"scansEnabled_dns" => true,
285
"scansEnabled_oldVersions" => true,
286
"firewallEnabled" => true,
29
"scansEnabled_comments" => false,
30
"scansEnabled_passwds" => false,
31
"scansEnabled_diskSpace" => false,
32
+ "scansEnabled_options" => false,
33
"scansEnabled_dns" => false,
34
"scansEnabled_oldVersions" => false,
35
"firewallEnabled" => false,
93
"scansEnabled_comments" => true,
94
"scansEnabled_passwds" => true,
95
"scansEnabled_diskSpace" => true,
96
+ "scansEnabled_options" => true,
97
"scansEnabled_dns" => true,
98
"scansEnabled_oldVersions" => true,
99
"firewallEnabled" => false,
157
"scansEnabled_comments" => true,
158
"scansEnabled_passwds" => true,
159
"scansEnabled_diskSpace" => true,
160
+ "scansEnabled_options" => true,
161
"scansEnabled_dns" => true,
162
"scansEnabled_oldVersions" => true,
163
"firewallEnabled" => false,
221
"scansEnabled_comments" => true,
222
"scansEnabled_passwds" => true,
223
"scansEnabled_diskSpace" => true,
224
+ "scansEnabled_options" => true,
225
"scansEnabled_dns" => true,
226
"scansEnabled_oldVersions" => true,
227
"firewallEnabled" => true,
285
"scansEnabled_comments" => true,
286
"scansEnabled_passwds" => true,
287
"scansEnabled_diskSpace" => true,
288
+ "scansEnabled_options" => true,
289
"scansEnabled_dns" => true,
290
"scansEnabled_oldVersions" => true,
291
"firewallEnabled" => true,
lib/wfLockedOut.php CHANGED
@@ -1,4 +1,4 @@
1
- <!DOCTYPE html>
2
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="en-US">
3
<head>
4
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
1
+ <?php wfUtils::doNotCache(); ?><!DOCTYPE html>
2
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="en-US">
3
<head>
4
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
lib/wfLog.php CHANGED
@@ -22,6 +22,7 @@ class wfLog {
22
$this->scanTable = $wpdb->base_prefix . 'wfScanners';
23
$this->throttleTable = $wpdb->base_prefix . 'wfThrottleLog';
24
$this->statusTable = $wpdb->base_prefix . 'wfStatus';
25
}
26
public function logLogin($action, $fail, $username){
27
$user = get_user_by('login', $username);
@@ -50,21 +51,68 @@ class wfLog {
50
return $pagename;
51
}
52
public function logLeechAndBlock($type){ //404 or hit
53
- $IP = wfUtils::getIP();
54
- if($this->isWhitelisted($IP)){
55
- return;
56
- }
57
- if($type == '404'){
58
- $table = $this->scanTable;
59
- } else if($type == 'hit'){
60
- $table = $this->leechTable;
61
- } else {
62
- wordfence::status(1, 'error', "Invalid type to logLeechAndBlock(): $type");
63
- return;
64
- }
65
- $this->getDB()->query("insert into $table (eMin, IP, hits) values (floor(unix_timestamp() / 60), %s, 1) ON DUPLICATE KEY update hits = IF(@wfcurrenthits := hits + 1, hits + 1, hits + 1)", wfUtils::inet_aton($IP));
66
- $hitsPerMinute = $this->getDB()->querySingle("select @wfcurrenthits");
67
if(wfConfig::get('firewallEnabled')){
68
if(wfConfig::get('blockFakeBots')){
69
if(wfCrawl::isGooglebot() && (! wfCrawl::verifyCrawlerPTR($this->googlePattern, $IP) )){
70
wordfence::status(2, 'info', "Blocking fake Googlebot at IP $IP");
@@ -87,7 +135,7 @@ class wfLog {
87
$this->getDB()->query("insert IGNORE into $p"."wfVulnScanners (IP, ctime, hits) values (INET_ATON('%s'), unix_timestamp(), 1) ON DUPLICATE KEY UPDATE ctime = unix_timestamp, hits = hits + 1", $IP);
88
if(wfConfig::get('maxScanHits') != 'DISABLED'){
89
if( empty($_SERVER['HTTP_REFERER'] )){
90
- $this->getDB()->query("insert into " . $this->badLeechersTable . " (eMin, IP, hits) values (floor(unix_timestamp() / 60), %s, 1) ON DUPLICATE KEY update hits = IF(@wfblcurrenthits := hits + 1, hits + 1, hits + 1)", wfUtils::inet_aton($IP));
91
$BL_hitsPerMinute = $this->getDB()->querySingle("select @wfblcurrenthits");
92
if($BL_hitsPerMinute > wfConfig::get('maxScanHits')){
93
$this->takeBlockingAction('maxScanHits', "Exceeded the maximum number of 404 requests per minute for a known security vulnerability.");
@@ -160,6 +208,41 @@ class wfLog {
160
public function unblockIP($IP){
161
$this->getDB()->query("delete from " . $this->blocksTable . " where IP=%s", wfUtils::inet_aton($IP));
162
}
163
public function blockIP($IP, $reason, $wfsn = false, $permanent = false){ //wfsn indicates it comes from Wordfence secure network
164
if($this->isWhitelisted($IP)){ return false; }
165
$wfsn = $wfsn ? 1 : 0;
@@ -241,14 +324,19 @@ class wfLog {
241
while($elem = mysql_fetch_assoc($res)){
242
$lastHitAgo = 0;
243
$totalHits = 0;
244
- $lastLeech = $this->getDB()->querySingleRec("select unix_timestamp() as serverTime, max(eMin) * 60 as lastHit, sum(hits) as totalHits from " . $this->leechTable . " where IP=%s", $elem['IP']);
245
- if($lastLeech){ $totalHits += $lastLeech['totalHits']; $lastHitAgo = $lastLeech['serverTime'] - $lastLeech['lastHit']; }
246
- $lastScan = $this->getDB()->querySingleRec("select unix_timestamp() as serverTime, max(eMin) * 60 as lastHit, sum(hits) as totalHits from " . $this->scanTable . " where IP=%s", $elem['IP']);
247
- if($lastScan){
248
$totalHits += $lastScan['totalHits'];
249
- $ago = $lastScan['serverTime'] - $lastScan['lastHit'];
250
- if($ago < $lastHitAgo){
251
- $lastHitAgo = $ago;
252
}
253
}
254
$elem['totalHits'] = $totalHits;
@@ -589,6 +677,7 @@ class wfLog {
589
}
590
}
591
private function do503($secsToGo, $reason){
592
header('HTTP/1.1 503 Service Temporarily Unavailable');
593
header('Status: 503 Service Temporarily Unavailable');
594
if($secsToGo){
22
$this->scanTable = $wpdb->base_prefix . 'wfScanners';
23
$this->throttleTable = $wpdb->base_prefix . 'wfThrottleLog';
24
$this->statusTable = $wpdb->base_prefix . 'wfStatus';
25
+ $this->ipRangesTable = $wpdb->base_prefix . 'wfBlocksAdv';
26
}
27
public function logLogin($action, $fail, $username){
28
$user = get_user_by('login', $username);
51
return $pagename;
52
}
53
public function logLeechAndBlock($type){ //404 or hit
54
if(wfConfig::get('firewallEnabled')){
55
+ //Moved the following block into the "is fw enabled section" for optimization.
56
+ $IP = wfUtils::getIP();
57
+ $IPnum = wfUtils::inet_aton($IP);
58
+ // if($this->isWhitelisted($IP)){
59
+ // return;
60
+ // }
61
+ if($type == '404'){
62
+ $table = $this->scanTable;
63
+ } else if($type == 'hit'){
64
+ $table = $this->leechTable;
65
+ } else {
66
+ wordfence::status(1, 'error', "Invalid type to logLeechAndBlock(): $type");
67
+ return;
68
+ }
69
+ $this->getDB()->query("insert into $table (eMin, IP, hits) values (floor(unix_timestamp() / 60), %s, 1) ON DUPLICATE KEY update hits = IF(@wfcurrenthits := hits + 1, hits + 1, hits + 1)", wfUtils::inet_aton($IP));
70
+ $hitsPerMinute = $this->getDB()->querySingle("select @wfcurrenthits");
71
+ //end block moved into "is fw enabled" section
72
+
73
+ //New range and UA pattern blocking:
74
+ $r1 = $this->getDB()->query("select id, blockType, blockString from " . $this->ipRangesTable);
75
+ while($blockRec = mysql_fetch_assoc($r1)){
76
+ if($blockRec['blockType'] == 'IU'){
77
+ $ipRangeBlocked = false;
78
+ $uaPatternBlocked = false;
79
+
80
+ $bDat = explode('|', $blockRec['blockString']);
81
+ $ipRange = $bDat[0];
82
+ $uaPattern = $bDat[1];
83
+ if($ipRange){
84
+ $ips = explode('-', $ipRange);
85
+ if($IPnum >= $ips[0] && $IPnum <= $ips[1]){
86
+ $ipRangeBlocked = true;
87
+ }
88
+ }
89
+ if($uaPattern){
90
+ if(wfUtils::isUABlocked($uaPattern)){
91
+ $uaPatternBlocked = true;
92
+ }
93
+ }
94
+ $rangeBlockReason = false;
95
+ if($uaPattern && $ipRange){
96
+ if($uaPatternBlocked && $ipRangeBlocked){
97
+ $rangeBlockReason = "Advanced pattern blocking in effect.";
98
+ }
99
+ } else if($uaPattern){
100
+ if($uaPatternBlocked){
101
+ $rangeBlockReason = "Advanced pattern blocking in effect.";
102
+ }
103
+ } else if($ipRange){
104
+ if($ipRangeBlocked){
105
+ $rangeBlockReason = "Advanced pattern blocking in effect.";
106
+ }
107
+ }
108
+ if($rangeBlockReason){
109
+ $this->getDB()->query("update " . $this->ipRangesTable . " set totalBlocked = totalBlocked + 1, lastBlocked = unix_timestamp() where id=%d", $blockRec['id']);
110
+ $this->do503(3600, $rangeBlockReason);
111
+ }
112
+ }
113
+ }
114
+ //End range/UA blocking
115
+
116
if(wfConfig::get('blockFakeBots')){
117
if(wfCrawl::isGooglebot() && (! wfCrawl::verifyCrawlerPTR($this->googlePattern, $IP) )){
118
wordfence::status(2, 'info', "Blocking fake Googlebot at IP $IP");
135
$this->getDB()->query("insert IGNORE into $p"."wfVulnScanners (IP, ctime, hits) values (INET_ATON('%s'), unix_timestamp(), 1) ON DUPLICATE KEY UPDATE ctime = unix_timestamp, hits = hits + 1", $IP);
136
if(wfConfig::get('maxScanHits') != 'DISABLED'){
137
if( empty($_SERVER['HTTP_REFERER'] )){
138
+ $this->getDB()->query("insert into " . $this->badLeechersTable . " (eMin, IP, hits) values (floor(unix_timestamp() / 60), %s, 1) ON DUPLICATE KEY update hits = IF(@wfblcurrenthits := hits + 1, hits + 1, hits + 1)", $IPnum);
139
$BL_hitsPerMinute = $this->getDB()->querySingle("select @wfblcurrenthits");
140
if($BL_hitsPerMinute > wfConfig::get('maxScanHits')){
141
$this->takeBlockingAction('maxScanHits', "Exceeded the maximum number of 404 requests per minute for a known security vulnerability.");
208
public function unblockIP($IP){
209
$this->getDB()->query("delete from " . $this->blocksTable . " where IP=%s", wfUtils::inet_aton($IP));
210
}
211
+ public function unblockRange($id){
212
+ $this->getDB()->query("delete from " . $this->ipRangesTable . " where id=%d", $id);
213
+ }
214
+ public function blockRange($blockType, $range, $reason){
215
+ $this->getDB()->query("insert IGNORE into " . $this->ipRangesTable . " (blockType, blockString, ctime, reason, totalBlocked, lastBlocked) values ('%s', '%s', unix_timestamp(), '%s', 0, 0)", $blockType, $range, $reason);
216
+ return true;
217
+ }
218
+ public function getRanges(){
219
+ $res = $this->getDB()->query("select id, blockType, blockString, unix_timestamp() - ctime as ctimeAgo, reason, totalBlocked, unix_timestamp() - lastBlocked as lastBlockedAgo, lastBlocked from " . $this->ipRangesTable . " order by ctime desc");
220
+ $results = array();
221
+ while($elem = mysql_fetch_assoc($res)){
222
+ if($elem['blockType'] != 'IU'){ continue; } //We only use IU type for now, but have this for future different block types.
223
+ $elem['ctimeAgo'] = wfUtils::makeTimeAgo($elem['ctimeAgo']);
224
+ if($elem['lastBlocked'] > 0){
225
+ $elem['lastBlockedAgo'] = wfUtils::makeTimeAgo($elem['lastBlockedAgo']);
226
+ } else {
227
+ $elem['lastBlockedAgo'] = 'Never';
228
+ }
229
+ $blockDat = explode('|', $elem['blockString']);
230
+ $elem['ipPattern'] = "";
231
+ if($blockDat[0]){
232
+ $ipDat = explode('-', $blockDat[0]);
233
+ $elem['ipPattern'] = "Block visitors with IP addresses in the range: " . wfUtils::inet_ntoa($ipDat[0]) . ' - ' . wfUtils::inet_ntoa($ipDat[1]);
234
+ } else {
235
+ $elem['ipPattern'] = 'Allow all IP addresses';
236
+ }
237
+ if($blockDat[1]){
238
+ $elem['browserPattern'] = "Block visitors whos browsers match the pattern: " . $blockDat[1];
239
+ } else {
240
+ $elem['browserPattern'] = 'Allow all browsers';
241
+ }
242
+ array_push($results, $elem);
243
+ }
244
+ return $results;
245
+ }
246
public function blockIP($IP, $reason, $wfsn = false, $permanent = false){ //wfsn indicates it comes from Wordfence secure network
247
if($this->isWhitelisted($IP)){ return false; }
248
$wfsn = $wfsn ? 1 : 0;
324
while($elem = mysql_fetch_assoc($res)){
325
$lastHitAgo = 0;
326
$totalHits = 0;
327
+ $serverTime = $this->getDB()->querySingle("select unix_timestamp()");
328
+ $lastLeech = $this->getDB()->querySingleRec("select max(eMin) * 60 as lastHit, sum(hits) as totalHits from " . $this->leechTable . " where IP=%s", $elem['IP']);
329
+ //$lastLeech will be true because we use aggregation functions, so check actual values
330
+ if($lastLeech['lastHit']){
331
+ $totalHits += $lastLeech['totalHits'];
332
+ $lastHitAgo = $serverTime - $lastLeech['lastHit'];
333
+ }
334
+ $lastScan = $this->getDB()->querySingleRec("select max(eMin) * 60 as lastHit, sum(hits) as totalHits from " . $this->scanTable . " where IP=%s", $elem['IP']);
335
+ if($lastScan['lastHit']){ //Checking actual value because we will get a row back from aggregation funcs
336
$totalHits += $lastScan['totalHits'];
337
+ $lastScanAgo = $serverTime - $lastScan['lastHit'];
338
+ if($lastScanAgo < $lastHitAgo){
339
+ $lastHitAgo = $lastScanAgo;
340
}
341
}
342
$elem['totalHits'] = $totalHits;
677
}
678
}
679
private function do503($secsToGo, $reason){
680
+ wfUtils::doNotCache();
681
header('HTTP/1.1 503 Service Temporarily Unavailable');
682
header('Status: 503 Service Temporarily Unavailable');
683
if($secsToGo){
lib/wfScanEngine.php CHANGED
@@ -53,7 +53,7 @@ class wfScanEngine {
53
$this->jobList[] = 'knownFiles_init';
54
$this->jobList[] = 'knownFiles_main';
55
$this->jobList[] = 'knownFiles_finish';
56
- foreach(array('knownFiles', 'fileContents', 'posts', 'comments', 'passwds', 'dns', 'diskSpace', 'oldVersions') as $scanType){
57
if(wfConfig::get('scansEnabled_' . $scanType)){
58
if(method_exists($this, 'scan_' . $scanType . '_init')){
59
foreach(array('init', 'main', 'finish') as $op){ $this->jobList[] = $scanType . '_' . $op; };
@@ -678,6 +678,21 @@ class wfScanEngine {
678
wordfence::statusEnd($this->statusIDX['diskSpace'], false);
679
}
680
}
681
private function scan_dns(){
682
if(! function_exists('dns_get_record')){
683
$this->status(1, 'info', "Skipping DNS scan because this system does not support dns_get_record()");
53
$this->jobList[] = 'knownFiles_init';
54
$this->jobList[] = 'knownFiles_main';
55
$this->jobList[] = 'knownFiles_finish';
56
+ foreach(array('knownFiles', 'fileContents', 'posts', 'comments', 'passwds', 'options', 'dns', 'diskSpace', 'oldVersions') as $scanType){
57
if(wfConfig::get('scansEnabled_' . $scanType)){
58
if(method_exists($this, 'scan_' . $scanType . '_init')){
59
foreach(array('init', 'main', 'finish') as $op){ $this->jobList[] = $scanType . '_' . $op; };
678
wordfence::statusEnd($this->statusIDX['diskSpace'], false);
679
}
680
}
681
+ private function scan_options(){
682
+ $blogsToScan = $this->getBlogsToScan('options');
683
+ $wfdb = new wfDB();
684
+ foreach($blogsToScan as $blog){
685
+ $charset = $wfdb->querySingle("select option_value from " . $blog['table'] . " where option_name='blog_charset'");
686
+ if(strtolower($charset) == 'utf-7'){
687
+ $this->addIssue('badOption', 1, $blog['blog_id'] . 'blog_charset', $blog['blog_id'] . 'blog_charset', "An option was found in your site that indicates it may have been hacked.", "The 'blog_charset' option in your database is set to '" . $charset . "' which indicates your site may have been hacked. If hackers can gain access to your database via phpMyAdmin for example, they will change this value in order to inject malicious code into other parts of your site or allow XSS attacks. The 'badi' hack does this.", array(
688
+ 'isMultisite' => $blog['isMultisite'],
689
+ 'domain' => $blog['domain'],
690
+ 'path' => $blog['path'],
691
+ 'blog_id' => $blog['blog_id']
692
+ ));
693
+ }
694
+ }
695
+ }
696
private function scan_dns(){
697
if(! function_exists('dns_get_record')){
698
$this->status(1, 'info', "Skipping DNS scan because this system does not support dns_get_record()");
lib/wfSchema.php CHANGED
@@ -149,6 +149,15 @@ class wfSchema {
149
knownFile tinyint UNSIGNED NOT NULL,
150
oldMD5 binary(16) NOT NULL,
151
newMD5 binary(16) NOT NULL
152
) default charset=utf8"
153
);
154
private $db = false;
149
knownFile tinyint UNSIGNED NOT NULL,
150
oldMD5 binary(16) NOT NULL,
151
newMD5 binary(16) NOT NULL
152
+ ) default charset=utf8",
153
+ 'wfBlocksAdv' => "(
154
+ id int UNSIGNED NOT NULL auto_increment PRIMARY KEY,
155
+ blockType char(2) NOT NULL,
156
+ blockString varchar(255) NOT NULL,
157
+ ctime int UNSIGNED NOT NULL,
158
+ reason varchar(255) NOT NULL,
159
+ totalBlocked int UNSIGNED default 0,
160
+ lastBlocked int UNSIGNED default 0
161
) default charset=utf8"
162
);
163
private $db = false;
lib/wfUnlockMsg.php CHANGED
@@ -1,4 +1,4 @@
1
- If you are a site administrator and have been accidentally locked out, please enter your email in the box below and click "Send". If the email address you enter belongs to a known site administrator or someone set to receive Wordfence alerts, we will send you an email to help you regain access.
2
<br /><br />
3
<form method="POST" action="<?php echo wfUtils::getSiteBaseURL(); ?>?_wfsf=unlockEmail">
4
<input type="text" size="50" name="email" value="" maxlength="255" />&nbsp;<input type="submit" name="s" value="Send me an unlock email" />
1
+ If you are a site administrator and have been accidentally locked out, please enter your email in the box below and click "Send". If the email address you enter belongs to a known site administrator or someone set to receive Wordfence alerts, we will send you an email to help you regain access. <a href="http://www.wordfence.com/docs/frequently-asked-questions/#3" target="_blank">Please read our FAQ if this does not work.</a>
2
<br /><br />
3
<form method="POST" action="<?php echo wfUtils::getSiteBaseURL(); ?>?_wfsf=unlockEmail">
4
<input type="text" size="50" name="email" value="" maxlength="255" />&nbsp;<input type="submit" name="s" value="Send me an unlock email" />
lib/wfUtils.php CHANGED
@@ -129,7 +129,11 @@ class wfUtils {
129
}
130
return $IP;
131
} else {
132
- $msg = "Wordfence can't get the IP of clients and therefore can't operate. We received IP: $IP. X-Forwarded-For was: " . $_SERVER['HTTP_X_FORWARDED_FOR'] . " REMOTE_ADDR was: " . $_SERVER['REMOTE_ADDR'];
133
$possible = array();
134
foreach($_SERVER as $key => $val){
135
if(is_string($val) && preg_match('/^\d+\.\d+\.\d+\.\d+/', $val) && strlen($val) < 255){
@@ -497,6 +501,23 @@ class wfUtils {
497
@ini_set($key, $val);
498
}
499
}
500
}
501
502
129
}
130
return $IP;
131
} else {
132
+ $xFor = "";
133
+ if(isset($_SERVER['HTTP_X_FORWARDED_FOR']) ){
134
+ $xFor = $_SERVER['HTTP_X_FORWARDED_FOR'];
135
+ }
136
+ $msg = "Wordfence can't get the IP of clients and therefore can't operate. We received IP: $IP. X-Forwarded-For was: " . $xFor . " REMOTE_ADDR was: " . $_SERVER['REMOTE_ADDR'];
137
$possible = array();
138
foreach($_SERVER as $key => $val){
139
if(is_string($val) && preg_match('/^\d+\.\d+\.\d+\.\d+/', $val) && strlen($val) < 255){
501
@ini_set($key, $val);
502
}
503
}
504
+ public static function doNotCache(){
505
+ define('DONOTCACHEPAGE', true);
506
+ define('DONOTCACHEDB', true);
507
+ define('DONOTCDN', true);
508
+ define('DONOTCACHEOBJECT', true);
509
+ }
510
+ public static function isUABlocked($uaPattern){ // takes a pattern using asterisks as wildcards, turns it into regex and checks it against the visitor UA returning true if blocked
511
+ $uaPieces = explode('*', $uaPattern);
512
+ for($i = 0; $i < sizeof($uaPieces); $i++){
513
+ $uaPieces[$i] = preg_quote($uaPieces[$i]);
514
+ }
515
+ $uaPatternRegex = '/^' . implode('.*', $uaPieces) . '#x2F;i';
516
+ if(preg_match($uaPatternRegex, $_SERVER['HTTP_USER_AGENT'])){
517
+ return true;
518
+ }
519
+ return false;
520
+ }
521
}
522
523
lib/whois/.htaccess ADDED
@@ -0,0 +1,2 @@
1
+ deny from all
2
+
lib/whois/LICENSE ADDED
@@ -0,0 +1,340 @@
1
+ GNU GENERAL PUBLIC LICENSE
2
+ Version 2, June 1991
3
+
4
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
5
+ 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
6
+ Everyone is permitted to copy and distribute verbatim copies
7
+ of this license document, but changing it is not allowed.
8
+
9
+ Preamble
10
+
11
+ The licenses for most software are designed to take away your
12
+ freedom to share and change it. By contrast, the GNU General Public
13
+ License is intended to guarantee your freedom to share and change free
14
+ software--to make sure the software is free for all its users. This
15
+ General Public License applies to most of the Free Software
16
+ Foundation's software and to any other program whose authors commit to
17
+ using it. (Some other Free Software Foundation software is covered by
18
+ the GNU Library General Public License instead.) You can apply it to
19
+ your programs, too.
20
+
21
+ When we speak of free software, we are referring to freedom, not
22
+ price. Our General Public Licenses are designed to make sure that you
23
+ have the freedom to distribute copies of free software (and charge for
24
+ this service if you wish), that you receive source code or can get it
25
+ if you want it, that you can change the software or use pieces of it
26
+ in new free programs; and that you know you can do these things.
27
+
28
+ To protect your rights, we need to make restrictions that forbid
29
+ anyone to deny you these rights or to ask you to surrender the rights.
30
+ These restrictions translate to certain responsibilities for you if you
31
+ distribute copies of the software, or if you modify it.
32
+
33
+ For example, if you distribute copies of such a program, whether
34
+ gratis or for a fee, you must give the recipients all the rights that
35
+ you have. You must make sure that they, too, receive or can get the
36
+ source code. And you must show them these terms so they know their
37
+ rights.
38
+
39
+ We protect your rights with two steps: (1) copyright the software, and
40
+ (2) offer you this license which gives you legal permission to copy,
41
+ distribute and/or modify the software.
42
+
43
+ Also, for each author's protection and ours, we want to make certain
44
+ that everyone understands that there is no warranty for this free
45
+ software. If the software is modified by someone else and passed on, we
46
+ want its recipients to know that what they have is not the original, so
47
+ that any problems introduced by others will not reflect on the original
48
+ authors' reputations.
49
+
50
+ Finally, any free program is threatened constantly by software
51
+ patents. We wish to avoid the danger that redistributors of a free
52
+ program will individually obtain patent licenses, in effect making the
53
+ program proprietary. To prevent this, we have made it clear that any
54
+ patent must be licensed for everyone's free use or not licensed at all.
55
+
56
+ The precise terms and conditions for copying, distribution and
57
+ modification follow.
58
+
59
+ GNU GENERAL PUBLIC LICENSE
60
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
61
+
62
+ 0. This License applies to any program or other work which contains
63
+ a notice placed by the copyright holder saying it may be distributed
64
+ under the terms of this General Public License. The "Program", below,
65
+ refers to any such program or work, and a "work based on the Program"
66
+ means either the Program or any derivative work under copyright law:
67
+ that is to say, a work containing the Program or a portion of it,
68
+ either verbatim or with modifications and/or translated into another
69
+ language. (Hereinafter, translation is included without limitation in
70
+ the term "modification".) Each licensee is addressed as "you".
71
+
72
+ Activities other than copying, distribution and modification are not
73
+ covered by this License; they are outside its scope. The act of
74
+ running the Program is not restricted, and the output from the Program
75
+ is covered only if its contents constitute a work based on the
76
+ Program (independent of having been made by running the Program).
77
+ Whether that is true depends on what the Program does.
78
+
79
+ 1. You may copy and distribute verbatim copies of the Program's
80
+ source code as you receive it, in any medium, provided that you
81
+ conspicuously and appropriately publish on each copy an appropriate
82
+ copyright notice and disclaimer of warranty; keep intact all the
83
+ notices that refer to this License and to the absence of any warranty;
84
+ and give any other recipients of the Program a copy of this License
85
+ along with the Program.
86
+
87
+ You may charge a fee for the physical act of transferring a copy, and
88
+ you may at your option offer warranty protection in exchange for a fee.
89
+
90
+ 2. You may modify your copy or copies of the Program or any portion
91
+ of it, thus forming a work based on the Program, and copy and
92
+ distribute such modifications or work under the terms of Section 1
93
+ above, provided that you also meet all of these conditions:
94
+
95
+ a) You must cause the modified files to carry prominent notices
96
+ stating that you changed the files and the date of any change.
97
+
98
+ b) You must cause any work that you distribute or publish, that in
99
+ whole or in part contains or is derived from the Program or any
100
+ part thereof, to be licensed as a whole at no charge to all third
101
+ parties under the terms of this License.
102
+
103
+ c) If the modified program normally reads commands interactively
104
+ when run, you must cause it, when started running for such
105
+ interactive use in the most ordinary way, to print or display an
106
+ announcement including an appropriate copyright notice and a
107
+ notice that there is no warranty (or else, saying that you provide
108
+ a warranty) and that users may redistribute the program under
109
+ these conditions, and telling the user how to view a copy of this
110
+ License. (Exception: if the Program itself is interactive but
111
+ does not normally print such an announcement, your work based on
112
+ the Program is not required to print an announcement.)
113
+
114
+ These requirements apply to the modified work as a whole. If
115
+ identifiable sections of that work are not derived from the Program,
116
+ and can be reasonably considered independent and separate works in
117
+ themselves, then this License, and its terms, do not apply to those
118
+ sections when you distribute them as separate works. But when you
119
+ distribute the same sections as part of a whole which is a work based
120
+ on the Program, the distribution of the whole must be on the terms of
121
+ this License, whose permissions for other licensees extend to the
122
+ entire whole, and thus to each and every part regardless of who wrote it.
123
+
124
+ Thus, it is not the intent of this section to claim rights or contest
125
+ your rights to work written entirely by you; rather, the intent is to
126
+ exercise the right to control the distribution of derivative or
127
+ collective works based on the Program.
128
+
129
+ In addition, mere aggregation of another work not based on the Program
130
+ with the Program (or with a work based on the Program) on a volume of
131
+ a storage or distribution medium does not bring the other work under
132
+ the scope of this License.
133
+
134
+ 3. You may copy and distribute the Program (or a work based on it,
135
+ under Section 2) in object code or executable form under the terms of
136
+ Sections 1 and 2 above provided that you also do one of the following:
137
+
138
+ a) Accompany it with the complete corresponding machine-readable
139
+ source code, which must be distributed under the terms of Sections
140
+ 1 and 2 above on a medium customarily used for software interchange; or,
141
+
142
+ b) Accompany it with a written offer, valid for at least three
143
+ years, to give any third party, for a charge no more than your
144
+ cost of physically performing source distribution, a complete
145
+ machine-readable copy of the corresponding source code, to be
146
+ distributed under the terms of Sections 1 and 2 above on a medium
147
+ customarily used for software interchange; or,
148
+
149
+ c) Accompany it with the information you received as to the offer
150
+ to distribute corresponding source code. (This alternative is
151
+ allowed only for noncommercial distribution and only if you
152
+ received the program in object code or executable form with such
153
+ an offer, in accord with Subsection b above.)
154
+
155
+ The source code for a work means the preferred form of the work for
156
+ making modifications to it. For an executable work, complete source
157
+ code means all the source code for all modules it contains, plus any
158
+ associated interface definition files, plus the scripts used to
159
+ control compilation and installation of the executable. However, as a
160
+ special exception, the source code distributed need not include
161
+ anything that is normally distributed (in either source or binary
162
+ form) with the major components (compiler, kernel, and so on) of the
163
+ operating system on which the executable runs, unless that component
164
+ itself accompanies the executable.
165
+
166
+ If distribution of executable or object code is made by offering
167
+ access to copy from a designated place, then offering equivalent
168
+ access to copy the source code from the same place counts as
169
+ distribution of the source code, even though third parties are not
170
+ compelled to copy the source along with the object code.
171
+
172
+ 4. You may not copy, modify, sublicense, or distribute the Program
173
+ except as expressly provided under this License. Any attempt
174
+ otherwise to copy, modify, sublicense or distribute the Program is
175
+ void, and will automatically terminate your rights under this License.
176
+ However, parties who have received copies, or rights, from you under
177
+ this License will not have their licenses terminated so long as such
178
+ parties remain in full compliance.
179
+
180
+ 5. You are not required to accept this License, since you have not
181
+ signed it. However, nothing else grants you permission to modify or
182
+ distribute the Program or its derivative works. These actions are
183
+ prohibited by law if you do not accept this License. Therefore, by
184
+ modifying or distributing the Program (or any work based on the
185
+ Program), you indicate your acceptance of this License to do so, and
186
+ all its terms and conditions for copying, distributing or modifying
187
+ the Program or works based on it.
188
+
189
+ 6. Each time you redistribute the Program (or any work based on the
190
+ Program), the recipient automatically receives a license from the
191
+ original licensor to copy, distribute or modify the Program subject to
192
+ these terms and conditions. You may not impose any further
193
+ restrictions on the recipients' exercise of the rights granted herein.
194
+ You are not responsible for enforcing compliance by third parties to
195
+ this License.
196
+
197
+ 7. If, as a consequence of a court judgment or allegation of patent
198
+ infringement or for any other reason (not limited to patent issues),
199
+ conditions are imposed on you (whether by court order, agreement or
200
+ otherwise) that contradict the conditions of this License, they do not
201
+ excuse you from the conditions of this License. If you cannot
202
+ distribute so as to satisfy simultaneously your obligations under this
203
+ License and any other pertinent obligations, then as a consequence you
204
+ may not distribute the Program at all. For example, if a patent
205
+ license would not permit royalty-free redistribution of the Program by
206
+ all those who receive copies directly or indirectly through you, then
207
+ the only way you could satisfy both it and this License would be to
208
+ refrain entirely from distribution of the Program.
209
+
210
+ If any portion of this section is held invalid or unenforceable under
211
+ any particular circumstance, the balance of the section is intended to
212
+ apply and the section as a whole is intended to apply in other
213
+ circumstances.
214
+
215
+ It is not the purpose of this section to induce you to infringe any
216
+ patents or other property right claims or to contest validity of any
217
+ such claims; this section has the sole purpose of protecting the
218
+ integrity of the free software distribution system, which is
219
+ implemented by public license practices. Many people have made
220
+ generous contributions to the wide range of software distributed
221
+ through that system in reliance on consistent application of that
222
+ system; it is up to the author/donor to decide if he or she is willing
223
+ to distribute software through any other system and a licensee cannot
224
+ impose that choice.
225
+
226
+ This section is intended to make thoroughly clear what is believed to
227
+ be a consequence of the rest of this License.
228
+
229
+ 8. If the distribution and/or use of the Program is restricted in
230
+ certain countries either by patents or by copyrighted interfaces, the
231
+ original copyright holder who places the Program under this License
232
+ may add an explicit geographical distribution limitation excluding
233
+ those countries, so that distribution is permitted only in or among
234
+ countries not thus excluded. In such case, this License incorporates
235
+ the limitation as if written in the body of this License.
236
+
237
+ 9. The Free Software Foundation may publish revised and/or new versions
238
+ of the General Public License from time to time. Such new versions will
239
+ be similar in spirit to the present version, but may differ in detail to
240
+ address new problems or concerns.
241
+
242
+ Each version is given a distinguishing version number. If the Program
243
+ specifies a version number of this License which applies to it and "any
244
+ later version", you have the option of following the terms and conditions
245
+ either of that version or of any later version published by the Free
246
+ Software Foundation. If the Program does not specify a version number of
247
+ this License, you may choose any version ever published by the Free Software
248
+ Foundation.
249
+
250
+ 10. If you wish to incorporate parts of the Program into other free
251
+ programs whose distribution conditions are different, write to the author
252
+ to ask for permission. For software which is copyrighted by the Free
253
+ Software Foundation, write to the Free Software Foundation; we sometimes
254
+ make exceptions for this. Our decision will be guided by the two goals
255
+ of preserving the free status of all derivatives of our free software and
256
+ of promoting the sharing and reuse of software generally.
257
+
258
+ NO WARRANTY
259
+
260
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
261
+ FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
262
+ OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
263
+ PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
264
+ OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
265
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
266
+ TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
267
+ PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
268
+ REPAIR OR CORRECTION.
269
+
270
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
271
+ WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
272
+ REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
273
+ INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
274
+ OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
275
+ TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
276
+ YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
277
+ PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
278
+ POSSIBILITY OF SUCH DAMAGES.
279
+
280
+ END OF TERMS AND CONDITIONS
281
+
282
+ How to Apply These Terms to Your New Programs
283
+
284
+ If you develop a new program, and you want it to be of the greatest
285
+ possible use to the public, the best way to achieve this is to make it
286
+ free software which everyone can redistribute and change under these terms.
287
+
288
+ To do so, attach the following notices to the program. It is safest
289
+ to attach them to the start of each source file to most effectively
290
+ convey the exclusion of warranty; and each file should have at least
291
+ the "copyright" line and a pointer to where the full notice is found.
292
+
293
+ <one line to give the program's name and a brief idea of what it does.>
294
+ Copyright (C) <year> <name of author>
295
+
296
+ This program is free software; you can redistribute it and/or modify
297
+ it under the terms of the GNU General Public License as published by
298
+ the Free Software Foundation; either version 2 of the License, or
299
+ (at your option) any later version.
300
+
301
+ This program is distributed in the hope that it will be useful,
302
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
303
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
304
+ GNU General Public License for more details.
305
+
306
+ You should have received a copy of the GNU General Public License
307
+ along with this program; if not, write to the Free Software
308
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
309
+
310
+
311
+ Also add information on how to contact you by electronic and paper mail.
312
+
313
+ If the program is interactive, make it output a short notice like this
314
+ when it starts in an interactive mode:
315
+
316
+ Gnomovision version 69, Copyright (C) year name of author
317
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
318
+ This is free software, and you are welcome to redistribute it
319
+ under certain conditions; type `show c' for details.
320
+
321
+ The hypothetical commands `show w' and `show c' should show the appropriate
322
+ parts of the General Public License. Of course, the commands you use may
323
+ be called something other than `show w' and `show c'; they could even be
324
+ mouse-clicks or menu items--whatever suits your program.
325
+
326
+ You should also get your employer (if you work as a programmer) or your
327
+ school, if any, to sign a "copyright disclaimer" for the program, if
328
+ necessary. Here is a sample; alter the names:
329
+
330
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
331
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
332
+
333
+ <signature of Ty Coon>, 1 April 1989
334
+ Ty Coon, President of Vice
335
+
336
+ This General Public License does not permit incorporating your program into
337
+ proprietary programs. If your program is a subroutine library, you may
338
+ consider it more useful to permit linking proprietary applications with the
339
+ library. If this is what you want to do, use the GNU Library General
340
+ Public License instead of this License.
lib/whois/handler.template.php ADDED
@@ -0,0 +1,40 @@
1
+ <?php
2
+ /*
3
+ Whois.php PHP classes to conduct whois queries
4
+
5
+ Copyright (C)1999,2005 easyDNS Technologies Inc. & Mark Jeftovic
6
+
7
+ Maintained by David Saez
8
+
9
+ For the most recent version of this package visit:
10
+
11
+ http://www.phpwhois.org
12
+
13
+ This program is free software; you can redistribute it and/or
14
+ modify it under the terms of the GNU General Public License
15
+ as published by the Free Software Foundation; either version 2
16
+ of the License, or (at your option) any later version.
17
+
18
+ This program is distributed in the hope that it will be useful,
19
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
20
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21
+ GNU General Public License for more details.
22
+
23
+ You should have received a copy of the GNU General Public License
24
+ along with this program; if not, write to the Free Software
25
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
26
+ */
27
+
28
+ if (!defined('__XX_HANDLER__'))
29
+ define('__XX_HANDLER__', 1);
30
+
31
+ require_once('whois.parser.php');
32
+
33
+ class xx_handler
34
+ {
35
+ function parse($data_str, $query)
36
+ {
37
+ return $r;
38
+ }
39
+ }
40
+ ?>
lib/whois/npdata.ser ADDED
@@ -0,0 +1 @@
1
+ a:6:{s:11:"map_nothing";a:27:{i:0;i:173;i:1;i:847;i:2;i:6150;i:3;i:6155;i:4;i:6156;i:5;i:6157;i:6;i:8203;i:7;i:8204;i:8;i:8205;i:9;i:8288;i:10;i:65024;i:11;i:65025;i:12;i:65026;i:13;i:65027;i:14;i:65028;i:15;i:65029;i:16;i:65030;i:17;i:65031;i:18;i:65032;i:19;i:65033;i:20;i:65034;i:21;i:65035;i:22;i:65036;i:23;i:65037;i:24;i:65038;i:25;i:65039;i:26;i:65279;}s:18:"general_prohibited";a:64:{i:0;i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:4;i:4;i:5;i:5;i:6;i:6;i:7;i:7;i:8;i:8;i:9;i:9;i:10;i:10;i:11;i:11;i:12;i:12;i:13;i:13;i:14;i:14;i:15;i:15;i:16;i:16;i:17;i:17;i:18;i:18;i:19;i:19;i:20;i:20;i:21;i:21;i:22;i:22;i:23;i:23;i:24;i:24;i:25;i:25;i:26;i:26;i:27;i:27;i:28;i:28;i:29;i:29;i:30;i:30;i:31;i:31;i:32;i:32;i:33;i:33;i:34;i:34;i:35;i:35;i:36;i:36;i:37;i:37;i:38;i:38;i:39;i:39;i:40;i:40;i:41;i:41;i:42;i:42;i:43;i:43;i:44;i:44;i:45;i:47;i:46;i:59;i:47;i:60;i:48;i:61;i:49;i:62;i:50;i:63;i:51;i:64;i:52;i:91;i:53;i:92;i:54;i:93;i:55;i:94;i:56;i:95;i:57;i:96;i:58;i:123;i:59;i:124;i:60;i:125;i:61;i:126;i:62;i:127;i:63;i:12290;}s:8:"prohibit";a:84:{i:0;i:160;i:1;i:5760;i:2;i:8192;i:3;i:8193;i:4;i:8194;i:5;i:8195;i:6;i:8196;i:7;i:8197;i:8;i:8198;i:9;i:8199;i:10;i:8200;i:11;i:8201;i:12;i:8202;i:13;i:8203;i:14;i:8239;i:15;i:8287;i:16;i:12288;i:17;i:1757;i:18;i:1807;i:19;i:6158;i:20;i:8204;i:21;i:8205;i:22;i:8232;i:23;i:8233;i:24;i:65279;i:25;i:65529;i:26;i:65530;i:27;i:65531;i:28;i:65532;i:29;i:65534;i:30;i:65535;i:31;i:131070;i:32;i:131071;i:33;i:196606;i:34;i:196607;i:35;i:262142;i:36;i:262143;i:37;i:327678;i:38;i:327679;i:39;i:393214;i:40;i:393215;i:41;i:458750;i:42;i:458751;i:43;i:524286;i:44;i:524287;i:45;i:589822;i:46;i:589823;i:47;i:655358;i:48;i:655359;i:49;i:720894;i:50;i:720895;i:51;i:786430;i:52;i:786431;i:53;i:851966;i:54;i:851967;i:55;i:917502;i:56;i:917503;i:57;i:983038;i:58;i:983039;i:59;i:1048574;i:60;i:1048575;i:61;i:1114110;i:62;i:1114111;i:63;i:65529;i:64;i:65530;i:65;i:65531;i:66;i:65532;i:67;i:65533;i:68;i:832;i:69;i:833;i:70;i:8206;i:71;i:8207;i:72;i:8234;i:73;i:8235;i:74;i:8236;i:75;i:8237;i:76;i:8238;i:77;i:8298;i:78;i:8299;i:79;i:8300;i:80;i:8301;i:81;i:8302;i:82;i:8303;i:83;i:917505;}s:15:"prohibit_ranges";a:10:{i:0;a:2:{i:0;i:128;i:1;i:159;}i:1;a:2:{i:0;i:8288;i:1;i:8303;}i:2;a:2:{i:0;i:119155;i:1;i:119162;}i:3;a:2:{i:0;i:57344;i:1;i:63743;}i:4;a:2:{i:0;i:983040;i:1;i:1048573;}i:5;a:2:{i:0;i:1048576;i:1;i:1114109;}i:6;a:2:{i:0;i:64976;i:1;i:65007;}i:7;a:2:{i:0;i:55296;i:1;i:57343;}i:8;a:2:{i:0;i:12272;i:1;i:12283;}i:9;a:2:{i:0;i:917536;i:1;i:917631;}}s:11:"replacemaps";a:1401:{i:65;a:1:{i:0;i:97;}i:66;a:1:{i:0;i:98;}i:67;a:1:{i:0;i:99;}i:68;a:1:{i:0;i:100;}i:69;a:1:{i:0;i:101;}i:70;a:1:{i:0;i:102;}i:71;a:1:{i:0;i:103;}i:72;a:1:{i:0;i:104;}i:73;a:1:{i:0;i:105;}i:74;a:1:{i:0;i:106;}i:75;a:1:{i:0;i:107;}i:76;a:1:{i:0;i:108;}i:77;a:1:{i:0;i:109;}i:78;a:1:{i:0;i:110;}i:79;a:1:{i:0;i:111;}i:80;a:1:{i:0;i:112;}i:81;a:1:{i:0;i:113;}i:82;a:1:{i:0;i:114;}i:83;a:1:{i:0;i:115;}i:84;a:1:{i:0;i:116;}i:85;a:1:{i:0;i:117;}i:86;a:1:{i:0;i:118;}i:87;a:1:{i:0;i:119;}i:88;a:1:{i:0;i:120;}i:89;a:1:{i:0;i:121;}i:90;a:1:{i:0;i:122;}i:181;a:1:{i:0;i:956;}i:192;a:1:{i:0;i:224;}i:193;a:1:{i:0;i:225;}i:194;a:1:{i:0;i:226;}i:195;a:1:{i:0;i:227;}i:196;a:1:{i:0;i:228;}i:197;a:1:{i:0;i:229;}i:198;a:1:{i:0;i:230;}i:199;a:1:{i:0;i:231;}i:200;a:1:{i:0;i:232;}i:201;a:1:{i:0;i:233;}i:202;a:1:{i:0;i:234;}i:203;a:1:{i:0;i:235;}i:204;a:1:{i:0;i:236;}i:205;a:1:{i:0;i:237;}i:206;a:1:{i:0;i:238;}i:207;a:1:{i:0;i:239;}i:208;a:1:{i:0;i:240;}i:209;a:1:{i:0;i:241;}i:210;a:1:{i:0;i:242;}i:211;a:1:{i:0;i:243;}i:212;a:1:{i:0;i:244;}i:213;a:1:{i:0;i:245;}i:214;a:1:{i:0;i:246;}i:216;a:1:{i:0;i:248;}i:217;a:1:{i:0;i:249;}i:218;a:1:{i:0;i:250;}i:219;a:1:{i:0;i:251;}i:220;a:1:{i:0;i:252;}i:221;a:1:{i:0;i:253;}i:222;a:1:{i:0;i:254;}i:223;a:2:{i:0;i:115;i:1;i:115;}i:256;a:1:{i:0;i:257;}i:258;a:1:{i:0;i:259;}i:260;a:1:{i:0;i:261;}i:262;a:1:{i:0;i:263;}i:264;a:1:{i:0;i:265;}i:266;a:1:{i:0;i:267;}i:268;a:1:{i:0;i:269;}i:270;a:1:{i:0;i:271;}i:272;a:1:{i:0;i:273;}i:274;a:1:{i:0;i:275;}i:276;a:1:{i:0;i:277;}i:278;a:1:{i:0;i:279;}i:280;a:1:{i:0;i:281;}i:282;a:1:{i:0;i:283;}i:284;a:1:{i:0;i:285;}i:286;a:1:{i:0;i:287;}i:288;a:1:{i:0;i:289;}i:290;a:1:{i:0;i:291;}i:292;a:1:{i:0;i:293;}i:294;a:1:{i:0;i:295;}i:296;a:1:{i:0;i:297;}i:298;a:1:{i:0;i:299;}i:300;a:1:{i:0;i:301;}i:302;a:1:{i:0;i:303;}i:304;a:2:{i:0;i:105;i:1;i:775;}i:306;a:1:{i:0;i:307;}i:308;a:1:{i:0;i:309;}i:310;a:1:{i:0;i:311;}i:313;a:1:{i:0;i:314;}i:315;a:1:{i:0;i:316;}i:317;a:1:{i:0;i:318;}i:319;a:1:{i:0;i:320;}i:321;a:1:{i:0;i:322;}i:323;a:1:{i:0;i:324;}i:325;a:1:{i:0;i:326;}i:327;a:1:{i:0;i:328;}i:329;a:2:{i:0;i:700;i:1;i:110;}i:330;a:1:{i:0;i:331;}i:332;a:1:{i:0;i:333;}i:334;a:1:{i:0;i:335;}i:336;a:1:{i:0;i:337;}i:338;a:1:{i:0;i:339;}i:340;a:1:{i:0;i:341;}i:342;a:1:{i:0;i:343;}i:344;a:1:{i:0;i:345;}i:346;a:1:{i:0;i:347;}i:348;a:1:{i:0;i:349;}i:350;a:1:{i:0;i:351;}i:352;a:1:{i:0;i:353;}i:354;a:1:{i:0;i:355;}i:356;a:1:{i:0;i:357;}i:358;a:1:{i:0;i:359;}i:360;a:1:{i:0;i:361;}i:362;a:1:{i:0;i:363;}i:364;a:1:{i:0;i:365;}i:366;a:1:{i:0;i:367;}i:368;a:1:{i:0;i:369;}i:370;a:1:{i:0;i:371;}i:372;a:1:{i:0;i:373;}i:374;a:1:{i:0;i:375;}i:376;a:1:{i:0;i:255;}i:377;a:1:{i:0;i:378;}i:379;a:1:{i:0;i:380;}i:381;a:1:{i:0;i:382;}i:383;a:1:{i:0;i:115;}i:385;a:1:{i:0;i:595;}i:386;a:1:{i:0;i:387;}i:388;a:1:{i:0;i:389;}i:390;a:1:{i:0;i:596;}i:391;a:1:{i:0;i:392;}i:393;a:1:{i:0;i:598;}i:394;a:1:{i:0;i:599;}i:395;a:1:{i:0;i:396;}i:398;a:1:{i:0;i:477;}i:399;a:1:{i:0;i:601;}i:400;a:1:{i:0;i:603;}i:401;a:1:{i:0;i:402;}i:403;a:1:{i:0;i:608;}i:404;a:1:{i:0;i:611;}i:406;a:1:{i:0;i:617;}i:407;a:1:{i:0;i:616;}i:408;a:1:{i:0;i:409;}i:412;a:1:{i:0;i:623;}i:413;a:1:{i:0;i:626;}i:415;a:1:{i:0;i:629;}i:416;a:1:{i:0;i:417;}i:418;a:1:{i:0;i:419;}i:420;a:1:{i:0;i:421;}i:422;a:1:{i:0;i:640;}i:423;a:1:{i:0;i:424;}i:425;a:1:{i:0;i:643;}i:428;a:1:{i:0;i:429;}i:430;a:1:{i:0;i:648;}i:431;a:1:{i:0;i:432;}i:433;a:1:{i:0;i:650;}i:434;a:1:{i:0;i:651;}i:435;a:1:{i:0;i:436;}i:437;a:1:{i:0;i:438;}i:439;a:1:{i:0;i:658;}i:440;a:1:{i:0;i:441;}i:444;a:1:{i:0;i:445;}i:452;a:1:{i:0;i:454;}i:453;a:1:{i:0;i:454;}i:455;a:1:{i:0;i:457;}i:456;a:1:{i:0;i:457;}i:458;a:1:{i:0;i:460;}i:459;a:1:{i:0;i:460;}i:461;a:1:{i:0;i:462;}i:463;a:1:{i:0;i:464;}i:465;a:1:{i:0;i:466;}i:467;a:1:{i:0;i:468;}i:469;a:1:{i:0;i:470;}i:471;a:1:{i:0;i:472;}i:473;a:1:{i:0;i:474;}i:475;a:1:{i:0;i:476;}i:478;a:1:{i:0;i:479;}i:480;a:1:{i:0;i:481;}i:482;a:1:{i:0;i:483;}i:484;a:1:{i:0;i:485;}i:486;a:1:{i:0;i:487;}i:488;a:1:{i:0;i:489;}i:490;a:1:{i:0;i:491;}i:492;a:1:{i:0;i:493;}i:494;a:1:{i:0;i:495;}i:496;a:2:{i:0;i:106;i:1;i:780;}i:497;a:1:{i:0;i:499;}i:498;a:1:{i:0;i:499;}i:500;a:1:{i:0;i:501;}i:502;a:1:{i:0;i:405;}i:503;a:1:{i:0;i:447;}i:504;a:1:{i:0;i:505;}i:506;a:1:{i:0;i:507;}i:508;a:1:{i:0;i:509;}i:510;a:1:{i:0;i:511;}i:512;a:1:{i:0;i:513;}i:514;a:1:{i:0;i:515;}i:516;a:1:{i:0;i:517;}i:518;a:1:{i:0;i:519;}i:520;a:1:{i:0;i:521;}i:522;a:1:{i:0;i:523;}i:524;a:1:{i:0;i:525;}i:526;a:1:{i:0;i:527;}i:528;a:1:{i:0;i:529;}i:530;a:1:{i:0;i:531;}i:532;a:1:{i:0;i:533;}i:534;a:1:{i:0;i:535;}i:536;a:1:{i:0;i:537;}i:538;a:1:{i:0;i:539;}i:540;a:1:{i:0;i:541;}i:542;a:1:{i:0;i:543;}i:544;a:1:{i:0;i:414;}i:546;a:1:{i:0;i:547;}i:548;a:1:{i:0;i:549;}i:550;a:1:{i:0;i:551;}i:552;a:1:{i:0;i:553;}i:554;a:1:{i:0;i:555;}i:556;a:1:{i:0;i:557;}i:558;a:1:{i:0;i:559;}i:560;a:1:{i:0;i:561;}i:562;a:1:{i:0;i:563;}i:837;a:1:{i:0;i:953;}i:890;a:2:{i:0;i:32;i:1;i:953;}i:902;a:1:{i:0;i:940;}i:904;a:1:{i:0;i:941;}i:905;a:1:{i:0;i:942;}i:906;a:1:{i:0;i:943;}i:908;a:1:{i:0;i:972;}i:910;a:1:{i:0;i:973;}i:911;a:1:{i:0;i:974;}i:912;a:3:{i:0;i:953;i:1;i:776;i:2;i:769;}i:913;a:1:{i:0;i:945;}i:914;a:1:{i:0;i:946;}i:915;a:1:{i:0;i:947;}i:916;a:1:{i:0;i:948;}i:917;a:1:{i:0;i:949;}i:918;a:1:{i:0;i:950;}i:919;a:1:{i:0;i:951;}i:920;a:1:{i:0;i:952;}i:921;a:1:{i:0;i:953;}i:922;a:1:{i:0;i:954;}i:923;a:1:{i:0;i:955;}i:924;a:1:{i:0;i:956;}i:925;a:1:{i:0;i:957;}i:926;a:1:{i:0;i:958;}i:927;a:1:{i:0;i:959;}i:928;a:1:{i:0;i:960;}i:929;a:1:{i:0;i:961;}i:931;a:1:{i:0;i:963;}i:932;a:1:{i:0;i:964;}i:933;a:1:{i:0;i:965;}i:934;a:1:{i:0;i:966;}i:935;a:1:{i:0;i:967;}i:936;a:1:{i:0;i:968;}i:937;a:1:{i:0;i:969;}i:938;a:1:{i:0;i:970;}i:939;a:1:{i:0;i:971;}i:944;a:3:{i:0;i:965;i:1;i:776;i:2;i:769;}i:962;a:1:{i:0;i:963;}i:976;a:1:{i:0;i:946;}i:977;a:1:{i:0;i:952;}i:978;a:1:{i:0;i:965;}i:979;a:1:{i:0;i:973;}i:980;a:1:{i:0;i:971;}i:981;a:1:{i:0;i:966;}i:982;a:1:{i:0;i:960;}i:984;a:1:{i:0;i:985;}i:986;a:1:{i:0;i:987;}i:988;a:1:{i:0;i:989;}i:990;a:1:{i:0;i:991;}i:992;a:1:{i:0;i:993;}i:994;a:1:{i:0;i:995;}i:996;a:1:{i:0;i:997;}i:998;a:1:{i:0;i:999;}i:1000;a:1:{i:0;i:1001;}i:1002;a:1:{i:0;i:1003;}i:1004;a:1:{i:0;i:1005;}i:1006;a:1:{i:0;i:1007;}i:1008;a:1:{i:0;i:954;}i:1009;a:1:{i:0;i:961;}i:1010;a:1:{i:0;i:963;}i:1012;a:1:{i:0;i:952;}i:1013;a:1:{i:0;i:949;}i:1024;a:1:{i:0;i:1104;}i:1025;a:1:{i:0;i:1105;}i:1026;a:1:{i:0;i:1106;}i:1027;a:1:{i:0;i:1107;}i:1028;a:1:{i:0;i:1108;}i:1029;a:1:{i:0;i:1109;}i:1030;a:1:{i:0;i:1110;}i:1031;a:1:{i:0;i:1111;}i:1032;a:1:{i:0;i:1112;}i:1033;a:1:{i:0;i:1113;}i:1034;a:1:{i:0;i:1114;}i:1035;a:1:{i:0;i:1115;}i:1036;a:1:{i:0;i:1116;}i:1037;a:1:{i:0;i:1117;}i:1038;a:1:{i:0;i:1118;}i:1039;a:1:{i:0;i:1119;}i:1040;a:1:{i:0;i:1072;}i:1041;a:1:{i:0;i:1073;}i:1042;a:1:{i:0;i:1074;}i:1043;a:1:{i:0;i:1075;}i:1044;a:1:{i:0;i:1076;}i:1045;a:1:{i:0;i:1077;}i:1046;a:1:{i:0;i:1078;}i:1047;a:1:{i:0;i:1079;}i:1048;a:1:{i:0;i:1080;}i:1049;a:1:{i:0;i:1081;}i:1050;a:1:{i:0;i:1082;}i:1051;a:1:{i:0;i:1083;}i:1052;a:1:{i:0;i:1084;}i:1053;a:1:{i:0;i:1085;}i:1054;a:1:{i:0;i:1086;}i:1055;a:1:{i:0;i:1087;}i:1056;a:1:{i:0;i:1088;}i:1057;a:1:{i:0;i:1089;}i:1058;a:1:{i:0;i:1090;}i:1059;a:1:{i:0;i:1091;}i:1060;a:1:{i:0;i:1092;}i:1061;a:1:{i:0;i:1093;}i:1062;a:1:{i:0;i:1094;}i:1063;a:1:{i:0;i:1095;}i:1064;a:1:{i:0;i:1096;}i:1065;a:1:{i:0;i:1097;}i:1066;a:1:{i:0;i:1098;}i:1067;a:1:{i:0;i:1099;}i:1068;a:1:{i:0;i:1100;}i:1069;a:1:{i:0;i:1101;}i:1070;a:1:{i:0;i:1102;}i:1071;a:1:{i:0;i:1103;}i:1120;a:1:{i:0;i:1121;}i:1122;a:1:{i:0;i:1123;}i:1124;a:1:{i:0;i:1125;}i:1126;a:1:{i:0;i:1127;}i:1128;a:1:{i:0;i:1129;}i:1130;a:1:{i:0;i:1131;}i:1132;a:1:{i:0;i:1133;}i:1134;a:1:{i:0;i:1135;}i:1136;a:1:{i:0;i:1137;}i:1138;a:1:{i:0;i:1139;}i:1140;a:1:{i:0;i:1141;}i:1142;a:1:{i:0;i:1143;}i:1144;a:1:{i:0;i:1145;}i:1146;a:1:{i:0;i:1147;}i:1148;a:1:{i:0;i:1149;}i:1150;a:1:{i:0;i:1151;}i:1152;a:1:{i:0;i:1153;}i:1162;a:1:{i:0;i:1163;}i:1164;a:1:{i:0;i:1165;}i:1166;a:1:{i:0;i:1167;}i:1168;a:1:{i:0;i:1169;}i:1170;a:1:{i:0;i:1171;}i:1172;a:1:{i:0;i:1173;}i:1174;a:1:{i:0;i:1175;}i:1176;a:1:{i:0;i:1177;}i:1178;a:1:{i:0;i:1179;}i:1180;a:1:{i:0;i:1181;}i:1182;a:1:{i:0;i:1183;}i:1184;a:1:{i:0;i:1185;}i:1186;a:1:{i:0;i:1187;}i:1188;a:1:{i:0;i:1189;}i:1190;a:1:{i:0;i:1191;}i:1192;a:1:{i:0;i:1193;}i:1194;a:1:{i:0;i:1195;}i:1196;a:1:{i:0;i:1197;}i:1198;a:1:{i:0;i:1199;}i:1200;a:1:{i:0;i:1201;}i:1202;a:1:{i:0;i:1203;}i:1204;a:1:{i:0;i:1205;}i:1206;a:1:{i:0;i:1207;}i:1208;a:1:{i:0;i:1209;}i:1210;a:1:{i:0;i:1211;}i:1212;a:1:{i:0;i:1213;}i:1214;a:1:{i:0;i:1215;}i:1217;a:1:{i:0;i:1218;}i:1219;a:1:{i:0;i:1220;}i:1221;a:1:{i:0;i:1222;}i:1223;a:1:{i:0;i:1224;}i:1225;a:1:{i:0;i:1226;}i:1227;a:1:{i:0;i:1228;}i:1229;a:1:{i:0;i:1230;}i:1232;a:1:{i:0;i:1233;}i:1234;a:1:{i:0;i:1235;}i:1236;a:1:{i:0;i:1237;}i:1238;a:1:{i:0;i:1239;}i:1240;a:1:{i:0;i:1241;}i:1242;a:1:{i:0;i:1243;}i:1244;a:1:{i:0;i:1245;}i:1246;a:1:{i:0;i:1247;}i:1248;a:1:{i:0;i:1249;}i:1250;a:1:{i:0;i:1251;}i:1252;a:1:{i:0;i:1253;}i:1254;a:1:{i:0;i:1255;}i:1256;a:1:{i:0;i:1257;}i:1258;a:1:{i:0;i:1259;}i:1260;a:1:{i:0;i:1261;}i:1262;a:1:{i:0;i:1263;}i:1264;a:1:{i:0;i:1265;}i:1266;a:1:{i:0;i:1267;}i:1268;a:1:{i:0;i:1269;}i:1272;a:1:{i:0;i:1273;}i:1280;a:1:{i:0;i:1281;}i:1282;a:1:{i:0;i:1283;}i:1284;a:1:{i:0;i:1285;}i:1286;a:1:{i:0;i:1287;}i:1288;a:1:{i:0;i:1289;}i:1290;a:1:{i:0;i:1291;}i:1292;a:1:{i:0;i:1293;}i:1294;a:1:{i:0;i:1295;}i:1329;a:1:{i:0;i:1377;}i:1330;a:1:{i:0;i:1378;}i:1331;a:1:{i:0;i:1379;}i:1332;a:1:{i:0;i:1380;}i:1333;a:1:{i:0;i:1381;}i:1334;a:1:{i:0;i:1382;}i:1335;a:1:{i:0;i:1383;}i:1336;a:1:{i:0;i:1384;}i:1337;a:1:{i:0;i:1385;}i:1338;a:1:{i:0;i:1386;}i:1339;a:1:{i:0;i:1387;}i:1340;a:1:{i:0;i:1388;}i:1341;a:1:{i:0;i:1389;}i:1342;a:1:{i:0;i:1390;}i:1343;a:1:{i:0;i:1391;}i:1344;a:1:{i:0;i:1392;}i:1345;a:1:{i:0;i:1393;}i:1346;a:1:{i:0;i:1394;}i:1347;a:1:{i:0;i:1395;}i:1348;a:1:{i:0;i:1396;}i:1349;a:1:{i:0;i:1397;}i:1350;a:1:{i:0;i:1398;}i:1351;a:1:{i:0;i:1399;}i:1352;a:1:{i:0;i:1400;}i:1353;a:1:{i:0;i:1401;}i:1354;a:1:{i:0;i:1402;}i:1355;a:1:{i:0;i:1403;}i:1356;a:1:{i:0;i:1404;}i:1357;a:1:{i:0;i:1405;}i:1358;a:1:{i:0;i:1406;}i:1359;a:1:{i:0;i:1407;}i:1360;a:1:{i:0;i:1408;}i:1361;a:1:{i:0;i:1409;}i:1362;a:1:{i:0;i:1410;}i:1363;a:1:{i:0;i:1411;}i:1364;a:1:{i:0;i:1412;}i:1365;a:1:{i:0;i:1413;}i:1366;a:1:{i:0;i:1414;}i:1415;a:2:{i:0;i:1381;i:1;i:1410;}i:7680;a:1:{i:0;i:7681;}i:7682;a:1:{i:0;i:7683;}i:7684;a:1:{i:0;i:7685;}i:7686;a:1:{i:0;i:7687;}i:7688;a:1:{i:0;i:7689;}i:7690;a:1:{i:0;i:7691;}i:7692;a:1:{i:0;i:7693;}i:7694;a:1:{i:0;i:7695;}i:7696;a:1:{i:0;i:7697;}i:7698;a:1:{i:0;i:7699;}i:7700;a:1:{i:0;i:7701;}i:7702;a:1:{i:0;i:7703;}i:7704;a:1:{i:0;i:7705;}i:7706;a:1:{i:0;i:7707;}i:7708;a:1:{i:0;i:7709;}i:7710;a:1:{i:0;i:7711;}i:7712;a:1:{i:0;i:7713;}i:7714;a:1:{i:0;i:7715;}i:7716;a:1:{i:0;i:7717;}i:7718;a:1:{i:0;i:7719;}i:7720;a:1:{i:0;i:7721;}i:7722;a:1:{i:0;i:7723;}i:7724;a:1:{i:0;i:7725;}i:7726;a:1:{i:0;i:7727;}i:7728;a:1:{i:0;i:7729;}i:7730;a:1:{i:0;i:7731;}i:7732;a:1:{i:0;i:7733;}i:7734;a:1:{i:0;i:7735;}i:7736;a:1:{i:0;i:7737;}i:7738;a:1:{i:0;i:7739;}i:7740;a:1:{i:0;i:7741;}i:7742;a:1:{i:0;i:7743;}i:7744;a:1:{i:0;i:7745;}i:7746;a:1:{i:0;i:7747;}i:7748;a:1:{i:0;i:7749;}i:7750;a:1:{i:0;i:7751;}i:7752;a:1:{i:0;i:7753;}i:7754;a:1:{i:0;i:7755;}i:7756;a:1:{i:0;i:7757;}i:7758;a:1:{i:0;i:7759;}i:7760;a:1:{i:0;i:7761;}i:7762;a:1:{i:0;i:7763;}i:7764;a:1:{i:0;i:7765;}i:7766;a:1:{i:0;i:7767;}i:7768;a:1:{i:0;i:7769;}i:7770;a:1:{i:0;i:7771;}i:7772;a:1:{i:0;i:7773;}i:7774;a:1:{i:0;i:7775;}i:7776;a:1:{i:0;i:7777;}i:7778;a:1:{i:0;i:7779;}i:7780;a:1:{i:0;i:7781;}i:7782;a:1:{i:0;i:7783;}i:7784;a:1:{i:0;i:7785;}i:7786;a:1:{i:0;i:7787;}i:7788;a:1:{i:0;i:7789;}i:7790;a:1:{i:0;i:7791;}i:7792;a:1:{i:0;i:7793;}i:7794;a:1:{i:0;i:7795;}i:7796;a:1:{i:0;i:7797;}i:7798;a:1:{i:0;i:7799;}i:7800;a:1:{i:0;i:7801;}i:7802;a:1:{i:0;i:7803;}i:7804;a:1:{i:0;i:7805;}i:7806;a:1:{i:0;i:7807;}i:7808;a:1:{i:0;i:7809;}i:7810;a:1:{i:0;i:7811;}i:7812;a:1:{i:0;i:7813;}i:7814;a:1:{i:0;i:7815;}i:7816;a:1:{i:0;i:7817;}i:7818;a:1:{i:0;i:7819;}i:7820;a:1:{i:0;i:7821;}i:7822;a:1:{i:0;i:7823;}i:7824;a:1:{i:0;i:7825;}i:7826;a:1:{i:0;i:7827;}i:7828;a:1:{i:0;i:7829;}i:7830;a:2:{i:0;i:104;i:1;i:817;}i:7831;a:2:{i:0;i:116;i:1;i:776;}i:7832;a:2:{i:0;i:119;i:1;i:778;}i:7833;a:2:{i:0;i:121;i:1;i:778;}i:7834;a:2:{i:0;i:97;i:1;i:702;}i:7835;a:1:{i:0;i:7777;}i:7840;a:1:{i:0;i:7841;}i:7842;a:1:{i:0;i:7843;}i:7844;a:1:{i:0;i:7845;}i:7846;a:1:{i:0;i:7847;}i:7848;a:1:{i:0;i:7849;}i:7850;a:1:{i:0;i:7851;}i:7852;a:1:{i:0;i:7853;}i:7854;a:1:{i:0;i:7855;}i:7856;a:1:{i:0;i:7857;}i:7858;a:1:{i:0;i:7859;}i:7860;a:1:{i:0;i:7861;}i:7862;a:1:{i:0;i:7863;}i:7864;a:1:{i:0;i:7865;}i:7866;a:1:{i:0;i:7867;}i:7868;a:1:{i:0;i:7869;}i:7870;a:1:{i:0;i:7871;}i:7872;a:1:{i:0;i:7873;}i:7874;a:1:{i:0;i:7875;}i:7876;a:1:{i:0;i:7877;}i:7878;a:1:{i:0;i:7879;}i:7880;a:1:{i:0;i:7881;}i:7882;a:1:{i:0;i:7883;}i:7884;a:1:{i:0;i:7885;}i:7886;a:1:{i:0;i:7887;}i:7888;a:1:{i:0;i:7889;}i:7890;a:1:{i:0;i:7891;}i:7892;a:1:{i:0;i:7893;}i:7894;a:1:{i:0;i:7895;}i:7896;a:1:{i:0;i:7897;}i:7898;a:1:{i:0;i:7899;}i:7900;a:1:{i:0;i:7901;}i:7902;a:1:{i:0;i:7903;}i:7904;a:1:{i:0;i:7905;}i:7906;a:1:{i:0;i:7907;}i:7908;a:1:{i:0;i:7909;}i:7910;a:1:{i:0;i:7911;}i:7912;a:1:{i:0;i:7913;}i:7914;a:1:{i:0;i:7915;}i:7916;a:1:{i:0;i:7917;}i:7918;a:1:{i:0;i:7919;}i:7920;a:1:{i:0;i:7921;}i:7922;a:1:{i:0;i:7923;}i:7924;a:1:{i:0;i:7925;}i:7926;a:1:{i:0;i:7927;}i:7928;a:1:{i:0;i:7929;}i:7944;a:1:{i:0;i:7936;}i:7945;a:1:{i:0;i:7937;}i:7946;a:1:{i:0;i:7938;}i:7947;a:1:{i:0;i:7939;}i:7948;a:1:{i:0;i:7940;}i:7949;a:1:{i:0;i:7941;}i:7950;a:1:{i:0;i:7942;}i:7951;a:1:{i:0;i:7943;}i:7960;a:1:{i:0;i:7952;}i:7961;a:1:{i:0;i:7953;}i:7962;a:1:{i:0;i:7954;}i:7963;a:1:{i:0;i:7955;}i:7964;a:1:{i:0;i:7956;}i:7965;a:1:{i:0;i:7957;}i:7976;a:1:{i:0;i:7968;}i:7977;a:1:{i:0;i:7969;}i:7978;a:1:{i:0;i:7970;}i:7979;a:1:{i:0;i:7971;}i:7980;a:1:{i:0;i:7972;}i:7981;a:1:{i:0;i:7973;}i:7982;a:1:{i:0;i:7974;}i:7983;a:1:{i:0;i:7975;}i:7992;a:1:{i:0;i:7984;}i:7993;a:1:{i:0;i:7985;}i:7994;a:1:{i:0;i:7986;}i:7995;a:1:{i:0;i:7987;}i:7996;a:1:{i:0;i:7988;}i:7997;a:1:{i:0;i:7989;}i:7998;a:1:{i:0;i:7990;}i:7999;a:1:{i:0;i:7991;}i:8008;a:1:{i:0;i:8000;}i:8009;a:1:{i:0;i:8001;}i:8010;a:1:{i:0;i:8002;}i:8011;a:1:{i:0;i:8003;}i:8012;a:1:{i:0;i:8004;}i:8013;a:1:{i:0;i:8005;}i:8016;a:2:{i:0;i:965;i:1;i:787;}i:8018;a:3:{i:0;i:965;i:1;i:787;i:2;i:768;}i:8020;a:3:{i:0;i:965;i:1;i:787;i:2;i:769;}i:8022;a:3:{i:0;i:965;i:1;i:787;i:2;i:834;}i:8025;a:1:{i:0;i:8017;}i:8027;a:1:{i:0;i:8019;}i:8029;a:1:{i:0;i:8021;}i:8031;a:1:{i:0;i:8023;}i:8040;a:1:{i:0;i:8032;}i:8041;a:1:{i:0;i:8033;}i:8042;a:1:{i:0;i:8034;}i:8043;a:1:{i:0;i:8035;}i:8044;a:1:{i:0;i:8036;}i:8045;a:1:{i:0;i:8037;}i:8046;a:1:{i:0;i:8038;}i:8047;a:1:{i:0;i:8039;}i:8064;a:2:{i:0;i:7936;i:1;i:953;}i:8065;a:2:{i:0;i:7937;i:1;i:953;}i:8066;a:2:{i:0;i:7938;i:1;i:953;}i:8067;a:2:{i:0;i:7939;i:1;i:953;}i:8068;a:2:{i:0;i:7940;i:1;i:953;}i:8069;a:2:{i:0;i:7941;i:1;i:953;}i:8070;a:2:{i:0;i:7942;i:1;i:953;}i:8071;a:2:{i:0;i:7943;i:1;i:953;}i:8072;a:2:{i:0;i:7936;i:1;i:953;}i:8073;a:2:{i:0;i:7937;i:1;i:953;}i:8074;a:2:{i:0;i:7938;i:1;i:953;}i:8075;a:2:{i:0;i:7939;i:1;i:953;}i:8076;a:2:{i:0;i:7940;i:1;i:953;}i:8077;a:2:{i:0;i:7941;i:1;i:953;}i:8078;a:2:{i:0;i:7942;i:1;i:953;}i:8079;a:2:{i:0;i:7943;i:1;i:953;}i:8080;a:2:{i:0;i:7968;i:1;i:953;}i:8081;a:2:{i:0;i:7969;i:1;i:953;}i:8082;a:2:{i:0;i:7970;i:1;i:953;}i:8083;a:2:{i:0;i:7971;i:1;i:953;}i:8084;a:2:{i:0;i:7972;i:1;i:953;}i:8085;a:2:{i:0;i:7973;i:1;i:953;}i:8086;a:2:{i:0;i:7974;i:1;i:953;}i:8087;a:2:{i:0;i:7975;i:1;i:953;}i:8088;a:2:{i:0;i:7968;i:1;i:953;}i:8089;a:2:{i:0;i:7969;i:1;i:953;}i:8090;a:2:{i:0;i:7970;i:1;i:953;}i:8091;a:2:{i:0;i:7971;i:1;i:953;}i:8092;a:2:{i:0;i:7972;i:1;i:953;}i:8093;a:2:{i:0;i:7973;i:1;i:953;}i:8094;a:2:{i:0;i:7974;i:1;i:953;}i:8095;a:2:{i:0;i:7975;i:1;i:953;}i:8096;a:2:{i:0;i:8032;i:1;i:953;}i:8097;a:2:{i:0;i:8033;i:1;i:953;}i:8098;a:2:{i:0;i:8034;i:1;i:953;}i:8099;a:2:{i:0;i:8035;i:1;i:953;}i:8100;a:2:{i:0;i:8036;i:1;i:953;}i:8101;a:2:{i:0;i:8037;i:1;i:953;}i:8102;a:2:{i:0;i:8038;i:1;i:953;}i:8103;a:2:{i:0;i:8039;i:1;i:953;}i:8104;a:2:{i:0;i:8032;i:1;i:953;}i:8105;a:2:{i:0;i:8033;i:1;i:953;}i:8106;a:2:{i:0;i:8034;i:1;i:953;}i:8107;a:2:{i:0;i:8035;i:1;i:953;}i:8108;a:2:{i:0;i:8036;i:1;i:953;}i:8109;a:2:{i:0;i:8037;i:1;i:953;}i:8110;a:2:{i:0;i:8038;i:1;i:953;}i:8111;a:2:{i:0;i:8039;i:1;i:953;}i:8114;a:2:{i:0;i:8048;i:1;i:953;}i:8115;a:2:{i:0;i:945;i:1;i:953;}i:8116;a:2:{i:0;i:940;i:1;i:953;}i:8118;a:2:{i:0;i:945;i:1;i:834;}i:8119;a:3:{i:0;i:945;i:1;i:834;i:2;i:953;}i:8120;a:1:{i:0;i:8112;}i:8121;a:1:{i:0;i:8113;}i:8122;a:1:{i:0;i:8048;}i:8123;a:1:{i:0;i:8049;}i:8124;a:2:{i:0;i:945;i:1;i:953;}i:8126;a:1:{i:0;i:953;}i:8130;a:2:{i:0;i:8052;i:1;i:953;}i:8131;a:2:{i:0;i:951;i:1;i:953;}i:8132;a:2:{i:0;i:942;i:1;i:953;}i:8134;a:2:{i:0;i:951;i:1;i:834;}i:8135;a:3:{i:0;i:951;i:1;i:834;i:2;i:953;}i:8136;a:1:{i:0;i:8050;}i:8137;a:1:{i:0;i:8051;}i:8138;a:1:{i:0;i:8052;}i:8139;a:1:{i:0;i:8053;}i:8140;a:2:{i:0;i:951;i:1;i:953;}i:8146;a:3:{i:0;i:953;i:1;i:776;i:2;i:768;}i:8147;a:3:{i:0;i:953;i:1;i:776;i:2;i:769;}i:8150;a:2:{i:0;i:953;i:1;i:834;}i:8151;a:3:{i:0;i:953;i:1;i:776;i:2;i:834;}i:8152;a:1:{i:0;i:8144;}i:8153;a:1:{i:0;i:8145;}i:8154;a:1:{i:0;i:8054;}i:8155;a:1:{i:0;i:8055;}i:8162;a:3:{i:0;i:965;i:1;i:776;i:2;i:768;}i:8163;a:3:{i:0;i:965;i:1;i:776;i:2;i:769;}i:8164;a:2:{i:0;i:961;i:1;i:787;}i:8166;a:2:{i:0;i:965;i:1;i:834;}i:8167;a:3:{i:0;i:965;i:1;i:776;i:2;i:834;}i:8168;a:1:{i:0;i:8160;}i:8169;a:1:{i:0;i:8161;}i:8170;a:1:{i:0;i:8058;}i:8171;a:1:{i:0;i:8059;}i:8172;a:1:{i:0;i:8165;}i:8178;a:2:{i:0;i:8060;i:1;i:953;}i:8179;a:2:{i:0;i:969;i:1;i:953;}i:8180;a:2:{i:0;i:974;i:1;i:953;}i:8182;a:2:{i:0;i:969;i:1;i:834;}i:8183;a:3:{i:0;i:969;i:1;i:834;i:2;i:953;}i:8184;a:1:{i:0;i:8056;}i:8185;a:1:{i:0;i:8057;}i:8186;a:1:{i:0;i:8060;}i:8187;a:1:{i:0;i:8061;}i:8188;a:2:{i:0;i:969;i:1;i:953;}i:8360;a:2:{i:0;i:114;i:1;i:115;}i:8450;a:1:{i:0;i:99;}i:8451;a:2:{i:0;i:176;i:1;i:99;}i:8455;a:1:{i:0;i:603;}i:8457;a:2:{i:0;i:176;i:1;i:102;}i:8459;a:1:{i:0;i:104;}i:8460;a:1:{i:0;i:104;}i:8461;a:1:{i:0;i:104;}i:8464;a:1:{i:0;i:105;}i:8465;a:1:{i:0;i:105;}i:8466;a:1:{i:0;i:108;}i:8469;a:1:{i:0;i:110;}i:8470;a:2:{i:0;i:110;i:1;i:111;}i:8473;a:1:{i:0;i:112;}i:8474;a:1:{i:0;i:113;}i:8475;a:1:{i:0;i:114;}i:8476;a:1:{i:0;i:114;}i:8477;a:1:{i:0;i:114;}i:8480;a:2:{i:0;i:115;i:1;i:109;}i:8481;a:3:{i:0;i:116;i:1;i:101;i:2;i:108;}i:8482;a:2:{i:0;i:116;i:1;i:109;}i:8484;a:1:{i:0;i:122;}i:8486;a:1:{i:0;i:969;}i:8488;a:1:{i:0;i:122;}i:8490;a:1:{i:0;i:107;}i:8491;a:1:{i:0;i:229;}i:8492;a:1:{i:0;i:98;}i:8493;a:1:{i:0;i:99;}i:8496;a:1:{i:0;i:101;}i:8497;a:1:{i:0;i:102;}i:8499;a:1:{i:0;i:109;}i:8510;a:1:{i:0;i:947;}i:8511;a:1:{i:0;i:960;}i:8517;a:1:{i:0;i:100;}i:8544;a:1:{i:0;i:8560;}i:8545;a:1:{i:0;i:8561;}i:8546;a:1:{i:0;i:8562;}i:8547;a:1:{i:0;i:8563;}i:8548;a:1:{i:0;i:8564;}i:8549;a:1:{i:0;i:8565;}i:8550;a:1:{i:0;i:8566;}i:8551;a:1:{i:0;i:8567;}i:8552;a:1:{i:0;i:8568;}i:8553;a:1:{i:0;i:8569;}i:8554;a:1:{i:0;i:8570;}i:8555;a:1:{i:0;i:8571;}i:8556;a:1:{i:0;i:8572;}i:8557;a:1:{i:0;i:8573;}i:8558;a:1:{i:0;i:8574;}i:8559;a:1:{i:0;i:8575;}i:9398;a:1:{i:0;i:9424;}i:9399;a:1:{i:0;i:9425;}i:9400;a:1:{i:0;i:9426;}i:9401;a:1:{i:0;i:9427;}i:9402;a:1:{i:0;i:9428;}i:9403;a:1:{i:0;i:9429;}i:9404;a:1:{i:0;i:9430;}i:9405;a:1:{i:0;i:9431;}i:9406;a:1:{i:0;i:9432;}i:9407;a:1:{i:0;i:9433;}i:9408;a:1:{i:0;i:9434;}i:9409;a:1:{i:0;i:9435;}i:9410;a:1:{i:0;i:9436;}i:9411;a:1:{i:0;i:9437;}i:9412;a:1:{i:0;i:9438;}i:9413;a:1:{i:0;i:9439;}i:9414;a:1:{i:0;i:9440;}i:9415;a:1:{i:0;i:9441;}i:9416;a:1:{i:0;i:9442;}i:9417;a:1:{i:0;i:9443;}i:9418;a:1:{i:0;i:9444;}i:9419;a:1:{i:0;i:9445;}i:9420;a:1:{i:0;i:9446;}i:9421;a:1:{i:0;i:9447;}i:9422;a:1:{i:0;i:9448;}i:9423;a:1:{i:0;i:9449;}i:13169;a:3:{i:0;i:104;i:1;i:112;i:2;i:97;}i:13171;a:2:{i:0;i:97;i:1;i:117;}i:13173;a:2:{i:0;i:111;i:1;i:118;}i:13184;a:2:{i:0;i:112;i:1;i:97;}i:13185;a:2:{i:0;i:110;i:1;i:97;}i:13186;a:2:{i:0;i:956;i:1;i:97;}i:13187;a:2:{i:0;i:109;i:1;i:97;}i:13188;a:2:{i:0;i:107;i:1;i:97;}i:13189;a:2:{i:0;i:107;i:1;i:98;}i:13190;a:2:{i:0;i:109;i:1;i:98;}i:13191;a:2:{i:0;i:103;i:1;i:98;}i:13194;a:2:{i:0;i:112;i:1;i:102;}i:13195;a:2:{i:0;i:110;i:1;i:102;}i:13196;a:2:{i:0;i:956;i:1;i:102;}i:13200;a:2:{i:0;i:104;i:1;i:122;}i:13201;a:3:{i:0;i:107;i:1;i:104;i:2;i:122;}i:13202;a:3:{i:0;i:109;i:1;i:104;i:2;i:122;}i:13203;a:3:{i:0;i:103;i:1;i:104;i:2;i:122;}i:13204;a:3:{i:0;i:116;i:1;i:104;i:2;i:122;}i:13225;a:2:{i:0;i:112;i:1;i:97;}i:13226;a:3:{i:0;i:107;i:1;i:112;i:2;i:97;}i:13227;a:3:{i:0;i:109;i:1;i:112;i:2;i:97;}i:13228;a:3:{i:0;i:103;i:1;i:112;i:2;i:97;}i:13236;a:2:{i:0;i:112;i:1;i:118;}i:13237;a:2:{i:0;i:110;i:1;i:118;}i:13238;a:2:{i:0;i:956;i:1;i:118;}i:13239;a:2:{i:0;i:109;i:1;i:118;}i:13240;a:2:{i:0;i:107;i:1;i:118;}i:13241;a:2:{i:0;i:109;i:1;i:118;}i:13242;a:2:{i:0;i:112;i:1;i:119;}i:13243;a:2:{i:0;i:110;i:1;i:119;}i:13244;a:2:{i:0;i:956;i:1;i:119;}i:13245;a:2:{i:0;i:109;i:1;i:119;}i:13246;a:2:{i:0;i:107;i:1;i:119;}i:13247;a:2:{i:0;i:109;i:1;i:119;}i:13248;a:2:{i:0;i:107;i:1;i:969;}i:13249;a:2:{i:0;i:109;i:1;i:969;}i:13251;a:2:{i:0;i:98;i:1;i:113;}i:13254;a:4:{i:0;i:99;i:1;i:8725;i:2;i:107;i:3;i:103;}i:13255;a:3:{i:0;i:99;i:1;i:111;i:2;i:46;}i:13256;a:2:{i:0;i:100;i:1;i:98;}i:13257;a:2:{i:0;i:103;i:1;i:121;}i:13259;a:2:{i:0;i:104;i:1;i:112;}i:13261;a:2:{i:0;i:107;i:1;i:107;}i:13262;a:2:{i:0;i:107;i:1;i:109;}i:13271;a:2:{i:0;i:112;i:1;i:104;}i:13273;a:3:{i:0;i:112;i:1;i:112;i:2;i:109;}i:13274;a:2:{i:0;i:112;i:1;i:114;}i:13276;a:2:{i:0;i:115;i:1;i:118;}i:13277;a:2:{i:0;i:119;i:1;i:98;}i:64256;a:2:{i:0;i:102;i:1;i:102;}i:64257;a:2:{i:0;i:102;i:1;i:105;}i:64258;a:2:{i:0;i:102;i:1;i:108;}i:64259;a:3:{i:0;i:102;i:1;i:102;i:2;i:105;}i:64260;a:3:{i:0;i:102;i:1;i:102;i:2;i:108;}i:64261;a:2:{i:0;i:115;i:1;i:116;}i:64262;a:2:{i:0;i:115;i:1;i:116;}i:64275;a:2:{i:0;i:1396;i:1;i:1398;}i:64276;a:2:{i:0;i:1396;i:1;i:1381;}i:64277;a:2:{i:0;i:1396;i:1;i:1387;}i:64278;a:2:{i:0;i:1406;i:1;i:1398;}i:64279;a:2:{i:0;i:1396;i:1;i:1389;}i:65313;a:1:{i:0;i:65345;}i:65314;a:1:{i:0;i:65346;}i:65315;a:1:{i:0;i:65347;}i:65316;a:1:{i:0;i:65348;}i:65317;a:1:{i:0;i:65349;}i:65318;a:1:{i:0;i:65350;}i:65319;a:1:{i:0;i:65351;}i:65320;a:1:{i:0;i:65352;}i:65321;a:1:{i:0;i:65353;}i:65322;a:1:{i:0;i:65354;}i:65323;a:1:{i:0;i:65355;}i:65324;a:1:{i:0;i:65356;}i:65325;a:1:{i:0;i:65357;}i:65326;a:1:{i:0;i:65358;}i:65327;a:1:{i:0;i:65359;}i:65328;a:1:{i:0;i:65360;}i:65329;a:1:{i:0;i:65361;}i:65330;a:1:{i:0;i:65362;}i:65331;a:1:{i:0;i:65363;}i:65332;a:1:{i:0;i:65364;}i:65333;a:1:{i:0;i:65365;}i:65334;a:1:{i:0;i:65366;}i:65335;a:1:{i:0;i:65367;}i:65336;a:1:{i:0;i:65368;}i:65337;a:1:{i:0;i:65369;}i:65338;a:1:{i:0;i:65370;}i:66560;a:1:{i:0;i:66600;}i:66561;a:1:{i:0;i:66601;}i:66562;a:1:{i:0;i:66602;}i:66563;a:1:{i:0;i:66603;}i:66564;a:1:{i:0;i:66604;}i:66565;a:1:{i:0;i:66605;}i:66566;a:1:{i:0;i:66606;}i:66567;a:1:{i:0;i:66607;}i:66568;a:1:{i:0;i:66608;}i:66569;a:1:{i:0;i:66609;}i:66570;a:1:{i:0;i:66610;}i:66571;a:1:{i:0;i:66611;}i:66572;a:1:{i:0;i:66612;}i:66573;a:1:{i:0;i:66613;}i:66574;a:1:{i:0;i:66614;}i:66575;a:1:{i:0;i:66615;}i:66576;a:1:{i:0;i:66616;}i:66577;a:1:{i:0;i:66617;}i:66578;a:1:{i:0;i:66618;}i:66579;a:1:{i:0;i:66619;}i:66580;a:1:{i:0;i:66620;}i:66581;a:1:{i:0;i:66621;}i:66582;a:1:{i:0;i:66622;}i:66583;a:1:{i:0;i:66623;}i:66584;a:1:{i:0;i:66624;}i:66585;a:1:{i:0;i:66625;}i:66586;a:1:{i:0;i:66626;}i:66587;a:1:{i:0;i:66627;}i:66588;a:1:{i:0;i:66628;}i:66589;a:1:{i:0;i:66629;}i:66590;a:1:{i:0;i:66630;}i:66591;a:1:{i:0;i:66631;}i:66592;a:1:{i:0;i:66632;}i:66593;a:1:{i:0;i:66633;}i:66594;a:1:{i:0;i:66634;}i:66595;a:1:{i:0;i:66635;}i:66596;a:1:{i:0;i:66636;}i:66597;a:1:{i:0;i:66637;}i:119808;a:1:{i:0;i:97;}i:119809;a:1:{i:0;i:98;}i:119810;a:1:{i:0;i:99;}i:119811;a:1:{i:0;i:100;}i:119812;a:1:{i:0;i:101;}i:119813;a:1:{i:0;i:102;}i:119814;a:1:{i:0;i:103;}i:119815;a:1:{i:0;i:104;}i:119816;a:1:{i:0;i:105;}i:119817;a:1:{i:0;i:106;}i:119818;a:1:{i:0;i:107;}i:119819;a:1:{i:0;i:108;}i:119820;a:1:{i:0;i:109;}i:119821;a:1:{i:0;i:110;}i:119822;a:1:{i:0;i:111;}i:119823;a:1:{i:0;i:112;}i:119824;a:1:{i:0;i:113;}i:119825;a:1:{i:0;i:114;}i:119826;a:1:{i:0;i:115;}i:119827;a:1:{i:0;i:116;}i:119828;a:1:{i:0;i:117;}i:119829;a:1:{i:0;i:118;}i:119830;a:1:{i:0;i:119;}i:119831;a:1:{i:0;i:120;}i:119832;a:1:{i:0;i:121;}i:119833;a:1:{i:0;i:122;}i:119860;a:1:{i:0;i:97;}i:119861;a:1:{i:0;i:98;}i:119862;a:1:{i:0;i:99;}i:119863;a:1:{i:0;i:100;}i:119864;a:1:{i:0;i:101;}i:119865;a:1:{i:0;i:102;}i:119866;a:1:{i:0;i:103;}i:119867;a:1:{i:0;i:104;}i:119868;a:1:{i:0;i:105;}i:119869;a:1:{i:0;i:106;}i:119870;a:1:{i:0;i:107;}i:119871;a:1:{i:0;i:108;}i:119872;a:1:{i:0;i:109;}i:119873;a:1:{i:0;i:110;}i:119874;a:1:{i:0;i:111;}i:119875;a:1:{i:0;i:112;}i:119876;a:1:{i:0;i:113;}i:119877;a:1:{i:0;i:114;}i:119878;a:1:{i:0;i:115;}i:119879;a:1:{i:0;i:116;}i:119880;a:1:{i:0;i:117;}i:119881;a:1:{i:0;i:118;}i:119882;a:1:{i:0;i:119;}i:119883;a:1:{i:0;i:120;}i:119884;a:1:{i:0;i:121;}i:119885;a:1:{i:0;i:122;}i:119912;a:1:{i:0;i:97;}i:119913;a:1:{i:0;i:98;}i:119914;a:1:{i:0;i:99;}i:119915;a:1:{i:0;i:100;}i:119916;a:1:{i:0;i:101;}i:119917;a:1:{i:0;i:102;}i:119918;a:1:{i:0;i:103;}i:119919;a:1:{i:0;i:104;}i:119920;a:1:{i:0;i:105;}i:119921;a:1:{i:0;i:106;}i:119922;a:1:{i:0;i:107;}i:119923;a:1:{i:0;i:108;}i:119924;a:1:{i:0;i:109;}i:119925;a:1:{i:0;i:110;}i:119926;a:1:{i:0;i:111;}i:119927;a:1:{i:0;i:112;}i:119928;a:1:{i:0;i:113;}i:119929;a:1:{i:0;i:114;}i:119930;a:1:{i:0;i:115;}i:119931;a:1:{i:0;i:116;}i:119932;a:1:{i:0;i:117;}i:119933;a:1:{i:0;i:118;}i:119934;a:1:{i:0;i:119;}i:119935;a:1:{i:0;i:120;}i:119936;a:1:{i:0;i:121;}i:119937;a:1:{i:0;i:122;}i:119964;a:1:{i:0;i:97;}i:119966;a:1:{i:0;i:99;}i:119967;a:1:{i:0;i:100;}i:119970;a:1:{i:0;i:103;}i:119973;a:1:{i:0;i:106;}i:119974;a:1:{i:0;i:107;}i:119977;a:1:{i:0;i:110;}i:119978;a:1:{i:0;i:111;}i:119979;a:1:{i:0;i:112;}i:119980;a:1:{i:0;i:113;}i:119982;a:1:{i:0;i:115;}i:119983;a:1:{i:0;i:116;}i:119984;a:1:{i:0;i:117;}i:119985;a:1:{i:0;i:118;}i:119986;a:1:{i:0;i:119;}i:119987;a:1:{i:0;i:120;}i:119988;a:1:{i:0;i:121;}i:119989;a:1:{i:0;i:122;}i:120016;a:1:{i:0;i:97;}i:120017;a:1:{i:0;i:98;}i:120018;a:1:{i:0;i:99;}i:120019;a:1:{i:0;i:100;}i:120020;a:1:{i:0;i:101;}i:120021;a:1:{i:0;i:102;}i:120022;a:1:{i:0;i:103;}i:120023;a:1:{i:0;i:104;}i:120024;a:1:{i:0;i:105;}i:120025;a:1:{i:0;i:106;}i:120026;a:1:{i:0;i:107;}i:120027;a:1:{i:0;i:108;}i:120028;a:1:{i:0;i:109;}i:120029;a:1:{i:0;i:110;}i:120030;a:1:{i:0;i:111;}i:120031;a:1:{i:0;i:112;}i:120032;a:1:{i:0;i:113;}i:120033;a:1:{i:0;i:114;}i:120034;a:1:{i:0;i:115;}i:120035;a:1:{i:0;i:116;}i:120036;a:1:{i:0;i:117;}i:120037;a:1:{i:0;i:118;}i:120038;a:1:{i:0;i:119;}i:120039;a:1:{i:0;i:120;}i:120040;a:1:{i:0;i:121;}i:120041;a:1:{i:0;i:122;}i:120068;a:1:{i:0;i:97;}i:120069;a:1:{i:0;i:98;}i:120071;a:1:{i:0;i:100;}i:120072;a:1:{i:0;i:101;}i:120073;a:1:{i:0;i:102;}i:120074;a:1:{i:0;i:103;}i:120077;a:1:{i:0;i:106;}i:120078;a:1:{i:0;i:107;}i:120079;a:1:{i:0;i:108;}i:120080;a:1:{i:0;i:109;}i:120081;a:1:{i:0;i:110;}i:120082;a:1:{i:0;i:111;}i:120083;a:1:{i:0;i:112;}i:120084;a:1:{i:0;i:113;}i:120086;a:1:{i:0;i:115;}i:120087;a:1:{i:0;i:116;}i:120088;a:1:{i:0;i:117;}i:120089;a:1:{i:0;i:118;}i:120090;a:1:{i:0;i:119;}i:120091;a:1:{i:0;i:120;}i:120092;a:1:{i:0;i:121;}i:120120;a:1:{i:0;i:97;}i:120121;a:1:{i:0;i:98;}i:120123;a:1:{i:0;i:100;}i:120124;a:1:{i:0;i:101;}i:120125;a:1:{i:0;i:102;}i:120126;a:1:{i:0;i:103;}i:120128;a:1:{i:0;i:105;}i:120129;a:1:{i:0;i:106;}i:120130;a:1:{i:0;i:107;}i:120131;a:1:{i:0;i:108;}i:120132;a:1:{i:0;i:109;}i:120134;a:1:{i:0;i:111;}i:120138;a:1:{i:0;i:115;}i:120139;a:1:{i:0;i:116;}i:120140;a:1:{i:0;i:117;}i:120141;a:1:{i:0;i:118;}i:120142;a:1:{i:0;i:119;}i:120143;a:1:{i:0;i:120;}i:120144;a:1:{i:0;i:121;}i:120172;a:1:{i:0;i:97;}i:120173;a:1:{i:0;i:98;}i:120174;a:1:{i:0;i:99;}i:120175;a:1:{i:0;i:100;}i:120176;a:1:{i:0;i:101;}i:120177;a:1:{i:0;i:102;}i:120178;a:1:{i:0;i:103;}i:120179;a:1:{i:0;i:104;}i:120180;a:1:{i:0;i:105;}i:120181;a:1:{i:0;i:106;}i:120182;a:1:{i:0;i:107;}i:120183;a:1:{i:0;i:108;}i:120184;a:1:{i:0;i:109;}i:120185;a:1:{i:0;i:110;}i:120186;a:1:{i:0;i:111;}i:120187;a:1:{i:0;i:112;}i:120188;a:1:{i:0;i:113;}i:120189;a:1:{i:0;i:114;}i:120190;a:1:{i:0;i:115;}i:120191;a:1:{i:0;i:116;}i:120192;a:1:{i:0;i:117;}i:120193;a:1:{i:0;i:118;}i:120194;a:1:{i:0;i:119;}i:120195;a:1:{i:0;i:120;}i:120196;a:1:{i:0;i:121;}i:120197;a:1:{i:0;i:122;}i:120224;a:1:{i:0;i:97;}i:120225;a:1:{i:0;i:98;}i:120226;a:1:{i:0;i:99;}i:120227;a:1:{i:0;i:100;}i:120228;a:1:{i:0;i:101;}i:120229;a:1:{i:0;i:102;}i:120230;a:1:{i:0;i:103;}i:120231;a:1:{i:0;i:104;}i:120232;a:1:{i:0;i:105;}i:120233;a:1:{i:0;i:106;}i:120234;a:1:{i:0;i:107;}i:120235;a:1:{i:0;i:108;}i:120236;a:1:{i:0;i:109;}i:120237;a:1:{i:0;i:110;}i:120238;a:1:{i:0;i:111;}i:120239;a:1:{i:0;i:112;}i:120240;a:1:{i:0;i:113;}i:120241;a:1:{i:0;i:114;}i:120242;a:1:{i:0;i:115;}i:120243;a:1:{i:0;i:116;}i:120244;a:1:{i:0;i:117;}i:120245;a:1:{i:0;i:118;}i:120246;a:1:{i:0;i:119;}i:120247;a:1:{i:0;i:120;}i:120248;a:1:{i:0;i:121;}i:120249;a:1:{i:0;i:122;}i:120276;a:1:{i:0;i:97;}i:120277;a:1:{i:0;i:98;}i:120278;a:1:{i:0;i:99;}i:120279;a:1:{i:0;i:100;}i:120280;a:1:{i:0;i:101;}i:120281;a:1:{i:0;i:102;}i:120282;a:1:{i:0;i:103;}i:120283;a:1:{i:0;i:104;}i:120284;a:1:{i:0;i:105;}i:120285;a:1:{i:0;i:106;}i:120286;a:1:{i:0;i:107;}i:120287;a:1:{i:0;i:108;}i:120288;a:1:{i:0;i:109;}i:120289;a:1:{i:0;i:110;}i:120290;a:1:{i:0;i:111;}i:120291;a:1:{i:0;i:112;}i:120292;a:1:{i:0;i:113;}i:120293;a:1:{i:0;i:114;}i:120294;a:1:{i:0;i:115;}i:120295;a:1:{i:0;i:116;}i:120296;a:1:{i:0;i:117;}i:120297;a:1:{i:0;i:118;}i:120298;a:1:{i:0;i:119;}i:120299;a:1:{i:0;i:120;}i:120300;a:1:{i:0;i:121;}i:120301;a:1:{i:0;i:122;}i:120328;a:1:{i:0;i:97;}i:120329;a:1:{i:0;i:98;}i:120330;a:1:{i:0;i:99;}i:120331;a:1:{i:0;i:100;}i:120332;a:1:{i:0;i:101;}i:120333;a:1:{i:0;i:102;}i:120334;a:1:{i:0;i:103;}i:120335;a:1:{i:0;i:104;}i:120336;a:1:{i:0;i:105;}i:120337;a:1:{i:0;i:106;}i:120338;a:1:{i:0;i:107;}i:120339;a:1:{i:0;i:108;}i:120340;a:1:{i:0;i:109;}i:120341;a:1:{i:0;i:110;}i:120342;a:1:{i:0;i:111;}i:120343;a:1:{i:0;i:112;}i:120344;a:1:{i:0;i:113;}i:120345;a:1:{i:0;i:114;}i:120346;a:1:{i:0;i:115;}i:120347;a:1:{i:0;i:116;}i:120348;a:1:{i:0;i:117;}i:120349;a:1:{i:0;i:118;}i:120350;a:1:{i:0;i:119;}i:120351;a:1:{i:0;i:120;}i:120352;a:1:{i:0;i:121;}i:120353;a:1:{i:0;i:122;}i:120380;a:1:{i:0;i:97;}i:120381;a:1:{i:0;i:98;}i:120382;a:1:{i:0;i:99;}i:120383;a:1:{i:0;i:100;}i:120384;a:1:{i:0;i:101;}i:120385;a:1:{i:0;i:102;}i:120386;a:1:{i:0;i:103;}i:120387;a:1:{i:0;i:104;}i:120388;a:1:{i:0;i:105;}i:120389;a:1:{i:0;i:106;}i:120390;a:1:{i:0;i:107;}i:120391;a:1:{i:0;i:108;}i:120392;a:1:{i:0;i:109;}i:120393;a:1:{i:0;i:110;}i:120394;a:1:{i:0;i:111;}i:120395;a:1:{i:0;i:112;}i:120396;a:1:{i:0;i:113;}i:120397;a:1:{i:0;i:114;}i:120398;a:1:{i:0;i:115;}i:120399;a:1:{i:0;i:116;}i:120400;a:1:{i:0;i:117;}i:120401;a:1:{i:0;i:118;}i:120402;a:1:{i:0;i:119;}i:120403;a:1:{i:0;i:120;}i:120404;a:1:{i:0;i:121;}i:120405;a:1:{i:0;i:122;}i:120432;a:1:{i:0;i:97;}i:120433;a:1:{i:0;i:98;}i:120434;a:1:{i:0;i:99;}i:120435;a:1:{i:0;i:100;}i:120436;a:1:{i:0;i:101;}i:120437;a:1:{i:0;i:102;}i:120438;a:1:{i:0;i:103;}i:120439;a:1:{i:0;i:104;}i:120440;a:1:{i:0;i:105;}i:120441;a:1:{i:0;i:106;}i:120442;a:1:{i:0;i:107;}i:120443;a:1:{i:0;i:108;}i:120444;a:1:{i:0;i:109;}i:120445;a:1:{i:0;i:110;}i:120446;a:1:{i:0;i:111;}i:120447;a:1:{i:0;i:112;}i:120448;a:1:{i:0;i:113;}i:120449;a:1:{i:0;i:114;}i:120450;a:1:{i:0;i:115;}i:120451;a:1:{i:0;i:116;}i:120452;a:1:{i:0;i:117;}i:120453;a:1:{i:0;i:118;}i:120454;a:1:{i:0;i:119;}i:120455;a:1:{i:0;i:120;}i:120456;a:1:{i:0;i:121;}i:120457;a:1:{i:0;i:122;}i:120488;a:1:{i:0;i:945;}i:120489;a:1:{i:0;i:946;}i:120490;a:1:{i:0;i:947;}i:120491;a:1:{i:0;i:948;}i:120492;a:1:{i:0;i:949;}i:120493;a:1:{i:0;i:950;}i:120494;a:1:{i:0;i:951;}i:120495;a:1:{i:0;i:952;}i:120496;a:1:{i:0;i:953;}i:120497;a:1:{i:0;i:954;}i:120498;a:1:{i:0;i:955;}i:120499;a:1:{i:0;i:956;}i:120500;a:1:{i:0;i:957;}i:120501;a:1:{i:0;i:958;}i:120502;a:1:{i:0;i:959;}i:120503;a:1:{i:0;i:960;}i:120504;a:1:{i:0;i:961;}i:120505;a:1:{i:0;i:952;}i:120506;a:1:{i:0;i:963;}i:120507;a:1:{i:0;i:964;}i:120508;a:1:{i:0;i:965;}i:120509;a:1:{i:0;i:966;}i:120510;a:1:{i:0;i:967;}i:120511;a:1:{i:0;i:968;}i:120512;a:1:{i:0;i:969;}i:120531;a:1:{i:0;i:963;}i:120546;a:1:{i:0;i:945;}i:120547;a:1:{i:0;i:946;}i:120548;a:1:{i:0;i:947;}i:120549;a:1:{i:0;i:948;}i:120550;a:1:{i:0;i:949;}i:120551;a:1:{i:0;i:950;}i:120552;a:1:{i:0;i:951;}i:120553;a:1:{i:0;i:952;}i:120554;a:1:{i:0;i:953;}i:120555;a:1:{i:0;i:954;}i:120556;a:1:{i:0;i:955;}i:120557;a:1:{i:0;i:956;}i:120558;a:1:{i:0;i:957;}i:120559;a:1:{i:0;i:958;}i:120560;a:1:{i:0;i:959;}i:120561;a:1:{i:0;i:960;}i:120562;a:1:{i:0;i:961;}i:120563;a:1:{i:0;i:952;}i:120564;a:1:{i:0;i:963;}i:120565;a:1:{i:0;i:964;}i:120566;a:1:{i:0;i:965;}i:120567;a:1:{i:0;i:966;}i:120568;a:1:{i:0;i:967;}i:120569;a:1:{i:0;i:968;}i:120570;a:1:{i:0;i:969;}i:120589;a:1:{i:0;i:963;}i:120604;a:1:{i:0;i:945;}i:120605;a:1:{i:0;i:946;}i:120606;a:1:{i:0;i:947;}i:120607;a:1:{i:0;i:948;}i:120608;a:1:{i:0;i:949;}i:120609;a:1:{i:0;i:950;}i:120610;a:1:{i:0;i:951;}i:120611;a:1:{i:0;i:952;}i:120612;a:1:{i:0;i:953;}i:120613;a:1:{i:0;i:954;}i:120614;a:1:{i:0;i:955;}i:120615;a:1:{i:0;i:956;}i:120616;a:1:{i:0;i:957;}i:120617;a:1:{i:0;i:958;}i:120618;a:1:{i:0;i:959;}i:120619;a:1:{i:0;i:960;}i:120620;a:1:{i:0;i:961;}i:120621;a:1:{i:0;i:952;}i:120622;a:1:{i:0;i:963;}i:120623;a:1:{i:0;i:964;}i:120624;a:1:{i:0;i:965;}i:120625;a:1:{i:0;i:966;}i:120626;a:1:{i:0;i:967;}i:120627;a:1:{i:0;i:968;}i:120628;a:1:{i:0;i:969;}i:120647;a:1:{i:0;i:963;}i:120662;a:1:{i:0;i:945;}i:120663;a:1:{i:0;i:946;}i:120664;a:1:{i:0;i:947;}i:120665;a:1:{i:0;i:948;}i:120666;a:1:{i:0;i:949;}i:120667;a:1:{i:0;i:950;}i:120668;a:1:{i:0;i:951;}i:120669;a:1:{i:0;i:952;}i:120670;a:1:{i:0;i:953;}i:120671;a:1:{i:0;i:954;}i:120672;a:1:{i:0;i:955;}i:120673;a:1:{i:0;i:956;}i:120674;a:1:{i:0;i:957;}i:120675;a:1:{i:0;i:958;}i:120676;a:1:{i:0;i:959;}i:120677;a:1:{i:0;i:960;}i:120678;a:1:{i:0;i:961;}i:120679;a:1:{i:0;i:952;}i:120680;a:1:{i:0;i:963;}i:120681;a:1:{i:0;i:964;}i:120682;a:1:{i:0;i:965;}i:120683;a:1:{i:0;i:966;}i:120684;a:1:{i:0;i:967;}i:120685;a:1:{i:0;i:968;}i:120686;a:1:{i:0;i:969;}i:120705;a:1:{i:0;i:963;}i:120720;a:1:{i:0;i:945;}i:120721;a:1:{i:0;i:946;}i:120722;a:1:{i:0;i:947;}i:120723;a:1:{i:0;i:948;}i:120724;a:1:{i:0;i:949;}i:120725;a:1:{i:0;i:950;}i:120726;a:1:{i:0;i:951;}i:120727;a:1:{i:0;i:952;}i:120728;a:1:{i:0;i:953;}i:120729;a:1:{i:0;i:954;}i:120730;a:1:{i:0;i:955;}i:120731;a:1:{i:0;i:956;}i:120732;a:1:{i:0;i:957;}i:120733;a:1:{i:0;i:958;}i:120734;a:1:{i:0;i:959;}i:120735;a:1:{i:0;i:960;}i:120736;a:1:{i:0;i:961;}i:120737;a:1:{i:0;i:952;}i:120738;a:1:{i:0;i:963;}i:120739;a:1:{i:0;i:964;}i:120740;a:1:{i:0;i:965;}i:120741;a:1:{i:0;i:966;}i:120742;a:1:{i:0;i:967;}i:120743;a:1:{i:0;i:968;}i:120744;a:1:{i:0;i:969;}i:120763;a:1:{i:0;i:963;}i:1017;a:1:{i:0;i:963;}i:7468;a:1:{i:0;i:97;}i:7469;a:1:{i:0;i:230;}i:7470;a:1:{i:0;i:98;}i:7472;a:1:{i:0;i:100;}i:7473;a:1:{i:0;i:101;}i:7474;a:1:{i:0;i:477;}i:7475;a:1:{i:0;i:103;}i:7476;a:1:{i:0;i:104;}i:7477;a:1:{i:0;i:105;}i:7478;a:1:{i:0;i:106;}i:7479;a:1:{i:0;i:107;}i:7480;a:1:{i:0;i:108;}i:7481;a:1:{i:0;i:109;}i:7482;a:1:{i:0;i:110;}i:7484;a:1:{i:0;i:111;}i:7485;a:1:{i:0;i:547;}i:7486;a:1:{i:0;i:112;}i:7487;a:1:{i:0;i:114;}i:7488;a:1:{i:0;i:116;}i:7489;a:1:{i:0;i:117;}i:7490;a:1:{i:0;i:119;}i:8507;a:3:{i:0;i:102;i:1;i:97;i:2;i:120;}i:12880;a:3:{i:0;i:112;i:1;i:116;i:2;i:101;}i:13004;a:2:{i:0;i:104;i:1;i:103;}i:13006;a:2:{i:0;i:101;i:1;i:118;}i:13007;a:3:{i:0;i:108;i:1;i:116;i:2;i:100;}i:13178;a:2:{i:0;i:105;i:1;i:117;}i:13278;a:3:{i:0;i:118;i:1;i:8725;i:2;i:109;}i:13279;a:3:{i:0;i:97;i:1;i:8725;i:2;i:109;}}s:12:"norm_combcls";a:341:{i:820;i:1;i:821;i:1;i:822;i:1;i:823;i:1;i:824;i:1;i:2364;i:7;i:2492;i:7;i:2620;i:7;i:2748;i:7;i:2876;i:7;i:3260;i:7;i:4151;i:7;i:12441;i:8;i:12442;i:8;i:2381;i:9;i:2509;i:9;i:2637;i:9;i:2765;i:9;i:2893;i:9;i:3021;i:9;i:3149;i:9;i:3277;i:9;i:3405;i:9;i:3530;i:9;i:3642;i:9;i:3972;i:9;i:4153;i:9;i:5908;i:9;i:5940;i:9;i:6098;i:9;i:1456;i:10;i:1457;i:11;i:1458;i:12;i:1459;i:13;i:1460;i:14;i:1461;i:15;i:1462;i:16;i:1463;i:17;i:1464;i:18;i:1465;i:19;i:1467;i:20;i:1468;i:21;i:1469;i:22;i:1471;i:23;i:1473;i:24;i:1474;i:25;i:64286;i:26;i:1611;i:27;i:1612;i:28;i:1613;i:29;i:1614;i:30;i:1615;i:31;i:1616;i:32;i:1617;i:33;i:1618;i:34;i:1648;i:35;i:1809;i:36;i:3157;i:84;i:3158;i:91;i:3640;i:103;i:3641;i:103;i:3656;i:107;i:3657;i:107;i:3658;i:107;i:3659;i:107;i:3768;i:118;i:3769;i:118;i:3784;i:122;i:3785;i:122;i:3786;i:122;i:3787;i:122;i:3953;i:129;i:3954;i:130;i:3962;i:130;i:3963;i:130;i:3964;i:130;i:3965;i:130;i:3968;i:130;i:3956;i:132;i:801;i:202;i:802;i:202;i:807;i:202;i:808;i:202;i:795;i:216;i:3897;i:216;i:119141;i:216;i:119142;i:216;i:119150;i:216;i:119151;i:216;i:119152;i:216;i:119153;i:216;i:119154;i:216;i:12330;i:218;i:790;i:220;i:791;i:220;i:792;i:220;i:793;i:220;i:796;i:220;i:797;i:220;i:798;i:220;i:799;i:220;i:800;i:220;i:803;i:220;i:804;i:220;i:805;i:220;i:806;i:220;i:809;i:220;i:810;i:220;i:811;i:220;i:812;i:220;i:813;i:220;i:814;i:220;i:815;i:220;i:816;i:220;i:817;i:220;i:818;i:220;i:819;i:220;i:825;i:220;i:826;i:220;i:827;i:220;i:828;i:220;i:839;i:220;i:840;i:220;i:841;i:220;i:845;i:220;i:846;i:220;i:851;i:220;i:852;i:220;i:853;i:220;i:854;i:220;i:1425;i:220;i:1430;i:220;i:1435;i:220;i:1443;i:220;i:1444;i:220;i:1445;i:220;i:1446;i:220;i:1447;i:220;i:1450;i:220;i:1621;i:220;i:1622;i:220;i:1763;i:220;i:1770;i:220;i:1773;i:220;i:1841;i:220;i:1844;i:220;i:1847;i:220;i:1848;i:220;i:1849;i:220;i:1851;i:220;i:1852;i:220;i:1854;i:220;i:1858;i:220;i:1860;i:220;i:1862;i:220;i:1864;i:220;i:2386;i:220;i:3864;i:220;i:3865;i:220;i:3893;i:220;i:3895;i:220;i:4038;i:220;i:6459;i:220;i:8424;i:220;i:119163;i:220;i:119164;i:220;i:119165;i:220;i:119166;i:220;i:119167;i:220;i:119168;i:220;i:119169;i:220;i:119170;i:220;i:119178;i:220;i:119179;i:220;i:1434;i:222;i:1453;i:222;i:6441;i:222;i:12333;i:222;i:12334;i:224;i:12335;i:224;i:119149;i:226;i:1454;i:228;i:6313;i:228;i:12331;i:228;i:768;i:230;i:769;i:230;i:770;i:230;i:771;i:230;i:772;i:230;i:773;i:230;i:774;i:230;i:775;i:230;i:776;i:230;i:777;i:230;i:778;i:230;i:779;i:230;i:780;i:230;i:781;i:230;i:782;i:230;i:783;i:230;i:784;i:230;i:785;i:230;i:786;i:230;i:787;i:230;i:788;i:230;i:829;i:230;i:830;i:230;i:831;i:230;i:832;i:230;i:833;i:230;i:834;i:230;i:835;i:230;i:836;i:230;i:838;i:230;i:842;i:230;i:843;i:230;i:844;i:230;i:848;i:230;i:849;i:230;i:850;i:230;i:855;i:230;i:867;i:230;i:868;i:230;i:869;i:230;i:870;i:230;i:871;i:230;i:872;i:230;i:873;i:230;i:874;i:230;i:875;i:230;i:876;i:230;i:877;i:230;i:878;i:230;i:879;i:230;i:1155;i:230;i:1156;i:230;i:1157;i:230;i:1158;i:230;i:1426;i:230;i:1427;i:230;i:1428;i:230;i:1429;i:230;i:1431;i:230;i:1432;i:230;i:1433;i:230;i:1436;i:230;i:1437;i:230;i:1438;i:230;i:1439;i:230;i:1440;i:230;i:1441;i:230;i:1448;i:230;i:1449;i:230;i:1451;i:230;i:1452;i:230;i:1455;i:230;i:1476;i:230;i:1552;i:230;i:1553;i:230;i:1554;i:230;i:1555;i:230;i:1556;i:230;i:1557;i:230;i:1619;i:230;i:1620;i:230;i:1623;i:230;i:1624;i:230;i:1750;i:230;i:1751;i:230;i:1752;i:230;i:1753;i:230;i:1754;i:230;i:1755;i:230;i:1756;i:230;i:1759;i:230;i:1760;i:230;i:1761;i:230;i:1762;i:230;i:1764;i:230;i:1767;i:230;i:1768;i:230;i:1771;i:230;i:1772;i:230;i:1840;i:230;i:1842;i:230;i:1843;i:230;i:1845;i:230;i:1846;i:230;i:1850;i:230;i:1853;i:230;i:1855;i:230;i:1856;i:230;i:1857;i:230;i:1859;i:230;i:1861;i:230;i:1863;i:230;i:1865;i:230;i:1866;i:230;i:2385;i:230;i:2387;i:230;i:2388;i:230;i:3970;i:230;i:3971;i:230;i:3974;i:230;i:3975;i:230;i:5901;i:230;i:6458;i:230;i:8400;i:230;i:8401;i:230;i:8404;i:230;i:8405;i:230;i:8406;i:230;i:8407;i:230;i:8411;i:230;i:8412;i:230;i:8417;i:230;i:8423;i:230;i:8425;i:230;i:65056;i:230;i:65057;i:230;i:65058;i:230;i:65059;i:230;i:119173;i:230;i:119174;i:230;i:119175;i:230;i:119177;i:230;i:119176;i:230;i:119210;i:230;i:119211;i:230;i:119212;i:230;i:119213;i:230;i:789;i:232;i:794;i:232;i:12332;i:232;i:863;i:233;i:866;i:233;i:861;i:234;i:862;i:234;i:864;i:234;i:865;i:234;i:837;i:240;}}
lib/whois/whois.ae.php ADDED
@@ -0,0 +1,58 @@
1
+ <?php
2
+ /*
3
+ Whois.php PHP classes to conduct whois queries
4
+
5
+ Copyright (C)1999,2005 easyDNS Technologies Inc. & Mark Jeftovic
6
+
7
+ Maintained by David Saez
8
+
9
+ For the most recent version of this package visit:
10
+
11
+ http://www.phpwhois.org
12
+
13
+ This program is free software; you can redistribute it and/or
14
+ modify it under the terms of the GNU General Public License
15
+ as published by the Free Software Foundation; either version 2
16
+ of the License, or (at your option) any later version.
17
+
18
+ This program is distributed in the hope that it will be useful,
19
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
20
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21
+ GNU General Public License for more details.
22
+
23
+ You should have received a copy of the GNU General Public License
24
+ along with this program; if not, write to the Free Software
25
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
26
+ */
27
+
28
+ if (!defined('__AE_HANDLER__'))
29
+ define('__AE_HANDLER__', 1);
30
+
31
+ require_once('whois.parser.php');
32
+
33
+ class ae_handler
34
+ {
35
+ function parse($data_str, $query)
36
+ {
37
+ $items = array(
38
+ 'Domain Name:' => 'domain.name',
39
+ 'Registrar Name:' => 'domain.sponsor',
40
+ 'Status:' => 'domain.status',
41
+ 'Registrant Contact ID:' => 'owner.handle',
42
+ 'Registrant Contact Name:' => 'owner.name',
43
+ 'Tech Contact Name:' => 'tech.name',
44
+ 'Tech Contact ID:' => 'tech.handle',
45
+ 'Name Server:' => 'domain.nserver.'
46
+ );
47
+
48
+ $r['regrinfo'] = generic_parser_b($data_str['rawdata'], $items, 'ymd');
49
+
50
+ $r['regyinfo'] = array(
51
+ 'referrer' => 'http://www.nic.ae',
52
+ 'registrar' => 'UAENIC'
53
+ );
54
+
55
+ return $r;
56
+ }
57
+ }
58
+ ?>
lib/whois/whois.aero.php ADDED
@@ -0,0 +1,45 @@
1
+ <?php
2
+ /*
3
+ Whois.php PHP classes to conduct whois queries
4
+
5
+ Copyright (C)1999,2005 easyDNS Technologies Inc. & Mark Jeftovic
6
+
7
+ Maintained by David Saez
8
+
9
+ For the most recent version of this package visit:
10
+
11
+ http://www.phpwhois.org
12
+
13
+ This program is free software; you can redistribute it and/or
14
+ modify it under the terms of the GNU General Public License
15
+ as published by the Free Software Foundation; either version 2
16
+ of the License, or (at your option) any later version.
17
+
18
+ This program is distributed in the hope that it will be useful,
19
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
20
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21
+ GNU General Public License for more details.
22
+
23
+ You should have received a copy of the GNU General Public License
24
+ along with this program; if not, write to the Free Software
25
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
26
+ */
27
+
28
+ if (!defined('__AERO_HANDLER__'))
29
+ define('__AERO_HANDLER__', 1);
30
+
31
+ require_once('whois.parser.php');
32
+
33
+ class aero_handler
34
+ {
35
+ function parse($data_str, $query)
36
+ {
37
+ $r['regrinfo'] = generic_parser_b($data_str['rawdata'], false, 'ymd');
38
+ $r['regyinfo'] = array(
39
+ 'referrer' => 'http://www.nic.aero',
40
+ 'registrar' => 'Societe Internationale de Telecommunications Aeronautiques SC'
41
+ );
42
+ return $r;
43
+ }
44
+ }
45
+ ?>
lib/whois/whois.ag.php ADDED
@@ -0,0 +1,45 @@
1
+ <?php
2
+ /*
3
+ Whois.php PHP classes to conduct whois queries
4
+
5
+ Copyright (C)1999,2005 easyDNS Technologies Inc. & Mark Jeftovic
6
+
7
+ Maintained by David Saez
8
+
9
+ For the most recent version of this package visit:
10
+
11
+ http://www.phpwhois.org
12
+
13
+ This program is free software; you can redistribute it and/or
14
+ modify it under the terms of the GNU General Public License
15
+ as published by the Free Software Foundation; either version 2
16
+ of the License, or (at your option) any later version.
17
+
18
+ This program is distributed in the hope that it will be useful,
19
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
20
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21
+ GNU General Public License for more details.
22
+
23
+ You should have received a copy of the GNU General Public License
24
+ along with this program; if not, write to the Free Software
25
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
26
+ */
27
+
28
+ if (!defined('__AG_HANDLER__'))
29
+ define('__AG_HANDLER__', 1);
30
+
31
+ require_once('whois.parser.php');
32
+
33
+ class ag_handler
34
+ {
35
+ function parse($data_str, $query)
36
+ {
37
+ $r['regrinfo'] = generic_parser_b($data_str['rawdata']);
38
+ $r['regyinfo'] = array(
39
+ 'referrer' => 'http://www.nic.ag',
40
+ 'registrar' => 'Nic AG'
41
+ );
42
+ return $r;
43
+ }
44
+ }
45
+ ?>
lib/whois/whois.asia.php ADDED
@@ -0,0 +1,44 @@
1
+ <?php
2
+ /*
3
+ Whois.php PHP classes to conduct whois queries
4
+
5
+ Copyright (C)1999,2005 easyDNS Technologies Inc. & Mark Jeftovic
6
+
7
+ Maintained by David Saez
8
+
9
+ For the most recent version of this package visit:
10
+
11
+ http://www.phpwhois.org
12
+
13
+ This program is free software; you can redistribute it and/or
14
+ modify it under the terms of the GNU General Public License
15
+ as published by the Free Software Foundation; either version 2
16
+ of the License, or (at your option) any later version.
17
+
18
+ This program is distributed in the hope that it will be useful,
19
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
20
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21
+ GNU General Public License for more details.
22
+
23
+ You should have received a copy of the GNU General Public License
24
+ along with this program; if not, write to the Free Software
25
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
26
+ */
27
+
28
+ if(!defined('__ASIA_HANDLER__')) define('__ASIA_HANDLER__',1);
29
+
30
+ require_once('whois.parser.php');
31
+
32
+ class asia_handler
33
+ {
34
+ function parse ($data_str, $query)
35
+ {
36
+ $r['regrinfo'] = generic_parser_b($data_str['rawdata']);
37
+ $r['regyinfo'] = array(
38
+ 'referrer'=>'http://www.dotasia.org/',
39
+ 'registrar' => 'DotAsia'
40
+ );
41
+ return $r;
42
+ }
43
+ }
44
+ ?>
lib/whois/whois.at.php ADDED
@@ -0,0 +1,102 @@
1
+ <?php
2
+ /*
3
+ Whois.php PHP classes to conduct whois queries
4
+
5
+ Copyright (C)1999,2005 easyDNS Technologies Inc. & Mark Jeftovic
6
+
7
+ Maintained by David Saez
8
+
9
+ For the most recent version of this package visit:
10
+
11
+ http://www.phpwhois.org
12
+
13
+ This program is free software; you can redistribute it and/or
14
+ modify it under the terms of the GNU General Public License
15
+ as published by the Free Software Foundation; either version 2
16
+ of the License, or (at your option) any later version.
17
+
18
+ This program is distributed in the hope that it will be useful,
19
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
20
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21
+ GNU General Public License for more details.
22
+
23
+ You should have received a copy of the GNU General Public License
24
+ along with this program; if not, write to the Free Software
25
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
26
+ */
27
+
28
+ if (!defined('__AT_HANDLER__'))
29
+ define('__AT_HANDLER__', 1);
30
+
31
+ require_once('whois.parser.php');
32
+
33
+ class at_handler
34
+ {
35
+ function parse($data_str, $query)
36
+ {
37
+ $translate = array(
38
+ 'fax-no' => 'fax',
39
+ 'e-mail' => 'email',
40
+ 'nic-hdl' => 'handle',
41
+ 'person' => 'name',
42
+ 'personname' => 'name',
43
+ 'street address' => 'address.street',
44
+ 'city' => 'address.city',
45
+ 'postal code' => 'address.pcode',
46
+ 'country' => 'address.country'
47
+ );
48
+
49
+ $contacts = array(
50
+ 'registrant' => 'owner',
51
+ 'admin-c' => 'admin',
52
+ 'tech-c' => 'tech',
53
+ 'billing-c' => 'billing',
54
+ 'zone-c' => 'zone'
55
+ );
56
+
57
+ $reg = generic_parser_a($data_str['rawdata'], $translate, $contacts, 'domain', 'Ymd');
58
+
59
+ if (isset($reg['domain']['remarks']))
60
+ unset($reg['domain']['remarks']);
61
+
62
+ if (isset($reg['domain']['descr']))
63
+ {
64
+ while (list($key, $val) = each($reg['domain']['descr']))