/*
 * Copyright 2011-2014 Software Freedom Conservancy
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/* AUTO GENERATED - DO NOT EDIT BY HAND */

#include <stddef.h>  // For NULL.

#include "atoms.h"

namespace webdriver {
namespace atoms {

const char* const CLEAR[] = {
    "function(){return function(){var g,aa=this;function k(a){return void 0!",
    "==a}function l(a){return\"string\"==typeof a}function n(a){return\"numb",
    "er\"==typeof a}function ba(a,b){a=a.split(\".\");var c=aa;a[0]in c||!c.",
    "execScript||c.execScript(\"var \"+a[0]);for(var d;a.length&&(d=a.shift(",
    "));)!a.length&&k(b)?c[d]=b:c=c[d]&&c[d]!==Object.prototype[d]?c[d]:c[d]",
    "={}}\nfunction ca(a){var b=typeof a;if(\"object\"==b)if(a){if(a instanc",
    "eof Array)return\"array\";if(a instanceof Object)return b;var c=Object.",
    "prototype.toString.call(a);if(\"[object Window]\"==c)return\"object\";i",
    "f(\"[object Array]\"==c||\"number\"==typeof a.length&&\"undefined\"!=ty",
    "peof a.splice&&\"undefined\"!=typeof a.propertyIsEnumerable&&!a.propert",
    "yIsEnumerable(\"splice\"))return\"array\";if(\"[object Function]\"==c||",
    "\"undefined\"!=typeof a.call&&\"undefined\"!=typeof a.propertyIsEnumera",
    "ble&&!a.propertyIsEnumerable(\"call\"))return\"function\"}else return\"",
    "null\";\nelse if(\"function\"==b&&\"undefined\"==typeof a.call)return\"",
    "object\";return b}function da(a){var b=ca(a);return\"array\"==b||\"obje",
    "ct\"==b&&\"number\"==typeof a.length}function ea(a){return\"function\"=",
    "=ca(a)}function fa(a){var b=typeof a;return\"object\"==b&&null!=a||\"fu",
    "nction\"==b}function ga(a,b,c){return a.call.apply(a.bind,arguments)}\n",
    "function ha(a,b,c){if(!a)throw Error();if(2<arguments.length){var d=Arr",
    "ay.prototype.slice.call(arguments,2);return function(){var c=Array.prot",
    "otype.slice.call(arguments);Array.prototype.unshift.apply(c,d);return a",
    ".apply(b,c)}}return function(){return a.apply(b,arguments)}}function ia",
    "(a,b,c){ia=Function.prototype.bind&&-1!=Function.prototype.bind.toStrin",
    "g().indexOf(\"native code\")?ga:ha;return ia.apply(null,arguments)}\nfu",
    "nction ja(a,b){var c=Array.prototype.slice.call(arguments,1);return fun",
    "ction(){var b=c.slice();b.push.apply(b,arguments);return a.apply(this,b",
    ")}}function p(a,b){function c(){}c.prototype=b.prototype;a.Da=b.prototy",
    "pe;a.prototype=new c;a.prototype.constructor=a;a.Ba=function(a,c,f){for",
    "(var d=Array(arguments.length-2),e=2;e<arguments.length;e++)d[e-2]=argu",
    "ments[e];return b.prototype[c].apply(a,d)}};var ka=window;var la=String",
    ".prototype.trim?function(a){return a.trim()}:function(a){return a.repla",
    "ce(/^[\\s\\xa0]+|[\\s\\xa0]+$/g,\"\")};function ma(a,b){return a<b?-1:a",
    ">b?1:0}function na(a){return String(a).replace(/\\-([a-z])/g,function(a",
    ",c){return c.toUpperCase()})};function oa(a,b){if(l(a))return l(b)&&1==",
    "b.length?a.indexOf(b,0):-1;for(var c=0;c<a.length;c++)if(c in a&&a[c]==",
    "=b)return c;return-1}function q(a,b){for(var c=a.length,d=l(a)?a.split(",
    "\"\"):a,e=0;e<c;e++)e in d&&b.call(void 0,d[e],e,a)}function r(a,b,c){v",
    "ar d=c;q(a,function(c,f){d=b.call(void 0,d,c,f,a)});return d}function u",
    "(a,b){for(var c=a.length,d=l(a)?a.split(\"\"):a,e=0;e<c;e++)if(e in d&&",
    "b.call(void 0,d[e],e,a))return!0;return!1}\nfunction pa(a,b){for(var c=",
    "a.length,d=l(a)?a.split(\"\"):a,e=0;e<c;e++)if(e in d&&!b.call(void 0,d",
    "[e],e,a))return!1;return!0}function qa(a){return Array.prototype.concat",
    ".apply([],arguments)}function ra(a){var b=a.length;if(0<b){for(var c=Ar",
    "ray(b),d=0;d<b;d++)c[d]=a[d];return c}return[]}function sa(a,b,c){retur",
    "n 2>=arguments.length?Array.prototype.slice.call(a,b):Array.prototype.s",
    "lice.call(a,b,c)};var ta={aliceblue:\"#f0f8ff\",antiquewhite:\"#faebd7",
    "\",aqua:\"#00ffff\",aquamarine:\"#7fffd4\",azure:\"#f0ffff\",beige:\"#f",
    "5f5dc\",bisque:\"#ffe4c4\",black:\"#000000\",blanchedalmond:\"#ffebcd\"",
    ",blue:\"#0000ff\",blueviolet:\"#8a2be2\",brown:\"#a52a2a\",burlywood:\"",
    "#deb887\",cadetblue:\"#5f9ea0\",chartreuse:\"#7fff00\",chocolate:\"#d26",
    "91e\",coral:\"#ff7f50\",cornflowerblue:\"#6495ed\",cornsilk:\"#fff8dc\"",
    ",crimson:\"#dc143c\",cyan:\"#00ffff\",darkblue:\"#00008b\",darkcyan:\"#",
    "008b8b\",darkgoldenrod:\"#b8860b\",darkgray:\"#a9a9a9\",darkgreen:\"#00",
    "6400\",\ndarkgrey:\"#a9a9a9\",darkkhaki:\"#bdb76b\",darkmagenta:\"#8b00",
    "8b\",darkolivegreen:\"#556b2f\",darkorange:\"#ff8c00\",darkorchid:\"#99",
    "32cc\",darkred:\"#8b0000\",darksalmon:\"#e9967a\",darkseagreen:\"#8fbc8",
    "f\",darkslateblue:\"#483d8b\",darkslategray:\"#2f4f4f\",darkslategrey:",
    "\"#2f4f4f\",darkturquoise:\"#00ced1\",darkviolet:\"#9400d3\",deeppink:",
    "\"#ff1493\",deepskyblue:\"#00bfff\",dimgray:\"#696969\",dimgrey:\"#6969",
    "69\",dodgerblue:\"#1e90ff\",firebrick:\"#b22222\",floralwhite:\"#fffaf0",
    "\",forestgreen:\"#228b22\",fuchsia:\"#ff00ff\",gainsboro:\"#dcdcdc\",\n",
    "ghostwhite:\"#f8f8ff\",gold:\"#ffd700\",goldenrod:\"#daa520\",gray:\"#8",
    "08080\",green:\"#008000\",greenyellow:\"#adff2f\",grey:\"#808080\",hone",
    "ydew:\"#f0fff0\",hotpink:\"#ff69b4\",indianred:\"#cd5c5c\",indigo:\"#4b",
    "0082\",ivory:\"#fffff0\",khaki:\"#f0e68c\",lavender:\"#e6e6fa\",lavende",
    "rblush:\"#fff0f5\",lawngreen:\"#7cfc00\",lemonchiffon:\"#fffacd\",light",
    "blue:\"#add8e6\",lightcoral:\"#f08080\",lightcyan:\"#e0ffff\",lightgold",
    "enrodyellow:\"#fafad2\",lightgray:\"#d3d3d3\",lightgreen:\"#90ee90\",li",
    "ghtgrey:\"#d3d3d3\",lightpink:\"#ffb6c1\",lightsalmon:\"#ffa07a\",\nlig",
    "htseagreen:\"#20b2aa\",lightskyblue:\"#87cefa\",lightslategray:\"#77889",
    "9\",lightslategrey:\"#778899\",lightsteelblue:\"#b0c4de\",lightyellow:",
    "\"#ffffe0\",lime:\"#00ff00\",limegreen:\"#32cd32\",linen:\"#faf0e6\",ma",
    "genta:\"#ff00ff\",maroon:\"#800000\",mediumaquamarine:\"#66cdaa\",mediu",
    "mblue:\"#0000cd\",mediumorchid:\"#ba55d3\",mediumpurple:\"#9370db\",med",
    "iumseagreen:\"#3cb371\",mediumslateblue:\"#7b68ee\",mediumspringgreen:",
    "\"#00fa9a\",mediumturquoise:\"#48d1cc\",mediumvioletred:\"#c71585\",mid",
    "nightblue:\"#191970\",mintcream:\"#f5fffa\",mistyrose:\"#ffe4e1\",\nmoc",
    "casin:\"#ffe4b5\",navajowhite:\"#ffdead\",navy:\"#000080\",oldlace:\"#f",
    "df5e6\",olive:\"#808000\",olivedrab:\"#6b8e23\",orange:\"#ffa500\",oran",
    "gered:\"#ff4500\",orchid:\"#da70d6\",palegoldenrod:\"#eee8aa\",palegree",
    "n:\"#98fb98\",paleturquoise:\"#afeeee\",palevioletred:\"#db7093\",papay",
    "awhip:\"#ffefd5\",peachpuff:\"#ffdab9\",peru:\"#cd853f\",pink:\"#ffc0cb",
    "\",plum:\"#dda0dd\",powderblue:\"#b0e0e6\",purple:\"#800080\",red:\"#ff",
    "0000\",rosybrown:\"#bc8f8f\",royalblue:\"#4169e1\",saddlebrown:\"#8b451",
    "3\",salmon:\"#fa8072\",sandybrown:\"#f4a460\",seagreen:\"#2e8b57\",\nse",
    "ashell:\"#fff5ee\",sienna:\"#a0522d\",silver:\"#c0c0c0\",skyblue:\"#87c",
    "eeb\",slateblue:\"#6a5acd\",slategray:\"#708090\",slategrey:\"#708090\"",
    ",snow:\"#fffafa\",springgreen:\"#00ff7f\",steelblue:\"#4682b4\",tan:\"#",
    "d2b48c\",teal:\"#008080\",thistle:\"#d8bfd8\",tomato:\"#ff6347\",turquo",
    "ise:\"#40e0d0\",violet:\"#ee82ee\",wheat:\"#f5deb3\",white:\"#ffffff\",",
    "whitesmoke:\"#f5f5f5\",yellow:\"#ffff00\",yellowgreen:\"#9acd32\"};var ",
    "ua=\"backgroundColor borderTopColor borderRightColor borderBottomColor ",
    "borderLeftColor color outlineColor\".split(\" \"),va=/#([0-9a-fA-F])([0",
    "-9a-fA-F])([0-9a-fA-F])/,wa=/^#(?:[0-9a-f]{3}){1,2}$/i,xa=/^(?:rgba)?",
    "\\((\\d{1,3}),\\s?(\\d{1,3}),\\s?(\\d{1,3}),\\s?(0|1|0\\.\\d*)\\)$/i,ya",
    "=/^(?:rgb)?\\((0|[1-9]\\d{0,2}),\\s?(0|[1-9]\\d{0,2}),\\s?(0|[1-9]\\d{0",
    ",2})\\)$/i;function v(a,b){this.code=a;this.state=w[a]||za;this.message",
    "=b||\"\";a=this.state.replace(/((?:^|\\s+)[a-z])/g,function(a){return a",
    ".toUpperCase().replace(/^[\\s\\xa0]+/g,\"\")});b=a.length-5;if(0>b||a.i",
    "ndexOf(\"Error\",b)!=b)a+=\"Error\";this.name=a;a=Error(this.message);a",
    ".name=this.name;this.stack=a.stack||\"\"}p(v,Error);var za=\"unknown er",
    "ror\",w={15:\"element not selectable\",11:\"element not visible\"};w[31",
    "]=za;w[30]=za;w[24]=\"invalid cookie domain\";w[29]=\"invalid element c",
    "oordinates\";w[12]=\"invalid element state\";\nw[32]=\"invalid selector",
    "\";w[51]=\"invalid selector\";w[52]=\"invalid selector\";w[17]=\"javasc",
    "ript error\";w[405]=\"unsupported operation\";w[34]=\"move target out o",
    "f bounds\";w[27]=\"no such alert\";w[7]=\"no such element\";w[8]=\"no s",
    "uch frame\";w[23]=\"no such window\";w[28]=\"script timeout\";w[33]=\"s",
    "ession not created\";w[10]=\"stale element reference\";w[21]=\"timeout",
    "\";w[25]=\"unable to set cookie\";w[26]=\"unexpected alert open\";w[13]",
    "=za;w[9]=\"unknown command\";v.prototype.toString=function(){return thi",
    "s.name+\": \"+this.message};var Aa;a:{var Ba=aa.navigator;if(Ba){var Ca",
    "=Ba.userAgent;if(Ca){Aa=Ca;break a}}Aa=\"\"};function Ea(a){var b=Fa;Ob",
    "ject.prototype.hasOwnProperty.call(b,\"528\")||(b[\"528\"]=a(\"528\"))}",
    ";var Ga=-1!=Aa.indexOf(\"Macintosh\"),Ha=-1!=Aa.indexOf(\"Windows\"),Ia",
    ",Ja=\"\",Ka=/WebKit\\/(\\S+)/.exec(Aa);Ka&&(Ja=Ka?Ka[1]:\"\");Ia=Ja;var",
    " Fa={};\nfunction La(){Ea(function(){for(var a=0,b=la(String(Ia)).split",
    "(\".\"),c=la(\"528\").split(\".\"),d=Math.max(b.length,c.length),e=0;0=",
    "=a&&e<d;e++){var f=b[e]||\"\",h=c[e]||\"\";do{f=/(\\d*)(\\D*)(.*)/.exec",
    "(f)||[\"\",\"\",\"\",\"\"];h=/(\\d*)(\\D*)(.*)/.exec(h)||[\"\",\"\",\"",
    "\",\"\"];if(0==f[0].length&&0==h[0].length)break;a=ma(0==f[1].length?0:",
    "parseInt(f[1],10),0==h[1].length?0:parseInt(h[1],10))||ma(0==f[2].lengt",
    "h,0==h[2].length)||ma(f[2],h[2]);f=f[3];h=h[3]}while(0==a)}return 0<=a}",
    ")};function x(a,b){this.x=k(a)?a:0;this.y=k(b)?b:0}g=x.prototype;g.clon",
    "e=function(){return new x(this.x,this.y)};g.toString=function(){return",
    "\"(\"+this.x+\", \"+this.y+\")\"};g.ceil=function(){this.x=Math.ceil(th",
    "is.x);this.y=Math.ceil(this.y);return this};g.floor=function(){this.x=M",
    "ath.floor(this.x);this.y=Math.floor(this.y);return this};g.round=functi",
    "on(){this.x=Math.round(this.x);this.y=Math.round(this.y);return this};",
    "\ng.translate=function(a,b){a instanceof x?(this.x+=a.x,this.y+=a.y):(t",
    "his.x+=Number(a),n(b)&&(this.y+=b));return this};g.scale=function(a,b){",
    "b=n(b)?b:a;this.x*=a;this.y*=b;return this};function Ma(a,b){this.width",
    "=a;this.height=b}g=Ma.prototype;g.clone=function(){return new Ma(this.w",
    "idth,this.height)};g.toString=function(){return\"(\"+this.width+\" x \"",
    "+this.height+\")\"};g.ceil=function(){this.width=Math.ceil(this.width);",
    "this.height=Math.ceil(this.height);return this};g.floor=function(){this",
    ".width=Math.floor(this.width);this.height=Math.floor(this.height);retur",
    "n this};g.round=function(){this.width=Math.round(this.width);this.heigh",
    "t=Math.round(this.height);return this};\ng.scale=function(a,b){b=n(b)?b",
    ":a;this.width*=a;this.height*=b;return this};function Na(a,b,c){functio",
    "n d(c){c&&b.appendChild(l(c)?a.createTextNode(c):c)}for(var e=1;e<c.len",
    "gth;e++){var f=c[e];!da(f)||fa(f)&&0<f.nodeType?d(f):q(Oa(f)?ra(f):f,d)",
    "}}function Pa(a){for(;a&&1!=a.nodeType;)a=a.previousSibling;return a}fu",
    "nction Qa(a,b){if(!a||!b)return!1;if(a.contains&&1==b.nodeType)return a",
    "==b||a.contains(b);if(\"undefined\"!=typeof a.compareDocumentPosition)r",
    "eturn a==b||!!(a.compareDocumentPosition(b)&16);for(;b&&a!=b;)b=b.paren",
    "tNode;return b==a}\nfunction Ra(a,b){if(a==b)return 0;if(a.compareDocum",
    "entPosition)return a.compareDocumentPosition(b)&2?1:-1;if(\"sourceIndex",
    "\"in a||a.parentNode&&\"sourceIndex\"in a.parentNode){var c=1==a.nodeTy",
    "pe,d=1==b.nodeType;if(c&&d)return a.sourceIndex-b.sourceIndex;var e=a.p",
    "arentNode,f=b.parentNode;return e==f?Sa(a,b):!c&&Qa(e,b)?-1*Ta(a,b):!d&",
    "&Qa(f,a)?Ta(b,a):(c?a.sourceIndex:e.sourceIndex)-(d?b.sourceIndex:f.sou",
    "rceIndex)}d=A(a);c=d.createRange();c.selectNode(a);c.collapse(!0);a=d.c",
    "reateRange();a.selectNode(b);\na.collapse(!0);return c.compareBoundaryP",
    "oints(aa.Range.START_TO_END,a)}function Ta(a,b){var c=a.parentNode;if(c",
    "==b)return-1;for(;b.parentNode!=c;)b=b.parentNode;return Sa(b,a)}functi",
    "on Sa(a,b){for(;b=b.previousSibling;)if(b==a)return-1;return 1}function",
    " A(a){return 9==a.nodeType?a:a.ownerDocument||a.document}function Oa(a)",
    "{if(a&&\"number\"==typeof a.length){if(fa(a))return\"function\"==typeof",
    " a.item||\"string\"==typeof a.item;if(ea(a))return\"function\"==typeof ",
    "a.item}return!1}\nfunction Ua(a,b,c){a&&!c&&(a=a.parentNode);for(c=0;a;",
    "){if(b(a))return a;a=a.parentNode;c++}return null}function Va(a){try{re",
    "turn a&&a.activeElement}catch(b){}return null}function Wa(a){this.M=a||",
    "aa.document||document}g=Wa.prototype;g.getElementsByTagName=function(a,",
    "b){return(b||this.M).getElementsByTagName(String(a))};g.createElement=f",
    "unction(a){return this.M.createElement(String(a))};g.createTextNode=fun",
    "ction(a){return this.M.createTextNode(String(a))};g.appendChild=functio",
    "n(a,b){a.appendChild(b)};\ng.append=function(a,b){Na(A(a),a,arguments)}",
    ";g.canHaveChildren=function(a){if(1!=a.nodeType)return!1;switch(a.tagNa",
    "me){case \"APPLET\":case \"AREA\":case \"BASE\":case \"BR\":case \"COL",
    "\":case \"COMMAND\":case \"EMBED\":case \"FRAME\":case \"HR\":case \"IM",
    "G\":case \"INPUT\":case \"IFRAME\":case \"ISINDEX\":case \"KEYGEN\":cas",
    "e \"LINK\":case \"NOFRAMES\":case \"NOSCRIPT\":case \"META\":case \"OBJ",
    "ECT\":case \"PARAM\":case \"SCRIPT\":case \"SOURCE\":case \"STYLE\":cas",
    "e \"TRACK\":case \"WBR\":return!1}return!0};\ng.removeNode=function(a){",
    "return a&&a.parentNode?a.parentNode.removeChild(a):null};g.contains=Qa;",
    "function Xa(a){var b=\"tabindex\";return\"style\"==b?Ya(a.style.cssText",
    "):(a=a.getAttributeNode(b))&&a.specified?a.value:null}var Za=/[;]+(?=(?",
    ":(?:[^\"]*\"){2})*[^\"]*$)(?=(?:(?:[^']*'){2})*[^']*$)(?=(?:[^()]*\\([^",
    "()]*\\))*[^()]*$)/;function Ya(a){var b=[];q(a.split(Za),function(a){va",
    "r c=a.indexOf(\":\");0<c&&(a=[a.slice(0,c),a.slice(c+1)],2==a.length&&b",
    ".push(a[0].toLowerCase(),\":\",a[1],\";\"))});b=b.join(\"\");return b=",
    "\";\"==b.charAt(b.length-1)?b:b+\";\"}\nfunction B(a,b){b&&\"string\"!=",
    "=typeof b&&(b=b.toString());return!!a&&1==a.nodeType&&(!b||a.tagName.to",
    "UpperCase()==b)};/*\n\n The MIT License\n\n Copyright (c) 2007 Cybozu L",
    "abs, Inc.\n Copyright (c) 2012 Google Inc.\n\n Permission is hereby gra",
    "nted, free of charge, to any person obtaining a copy\n of this software",
    " and associated documentation files (the \"Software\"), to\n deal in th",
    "e Software without restriction, including without limitation the\n righ",
    "ts to use, copy, modify, merge, publish, distribute, sublicense, and/or",
    "\n sell copies of the Software, and to permit persons to whom the Softw",
    "are is\n furnished to do so, subject to the following conditions:\n\n T",
    "he above copyright notice and this permission notice shall be included ",
    "in\n all copies or substantial portions of the Software.\n\n THE SOFTWA",
    "RE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IM",
    "PLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,",
    "\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SH",
    "ALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES",
    " OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERW",
    "ISE, ARISING\n FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE U",
    "SE OR OTHER DEALINGS\n IN THE SOFTWARE.\n*/\nfunction $a(a,b,c){this.s=",
    "a;this.ya=b||1;this.o=c||1};function ab(a){this.$=a;this.P=0}function b",
    "b(a){a=a.match(cb);for(var b=0;b<a.length;b++)db.test(a[b])&&a.splice(b",
    ",1);return new ab(a)}var cb=/\\$?(?:(?![0-9-\\.])(?:\\*|[\\w-\\.]+):)?(",
    "?![0-9-\\.])(?:\\*|[\\w-\\.]+)|\\/\\/|\\.\\.|::|\\d+(?:\\.\\d*)?|\\.\\d",
    "+|\"[^\"]*\"|'[^']*'|[!<>]=|\\s+|./g,db=/^\\s/;function C(a,b){return a",
    ".$[a.P+(b||0)]}ab.prototype.next=function(){return this.$[this.P++]};ab",
    ".prototype.back=function(){this.P--};ab.prototype.empty=function(){retu",
    "rn this.$.length<=this.P};function D(a){var b=null,c=a.nodeType;1==c&&(",
    "b=a.textContent,b=void 0==b||null==b?a.innerText:b,b=void 0==b||null==b",
    "?\"\":b);if(\"string\"!=typeof b)if(9==c||1==c){a=9==c?a.documentElemen",
    "t:a.firstChild;for(var c=0,d=[],b=\"\";a;){do 1!=a.nodeType&&(b+=a.node",
    "Value),d[c++]=a;while(a=a.firstChild);for(;c&&!(a=d[--c].nextSibling);)",
    ";}}else b=a.nodeValue;return\"\"+b}\nfunction eb(a,b,c){if(null===b)ret",
    "urn!0;try{if(!a.getAttribute)return!1}catch(d){return!1}return null==c?",
    "!!a.getAttribute(b):a.getAttribute(b,2)==c}function fb(a,b,c,d,e){retur",
    "n gb.call(null,a,b,l(c)?c:null,l(d)?d:null,e||new E)}\nfunction gb(a,b,",
    "c,d,e){b.getElementsByName&&d&&\"name\"==c?(b=b.getElementsByName(d),q(",
    "b,function(b){a.matches(b)&&e.add(b)})):b.getElementsByClassName&&d&&\"",
    "class\"==c?(b=b.getElementsByClassName(d),q(b,function(b){b.className==",
    "d&&a.matches(b)&&e.add(b)})):a instanceof F?hb(a,b,c,d,e):b.getElements",
    "ByTagName&&(b=b.getElementsByTagName(a.getName()),q(b,function(a){eb(a,",
    "c,d)&&e.add(a)}));return e}\nfunction hb(a,b,c,d,e){for(b=b.firstChild;",
    "b;b=b.nextSibling)eb(b,c,d)&&a.matches(b)&&e.add(b),hb(a,b,c,d,e)};func",
    "tion E(){this.o=this.j=null;this.J=0}function ib(a){this.node=a;this.ne",
    "xt=this.F=null}function jb(a,b){if(!a.j)return b;if(!b.j)return a;var c",
    "=a.j;b=b.j;for(var d=null,e,f=0;c&&b;)c.node==b.node?(e=c,c=c.next,b=b.",
    "next):0<Ra(c.node,b.node)?(e=b,b=b.next):(e=c,c=c.next),(e.F=d)?d.next=",
    "e:a.j=e,d=e,f++;for(e=c||b;e;)e.F=d,d=d.next=e,f++,e=e.next;a.o=d;a.J=f",
    ";return a}E.prototype.unshift=function(a){a=new ib(a);a.next=this.j;thi",
    "s.o?this.j.F=a:this.j=this.o=a;this.j=a;this.J++};\nE.prototype.add=fun",
    "ction(a){a=new ib(a);a.F=this.o;this.j?this.o.next=a:this.j=this.o=a;th",
    "is.o=a;this.J++};function kb(a){return(a=a.j)?a.node:null}E.prototype.v",
    "=function(){return this.J};function lb(a){return(a=kb(a))?D(a):\"\"}E.p",
    "rototype.iterator=function(a){return new mb(this,!!a)};function mb(a,b)",
    "{this.ua=a;this.ca=(this.H=b)?a.o:a.j;this.X=null}mb.prototype.next=fun",
    "ction(){var a=this.ca;if(null==a)return null;var b=this.X=a;this.ca=thi",
    "s.H?a.F:a.next;return b.node};\nmb.prototype.remove=function(){var a=th",
    "is.ua,b=this.X;if(!b)throw Error(\"Next must be called at least once be",
    "fore remove.\");var c=b.F,b=b.next;c?c.next=b:a.j=b;b?b.F=c:a.o=c;a.J--",
    ";this.X=null};function G(a){this.i=a;this.l=this.A=!1;this.K=null}funct",
    "ion I(a){return\"\\n  \"+a.toString().split(\"\\n\").join(\"\\n  \")}G.",
    "prototype.h=function(){return this.A};function nb(a,b){a.A=b}function o",
    "b(a,b){a.l=b}G.prototype.D=function(){return this.K};function J(a,b){a=",
    "a.evaluate(b);return a instanceof E?+lb(a):+a}function K(a,b){a=a.evalu",
    "ate(b);return a instanceof E?lb(a):\"\"+a}function pb(a,b){a=a.evaluate",
    "(b);return a instanceof E?!!a.v():!!a};function qb(a,b,c){G.call(this,a",
    ".i);this.Z=a;this.ga=b;this.la=c;this.A=b.h()||c.h();this.l=b.l||c.l;th",
    "is.Z==rb&&(c.l||c.h()||4==c.i||0==c.i||!b.D()?b.l||b.h()||4==b.i||0==b.",
    "i||!c.D()||(this.K={name:c.D().name,I:b}):this.K={name:b.D().name,I:c})",
    "}p(qb,G);\nfunction sb(a,b,c,d,e){b=b.evaluate(d);c=c.evaluate(d);var f",
    ";if(b instanceof E&&c instanceof E){b=b.iterator();for(d=b.next();d;d=b",
    ".next())for(e=c.iterator(),f=e.next();f;f=e.next())if(a(D(d),D(f)))retu",
    "rn!0;return!1}if(b instanceof E||c instanceof E){b instanceof E?(e=b,d=",
    "c):(e=c,d=b);f=e.iterator();for(var h=typeof d,m=f.next();m;m=f.next())",
    "{switch(h){case \"number\":m=+D(m);break;case \"boolean\":m=!!D(m);brea",
    "k;case \"string\":m=D(m);break;default:throw Error(\"Illegal primitive ",
    "type for comparison.\");\n}if(e==b&&a(m,d)||e==c&&a(d,m))return!0}retur",
    "n!1}return e?\"boolean\"==typeof b||\"boolean\"==typeof c?a(!!b,!!c):\"",
    "number\"==typeof b||\"number\"==typeof c?a(+b,+c):a(b,c):a(+b,+c)}qb.pr",
    "ototype.evaluate=function(a){return this.Z.u(this.ga,this.la,a)};qb.pro",
    "totype.toString=function(){var a=\"Binary Expression: \"+this.Z,a=a+I(t",
    "his.ga);return a+=I(this.la)};function tb(a,b,c,d){this.xa=a;this.ja=b;",
    "this.i=c;this.u=d}tb.prototype.toString=function(){return this.xa};var ",
    "ub={};\nfunction L(a,b,c,d){if(ub.hasOwnProperty(a))throw Error(\"Binar",
    "y operator already created: \"+a);a=new tb(a,b,c,d);return ub[a.toStrin",
    "g()]=a}L(\"div\",6,1,function(a,b,c){return J(a,c)/J(b,c)});L(\"mod\",6",
    ",1,function(a,b,c){return J(a,c)%J(b,c)});L(\"*\",6,1,function(a,b,c){r",
    "eturn J(a,c)*J(b,c)});L(\"+\",5,1,function(a,b,c){return J(a,c)+J(b,c)}",
    ");L(\"-\",5,1,function(a,b,c){return J(a,c)-J(b,c)});L(\"<\",4,2,functi",
    "on(a,b,c){return sb(function(a,b){return a<b},a,b,c)});\nL(\">\",4,2,fu",
    "nction(a,b,c){return sb(function(a,b){return a>b},a,b,c)});L(\"<=\",4,2",
    ",function(a,b,c){return sb(function(a,b){return a<=b},a,b,c)});L(\">=\"",
    ",4,2,function(a,b,c){return sb(function(a,b){return a>=b},a,b,c)});var ",
    "rb=L(\"=\",3,2,function(a,b,c){return sb(function(a,b){return a==b},a,b",
    ",c,!0)});L(\"!=\",3,2,function(a,b,c){return sb(function(a,b){return a!",
    "=b},a,b,c,!0)});L(\"and\",2,2,function(a,b,c){return pb(a,c)&&pb(b,c)})",
    ";L(\"or\",1,2,function(a,b,c){return pb(a,c)||pb(b,c)});function vb(a,b",
    "){if(b.v()&&4!=a.i)throw Error(\"Primary expression must evaluate to no",
    "deset if filter has predicate(s).\");G.call(this,a.i);this.ka=a;this.f=",
    "b;this.A=a.h();this.l=a.l}p(vb,G);vb.prototype.evaluate=function(a){a=t",
    "his.ka.evaluate(a);return wb(this.f,a)};vb.prototype.toString=function(",
    "){var a=\"Filter:\"+I(this.ka);return a+=I(this.f)};function xb(a,b){if",
    "(b.length<a.ia)throw Error(\"Function \"+a.m+\" expects at least\"+a.ia",
    "+\" arguments, \"+b.length+\" given\");if(null!==a.Y&&b.length>a.Y)thro",
    "w Error(\"Function \"+a.m+\" expects at most \"+a.Y+\" arguments, \"+b.",
    "length+\" given\");a.va&&q(b,function(b,d){if(4!=b.i)throw Error(\"Argu",
    "ment \"+d+\" to function \"+a.m+\" is not of type Nodeset: \"+b);});G.c",
    "all(this,a.i);this.O=a;this.U=b;nb(this,a.A||u(b,function(a){return a.h",
    "()}));ob(this,a.ta&&!b.length||a.sa&&!!b.length||u(b,function(a){return",
    " a.l}))}\np(xb,G);xb.prototype.evaluate=function(a){return this.O.u.app",
    "ly(null,qa(a,this.U))};xb.prototype.toString=function(){var a=\"Functio",
    "n: \"+this.O;if(this.U.length)var b=r(this.U,function(a,b){return a+I(b",
    ")},\"Arguments:\"),a=a+I(b);return a};function yb(a,b,c,d,e,f,h,m,y){th",
    "is.m=a;this.i=b;this.A=c;this.ta=d;this.sa=e;this.u=f;this.ia=h;this.Y=",
    "k(m)?m:h;this.va=!!y}yb.prototype.toString=function(){return this.m};va",
    "r zb={};\nfunction N(a,b,c,d,e,f,h,m){if(zb.hasOwnProperty(a))throw Err",
    "or(\"Function already created: \"+a+\".\");zb[a]=new yb(a,b,c,d,!1,e,f,",
    "h,m)}N(\"boolean\",2,!1,!1,function(a,b){return pb(b,a)},1);N(\"ceiling",
    "\",1,!1,!1,function(a,b){return Math.ceil(J(b,a))},1);N(\"concat\",3,!1",
    ",!1,function(a,b){return r(sa(arguments,1),function(b,d){return b+K(d,a",
    ")},\"\")},2,null);N(\"contains\",2,!1,!1,function(a,b,c){b=K(b,a);a=K(c",
    ",a);return-1!=b.indexOf(a)},2);N(\"count\",1,!1,!1,function(a,b){return",
    " b.evaluate(a).v()},1,1,!0);\nN(\"false\",2,!1,!1,function(){return!1},",
    "0);N(\"floor\",1,!1,!1,function(a,b){return Math.floor(J(b,a))},1);N(\"",
    "id\",4,!1,!1,function(a,b){var c=a.s,d=9==c.nodeType?c:c.ownerDocument;",
    "a=K(b,a).split(/\\s+/);var e=[];q(a,function(a){a=d.getElementById(a);!",
    "a||0<=oa(e,a)||e.push(a)});e.sort(Ra);var f=new E;q(e,function(a){f.add",
    "(a)});return f},1);N(\"lang\",2,!1,!1,function(){return!1},1);N(\"last",
    "\",1,!0,!1,function(a){if(1!=arguments.length)throw Error(\"Function la",
    "st expects ()\");return a.o},0);\nN(\"local-name\",3,!1,!0,function(a,b",
    "){return(a=b?kb(b.evaluate(a)):a.s)?a.localName||a.nodeName.toLowerCase",
    "():\"\"},0,1,!0);N(\"name\",3,!1,!0,function(a,b){return(a=b?kb(b.evalu",
    "ate(a)):a.s)?a.nodeName.toLowerCase():\"\"},0,1,!0);N(\"namespace-uri\"",
    ",3,!0,!1,function(){return\"\"},0,1,!0);N(\"normalize-space\",3,!1,!0,f",
    "unction(a,b){return(b?K(b,a):D(a.s)).replace(/[\\s\\xa0]+/g,\" \").repl",
    "ace(/^\\s+|\\s+$/g,\"\")},0,1);N(\"not\",2,!1,!1,function(a,b){return!p",
    "b(b,a)},1);\nN(\"number\",1,!1,!0,function(a,b){return b?J(b,a):+D(a.s)",
    "},0,1);N(\"position\",1,!0,!1,function(a){return a.ya},0);N(\"round\",1",
    ",!1,!1,function(a,b){return Math.round(J(b,a))},1);N(\"starts-with\",2,",
    "!1,!1,function(a,b,c){b=K(b,a);a=K(c,a);return 0==b.lastIndexOf(a,0)},2",
    ");N(\"string\",3,!1,!0,function(a,b){return b?K(b,a):D(a.s)},0,1);N(\"s",
    "tring-length\",1,!1,!0,function(a,b){return(b?K(b,a):D(a.s)).length},0,",
    "1);\nN(\"substring\",3,!1,!1,function(a,b,c,d){c=J(c,a);if(isNaN(c)||In",
    "finity==c||-Infinity==c)return\"\";d=d?J(d,a):Infinity;if(isNaN(d)||-In",
    "finity===d)return\"\";c=Math.round(c)-1;var e=Math.max(c,0);a=K(b,a);re",
    "turn Infinity==d?a.substring(e):a.substring(e,c+Math.round(d))},2,3);N(",
    "\"substring-after\",3,!1,!1,function(a,b,c){b=K(b,a);a=K(c,a);c=b.index",
    "Of(a);return-1==c?\"\":b.substring(c+a.length)},2);\nN(\"substring-befo",
    "re\",3,!1,!1,function(a,b,c){b=K(b,a);a=K(c,a);a=b.indexOf(a);return-1=",
    "=a?\"\":b.substring(0,a)},2);N(\"sum\",1,!1,!1,function(a,b){a=b.evalua",
    "te(a).iterator();b=0;for(var c=a.next();c;c=a.next())b+=+D(c);return b}",
    ",1,1,!0);N(\"translate\",3,!1,!1,function(a,b,c,d){b=K(b,a);c=K(c,a);va",
    "r e=K(d,a);d={};for(var f=0;f<c.length;f++)a=c.charAt(f),a in d||(d[a]=",
    "e.charAt(f));c=\"\";for(f=0;f<b.length;f++)a=b.charAt(f),c+=a in d?d[a]",
    ":a;return c},3);N(\"true\",2,!1,!1,function(){return!0},0);function F(a",
    ",b){this.na=a;this.ha=k(b)?b:null;this.B=null;switch(a){case \"comment",
    "\":this.B=8;break;case \"text\":this.B=3;break;case \"processing-instru",
    "ction\":this.B=7;break;case \"node\":break;default:throw Error(\"Unexpe",
    "cted argument\");}}function Ab(a){return\"comment\"==a||\"text\"==a||\"",
    "processing-instruction\"==a||\"node\"==a}F.prototype.matches=function(a",
    "){return null===this.B||this.B==a.nodeType};F.prototype.getName=functio",
    "n(){return this.na};\nF.prototype.toString=function(){var a=\"Kind Test",
    ": \"+this.na;null===this.ha||(a+=I(this.ha));return a};function Bb(a){G",
    ".call(this,3);this.ma=a.substring(1,a.length-1)}p(Bb,G);Bb.prototype.ev",
    "aluate=function(){return this.ma};Bb.prototype.toString=function(){retu",
    "rn\"Literal: \"+this.ma};function Cb(a,b){this.m=a.toLowerCase();a=\"*",
    "\"==this.m?\"*\":\"http://www.w3.org/1999/xhtml\";this.R=b?b.toLowerCas",
    "e():a}Cb.prototype.matches=function(a){var b=a.nodeType;if(1!=b&&2!=b)r",
    "eturn!1;b=k(a.localName)?a.localName:a.nodeName;return\"*\"!=this.m&&th",
    "is.m!=b.toLowerCase()?!1:\"*\"==this.R?!0:this.R==(a.namespaceURI?a.nam",
    "espaceURI.toLowerCase():\"http://www.w3.org/1999/xhtml\")};Cb.prototype",
    ".getName=function(){return this.m};\nCb.prototype.toString=function(){r",
    "eturn\"Name Test: \"+(\"http://www.w3.org/1999/xhtml\"==this.R?\"\":thi",
    "s.R+\":\")+this.m};function Db(a){G.call(this,1);this.oa=a}p(Db,G);Db.p",
    "rototype.evaluate=function(){return this.oa};Db.prototype.toString=func",
    "tion(){return\"Number: \"+this.oa};function Eb(a,b){G.call(this,a.i);th",
    "is.ea=a;this.L=b;this.A=a.h();this.l=a.l;1==this.L.length&&(a=this.L[0]",
    ",a.V||a.C!=Fb||(a=a.T,\"*\"!=a.getName()&&(this.K={name:a.getName(),I:n",
    "ull})))}p(Eb,G);function Gb(){G.call(this,4)}p(Gb,G);Gb.prototype.evalu",
    "ate=function(a){var b=new E;a=a.s;9==a.nodeType?b.add(a):b.add(a.ownerD",
    "ocument);return b};Gb.prototype.toString=function(){return\"Root Helper",
    " Expression\"};function Hb(){G.call(this,4)}p(Hb,G);Hb.prototype.evalua",
    "te=function(a){var b=new E;b.add(a.s);return b};\nHb.prototype.toString",
    "=function(){return\"Context Helper Expression\"};function Ib(a){return",
    "\"/\"==a||\"//\"==a}\nEb.prototype.evaluate=function(a){var b=this.ea.e",
    "valuate(a);if(!(b instanceof E))throw Error(\"Filter expression must ev",
    "aluate to nodeset.\");a=this.L;for(var c=0,d=a.length;c<d&&b.v();c++){v",
    "ar e=a[c],f=b.iterator(e.C.H);if(e.h()||e.C!=Jb)if(e.h()||e.C!=Kb){var ",
    "h=f.next();for(b=e.evaluate(new $a(h));null!=(h=f.next());)h=e.evaluate",
    "(new $a(h)),b=jb(b,h)}else h=f.next(),b=e.evaluate(new $a(h));else{for(",
    "h=f.next();(b=f.next())&&(!h.contains||h.contains(b))&&b.compareDocumen",
    "tPosition(h)&8;h=b);b=e.evaluate(new $a(h))}}return b};\nEb.prototype.t",
    "oString=function(){var a=\"Path Expression:\"+I(this.ea);if(this.L.leng",
    "th){var b=r(this.L,function(a,b){return a+I(b)},\"Steps:\");a+=I(b)}ret",
    "urn a};function O(a,b){this.f=a;this.H=!!b}function wb(a,b,c){for(c=c||",
    "0;c<a.f.length;c++)for(var d=a.f[c],e=b.iterator(),f=b.v(),h,m=0;h=e.ne",
    "xt();m++){var y=a.H?f-m:m+1;h=d.evaluate(new $a(h,y,f));if(\"number\"==",
    "typeof h)y=y==h;else if(\"string\"==typeof h||\"boolean\"==typeof h)y=!",
    "!h;else if(h instanceof E)y=0<h.v();else throw Error(\"Predicate.evalua",
    "te returned an unexpected type.\");y||e.remove()}return b}O.prototype.D",
    "=function(){return 0<this.f.length?this.f[0].D():null};\nO.prototype.h=",
    "function(){for(var a=0;a<this.f.length;a++){var b=this.f[a];if(b.h()||1",
    "==b.i||0==b.i)return!0}return!1};O.prototype.v=function(){return this.f",
    ".length};O.prototype.toString=function(){return r(this.f,function(a,b){",
    "return a+I(b)},\"Predicates:\")};function P(a,b,c,d){G.call(this,4);thi",
    "s.C=a;this.T=b;this.f=c||new O([]);this.V=!!d;b=this.f.D();a.Aa&&b&&(th",
    "is.K={name:b.name,I:b.I});this.A=this.f.h()}p(P,G);\nP.prototype.evalua",
    "te=function(a){var b=a.s,c=this.D(),d=null,e=null,f=0;c&&(d=c.name,e=c.",
    "I?K(c.I,a):null,f=1);if(this.V)if(this.h()||this.C!=Lb)if(b=(new P(Mb,n",
    "ew F(\"node\"))).evaluate(a).iterator(),c=b.next())for(a=this.u(c,d,e,f",
    ");null!=(c=b.next());)a=jb(a,this.u(c,d,e,f));else a=new E;else a=fb(th",
    "is.T,b,d,e),a=wb(this.f,a,f);else a=this.u(a.s,d,e,f);return a};P.proto",
    "type.u=function(a,b,c,d){a=this.C.O(this.T,a,b,c);return a=wb(this.f,a,",
    "d)};\nP.prototype.toString=function(){var a=\"Step:\"+I(\"Operator: \"+",
    "(this.V?\"//\":\"/\"));this.C.m&&(a+=I(\"Axis: \"+this.C));a+=I(this.T)",
    ";if(this.f.v()){var b=r(this.f.f,function(a,b){return a+I(b)},\"Predica",
    "tes:\");a+=I(b)}return a};function Nb(a,b,c,d){this.m=a;this.O=b;this.H",
    "=c;this.Aa=d}Nb.prototype.toString=function(){return this.m};var Ob={};",
    "function Q(a,b,c,d){if(Ob.hasOwnProperty(a))throw Error(\"Axis already ",
    "created: \"+a);b=new Nb(a,b,c,!!d);return Ob[a]=b}\nQ(\"ancestor\",func",
    "tion(a,b){for(var c=new E;b=b.parentNode;)a.matches(b)&&c.unshift(b);re",
    "turn c},!0);Q(\"ancestor-or-self\",function(a,b){var c=new E;do a.match",
    "es(b)&&c.unshift(b);while(b=b.parentNode);return c},!0);\nvar Fb=Q(\"at",
    "tribute\",function(a,b){var c=new E,d=a.getName();if(b=b.attributes)if(",
    "a instanceof F&&null===a.B||\"*\"==d)for(d=0;a=b[d];d++)c.add(a);else(a",
    "=b.getNamedItem(d))&&c.add(a);return c},!1),Lb=Q(\"child\",function(a,b",
    ",c,d,e){c=l(c)?c:null;d=l(d)?d:null;e=e||new E;for(b=b.firstChild;b;b=b",
    ".nextSibling)eb(b,c,d)&&a.matches(b)&&e.add(b);return e},!1,!0);Q(\"des",
    "cendant\",fb,!1,!0);\nvar Mb=Q(\"descendant-or-self\",function(a,b,c,d)",
    "{var e=new E;eb(b,c,d)&&a.matches(b)&&e.add(b);return fb(a,b,c,d,e)},!1",
    ",!0),Jb=Q(\"following\",function(a,b,c,d){var e=new E;do for(var f=b;f=",
    "f.nextSibling;)eb(f,c,d)&&a.matches(f)&&e.add(f),e=fb(a,f,c,d,e);while(",
    "b=b.parentNode);return e},!1,!0);Q(\"following-sibling\",function(a,b){",
    "for(var c=new E;b=b.nextSibling;)a.matches(b)&&c.add(b);return c},!1);Q",
    "(\"namespace\",function(){return new E},!1);\nvar Pb=Q(\"parent\",funct",
    "ion(a,b){var c=new E;if(9==b.nodeType)return c;if(2==b.nodeType)return ",
    "c.add(b.ownerElement),c;b=b.parentNode;a.matches(b)&&c.add(b);return c}",
    ",!1),Kb=Q(\"preceding\",function(a,b,c,d){var e=new E,f=[];do f.unshift",
    "(b);while(b=b.parentNode);for(var h=1,m=f.length;h<m;h++){var y=[];for(",
    "b=f[h];b=b.previousSibling;)y.unshift(b);for(var H=0,t=y.length;H<t;H++",
    ")b=y[H],eb(b,c,d)&&a.matches(b)&&e.add(b),e=fb(a,b,c,d,e)}return e},!0,",
    "!0);\nQ(\"preceding-sibling\",function(a,b){for(var c=new E;b=b.previou",
    "sSibling;)a.matches(b)&&c.unshift(b);return c},!0);var Qb=Q(\"self\",fu",
    "nction(a,b){var c=new E;a.matches(b)&&c.add(b);return c},!1);function R",
    "b(a){G.call(this,1);this.da=a;this.A=a.h();this.l=a.l}p(Rb,G);Rb.protot",
    "ype.evaluate=function(a){return-J(this.da,a)};Rb.prototype.toString=fun",
    "ction(){return\"Unary Expression: -\"+I(this.da)};function Sb(a){G.call",
    "(this,4);this.S=a;nb(this,u(this.S,function(a){return a.h()}));ob(this,",
    "u(this.S,function(a){return a.l}))}p(Sb,G);Sb.prototype.evaluate=functi",
    "on(a){var b=new E;q(this.S,function(c){c=c.evaluate(a);if(!(c instanceo",
    "f E))throw Error(\"Path expression must evaluate to NodeSet.\");b=jb(b,",
    "c)});return b};Sb.prototype.toString=function(){return r(this.S,functio",
    "n(a,b){return a+I(b)},\"Union Expression:\")};function Tb(a,b){this.a=a",
    ";this.wa=b}function Ub(a){for(var b,c=[];;){R(a,\"Missing right hand si",
    "de of binary expression.\");b=Vb(a);var d=a.a.next();if(!d)break;var e=",
    "(d=ub[d]||null)&&d.ja;if(!e){a.a.back();break}for(;c.length&&e<=c[c.len",
    "gth-1].ja;)b=new qb(c.pop(),c.pop(),b);c.push(b,d)}for(;c.length;)b=new",
    " qb(c.pop(),c.pop(),b);return b}function R(a,b){if(a.a.empty())throw Er",
    "ror(b);}function Wb(a,b){a=a.a.next();if(a!=b)throw Error(\"Bad token, ",
    "expected: \"+b+\" got: \"+a);}\nfunction Xb(a){a=a.a.next();if(\")\"!=a",
    ")throw Error(\"Bad token: \"+a);}function Yb(a){a=a.a.next();if(2>a.len",
    "gth)throw Error(\"Unclosed literal string\");return new Bb(a)}\nfunctio",
    "n Zb(a){var b=[];if(Ib(C(a.a))){var c=a.a.next();var d=C(a.a);if(\"/\"=",
    "=c&&(a.a.empty()||\".\"!=d&&\"..\"!=d&&\"@\"!=d&&\"*\"!=d&&!/(?![0-9])[",
    "\\w]/.test(d)))return new Gb;d=new Gb;R(a,\"Missing next location step.",
    "\");c=$b(a,c);b.push(c)}else{a:{c=C(a.a);d=c.charAt(0);switch(d){case ",
    "\"$\":throw Error(\"Variable reference not allowed in HTML XPath\");cas",
    "e \"(\":a.a.next();c=Ub(a);R(a,'unclosed \"(\"');Wb(a,\")\");break;case",
    " '\"':case \"'\":c=Yb(a);break;default:if(isNaN(+c))if(!Ab(c)&&/(?![0-9",
    "])[\\w]/.test(d)&&\"(\"==C(a.a,\n1)){c=a.a.next();c=zb[c]||null;a.a.nex",
    "t();for(d=[];\")\"!=C(a.a);){R(a,\"Missing function argument list.\");d",
    ".push(Ub(a));if(\",\"!=C(a.a))break;a.a.next()}R(a,\"Unclosed function ",
    "argument list.\");Xb(a);c=new xb(c,d)}else{c=null;break a}else c=new Db",
    "(+a.a.next())}\"[\"==C(a.a)&&(d=new O(ac(a)),c=new vb(c,d))}if(c)if(Ib(",
    "C(a.a)))d=c;else return c;else c=$b(a,\"/\"),d=new Hb,b.push(c)}for(;Ib",
    "(C(a.a));)c=a.a.next(),R(a,\"Missing next location step.\"),c=$b(a,c),b",
    ".push(c);return new Eb(d,b)}\nfunction $b(a,b){if(\"/\"!=b&&\"//\"!=b)t",
    "hrow Error('Step op should be \"/\" or \"//\"');if(\".\"==C(a.a)){var c",
    "=new P(Qb,new F(\"node\"));a.a.next();return c}if(\"..\"==C(a.a))return",
    " c=new P(Pb,new F(\"node\")),a.a.next(),c;if(\"@\"==C(a.a)){var d=Fb;a.",
    "a.next();R(a,\"Missing attribute name\")}else if(\"::\"==C(a.a,1)){if(!",
    "/(?![0-9])[\\w]/.test(C(a.a).charAt(0)))throw Error(\"Bad token: \"+a.a",
    ".next());var e=a.a.next();d=Ob[e]||null;if(!d)throw Error(\"No axis wit",
    "h name: \"+e);a.a.next();R(a,\"Missing node name\")}else d=Lb;e=\nC(a.a",
    ");if(/(?![0-9])[\\w\\*]/.test(e.charAt(0)))if(\"(\"==C(a.a,1)){if(!Ab(e",
    "))throw Error(\"Invalid node type: \"+e);e=a.a.next();if(!Ab(e))throw E",
    "rror(\"Invalid type name: \"+e);Wb(a,\"(\");R(a,\"Bad nodetype\");var f",
    "=C(a.a).charAt(0),h=null;if('\"'==f||\"'\"==f)h=Yb(a);R(a,\"Bad nodetyp",
    "e\");Xb(a);e=new F(e,h)}else if(e=a.a.next(),f=e.indexOf(\":\"),-1==f)e",
    "=new Cb(e);else{var h=e.substring(0,f);if(\"*\"==h)var m=\"*\";else if(",
    "m=a.wa(h),!m)throw Error(\"Namespace prefix not declared: \"+h);e=e.sub",
    "str(f+1);e=new Cb(e,m)}else throw Error(\"Bad token: \"+\na.a.next());a",
    "=new O(ac(a),d.H);return c||new P(d,e,a,\"//\"==b)}function ac(a){for(v",
    "ar b=[];\"[\"==C(a.a);){a.a.next();R(a,\"Missing predicate expression.",
    "\");var c=Ub(a);b.push(c);R(a,\"Unclosed predicate expression.\");Wb(a,",
    "\"]\")}return b}function Vb(a){if(\"-\"==C(a.a))return a.a.next(),new R",
    "b(Vb(a));var b=Zb(a);if(\"|\"!=C(a.a))a=b;else{for(b=[b];\"|\"==a.a.nex",
    "t();)R(a,\"Missing next union location path.\"),b.push(Zb(a));a.a.back(",
    ");a=new Sb(b)}return a};function bc(a){switch(a.nodeType){case 1:return",
    " ja(cc,a);case 9:return bc(a.documentElement);case 11:case 10:case 6:ca",
    "se 12:return dc;default:return a.parentNode?bc(a.parentNode):dc}}functi",
    "on dc(){return null}function cc(a,b){if(a.prefix==b)return a.namespaceU",
    "RI||\"http://www.w3.org/1999/xhtml\";var c=a.getAttributeNode(\"xmlns:",
    "\"+b);return c&&c.specified?c.value||null:a.parentNode&&9!=a.parentNode",
    ".nodeType?cc(a.parentNode,b):null};function ec(a,b){if(!a.length)throw ",
    "Error(\"Empty XPath expression.\");a=bb(a);if(a.empty())throw Error(\"I",
    "nvalid XPath expression.\");b?ea(b)||(b=ia(b.lookupNamespaceURI,b)):b=f",
    "unction(){return null};var c=Ub(new Tb(a,b));if(!a.empty())throw Error(",
    "\"Bad token: \"+a.next());this.evaluate=function(a,b){a=c.evaluate(new ",
    "$a(a));return new S(a,b)}}\nfunction S(a,b){if(0==b)if(a instanceof E)b",
    "=4;else if(\"string\"==typeof a)b=2;else if(\"number\"==typeof a)b=1;el",
    "se if(\"boolean\"==typeof a)b=3;else throw Error(\"Unexpected evaluatio",
    "n result.\");if(2!=b&&1!=b&&3!=b&&!(a instanceof E))throw Error(\"value",
    " could not be converted to the specified type\");this.resultType=b;swit",
    "ch(b){case 2:this.stringValue=a instanceof E?lb(a):\"\"+a;break;case 1:",
    "this.numberValue=a instanceof E?+lb(a):+a;break;case 3:this.booleanValu",
    "e=a instanceof E?0<a.v():!!a;break;case 4:case 5:case 6:case 7:var c=\n",
    "a.iterator();var d=[];for(var e=c.next();e;e=c.next())d.push(e);this.sn",
    "apshotLength=a.v();this.invalidIteratorState=!1;break;case 8:case 9:thi",
    "s.singleNodeValue=kb(a);break;default:throw Error(\"Unknown XPathResult",
    " type.\");}var f=0;this.iterateNext=function(){if(4!=b&&5!=b)throw Erro",
    "r(\"iterateNext called with wrong result type\");return f>=d.length?nul",
    "l:d[f++]};this.snapshotItem=function(a){if(6!=b&&7!=b)throw Error(\"sna",
    "pshotItem called with wrong result type\");return a>=d.length||0>a?null",
    ":d[a]}}\nS.ANY_TYPE=0;S.NUMBER_TYPE=1;S.STRING_TYPE=2;S.BOOLEAN_TYPE=3;",
    "S.UNORDERED_NODE_ITERATOR_TYPE=4;S.ORDERED_NODE_ITERATOR_TYPE=5;S.UNORD",
    "ERED_NODE_SNAPSHOT_TYPE=6;S.ORDERED_NODE_SNAPSHOT_TYPE=7;S.ANY_UNORDERE",
    "D_NODE_TYPE=8;S.FIRST_ORDERED_NODE_TYPE=9;function fc(a){this.lookupNam",
    "espaceURI=bc(a)}\nba(\"wgxpath.install\",function(a,b){a=a||aa;var c=a.",
    "Document&&a.Document.prototype||a.document;if(!c.evaluate||b)a.XPathRes",
    "ult=S,c.evaluate=function(a,b,c,h){return(new ec(a,c)).evaluate(b,h)},c",
    ".createExpression=function(a,b){return new ec(a,b)},c.createNSResolver=",
    "function(a){return new fc(a)}});var U={};U.aa=function(){var a={Ea:\"ht",
    "tp://www.w3.org/2000/svg\"};return function(b){return a[b]||null}}();\n",
    "U.u=function(a,b,c){var d=A(a);if(!d.documentElement)return null;try{fo",
    "r(var e=d.createNSResolver?d.createNSResolver(d.documentElement):U.aa,f",
    "={},h=d.getElementsByTagName(\"*\"),m=0;m<h.length;++m){var y=h[m],H=y.",
    "namespaceURI;if(H&&!f[H]){var t=y.lookupPrefix(H);if(!t)var z=H.match(",
    "\".*/(\\\\w+)/?$\"),t=z?z[1]:\"xhtml\";f[H]=t}}var M={},T;for(T in f)M[",
    "f[T]]=T;e=function(a){return M[a]||null};try{return d.evaluate(b,a,e,c,",
    "null)}catch(Da){if(\"TypeError\"===Da.name)return e=d.createNSResolver?",
    "d.createNSResolver(d.documentElement):\nU.aa,d.evaluate(b,a,e,c,null);t",
    "hrow Da;}}catch(Da){throw new v(32,\"Unable to locate an element with t",
    "he xpath expression \"+b+\" because of the following error:\\n\"+Da);}}",
    ";U.ba=function(a,b){if(!a||1!=a.nodeType)throw new v(32,'The result of ",
    "the xpath expression \"'+b+'\" is: '+a+\". It should be an element.\");",
    "};\nU.za=function(a,b){var c=function(){var c=U.u(b,a,9);return c?c.sin",
    "gleNodeValue||null:b.selectSingleNode?(c=A(b),c.setProperty&&c.setPrope",
    "rty(\"SelectionLanguage\",\"XPath\"),b.selectSingleNode(a)):null}();nul",
    "l===c||U.ba(c,a);return c};\nU.Ca=function(a,b){var c=function(){var c=",
    "U.u(b,a,7);if(c){for(var e=c.snapshotLength,f=[],h=0;h<e;++h)f.push(c.s",
    "napshotItem(h));return f}return b.selectNodes?(c=A(b),c.setProperty&&c.",
    "setProperty(\"SelectionLanguage\",\"XPath\"),b.selectNodes(a)):[]}();q(",
    "c,function(b){U.ba(b,a)});return c};function gc(a,b,c,d){this.top=a;thi",
    "s.right=b;this.bottom=c;this.left=d}g=gc.prototype;g.clone=function(){r",
    "eturn new gc(this.top,this.right,this.bottom,this.left)};g.toString=fun",
    "ction(){return\"(\"+this.top+\"t, \"+this.right+\"r, \"+this.bottom+\"b",
    ", \"+this.left+\"l)\"};g.contains=function(a){return this&&a?a instance",
    "of gc?a.left>=this.left&&a.right<=this.right&&a.top>=this.top&&a.bottom",
    "<=this.bottom:a.x>=this.left&&a.x<=this.right&&a.y>=this.top&&a.y<=this",
    ".bottom:!1};\ng.expand=function(a,b,c,d){fa(a)?(this.top-=a.top,this.ri",
    "ght+=a.right,this.bottom+=a.bottom,this.left-=a.left):(this.top-=a,this",
    ".right+=Number(b),this.bottom+=Number(c),this.left-=Number(d));return t",
    "his};g.ceil=function(){this.top=Math.ceil(this.top);this.right=Math.cei",
    "l(this.right);this.bottom=Math.ceil(this.bottom);this.left=Math.ceil(th",
    "is.left);return this};\ng.floor=function(){this.top=Math.floor(this.top",
    ");this.right=Math.floor(this.right);this.bottom=Math.floor(this.bottom)",
    ";this.left=Math.floor(this.left);return this};g.round=function(){this.t",
    "op=Math.round(this.top);this.right=Math.round(this.right);this.bottom=M",
    "ath.round(this.bottom);this.left=Math.round(this.left);return this};g.t",
    "ranslate=function(a,b){a instanceof x?(this.left+=a.x,this.right+=a.x,t",
    "his.top+=a.y,this.bottom+=a.y):(this.left+=a,this.right+=a,n(b)&&(this.",
    "top+=b,this.bottom+=b));return this};\ng.scale=function(a,b){b=n(b)?b:a",
    ";this.left*=a;this.right*=a;this.top*=b;this.bottom*=b;return this};fun",
    "ction V(a,b,c,d){this.left=a;this.top=b;this.width=c;this.height=d}g=V.",
    "prototype;g.clone=function(){return new V(this.left,this.top,this.width",
    ",this.height)};g.toString=function(){return\"(\"+this.left+\", \"+this.",
    "top+\" - \"+this.width+\"w x \"+this.height+\"h)\"};g.contains=function",
    "(a){return a instanceof x?a.x>=this.left&&a.x<=this.left+this.width&&a.",
    "y>=this.top&&a.y<=this.top+this.height:this.left<=a.left&&this.left+thi",
    "s.width>=a.left+a.width&&this.top<=a.top&&this.top+this.height>=a.top+a",
    ".height};\ng.ceil=function(){this.left=Math.ceil(this.left);this.top=Ma",
    "th.ceil(this.top);this.width=Math.ceil(this.width);this.height=Math.cei",
    "l(this.height);return this};g.floor=function(){this.left=Math.floor(thi",
    "s.left);this.top=Math.floor(this.top);this.width=Math.floor(this.width)",
    ";this.height=Math.floor(this.height);return this};g.round=function(){th",
    "is.left=Math.round(this.left);this.top=Math.round(this.top);this.width=",
    "Math.round(this.width);this.height=Math.round(this.height);return this}",
    ";\ng.translate=function(a,b){a instanceof x?(this.left+=a.x,this.top+=a",
    ".y):(this.left+=a,n(b)&&(this.top+=b));return this};g.scale=function(a,",
    "b){b=n(b)?b:a;this.left*=a;this.width*=a;this.top*=b;this.height*=b;ret",
    "urn this};var hc=\"function\"===typeof ShadowRoot,ic=\"A AREA BUTTON IN",
    "PUT LABEL SELECT TEXTAREA\".split(\" \");function jc(a){return u(ic,fun",
    "ction(b){return B(a,b)})||null!=Xa(a)&&0<=Number(a.tabIndex)||(kc(a)||(",
    "B(a,\"INPUT\")?\"file\"==a.type.toLowerCase():!1))&&!a.readOnly}var lc=",
    "\"BUTTON INPUT OPTGROUP OPTION SELECT TEXTAREA\".split(\" \");\nfunctio",
    "n mc(a){return u(lc,function(b){return B(a,b)})?a.disabled?!1:a.parentN",
    "ode&&1==a.parentNode.nodeType&&B(a,\"OPTGROUP\")||B(a,\"OPTION\")?mc(a.",
    "parentNode):!Ua(a,function(a){var b=a.parentNode;if(b&&B(b,\"FIELDSET\"",
    ")&&b.disabled){if(!B(a,\"LEGEND\"))return!0;for(;a=k(a.previousElementS",
    "ibling)?a.previousElementSibling:Pa(a.previousSibling);)if(B(a,\"LEGEND",
    "\"))return!0}return!1},!0):!0}var nc=\"text search tel url email passwo",
    "rd number\".split(\" \");\nfunction kc(a){return B(a,\"TEXTAREA\")?!0:B",
    "(a,\"INPUT\")?0<=oa(nc,a.type.toLowerCase()):oc(a)?!0:!1}function oc(a)",
    "{function b(a){return\"inherit\"==a.contentEditable?(a=pc(a))?b(a):!1:",
    "\"true\"==a.contentEditable}return k(a.contentEditable)?k(a.isContentEd",
    "itable)?a.isContentEditable:b(a):!1}function pc(a){for(a=a.parentNode;a",
    "&&1!=a.nodeType&&9!=a.nodeType&&11!=a.nodeType;)a=a.parentNode;return B",
    "(a)?a:null}\nfunction W(a,b){b=na(b);if(\"float\"==b||\"cssFloat\"==b||",
    "\"styleFloat\"==b)b=\"cssFloat\";a:{var c=b;var d=A(a);if(d.defaultView",
    "&&d.defaultView.getComputedStyle&&(d=d.defaultView.getComputedStyle(a,n",
    "ull))){c=d[c]||d.getPropertyValue(c)||\"\";break a}c=\"\"}a=c||qc(a,b);",
    "if(null===a)a=null;else if(0<=oa(ua,b)){b:{var e=a.match(xa);if(e&&(b=N",
    "umber(e[1]),c=Number(e[2]),d=Number(e[3]),e=Number(e[4]),0<=b&&255>=b&&",
    "0<=c&&255>=c&&0<=d&&255>=d&&0<=e&&1>=e)){b=[b,c,d,e];break b}b=null}if(",
    "!b)b:{if(d=a.match(ya))if(b=Number(d[1]),\nc=Number(d[2]),d=Number(d[3]",
    "),0<=b&&255>=b&&0<=c&&255>=c&&0<=d&&255>=d){b=[b,c,d,1];break b}b=null}",
    "if(!b)b:{b=a.toLowerCase();c=ta[b.toLowerCase()];if(!c&&(c=\"#\"==b.cha",
    "rAt(0)?b:\"#\"+b,4==c.length&&(c=c.replace(va,\"#$1$1$2$2$3$3\")),!wa.t",
    "est(c))){b=null;break b}b=[parseInt(c.substr(1,2),16),parseInt(c.substr",
    "(3,2),16),parseInt(c.substr(5,2),16),1]}a=b?\"rgba(\"+b.join(\", \")+\"",
    ")\":a}return a}\nfunction qc(a,b){var c=a.currentStyle||a.style,d=c[b];",
    "!k(d)&&ea(c.getPropertyValue)&&(d=c.getPropertyValue(b));return\"inheri",
    "t\"!=d?k(d)?d:null:(a=pc(a))?qc(a,b):null}\nfunction rc(a,b,c){function",
    " d(a){var b=sc(a);return 0<b.height&&0<b.width?!0:B(a,\"PATH\")&&(0<b.h",
    "eight||0<b.width)?(a=W(a,\"stroke-width\"),!!a&&0<parseInt(a,10)):\"hid",
    "den\"!=W(a,\"overflow\")&&u(a.childNodes,function(a){return 3==a.nodeTy",
    "pe||B(a)&&d(a)})}function e(a){return tc(a)==X&&pa(a.childNodes,functio",
    "n(a){return!B(a)||e(a)||!d(a)})}if(!B(a))throw Error(\"Argument to isSh",
    "own must be of type Element\");if(B(a,\"BODY\"))return!0;if(B(a,\"OPTIO",
    "N\")||B(a,\"OPTGROUP\"))return a=Ua(a,function(a){return B(a,\"SELECT\"",
    ")}),\n!!a&&rc(a,!0,c);var f=uc(a);if(f)return!!f.fa&&0<f.rect.width&&0<",
    "f.rect.height&&rc(f.fa,b,c);if(B(a,\"INPUT\")&&\"hidden\"==a.type.toLow",
    "erCase()||B(a,\"NOSCRIPT\"))return!1;f=W(a,\"visibility\");return\"coll",
    "apse\"!=f&&\"hidden\"!=f&&c(a)&&(b||0!=vc(a))&&d(a)?!e(a):!1}\nfunction",
    " wc(a){var b=hc?function(c){if(\"none\"==W(c,\"display\"))return!1;do{v",
    "ar d=c.parentNode;if(c.getDestinationInsertionPoints){var e=c.getDestin",
    "ationInsertionPoints();0<e.length&&(d=e[e.length-1])}if(d instanceof Sh",
    "adowRoot)return!0;!d||9!=d.nodeType&&11!=d.nodeType||(d=null)}while(a&&",
    "1!=a.nodeType);return!d||b(d)}:function(a){if(\"none\"==W(a,\"display\"",
    "))return!1;a=pc(a);return!a||b(a)};return rc(a,!0,b)}var X=\"hidden\";",
    "\nfunction tc(a){function b(a){function b(a){return a==h?!0:0==W(a,\"di",
    "splay\").lastIndexOf(\"inline\",0)||\"absolute\"==c&&\"static\"==W(a,\"",
    "position\")?!1:!0}var c=W(a,\"position\");if(\"fixed\"==c)return H=!0,a",
    "==h?null:h;for(a=pc(a);a&&!b(a);)a=pc(a);return a}function c(a){var b=a",
    ";if(\"visible\"==y)if(a==h&&m)b=m;else if(a==m)return{x:\"visible\",y:",
    "\"visible\"};b={x:W(b,\"overflow-x\"),y:W(b,\"overflow-y\")};a==h&&(b.x",
    "=\"visible\"==b.x?\"auto\":b.x,b.y=\"visible\"==b.y?\"auto\":b.y);retur",
    "n b}function d(a){if(a==h){var b=(new Wa(f)).M;\na=b.scrollingElement?b",
    ".scrollingElement:b.body||b.documentElement;b=b.parentWindow||b.default",
    "View;a=new x(b.pageXOffset||a.scrollLeft,b.pageYOffset||a.scrollTop)}el",
    "se a=new x(a.scrollLeft,a.scrollTop);return a}var e=xc(a);var f=A(a),h=",
    "f.documentElement,m=f.body,y=W(h,\"overflow\"),H;for(a=b(a);a;a=b(a)){v",
    "ar t=c(a);if(\"visible\"!=t.x||\"visible\"!=t.y){var z=sc(a);if(0==z.wi",
    "dth||0==z.height)return X;var M=e.right<z.left,T=e.bottom<z.top;if(M&&",
    "\"hidden\"==t.x||T&&\"hidden\"==t.y)return X;if(M&&\"visible\"!=t.x||\n",
    "T&&\"visible\"!=t.y){M=d(a);T=e.bottom<z.top-M.y;if(e.right<z.left-M.x&",
    "&\"visible\"!=t.x||T&&\"visible\"!=t.x)return X;e=tc(a);return e==X?X:",
    "\"scroll\"}M=e.left>=z.left+z.width;z=e.top>=z.top+z.height;if(M&&\"hid",
    "den\"==t.x||z&&\"hidden\"==t.y)return X;if(M&&\"visible\"!=t.x||z&&\"vi",
    "sible\"!=t.y){if(H&&(t=d(a),e.left>=h.scrollWidth-t.x||e.right>=h.scrol",
    "lHeight-t.y))return X;e=tc(a);return e==X?X:\"scroll\"}}}return\"none\"",
    "}\nfunction sc(a){var b=uc(a);if(b)return b.rect;if(B(a,\"HTML\"))retur",
    "n a=A(a),a=((a?a.parentWindow||a.defaultView:window)||window).document,",
    "a=\"CSS1Compat\"==a.compatMode?a.documentElement:a.body,a=new Ma(a.clie",
    "ntWidth,a.clientHeight),new V(0,0,a.width,a.height);try{var c=a.getBoun",
    "dingClientRect()}catch(d){return new V(0,0,0,0)}return new V(c.left,c.t",
    "op,c.right-c.left,c.bottom-c.top)}\nfunction uc(a){var b=B(a,\"MAP\");i",
    "f(!b&&!B(a,\"AREA\"))return null;var c=b?a:B(a.parentNode,\"MAP\")?a.pa",
    "rentNode:null,d=null,e=null;c&&c.name&&(d=U.za('/descendant::*[@usemap ",
    "= \"#'+c.name+'\"]',A(c)))&&(e=sc(d),b||\"default\"==a.shape.toLowerCas",
    "e()||(a=yc(a),b=Math.min(Math.max(a.left,0),e.width),c=Math.min(Math.ma",
    "x(a.top,0),e.height),e=new V(b+e.left,c+e.top,Math.min(a.width,e.width-",
    "b),Math.min(a.height,e.height-c))));return{fa:d,rect:e||new V(0,0,0,0)}",
    "}\nfunction yc(a){var b=a.shape.toLowerCase();a=a.coords.split(\",\");i",
    "f(\"rect\"==b&&4==a.length){var b=a[0],c=a[1];return new V(b,c,a[2]-b,a",
    "[3]-c)}if(\"circle\"==b&&3==a.length)return b=a[2],new V(a[0]-b,a[1]-b,",
    "2*b,2*b);if(\"poly\"==b&&2<a.length){for(var b=a[0],c=a[1],d=b,e=c,f=2;",
    "f+1<a.length;f+=2)b=Math.min(b,a[f]),d=Math.max(d,a[f]),c=Math.min(c,a[",
    "f+1]),e=Math.max(e,a[f+1]);return new V(b,c,d-b,e-c)}return new V(0,0,0",
    ",0)}function xc(a){a=sc(a);return new gc(a.top,a.left+a.width,a.top+a.h",
    "eight,a.left)}\nfunction vc(a){var b=1,c=W(a,\"opacity\");c&&(b=Number(",
    "c));(a=pc(a))&&(b*=vc(a));return b};function zc(){this.N=ka.document.do",
    "cumentElement;var a=Va(A(this.N));a&&Ac(this,a)}function Ac(a,b){a.N=b;",
    "B(b,\"OPTION\")&&Ua(b,function(a){return B(a,\"SELECT\")})}function Bc(",
    "a){var b=Ua(a.N,function(a){return!!a&&B(a)&&jc(a)},!0),b=b||a.N;a=Va(A",
    "(b));if(b!=a){if(a&&ea(a.blur)&&!B(a,\"BODY\"))try{a.blur()}catch(c){th",
    "row c;}ea(b.focus)&&b.focus()}};La();La();function Cc(a,b,c){this.B=a;t",
    "his.pa=b;this.qa=c}Cc.prototype.create=function(a){a=A(a).createEvent(",
    "\"HTMLEvents\");a.initEvent(this.B,this.pa,this.qa);return a};Cc.protot",
    "ype.toString=function(){return this.B};var Dc=new Cc(\"change\",!0,!1);",
    "function Ec(a,b){this.w={};this.g=[];this.G=0;var c=arguments.length;if",
    "(1<c){if(c%2)throw Error(\"Uneven number of arguments\");for(var d=0;d<",
    "c;d+=2)this.set(arguments[d],arguments[d+1])}else a&&this.addAll(a)}fun",
    "ction Fc(a){Gc(a);return a.g.concat()}g=Ec.prototype;g.clear=function()",
    "{this.w={};this.G=this.g.length=0};g.remove=function(a){return Object.p",
    "rototype.hasOwnProperty.call(this.w,a)?(delete this.w[a],this.G--,this.",
    "g.length>2*this.G&&Gc(this),!0):!1};\nfunction Gc(a){var b,c;if(a.G!=a.",
    "g.length){for(b=c=0;c<a.g.length;){var d=a.g[c];Object.prototype.hasOwn",
    "Property.call(a.w,d)&&(a.g[b++]=d);c++}a.g.length=b}if(a.G!=a.g.length)",
    "{var e={};for(b=c=0;c<a.g.length;)d=a.g[c],Object.prototype.hasOwnPrope",
    "rty.call(e,d)||(a.g[b++]=d,e[d]=1),c++;a.g.length=b}}g.get=function(a,b",
    "){return Object.prototype.hasOwnProperty.call(this.w,a)?this.w[a]:b};g.",
    "set=function(a,b){Object.prototype.hasOwnProperty.call(this.w,a)||(this",
    ".G++,this.g.push(a));this.w[a]=b};\ng.addAll=function(a){if(a instanceo",
    "f Ec){var b=Fc(a);Gc(a);for(var c=[],d=0;d<a.g.length;d++)c.push(a.w[a.",
    "g[d]]);a=c}else{b=[];var d=0;for(e in a)b[d++]=e;d=[];var e=0;for(c in ",
    "a)d[e++]=a[c];a=d}for(c=0;c<b.length;c++)this.set(b[c],a[c])};g.forEach",
    "=function(a,b){for(var c=Fc(this),d=0;d<c.length;d++){var e=c[d],f=this",
    ".get(e);a.call(b,f,e,this)}};g.clone=function(){return new Ec(this)};va",
    "r Hc={};function Y(a,b,c){fa(a)&&(a=a.b);a=new Ic(a);!b||b in Hc&&!c||(",
    "Hc[b]={key:a,shift:!1},c&&(Hc[c]={key:a,shift:!0}));return a}function I",
    "c(a){this.code=a}Y(8);Y(9);Y(13);var Jc=Y(16),Kc=Y(17),Lc=Y(18);Y(19);Y",
    "(20);Y(27);Y(32,\" \");Y(33);Y(34);Y(35);Y(36);Y(37);Y(38);Y(39);Y(40);",
    "Y(44);Y(45);Y(46);Y(48,\"0\",\")\");Y(49,\"1\",\"!\");Y(50,\"2\",\"@\")",
    ";Y(51,\"3\",\"#\");Y(52,\"4\",\"$\");Y(53,\"5\",\"%\");Y(54,\"6\",\"^\"",
    ");Y(55,\"7\",\"&\");Y(56,\"8\",\"*\");Y(57,\"9\",\"(\");Y(65,\"a\",\"A",
    "\");Y(66,\"b\",\"B\");Y(67,\"c\",\"C\");Y(68,\"d\",\"D\");\nY(69,\"e\",",
    "\"E\");Y(70,\"f\",\"F\");Y(71,\"g\",\"G\");Y(72,\"h\",\"H\");Y(73,\"i\"",
    ",\"I\");Y(74,\"j\",\"J\");Y(75,\"k\",\"K\");Y(76,\"l\",\"L\");Y(77,\"m",
    "\",\"M\");Y(78,\"n\",\"N\");Y(79,\"o\",\"O\");Y(80,\"p\",\"P\");Y(81,\"",
    "q\",\"Q\");Y(82,\"r\",\"R\");Y(83,\"s\",\"S\");Y(84,\"t\",\"T\");Y(85,",
    "\"u\",\"U\");Y(86,\"v\",\"V\");Y(87,\"w\",\"W\");Y(88,\"x\",\"X\");Y(89",
    ",\"y\",\"Y\");Y(90,\"z\",\"Z\");var Mc=Y(Ha?{c:91,b:91}:Ga?{c:224,b:91}",
    ":{c:0,b:91});Y(Ha?{c:92,b:92}:Ga?{c:224,b:93}:{c:0,b:92});Y(Ha?{c:93,b:",
    "93}:Ga?{c:0,b:0}:{c:93,b:null});Y({c:96,b:96},\"0\");Y({c:97,b:97},\"1",
    "\");\nY({c:98,b:98},\"2\");Y({c:99,b:99},\"3\");Y({c:100,b:100},\"4\");",
    "Y({c:101,b:101},\"5\");Y({c:102,b:102},\"6\");Y({c:103,b:103},\"7\");Y(",
    "{c:104,b:104},\"8\");Y({c:105,b:105},\"9\");Y({c:106,b:106},\"*\");Y({c",
    ":107,b:107},\"+\");Y({c:109,b:109},\"-\");Y({c:110,b:110},\".\");Y({c:1",
    "11,b:111},\"/\");Y(144);Y(112);Y(113);Y(114);Y(115);Y(116);Y(117);Y(118",
    ");Y(119);Y(120);Y(121);Y(122);Y(123);Y({c:107,b:187},\"=\",\"+\");Y(108",
    ",\",\");Y({c:109,b:189},\"-\",\"_\");Y(188,\",\",\"<\");Y(190,\".\",\">",
    "\");Y(191,\"/\",\"?\");Y(192,\"`\",\"~\");Y(219,\"[\",\"{\");\nY(220,\"",
    "\\\\\",\"|\");Y(221,\"]\",\"}\");Y({c:59,b:186},\";\",\":\");Y(222,\"'",
    "\",'\"');var Nc=new Ec;Nc.set(1,Jc);Nc.set(2,Kc);Nc.set(4,Lc);Nc.set(8,",
    "Mc);(function(a){var b=new Ec;q(Fc(a),function(c){b.set(a.get(c).code,c",
    ")});return b})(Nc);function Z(){zc.call(this)}p(Z,zc);Z.W=void 0;Z.ra=f",
    "unction(){return Z.W?Z.W:Z.W=new Z};ba(\"_\",function(a){if(!wc(a)||!mc",
    "(a)||\"none\"==W(a,\"pointer-events\"))throw new v(12,\"Element is not ",
    "currently interactable and may not be manipulated\");if(!(kc(a)||B(a,\"",
    "INPUT\")&&\"file\"==a.type.toLowerCase())||a.readOnly)throw new v(12,\"",
    "Element must be user-editable in order to clear it.\");var b=Z.ra();Ac(",
    "b,a);Bc(b);a.value?(a.value=\"\",b=Dc.create(a,void 0),\"isTrusted\"in ",
    "b||(b.isTrusted=!1),a.dispatchEvent(b)):B(a,\"INPUT\")&&a.getAttribute(",
    "\"type\")&&\"number\"==a.getAttribute(\"type\").toLowerCase()&&(a.value",
    "=\n\"\");oc(a)&&(a.innerHTML=\" \")});; return this._.apply(null,argume",
    "nts);}.apply({navigator:typeof window!='undefined'?window.navigator:nul",
    "l,document:typeof window!='undefined'?window.document:null}, arguments)",
    ";}",
    NULL
};

const char* const CLICK[] = {
    "function(){return function(){var g,aa=this;function k(a){return void 0!",
    "==a}function m(a){return\"string\"==typeof a}function n(a){return\"numb",
    "er\"==typeof a}function ba(a,b){a=a.split(\".\");var c=aa;a[0]in c||!c.",
    "execScript||c.execScript(\"var \"+a[0]);for(var d;a.length&&(d=a.shift(",
    "));)!a.length&&k(b)?c[d]=b:c=c[d]&&c[d]!==Object.prototype[d]?c[d]:c[d]",
    "={}}\nfunction ca(a){var b=typeof a;if(\"object\"==b)if(a){if(a instanc",
    "eof Array)return\"array\";if(a instanceof Object)return b;var c=Object.",
    "prototype.toString.call(a);if(\"[object Window]\"==c)return\"object\";i",
    "f(\"[object Array]\"==c||\"number\"==typeof a.length&&\"undefined\"!=ty",
    "peof a.splice&&\"undefined\"!=typeof a.propertyIsEnumerable&&!a.propert",
    "yIsEnumerable(\"splice\"))return\"array\";if(\"[object Function]\"==c||",
    "\"undefined\"!=typeof a.call&&\"undefined\"!=typeof a.propertyIsEnumera",
    "ble&&!a.propertyIsEnumerable(\"call\"))return\"function\"}else return\"",
    "null\";\nelse if(\"function\"==b&&\"undefined\"==typeof a.call)return\"",
    "object\";return b}function da(a){var b=ca(a);return\"array\"==b||\"obje",
    "ct\"==b&&\"number\"==typeof a.length}function ea(a){return\"function\"=",
    "=ca(a)}function fa(a){var b=typeof a;return\"object\"==b&&null!=a||\"fu",
    "nction\"==b}function ga(a,b,c){return a.call.apply(a.bind,arguments)}\n",
    "function ha(a,b,c){if(!a)throw Error();if(2<arguments.length){var d=Arr",
    "ay.prototype.slice.call(arguments,2);return function(){var c=Array.prot",
    "otype.slice.call(arguments);Array.prototype.unshift.apply(c,d);return a",
    ".apply(b,c)}}return function(){return a.apply(b,arguments)}}function ia",
    "(a,b,c){ia=Function.prototype.bind&&-1!=Function.prototype.bind.toStrin",
    "g().indexOf(\"native code\")?ga:ha;return ia.apply(null,arguments)}\nfu",
    "nction ja(a,b){var c=Array.prototype.slice.call(arguments,1);return fun",
    "ction(){var b=c.slice();b.push.apply(b,arguments);return a.apply(this,b",
    ")}}function p(a,b){function c(){}c.prototype=b.prototype;a.Na=b.prototy",
    "pe;a.prototype=new c;a.prototype.constructor=a;a.La=function(a,c,f){for",
    "(var d=Array(arguments.length-2),e=2;e<arguments.length;e++)d[e-2]=argu",
    "ments[e];return b.prototype[c].apply(a,d)}};var ka=window;var ma=String",
    ".prototype.trim?function(a){return a.trim()}:function(a){return a.repla",
    "ce(/^[\\s\\xa0]+|[\\s\\xa0]+$/g,\"\")};\nfunction na(a,b){var c=0;a=ma(",
    "String(a)).split(\".\");b=ma(String(b)).split(\".\");for(var d=Math.max",
    "(a.length,b.length),e=0;0==c&&e<d;e++){var f=a[e]||\"\",h=b[e]||\"\";do",
    "{f=/(\\d*)(\\D*)(.*)/.exec(f)||[\"\",\"\",\"\",\"\"];h=/(\\d*)(\\D*)(.*",
    ")/.exec(h)||[\"\",\"\",\"\",\"\"];if(0==f[0].length&&0==h[0].length)bre",
    "ak;c=oa(0==f[1].length?0:parseInt(f[1],10),0==h[1].length?0:parseInt(h[",
    "1],10))||oa(0==f[2].length,0==h[2].length)||oa(f[2],h[2]);f=f[3];h=h[3]",
    "}while(0==c)}return c}function oa(a,b){return a<b?-1:a>b?1:0}\nfunction",
    " pa(a){return String(a).replace(/\\-([a-z])/g,function(a,c){return c.to",
    "UpperCase()})};function qa(a,b){if(m(a))return m(b)&&1==b.length?a.inde",
    "xOf(b,0):-1;for(var c=0;c<a.length;c++)if(c in a&&a[c]===b)return c;ret",
    "urn-1}function t(a,b){for(var c=a.length,d=m(a)?a.split(\"\"):a,e=0;e<c",
    ";e++)e in d&&b.call(void 0,d[e],e,a)}function ra(a,b,c){var d=c;t(a,fun",
    "ction(c,f){d=b.call(void 0,d,c,f,a)});return d}function sa(a,b){for(var",
    " c=a.length,d=m(a)?a.split(\"\"):a,e=0;e<c;e++)if(e in d&&b.call(void 0",
    ",d[e],e,a))return!0;return!1}\nfunction ta(a,b){for(var c=a.length,d=m(",
    "a)?a.split(\"\"):a,e=0;e<c;e++)if(e in d&&!b.call(void 0,d[e],e,a))retu",
    "rn!1;return!0}function ua(a){return Array.prototype.concat.apply([],arg",
    "uments)}function va(a){var b=a.length;if(0<b){for(var c=Array(b),d=0;d<",
    "b;d++)c[d]=a[d];return c}return[]}function wa(a,b,c){return 2>=argument",
    "s.length?Array.prototype.slice.call(a,b):Array.prototype.slice.call(a,b",
    ",c)};var xa={aliceblue:\"#f0f8ff\",antiquewhite:\"#faebd7\",aqua:\"#00f",
    "fff\",aquamarine:\"#7fffd4\",azure:\"#f0ffff\",beige:\"#f5f5dc\",bisque",
    ":\"#ffe4c4\",black:\"#000000\",blanchedalmond:\"#ffebcd\",blue:\"#0000f",
    "f\",blueviolet:\"#8a2be2\",brown:\"#a52a2a\",burlywood:\"#deb887\",cade",
    "tblue:\"#5f9ea0\",chartreuse:\"#7fff00\",chocolate:\"#d2691e\",coral:\"",
    "#ff7f50\",cornflowerblue:\"#6495ed\",cornsilk:\"#fff8dc\",crimson:\"#dc",
    "143c\",cyan:\"#00ffff\",darkblue:\"#00008b\",darkcyan:\"#008b8b\",darkg",
    "oldenrod:\"#b8860b\",darkgray:\"#a9a9a9\",darkgreen:\"#006400\",\ndarkg",
    "rey:\"#a9a9a9\",darkkhaki:\"#bdb76b\",darkmagenta:\"#8b008b\",darkolive",
    "green:\"#556b2f\",darkorange:\"#ff8c00\",darkorchid:\"#9932cc\",darkred",
    ":\"#8b0000\",darksalmon:\"#e9967a\",darkseagreen:\"#8fbc8f\",darkslateb",
    "lue:\"#483d8b\",darkslategray:\"#2f4f4f\",darkslategrey:\"#2f4f4f\",dar",
    "kturquoise:\"#00ced1\",darkviolet:\"#9400d3\",deeppink:\"#ff1493\",deep",
    "skyblue:\"#00bfff\",dimgray:\"#696969\",dimgrey:\"#696969\",dodgerblue:",
    "\"#1e90ff\",firebrick:\"#b22222\",floralwhite:\"#fffaf0\",forestgreen:",
    "\"#228b22\",fuchsia:\"#ff00ff\",gainsboro:\"#dcdcdc\",\nghostwhite:\"#f",
    "8f8ff\",gold:\"#ffd700\",goldenrod:\"#daa520\",gray:\"#808080\",green:",
    "\"#008000\",greenyellow:\"#adff2f\",grey:\"#808080\",honeydew:\"#f0fff0",
    "\",hotpink:\"#ff69b4\",indianred:\"#cd5c5c\",indigo:\"#4b0082\",ivory:",
    "\"#fffff0\",khaki:\"#f0e68c\",lavender:\"#e6e6fa\",lavenderblush:\"#fff",
    "0f5\",lawngreen:\"#7cfc00\",lemonchiffon:\"#fffacd\",lightblue:\"#add8e",
    "6\",lightcoral:\"#f08080\",lightcyan:\"#e0ffff\",lightgoldenrodyellow:",
    "\"#fafad2\",lightgray:\"#d3d3d3\",lightgreen:\"#90ee90\",lightgrey:\"#d",
    "3d3d3\",lightpink:\"#ffb6c1\",lightsalmon:\"#ffa07a\",\nlightseagreen:",
    "\"#20b2aa\",lightskyblue:\"#87cefa\",lightslategray:\"#778899\",lightsl",
    "ategrey:\"#778899\",lightsteelblue:\"#b0c4de\",lightyellow:\"#ffffe0\",",
    "lime:\"#00ff00\",limegreen:\"#32cd32\",linen:\"#faf0e6\",magenta:\"#ff0",
    "0ff\",maroon:\"#800000\",mediumaquamarine:\"#66cdaa\",mediumblue:\"#000",
    "0cd\",mediumorchid:\"#ba55d3\",mediumpurple:\"#9370db\",mediumseagreen:",
    "\"#3cb371\",mediumslateblue:\"#7b68ee\",mediumspringgreen:\"#00fa9a\",m",
    "ediumturquoise:\"#48d1cc\",mediumvioletred:\"#c71585\",midnightblue:\"#",
    "191970\",mintcream:\"#f5fffa\",mistyrose:\"#ffe4e1\",\nmoccasin:\"#ffe4",
    "b5\",navajowhite:\"#ffdead\",navy:\"#000080\",oldlace:\"#fdf5e6\",olive",
    ":\"#808000\",olivedrab:\"#6b8e23\",orange:\"#ffa500\",orangered:\"#ff45",
    "00\",orchid:\"#da70d6\",palegoldenrod:\"#eee8aa\",palegreen:\"#98fb98\"",
    ",paleturquoise:\"#afeeee\",palevioletred:\"#db7093\",papayawhip:\"#ffef",
    "d5\",peachpuff:\"#ffdab9\",peru:\"#cd853f\",pink:\"#ffc0cb\",plum:\"#dd",
    "a0dd\",powderblue:\"#b0e0e6\",purple:\"#800080\",red:\"#ff0000\",rosybr",
    "own:\"#bc8f8f\",royalblue:\"#4169e1\",saddlebrown:\"#8b4513\",salmon:\"",
    "#fa8072\",sandybrown:\"#f4a460\",seagreen:\"#2e8b57\",\nseashell:\"#fff",
    "5ee\",sienna:\"#a0522d\",silver:\"#c0c0c0\",skyblue:\"#87ceeb\",slatebl",
    "ue:\"#6a5acd\",slategray:\"#708090\",slategrey:\"#708090\",snow:\"#fffa",
    "fa\",springgreen:\"#00ff7f\",steelblue:\"#4682b4\",tan:\"#d2b48c\",teal",
    ":\"#008080\",thistle:\"#d8bfd8\",tomato:\"#ff6347\",turquoise:\"#40e0d0",
    "\",violet:\"#ee82ee\",wheat:\"#f5deb3\",white:\"#ffffff\",whitesmoke:\"",
    "#f5f5f5\",yellow:\"#ffff00\",yellowgreen:\"#9acd32\"};var ya=\"backgrou",
    "ndColor borderTopColor borderRightColor borderBottomColor borderLeftCol",
    "or color outlineColor\".split(\" \"),za=/#([0-9a-fA-F])([0-9a-fA-F])([0",
    "-9a-fA-F])/,Aa=/^#(?:[0-9a-f]{3}){1,2}$/i,Ba=/^(?:rgba)?\\((\\d{1,3}),",
    "\\s?(\\d{1,3}),\\s?(\\d{1,3}),\\s?(0|1|0\\.\\d*)\\)$/i,Ca=/^(?:rgb)?\\(",
    "(0|[1-9]\\d{0,2}),\\s?(0|[1-9]\\d{0,2}),\\s?(0|[1-9]\\d{0,2})\\)$/i;fun",
    "ction u(a,b){this.code=a;this.state=w[a]||Da;this.message=b||\"\";a=thi",
    "s.state.replace(/((?:^|\\s+)[a-z])/g,function(a){return a.toUpperCase()",
    ".replace(/^[\\s\\xa0]+/g,\"\")});b=a.length-5;if(0>b||a.indexOf(\"Error",
    "\",b)!=b)a+=\"Error\";this.name=a;a=Error(this.message);a.name=this.nam",
    "e;this.stack=a.stack||\"\"}p(u,Error);var Da=\"unknown error\",w={15:\"",
    "element not selectable\",11:\"element not visible\"};w[31]=Da;w[30]=Da;",
    "w[24]=\"invalid cookie domain\";w[29]=\"invalid element coordinates\";w",
    "[12]=\"invalid element state\";\nw[32]=\"invalid selector\";w[51]=\"inv",
    "alid selector\";w[52]=\"invalid selector\";w[17]=\"javascript error\";w",
    "[405]=\"unsupported operation\";w[34]=\"move target out of bounds\";w[2",
    "7]=\"no such alert\";w[7]=\"no such element\";w[8]=\"no such frame\";w[",
    "23]=\"no such window\";w[28]=\"script timeout\";w[33]=\"session not cre",
    "ated\";w[10]=\"stale element reference\";w[21]=\"timeout\";w[25]=\"unab",
    "le to set cookie\";w[26]=\"unexpected alert open\";w[13]=Da;w[9]=\"unkn",
    "own command\";u.prototype.toString=function(){return this.name+\": \"+t",
    "his.message};var x;a:{var Ea=aa.navigator;if(Ea){var Fa=Ea.userAgent;if",
    "(Fa){x=Fa;break a}}x=\"\"};function Ga(a){var b=Ha;Object.prototype.has",
    "OwnProperty.call(b,\"528\")||(b[\"528\"]=a(\"528\"))};var Ia=-1!=x.inde",
    "xOf(\"Macintosh\"),Ja=-1!=x.indexOf(\"Windows\"),Ka,La=\"\",Ma=/WebKit",
    "\\/(\\S+)/.exec(x);Ma&&(La=Ma?Ma[1]:\"\");Ka=La;var Ha={};function Na()",
    "{Ga(function(){return 0<=na(Ka,\"528\")})};function Oa(a){return(a=a.ex",
    "ec(x))?a[1]:\"\"}var Pa=-1!=x.indexOf(\"iPhone\")&&-1==x.indexOf(\"iPod",
    "\")&&-1==x.indexOf(\"iPad\")||-1!=x.indexOf(\"iPad\")||-1!=x.indexOf(\"",
    "iPod\")?Oa(/CriOS\\/([0-9.]+)/):Oa(/Chrome\\/([0-9.]+)/);var Qa=10<=Num",
    "ber(void 0);function z(a,b){this.x=k(a)?a:0;this.y=k(b)?b:0}g=z.prototy",
    "pe;g.clone=function(){return new z(this.x,this.y)};g.toString=function(",
    "){return\"(\"+this.x+\", \"+this.y+\")\"};g.ceil=function(){this.x=Math",
    ".ceil(this.x);this.y=Math.ceil(this.y);return this};g.floor=function(){",
    "this.x=Math.floor(this.x);this.y=Math.floor(this.y);return this};g.roun",
    "d=function(){this.x=Math.round(this.x);this.y=Math.round(this.y);return",
    " this};\ng.translate=function(a,b){a instanceof z?(this.x+=a.x,this.y+=",
    "a.y):(this.x+=Number(a),n(b)&&(this.y+=b));return this};g.scale=functio",
    "n(a,b){b=n(b)?b:a;this.x*=a;this.y*=b;return this};function Ra(a,b){thi",
    "s.width=a;this.height=b}g=Ra.prototype;g.clone=function(){return new Ra",
    "(this.width,this.height)};g.toString=function(){return\"(\"+this.width+",
    "\" x \"+this.height+\")\"};g.ceil=function(){this.width=Math.ceil(this.",
    "width);this.height=Math.ceil(this.height);return this};g.floor=function",
    "(){this.width=Math.floor(this.width);this.height=Math.floor(this.height",
    ");return this};g.round=function(){this.width=Math.round(this.width);thi",
    "s.height=Math.round(this.height);return this};\ng.scale=function(a,b){b",
    "=n(b)?b:a;this.width*=a;this.height*=b;return this};function Sa(a){retu",
    "rn a?a.parentWindow||a.defaultView:window}function Ta(a,b,c){function d",
    "(c){c&&b.appendChild(m(c)?a.createTextNode(c):c)}for(var e=1;e<c.length",
    ";e++){var f=c[e];!da(f)||fa(f)&&0<f.nodeType?d(f):t(Ua(f)?va(f):f,d)}}f",
    "unction Va(a){for(;a&&1!=a.nodeType;)a=a.previousSibling;return a}\nfun",
    "ction Wa(a,b){if(!a||!b)return!1;if(a.contains&&1==b.nodeType)return a=",
    "=b||a.contains(b);if(\"undefined\"!=typeof a.compareDocumentPosition)re",
    "turn a==b||!!(a.compareDocumentPosition(b)&16);for(;b&&a!=b;)b=b.parent",
    "Node;return b==a}\nfunction Xa(a,b){if(a==b)return 0;if(a.compareDocume",
    "ntPosition)return a.compareDocumentPosition(b)&2?1:-1;if(\"sourceIndex",
    "\"in a||a.parentNode&&\"sourceIndex\"in a.parentNode){var c=1==a.nodeTy",
    "pe,d=1==b.nodeType;if(c&&d)return a.sourceIndex-b.sourceIndex;var e=a.p",
    "arentNode,f=b.parentNode;return e==f?Ya(a,b):!c&&Wa(e,b)?-1*Za(a,b):!d&",
    "&Wa(f,a)?Za(b,a):(c?a.sourceIndex:e.sourceIndex)-(d?b.sourceIndex:f.sou",
    "rceIndex)}d=A(a);c=d.createRange();c.selectNode(a);c.collapse(!0);a=d.c",
    "reateRange();a.selectNode(b);\na.collapse(!0);return c.compareBoundaryP",
    "oints(aa.Range.START_TO_END,a)}function Za(a,b){var c=a.parentNode;if(c",
    "==b)return-1;for(;b.parentNode!=c;)b=b.parentNode;return Ya(b,a)}functi",
    "on Ya(a,b){for(;b=b.previousSibling;)if(b==a)return-1;return 1}function",
    " A(a){return 9==a.nodeType?a:a.ownerDocument||a.document}function Ua(a)",
    "{if(a&&\"number\"==typeof a.length){if(fa(a))return\"function\"==typeof",
    " a.item||\"string\"==typeof a.item;if(ea(a))return\"function\"==typeof ",
    "a.item}return!1}\nfunction $a(a,b,c){a&&!c&&(a=a.parentNode);for(c=0;a;",
    "){if(b(a))return a;a=a.parentNode;c++}return null}function ab(a){try{re",
    "turn a&&a.activeElement}catch(b){}return null}function bb(a){this.R=a||",
    "aa.document||document}g=bb.prototype;g.I=function(a){return m(a)?this.R",
    ".getElementById(a):a};g.getElementsByTagName=function(a,b){return(b||th",
    "is.R).getElementsByTagName(String(a))};g.createElement=function(a){retu",
    "rn this.R.createElement(String(a))};g.createTextNode=function(a){return",
    " this.R.createTextNode(String(a))};\ng.appendChild=function(a,b){a.appe",
    "ndChild(b)};g.append=function(a,b){Ta(A(a),a,arguments)};g.canHaveChild",
    "ren=function(a){if(1!=a.nodeType)return!1;switch(a.tagName){case \"APPL",
    "ET\":case \"AREA\":case \"BASE\":case \"BR\":case \"COL\":case \"COMMAN",
    "D\":case \"EMBED\":case \"FRAME\":case \"HR\":case \"IMG\":case \"INPUT",
    "\":case \"IFRAME\":case \"ISINDEX\":case \"KEYGEN\":case \"LINK\":case ",
    "\"NOFRAMES\":case \"NOSCRIPT\":case \"META\":case \"OBJECT\":case \"PAR",
    "AM\":case \"SCRIPT\":case \"SOURCE\":case \"STYLE\":case \"TRACK\":case",
    " \"WBR\":return!1}return!0};\ng.removeNode=function(a){return a&&a.pare",
    "ntNode?a.parentNode.removeChild(a):null};g.contains=Wa;function cb(a){v",
    "ar b=\"tabindex\";return\"style\"==b?db(a.style.cssText):(a=a.getAttrib",
    "uteNode(b))&&a.specified?a.value:null}var eb=/[;]+(?=(?:(?:[^\"]*\"){2}",
    ")*[^\"]*$)(?=(?:(?:[^']*'){2})*[^']*$)(?=(?:[^()]*\\([^()]*\\))*[^()]*$",
    ")/;function db(a){var b=[];t(a.split(eb),function(a){var c=a.indexOf(\"",
    ":\");0<c&&(a=[a.slice(0,c),a.slice(c+1)],2==a.length&&b.push(a[0].toLow",
    "erCase(),\":\",a[1],\";\"))});b=b.join(\"\");return b=\";\"==b.charAt(b",
    ".length-1)?b:b+\";\"}\nfunction B(a,b){b&&\"string\"!==typeof b&&(b=b.t",
    "oString());return!!a&&1==a.nodeType&&(!b||a.tagName.toUpperCase()==b)}f",
    "unction fb(a){return B(a,\"OPTION\")?!0:B(a,\"INPUT\")?(a=a.type.toLowe",
    "rCase(),\"checkbox\"==a||\"radio\"==a):!1}function gb(a){if(!fb(a))thro",
    "w new u(15,\"Element is not selectable\");var b=\"selected\",c=a.type&&",
    "a.type.toLowerCase();if(\"checkbox\"==c||\"radio\"==c)b=\"checked\";ret",
    "urn!!a[b]};/*\n\n The MIT License\n\n Copyright (c) 2007 Cybozu Labs, I",
    "nc.\n Copyright (c) 2012 Google Inc.\n\n Permission is hereby granted, ",
    "free of charge, to any person obtaining a copy\n of this software and a",
    "ssociated documentation files (the \"Software\"), to\n deal in the Soft",
    "ware without restriction, including without limitation the\n rights to ",
    "use, copy, modify, merge, publish, distribute, sublicense, and/or\n sel",
    "l copies of the Software, and to permit persons to whom the Software is",
    "\n furnished to do so, subject to the following conditions:\n\n The abo",
    "ve copyright notice and this permission notice shall be included in\n a",
    "ll copies or substantial portions of the Software.\n\n THE SOFTWARE IS ",
    "PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED,",
    " INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITN",
    "ESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE",
    "\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTH",
    "ER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, AR",
    "ISING\n FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR O",
    "THER DEALINGS\n IN THE SOFTWARE.\n*/\nfunction hb(a,b,c){this.v=a;this.",
    "Ia=b||1;this.u=c||1};function ib(a){this.ja=a;this.Z=0}function jb(a){a",
    "=a.match(kb);for(var b=0;b<a.length;b++)lb.test(a[b])&&a.splice(b,1);re",
    "turn new ib(a)}var kb=/\\$?(?:(?![0-9-\\.])(?:\\*|[\\w-\\.]+):)?(?![0-9",
    "-\\.])(?:\\*|[\\w-\\.]+)|\\/\\/|\\.\\.|::|\\d+(?:\\.\\d*)?|\\.\\d+|\"[^",
    "\"]*\"|'[^']*'|[!<>]=|\\s+|./g,lb=/^\\s/;function C(a,b){return a.ja[a.",
    "Z+(b||0)]}ib.prototype.next=function(){return this.ja[this.Z++]};ib.pro",
    "totype.back=function(){this.Z--};ib.prototype.empty=function(){return t",
    "his.ja.length<=this.Z};function D(a){var b=null,c=a.nodeType;1==c&&(b=a",
    ".textContent,b=void 0==b||null==b?a.innerText:b,b=void 0==b||null==b?\"",
    "\":b);if(\"string\"!=typeof b)if(9==c||1==c){a=9==c?a.documentElement:a",
    ".firstChild;for(var c=0,d=[],b=\"\";a;){do 1!=a.nodeType&&(b+=a.nodeVal",
    "ue),d[c++]=a;while(a=a.firstChild);for(;c&&!(a=d[--c].nextSibling););}}",
    "else b=a.nodeValue;return\"\"+b}\nfunction mb(a,b,c){if(null===b)return",
    "!0;try{if(!a.getAttribute)return!1}catch(d){return!1}return null==c?!!a",
    ".getAttribute(b):a.getAttribute(b,2)==c}function nb(a,b,c,d,e){return o",
    "b.call(null,a,b,m(c)?c:null,m(d)?d:null,e||new E)}\nfunction ob(a,b,c,d",
    ",e){b.getElementsByName&&d&&\"name\"==c?(b=b.getElementsByName(d),t(b,f",
    "unction(b){a.matches(b)&&e.add(b)})):b.getElementsByClassName&&d&&\"cla",
    "ss\"==c?(b=b.getElementsByClassName(d),t(b,function(b){b.className==d&&",
    "a.matches(b)&&e.add(b)})):a instanceof F?pb(a,b,c,d,e):b.getElementsByT",
    "agName&&(b=b.getElementsByTagName(a.getName()),t(b,function(a){mb(a,c,d",
    ")&&e.add(a)}));return e}\nfunction pb(a,b,c,d,e){for(b=b.firstChild;b;b",
    "=b.nextSibling)mb(b,c,d)&&a.matches(b)&&e.add(b),pb(a,b,c,d,e)};functio",
    "n E(){this.u=this.m=null;this.T=0}function qb(a){this.node=a;this.next=",
    "this.L=null}function rb(a,b){if(!a.m)return b;if(!b.m)return a;var c=a.",
    "m;b=b.m;for(var d=null,e,f=0;c&&b;)c.node==b.node?(e=c,c=c.next,b=b.nex",
    "t):0<Xa(c.node,b.node)?(e=b,b=b.next):(e=c,c=c.next),(e.L=d)?d.next=e:a",
    ".m=e,d=e,f++;for(e=c||b;e;)e.L=d,d=d.next=e,f++,e=e.next;a.u=d;a.T=f;re",
    "turn a}E.prototype.unshift=function(a){a=new qb(a);a.next=this.m;this.u",
    "?this.m.L=a:this.m=this.u=a;this.m=a;this.T++};\nE.prototype.add=functi",
    "on(a){a=new qb(a);a.L=this.u;this.m?this.u.next=a:this.m=this.u=a;this.",
    "u=a;this.T++};function sb(a){return(a=a.m)?a.node:null}E.prototype.A=fu",
    "nction(){return this.T};function tb(a){return(a=sb(a))?D(a):\"\"}E.prot",
    "otype.iterator=function(a){return new ub(this,!!a)};function ub(a,b){th",
    "is.Ea=a;this.oa=(this.O=b)?a.u:a.m;this.ga=null}ub.prototype.next=funct",
    "ion(){var a=this.oa;if(null==a)return null;var b=this.ga=a;this.oa=this",
    ".O?a.L:a.next;return b.node};\nub.prototype.remove=function(){var a=thi",
    "s.Ea,b=this.ga;if(!b)throw Error(\"Next must be called at least once be",
    "fore remove.\");var c=b.L,b=b.next;c?c.next=b:a.m=b;b?b.L=c:a.u=c;a.T--",
    ";this.ga=null};function G(a){this.l=a;this.o=this.F=!1;this.U=null}func",
    "tion H(a){return\"\\n  \"+a.toString().split(\"\\n\").join(\"\\n  \")}G",
    ".prototype.i=function(){return this.F};function vb(a,b){a.F=b}function ",
    "wb(a,b){a.o=b}G.prototype.J=function(){return this.U};function I(a,b){a",
    "=a.evaluate(b);return a instanceof E?+tb(a):+a}function K(a,b){a=a.eval",
    "uate(b);return a instanceof E?tb(a):\"\"+a}function xb(a,b){a=a.evaluat",
    "e(b);return a instanceof E?!!a.A():!!a};function yb(a,b,c){G.call(this,",
    "a.l);this.ia=a;this.ta=b;this.ya=c;this.F=b.i()||c.i();this.o=b.o||c.o;",
    "this.ia==zb&&(c.o||c.i()||4==c.l||0==c.l||!b.J()?b.o||b.i()||4==b.l||0=",
    "=b.l||!c.J()||(this.U={name:c.J().name,P:b}):this.U={name:b.J().name,P:",
    "c})}p(yb,G);\nfunction Ab(a,b,c,d,e){b=b.evaluate(d);c=c.evaluate(d);va",
    "r f;if(b instanceof E&&c instanceof E){b=b.iterator();for(d=b.next();d;",
    "d=b.next())for(e=c.iterator(),f=e.next();f;f=e.next())if(a(D(d),D(f)))r",
    "eturn!0;return!1}if(b instanceof E||c instanceof E){b instanceof E?(e=b",
    ",d=c):(e=c,d=b);f=e.iterator();for(var h=typeof d,l=f.next();l;l=f.next",
    "()){switch(h){case \"number\":l=+D(l);break;case \"boolean\":l=!!D(l);b",
    "reak;case \"string\":l=D(l);break;default:throw Error(\"Illegal primiti",
    "ve type for comparison.\");\n}if(e==b&&a(l,d)||e==c&&a(d,l))return!0}re",
    "turn!1}return e?\"boolean\"==typeof b||\"boolean\"==typeof c?a(!!b,!!c)",
    ":\"number\"==typeof b||\"number\"==typeof c?a(+b,+c):a(b,c):a(+b,+c)}yb",
    ".prototype.evaluate=function(a){return this.ia.w(this.ta,this.ya,a)};yb",
    ".prototype.toString=function(){var a=\"Binary Expression: \"+this.ia,a=",
    "a+H(this.ta);return a+=H(this.ya)};function Bb(a,b,c,d){this.Ha=a;this.",
    "wa=b;this.l=c;this.w=d}Bb.prototype.toString=function(){return this.Ha}",
    ";var Cb={};\nfunction L(a,b,c,d){if(Cb.hasOwnProperty(a))throw Error(\"",
    "Binary operator already created: \"+a);a=new Bb(a,b,c,d);return Cb[a.to",
    "String()]=a}L(\"div\",6,1,function(a,b,c){return I(a,c)/I(b,c)});L(\"mo",
    "d\",6,1,function(a,b,c){return I(a,c)%I(b,c)});L(\"*\",6,1,function(a,b",
    ",c){return I(a,c)*I(b,c)});L(\"+\",5,1,function(a,b,c){return I(a,c)+I(",
    "b,c)});L(\"-\",5,1,function(a,b,c){return I(a,c)-I(b,c)});L(\"<\",4,2,f",
    "unction(a,b,c){return Ab(function(a,b){return a<b},a,b,c)});\nL(\">\",4",
    ",2,function(a,b,c){return Ab(function(a,b){return a>b},a,b,c)});L(\"<=",
    "\",4,2,function(a,b,c){return Ab(function(a,b){return a<=b},a,b,c)});L(",
    "\">=\",4,2,function(a,b,c){return Ab(function(a,b){return a>=b},a,b,c)}",
    ");var zb=L(\"=\",3,2,function(a,b,c){return Ab(function(a,b){return a==",
    "b},a,b,c,!0)});L(\"!=\",3,2,function(a,b,c){return Ab(function(a,b){ret",
    "urn a!=b},a,b,c,!0)});L(\"and\",2,2,function(a,b,c){return xb(a,c)&&xb(",
    "b,c)});L(\"or\",1,2,function(a,b,c){return xb(a,c)||xb(b,c)});function ",
    "Db(a,b){if(b.A()&&4!=a.l)throw Error(\"Primary expression must evaluate",
    " to nodeset if filter has predicate(s).\");G.call(this,a.l);this.xa=a;t",
    "his.f=b;this.F=a.i();this.o=a.o}p(Db,G);Db.prototype.evaluate=function(",
    "a){a=this.xa.evaluate(a);return Eb(this.f,a)};Db.prototype.toString=fun",
    "ction(){var a=\"Filter:\"+H(this.xa);return a+=H(this.f)};function Fb(a",
    ",b){if(b.length<a.va)throw Error(\"Function \"+a.s+\" expects at least",
    "\"+a.va+\" arguments, \"+b.length+\" given\");if(null!==a.ha&&b.length>",
    "a.ha)throw Error(\"Function \"+a.s+\" expects at most \"+a.ha+\" argume",
    "nts, \"+b.length+\" given\");a.Fa&&t(b,function(b,d){if(4!=b.l)throw Er",
    "ror(\"Argument \"+d+\" to function \"+a.s+\" is not of type Nodeset: \"",
    "+b);});G.call(this,a.l);this.X=a;this.ea=b;vb(this,a.F||sa(b,function(a",
    "){return a.i()}));wb(this,a.Da&&!b.length||a.Ca&&!!b.length||sa(b,funct",
    "ion(a){return a.o}))}\np(Fb,G);Fb.prototype.evaluate=function(a){return",
    " this.X.w.apply(null,ua(a,this.ea))};Fb.prototype.toString=function(){v",
    "ar a=\"Function: \"+this.X;if(this.ea.length)var b=ra(this.ea,function(",
    "a,b){return a+H(b)},\"Arguments:\"),a=a+H(b);return a};function Gb(a,b,",
    "c,d,e,f,h,l,q){this.s=a;this.l=b;this.F=c;this.Da=d;this.Ca=e;this.w=f;",
    "this.va=h;this.ha=k(l)?l:h;this.Fa=!!q}Gb.prototype.toString=function()",
    "{return this.s};var Hb={};\nfunction M(a,b,c,d,e,f,h,l){if(Hb.hasOwnPro",
    "perty(a))throw Error(\"Function already created: \"+a+\".\");Hb[a]=new ",
    "Gb(a,b,c,d,!1,e,f,h,l)}M(\"boolean\",2,!1,!1,function(a,b){return xb(b,",
    "a)},1);M(\"ceiling\",1,!1,!1,function(a,b){return Math.ceil(I(b,a))},1)",
    ";M(\"concat\",3,!1,!1,function(a,b){return ra(wa(arguments,1),function(",
    "b,d){return b+K(d,a)},\"\")},2,null);M(\"contains\",2,!1,!1,function(a,",
    "b,c){b=K(b,a);a=K(c,a);return-1!=b.indexOf(a)},2);M(\"count\",1,!1,!1,f",
    "unction(a,b){return b.evaluate(a).A()},1,1,!0);\nM(\"false\",2,!1,!1,fu",
    "nction(){return!1},0);M(\"floor\",1,!1,!1,function(a,b){return Math.flo",
    "or(I(b,a))},1);M(\"id\",4,!1,!1,function(a,b){var c=a.v,d=9==c.nodeType",
    "?c:c.ownerDocument;a=K(b,a).split(/\\s+/);var e=[];t(a,function(a){a=d.",
    "getElementById(a);!a||0<=qa(e,a)||e.push(a)});e.sort(Xa);var f=new E;t(",
    "e,function(a){f.add(a)});return f},1);M(\"lang\",2,!1,!1,function(){ret",
    "urn!1},1);M(\"last\",1,!0,!1,function(a){if(1!=arguments.length)throw E",
    "rror(\"Function last expects ()\");return a.u},0);\nM(\"local-name\",3,",
    "!1,!0,function(a,b){return(a=b?sb(b.evaluate(a)):a.v)?a.localName||a.no",
    "deName.toLowerCase():\"\"},0,1,!0);M(\"name\",3,!1,!0,function(a,b){ret",
    "urn(a=b?sb(b.evaluate(a)):a.v)?a.nodeName.toLowerCase():\"\"},0,1,!0);M",
    "(\"namespace-uri\",3,!0,!1,function(){return\"\"},0,1,!0);M(\"normalize",
    "-space\",3,!1,!0,function(a,b){return(b?K(b,a):D(a.v)).replace(/[\\s\\x",
    "a0]+/g,\" \").replace(/^\\s+|\\s+$/g,\"\")},0,1);M(\"not\",2,!1,!1,func",
    "tion(a,b){return!xb(b,a)},1);\nM(\"number\",1,!1,!0,function(a,b){retur",
    "n b?I(b,a):+D(a.v)},0,1);M(\"position\",1,!0,!1,function(a){return a.Ia",
    "},0);M(\"round\",1,!1,!1,function(a,b){return Math.round(I(b,a))},1);M(",
    "\"starts-with\",2,!1,!1,function(a,b,c){b=K(b,a);a=K(c,a);return 0==b.l",
    "astIndexOf(a,0)},2);M(\"string\",3,!1,!0,function(a,b){return b?K(b,a):",
    "D(a.v)},0,1);M(\"string-length\",1,!1,!0,function(a,b){return(b?K(b,a):",
    "D(a.v)).length},0,1);\nM(\"substring\",3,!1,!1,function(a,b,c,d){c=I(c,",
    "a);if(isNaN(c)||Infinity==c||-Infinity==c)return\"\";d=d?I(d,a):Infinit",
    "y;if(isNaN(d)||-Infinity===d)return\"\";c=Math.round(c)-1;var e=Math.ma",
    "x(c,0);a=K(b,a);return Infinity==d?a.substring(e):a.substring(e,c+Math.",
    "round(d))},2,3);M(\"substring-after\",3,!1,!1,function(a,b,c){b=K(b,a);",
    "a=K(c,a);c=b.indexOf(a);return-1==c?\"\":b.substring(c+a.length)},2);\n",
    "M(\"substring-before\",3,!1,!1,function(a,b,c){b=K(b,a);a=K(c,a);a=b.in",
    "dexOf(a);return-1==a?\"\":b.substring(0,a)},2);M(\"sum\",1,!1,!1,functi",
    "on(a,b){a=b.evaluate(a).iterator();b=0;for(var c=a.next();c;c=a.next())",
    "b+=+D(c);return b},1,1,!0);M(\"translate\",3,!1,!1,function(a,b,c,d){b=",
    "K(b,a);c=K(c,a);var e=K(d,a);d={};for(var f=0;f<c.length;f++)a=c.charAt",
    "(f),a in d||(d[a]=e.charAt(f));c=\"\";for(f=0;f<b.length;f++)a=b.charAt",
    "(f),c+=a in d?d[a]:a;return c},3);M(\"true\",2,!1,!1,function(){return!",
    "0},0);function F(a,b){this.Aa=a;this.ua=k(b)?b:null;this.B=null;switch(",
    "a){case \"comment\":this.B=8;break;case \"text\":this.B=3;break;case \"",
    "processing-instruction\":this.B=7;break;case \"node\":break;default:thr",
    "ow Error(\"Unexpected argument\");}}function Ib(a){return\"comment\"==a",
    "||\"text\"==a||\"processing-instruction\"==a||\"node\"==a}F.prototype.m",
    "atches=function(a){return null===this.B||this.B==a.nodeType};F.prototyp",
    "e.getName=function(){return this.Aa};\nF.prototype.toString=function(){",
    "var a=\"Kind Test: \"+this.Aa;null===this.ua||(a+=H(this.ua));return a}",
    ";function Jb(a){G.call(this,3);this.za=a.substring(1,a.length-1)}p(Jb,G",
    ");Jb.prototype.evaluate=function(){return this.za};Jb.prototype.toStrin",
    "g=function(){return\"Literal: \"+this.za};function Kb(a,b){this.s=a.toL",
    "owerCase();a=\"*\"==this.s?\"*\":\"http://www.w3.org/1999/xhtml\";this.",
    "aa=b?b.toLowerCase():a}Kb.prototype.matches=function(a){var b=a.nodeTyp",
    "e;if(1!=b&&2!=b)return!1;b=k(a.localName)?a.localName:a.nodeName;return",
    "\"*\"!=this.s&&this.s!=b.toLowerCase()?!1:\"*\"==this.aa?!0:this.aa==(a",
    ".namespaceURI?a.namespaceURI.toLowerCase():\"http://www.w3.org/1999/xht",
    "ml\")};Kb.prototype.getName=function(){return this.s};\nKb.prototype.to",
    "String=function(){return\"Name Test: \"+(\"http://www.w3.org/1999/xhtml",
    "\"==this.aa?\"\":this.aa+\":\")+this.s};function Lb(a){G.call(this,1);t",
    "his.Ba=a}p(Lb,G);Lb.prototype.evaluate=function(){return this.Ba};Lb.pr",
    "ototype.toString=function(){return\"Number: \"+this.Ba};function Mb(a,b",
    "){G.call(this,a.l);this.ra=a;this.V=b;this.F=a.i();this.o=a.o;1==this.V",
    ".length&&(a=this.V[0],a.fa||a.H!=Nb||(a=a.da,\"*\"!=a.getName()&&(this.",
    "U={name:a.getName(),P:null})))}p(Mb,G);function Ob(){G.call(this,4)}p(O",
    "b,G);Ob.prototype.evaluate=function(a){var b=new E;a=a.v;9==a.nodeType?",
    "b.add(a):b.add(a.ownerDocument);return b};Ob.prototype.toString=functio",
    "n(){return\"Root Helper Expression\"};function Pb(){G.call(this,4)}p(Pb",
    ",G);Pb.prototype.evaluate=function(a){var b=new E;b.add(a.v);return b};",
    "\nPb.prototype.toString=function(){return\"Context Helper Expression\"}",
    ";function Qb(a){return\"/\"==a||\"//\"==a}\nMb.prototype.evaluate=funct",
    "ion(a){var b=this.ra.evaluate(a);if(!(b instanceof E))throw Error(\"Fil",
    "ter expression must evaluate to nodeset.\");a=this.V;for(var c=0,d=a.le",
    "ngth;c<d&&b.A();c++){var e=a[c],f=b.iterator(e.H.O);if(e.i()||e.H!=Rb)i",
    "f(e.i()||e.H!=Sb){var h=f.next();for(b=e.evaluate(new hb(h));null!=(h=f",
    ".next());)h=e.evaluate(new hb(h)),b=rb(b,h)}else h=f.next(),b=e.evaluat",
    "e(new hb(h));else{for(h=f.next();(b=f.next())&&(!h.contains||h.contains",
    "(b))&&b.compareDocumentPosition(h)&8;h=b);b=e.evaluate(new hb(h))}}retu",
    "rn b};\nMb.prototype.toString=function(){var a=\"Path Expression:\"+H(t",
    "his.ra);if(this.V.length){var b=ra(this.V,function(a,b){return a+H(b)},",
    "\"Steps:\");a+=H(b)}return a};function Tb(a,b){this.f=a;this.O=!!b}func",
    "tion Eb(a,b,c){for(c=c||0;c<a.f.length;c++)for(var d=a.f[c],e=b.iterato",
    "r(),f=b.A(),h,l=0;h=e.next();l++){var q=a.O?f-l:l+1;h=d.evaluate(new hb",
    "(h,q,f));if(\"number\"==typeof h)q=q==h;else if(\"string\"==typeof h||",
    "\"boolean\"==typeof h)q=!!h;else if(h instanceof E)q=0<h.A();else throw",
    " Error(\"Predicate.evaluate returned an unexpected type.\");q||e.remove",
    "()}return b}Tb.prototype.J=function(){return 0<this.f.length?this.f[0].",
    "J():null};\nTb.prototype.i=function(){for(var a=0;a<this.f.length;a++){",
    "var b=this.f[a];if(b.i()||1==b.l||0==b.l)return!0}return!1};Tb.prototyp",
    "e.A=function(){return this.f.length};Tb.prototype.toString=function(){r",
    "eturn ra(this.f,function(a,b){return a+H(b)},\"Predicates:\")};function",
    " N(a,b,c,d){G.call(this,4);this.H=a;this.da=b;this.f=c||new Tb([]);this",
    ".fa=!!d;b=this.f.J();a.Ka&&b&&(this.U={name:b.name,P:b.P});this.F=this.",
    "f.i()}p(N,G);\nN.prototype.evaluate=function(a){var b=a.v,c=this.J(),d=",
    "null,e=null,f=0;c&&(d=c.name,e=c.P?K(c.P,a):null,f=1);if(this.fa)if(thi",
    "s.i()||this.H!=Ub)if(b=(new N(Vb,new F(\"node\"))).evaluate(a).iterator",
    "(),c=b.next())for(a=this.w(c,d,e,f);null!=(c=b.next());)a=rb(a,this.w(c",
    ",d,e,f));else a=new E;else a=nb(this.da,b,d,e),a=Eb(this.f,a,f);else a=",
    "this.w(a.v,d,e,f);return a};N.prototype.w=function(a,b,c,d){a=this.H.X(",
    "this.da,a,b,c);return a=Eb(this.f,a,d)};\nN.prototype.toString=function",
    "(){var a=\"Step:\"+H(\"Operator: \"+(this.fa?\"//\":\"/\"));this.H.s&&(",
    "a+=H(\"Axis: \"+this.H));a+=H(this.da);if(this.f.A()){var b=ra(this.f.f",
    ",function(a,b){return a+H(b)},\"Predicates:\");a+=H(b)}return a};functi",
    "on Wb(a,b,c,d){this.s=a;this.X=b;this.O=c;this.Ka=d}Wb.prototype.toStri",
    "ng=function(){return this.s};var Xb={};function O(a,b,c,d){if(Xb.hasOwn",
    "Property(a))throw Error(\"Axis already created: \"+a);b=new Wb(a,b,c,!!",
    "d);return Xb[a]=b}\nO(\"ancestor\",function(a,b){for(var c=new E;b=b.pa",
    "rentNode;)a.matches(b)&&c.unshift(b);return c},!0);O(\"ancestor-or-self",
    "\",function(a,b){var c=new E;do a.matches(b)&&c.unshift(b);while(b=b.pa",
    "rentNode);return c},!0);\nvar Nb=O(\"attribute\",function(a,b){var c=ne",
    "w E,d=a.getName();if(b=b.attributes)if(a instanceof F&&null===a.B||\"*",
    "\"==d)for(d=0;a=b[d];d++)c.add(a);else(a=b.getNamedItem(d))&&c.add(a);r",
    "eturn c},!1),Ub=O(\"child\",function(a,b,c,d,e){c=m(c)?c:null;d=m(d)?d:",
    "null;e=e||new E;for(b=b.firstChild;b;b=b.nextSibling)mb(b,c,d)&&a.match",
    "es(b)&&e.add(b);return e},!1,!0);O(\"descendant\",nb,!1,!0);\nvar Vb=O(",
    "\"descendant-or-self\",function(a,b,c,d){var e=new E;mb(b,c,d)&&a.match",
    "es(b)&&e.add(b);return nb(a,b,c,d,e)},!1,!0),Rb=O(\"following\",functio",
    "n(a,b,c,d){var e=new E;do for(var f=b;f=f.nextSibling;)mb(f,c,d)&&a.mat",
    "ches(f)&&e.add(f),e=nb(a,f,c,d,e);while(b=b.parentNode);return e},!1,!0",
    ");O(\"following-sibling\",function(a,b){for(var c=new E;b=b.nextSibling",
    ";)a.matches(b)&&c.add(b);return c},!1);O(\"namespace\",function(){retur",
    "n new E},!1);\nvar Yb=O(\"parent\",function(a,b){var c=new E;if(9==b.no",
    "deType)return c;if(2==b.nodeType)return c.add(b.ownerElement),c;b=b.par",
    "entNode;a.matches(b)&&c.add(b);return c},!1),Sb=O(\"preceding\",functio",
    "n(a,b,c,d){var e=new E,f=[];do f.unshift(b);while(b=b.parentNode);for(v",
    "ar h=1,l=f.length;h<l;h++){var q=[];for(b=f[h];b=b.previousSibling;)q.u",
    "nshift(b);for(var y=0,r=q.length;y<r;y++)b=q[y],mb(b,c,d)&&a.matches(b)",
    "&&e.add(b),e=nb(a,b,c,d,e)}return e},!0,!0);\nO(\"preceding-sibling\",f",
    "unction(a,b){for(var c=new E;b=b.previousSibling;)a.matches(b)&&c.unshi",
    "ft(b);return c},!0);var Zb=O(\"self\",function(a,b){var c=new E;a.match",
    "es(b)&&c.add(b);return c},!1);function $b(a){G.call(this,1);this.qa=a;t",
    "his.F=a.i();this.o=a.o}p($b,G);$b.prototype.evaluate=function(a){return",
    "-I(this.qa,a)};$b.prototype.toString=function(){return\"Unary Expressio",
    "n: -\"+H(this.qa)};function ac(a){G.call(this,4);this.ba=a;vb(this,sa(t",
    "his.ba,function(a){return a.i()}));wb(this,sa(this.ba,function(a){retur",
    "n a.o}))}p(ac,G);ac.prototype.evaluate=function(a){var b=new E;t(this.b",
    "a,function(c){c=c.evaluate(a);if(!(c instanceof E))throw Error(\"Path e",
    "xpression must evaluate to NodeSet.\");b=rb(b,c)});return b};ac.prototy",
    "pe.toString=function(){return ra(this.ba,function(a,b){return a+H(b)},",
    "\"Union Expression:\")};function bc(a,b){this.a=a;this.Ga=b}function cc",
    "(a){for(var b,c=[];;){P(a,\"Missing right hand side of binary expressio",
    "n.\");b=dc(a);var d=a.a.next();if(!d)break;var e=(d=Cb[d]||null)&&d.wa;",
    "if(!e){a.a.back();break}for(;c.length&&e<=c[c.length-1].wa;)b=new yb(c.",
    "pop(),c.pop(),b);c.push(b,d)}for(;c.length;)b=new yb(c.pop(),c.pop(),b)",
    ";return b}function P(a,b){if(a.a.empty())throw Error(b);}function ec(a,",
    "b){a=a.a.next();if(a!=b)throw Error(\"Bad token, expected: \"+b+\" got:",
    " \"+a);}\nfunction fc(a){a=a.a.next();if(\")\"!=a)throw Error(\"Bad tok",
    "en: \"+a);}function gc(a){a=a.a.next();if(2>a.length)throw Error(\"Uncl",
    "osed literal string\");return new Jb(a)}\nfunction hc(a){var b=[];if(Qb",
    "(C(a.a))){var c=a.a.next();var d=C(a.a);if(\"/\"==c&&(a.a.empty()||\".",
    "\"!=d&&\"..\"!=d&&\"@\"!=d&&\"*\"!=d&&!/(?![0-9])[\\w]/.test(d)))return",
    " new Ob;d=new Ob;P(a,\"Missing next location step.\");c=ic(a,c);b.push(",
    "c)}else{a:{c=C(a.a);d=c.charAt(0);switch(d){case \"$\":throw Error(\"Va",
    "riable reference not allowed in HTML XPath\");case \"(\":a.a.next();c=c",
    "c(a);P(a,'unclosed \"(\"');ec(a,\")\");break;case '\"':case \"'\":c=gc(",
    "a);break;default:if(isNaN(+c))if(!Ib(c)&&/(?![0-9])[\\w]/.test(d)&&\"(",
    "\"==C(a.a,\n1)){c=a.a.next();c=Hb[c]||null;a.a.next();for(d=[];\")\"!=C",
    "(a.a);){P(a,\"Missing function argument list.\");d.push(cc(a));if(\",\"",
    "!=C(a.a))break;a.a.next()}P(a,\"Unclosed function argument list.\");fc(",
    "a);c=new Fb(c,d)}else{c=null;break a}else c=new Lb(+a.a.next())}\"[\"==",
    "C(a.a)&&(d=new Tb(jc(a)),c=new Db(c,d))}if(c)if(Qb(C(a.a)))d=c;else ret",
    "urn c;else c=ic(a,\"/\"),d=new Pb,b.push(c)}for(;Qb(C(a.a));)c=a.a.next",
    "(),P(a,\"Missing next location step.\"),c=ic(a,c),b.push(c);return new ",
    "Mb(d,b)}\nfunction ic(a,b){if(\"/\"!=b&&\"//\"!=b)throw Error('Step op ",
    "should be \"/\" or \"//\"');if(\".\"==C(a.a)){var c=new N(Zb,new F(\"no",
    "de\"));a.a.next();return c}if(\"..\"==C(a.a))return c=new N(Yb,new F(\"",
    "node\")),a.a.next(),c;if(\"@\"==C(a.a)){var d=Nb;a.a.next();P(a,\"Missi",
    "ng attribute name\")}else if(\"::\"==C(a.a,1)){if(!/(?![0-9])[\\w]/.tes",
    "t(C(a.a).charAt(0)))throw Error(\"Bad token: \"+a.a.next());var e=a.a.n",
    "ext();d=Xb[e]||null;if(!d)throw Error(\"No axis with name: \"+e);a.a.ne",
    "xt();P(a,\"Missing node name\")}else d=Ub;e=\nC(a.a);if(/(?![0-9])[\\w",
    "\\*]/.test(e.charAt(0)))if(\"(\"==C(a.a,1)){if(!Ib(e))throw Error(\"Inv",
    "alid node type: \"+e);e=a.a.next();if(!Ib(e))throw Error(\"Invalid type",
    " name: \"+e);ec(a,\"(\");P(a,\"Bad nodetype\");var f=C(a.a).charAt(0),h",
    "=null;if('\"'==f||\"'\"==f)h=gc(a);P(a,\"Bad nodetype\");fc(a);e=new F(",
    "e,h)}else if(e=a.a.next(),f=e.indexOf(\":\"),-1==f)e=new Kb(e);else{var",
    " h=e.substring(0,f);if(\"*\"==h)var l=\"*\";else if(l=a.Ga(h),!l)throw ",
    "Error(\"Namespace prefix not declared: \"+h);e=e.substr(f+1);e=new Kb(e",
    ",l)}else throw Error(\"Bad token: \"+\na.a.next());a=new Tb(jc(a),d.O);",
    "return c||new N(d,e,a,\"//\"==b)}function jc(a){for(var b=[];\"[\"==C(a",
    ".a);){a.a.next();P(a,\"Missing predicate expression.\");var c=cc(a);b.p",
    "ush(c);P(a,\"Unclosed predicate expression.\");ec(a,\"]\")}return b}fun",
    "ction dc(a){if(\"-\"==C(a.a))return a.a.next(),new $b(dc(a));var b=hc(a",
    ");if(\"|\"!=C(a.a))a=b;else{for(b=[b];\"|\"==a.a.next();)P(a,\"Missing ",
    "next union location path.\"),b.push(hc(a));a.a.back();a=new ac(b)}retur",
    "n a};function kc(a){switch(a.nodeType){case 1:return ja(lc,a);case 9:re",
    "turn kc(a.documentElement);case 11:case 10:case 6:case 12:return mc;def",
    "ault:return a.parentNode?kc(a.parentNode):mc}}function mc(){return null",
    "}function lc(a,b){if(a.prefix==b)return a.namespaceURI||\"http://www.w3",
    ".org/1999/xhtml\";var c=a.getAttributeNode(\"xmlns:\"+b);return c&&c.sp",
    "ecified?c.value||null:a.parentNode&&9!=a.parentNode.nodeType?lc(a.paren",
    "tNode,b):null};function nc(a,b){if(!a.length)throw Error(\"Empty XPath ",
    "expression.\");a=jb(a);if(a.empty())throw Error(\"Invalid XPath express",
    "ion.\");b?ea(b)||(b=ia(b.lookupNamespaceURI,b)):b=function(){return nul",
    "l};var c=cc(new bc(a,b));if(!a.empty())throw Error(\"Bad token: \"+a.ne",
    "xt());this.evaluate=function(a,b){a=c.evaluate(new hb(a));return new Q(",
    "a,b)}}\nfunction Q(a,b){if(0==b)if(a instanceof E)b=4;else if(\"string",
    "\"==typeof a)b=2;else if(\"number\"==typeof a)b=1;else if(\"boolean\"==",
    "typeof a)b=3;else throw Error(\"Unexpected evaluation result.\");if(2!=",
    "b&&1!=b&&3!=b&&!(a instanceof E))throw Error(\"value could not be conve",
    "rted to the specified type\");this.resultType=b;switch(b){case 2:this.s",
    "tringValue=a instanceof E?tb(a):\"\"+a;break;case 1:this.numberValue=a ",
    "instanceof E?+tb(a):+a;break;case 3:this.booleanValue=a instanceof E?0<",
    "a.A():!!a;break;case 4:case 5:case 6:case 7:var c=\na.iterator();var d=",
    "[];for(var e=c.next();e;e=c.next())d.push(e);this.snapshotLength=a.A();",
    "this.invalidIteratorState=!1;break;case 8:case 9:this.singleNodeValue=s",
    "b(a);break;default:throw Error(\"Unknown XPathResult type.\");}var f=0;",
    "this.iterateNext=function(){if(4!=b&&5!=b)throw Error(\"iterateNext cal",
    "led with wrong result type\");return f>=d.length?null:d[f++]};this.snap",
    "shotItem=function(a){if(6!=b&&7!=b)throw Error(\"snapshotItem called wi",
    "th wrong result type\");return a>=d.length||0>a?null:d[a]}}\nQ.ANY_TYPE",
    "=0;Q.NUMBER_TYPE=1;Q.STRING_TYPE=2;Q.BOOLEAN_TYPE=3;Q.UNORDERED_NODE_IT",
    "ERATOR_TYPE=4;Q.ORDERED_NODE_ITERATOR_TYPE=5;Q.UNORDERED_NODE_SNAPSHOT_",
    "TYPE=6;Q.ORDERED_NODE_SNAPSHOT_TYPE=7;Q.ANY_UNORDERED_NODE_TYPE=8;Q.FIR",
    "ST_ORDERED_NODE_TYPE=9;function oc(a){this.lookupNamespaceURI=kc(a)}\nb",
    "a(\"wgxpath.install\",function(a,b){a=a||aa;var c=a.Document&&a.Documen",
    "t.prototype||a.document;if(!c.evaluate||b)a.XPathResult=Q,c.evaluate=fu",
    "nction(a,b,c,h){return(new nc(a,c)).evaluate(b,h)},c.createExpression=f",
    "unction(a,b){return new nc(a,b)},c.createNSResolver=function(a){return ",
    "new oc(a)}});var R={};R.ka=function(){var a={Oa:\"http://www.w3.org/200",
    "0/svg\"};return function(b){return a[b]||null}}();\nR.w=function(a,b,c)",
    "{var d=A(a);if(!d.documentElement)return null;try{for(var e=d.createNSR",
    "esolver?d.createNSResolver(d.documentElement):R.ka,f={},h=d.getElements",
    "ByTagName(\"*\"),l=0;l<h.length;++l){var q=h[l],y=q.namespaceURI;if(y&&",
    "!f[y]){var r=q.lookupPrefix(y);if(!r)var v=y.match(\".*/(\\\\w+)/?$\"),",
    "r=v?v[1]:\"xhtml\";f[y]=r}}var J={},U;for(U in f)J[f[U]]=U;e=function(a",
    "){return J[a]||null};try{return d.evaluate(b,a,e,c,null)}catch(la){if(",
    "\"TypeError\"===la.name)return e=d.createNSResolver?d.createNSResolver(",
    "d.documentElement):\nR.ka,d.evaluate(b,a,e,c,null);throw la;}}catch(la)",
    "{throw new u(32,\"Unable to locate an element with the xpath expression",
    " \"+b+\" because of the following error:\\n\"+la);}};R.na=function(a,b)",
    "{if(!a||1!=a.nodeType)throw new u(32,'The result of the xpath expressio",
    "n \"'+b+'\" is: '+a+\". It should be an element.\");};\nR.Ja=function(a",
    ",b){var c=function(){var c=R.w(b,a,9);return c?c.singleNodeValue||null:",
    "b.selectSingleNode?(c=A(b),c.setProperty&&c.setProperty(\"SelectionLang",
    "uage\",\"XPath\"),b.selectSingleNode(a)):null}();null===c||R.na(c,a);re",
    "turn c};\nR.Ma=function(a,b){var c=function(){var c=R.w(b,a,7);if(c){fo",
    "r(var e=c.snapshotLength,f=[],h=0;h<e;++h)f.push(c.snapshotItem(h));ret",
    "urn f}return b.selectNodes?(c=A(b),c.setProperty&&c.setProperty(\"Selec",
    "tionLanguage\",\"XPath\"),b.selectNodes(a)):[]}();t(c,function(b){R.na(",
    "b,a)});return c};function pc(a,b,c,d){this.top=a;this.right=b;this.bott",
    "om=c;this.left=d}g=pc.prototype;g.clone=function(){return new pc(this.t",
    "op,this.right,this.bottom,this.left)};g.toString=function(){return\"(\"",
    "+this.top+\"t, \"+this.right+\"r, \"+this.bottom+\"b, \"+this.left+\"l)",
    "\"};g.contains=function(a){return this&&a?a instanceof pc?a.left>=this.",
    "left&&a.right<=this.right&&a.top>=this.top&&a.bottom<=this.bottom:a.x>=",
    "this.left&&a.x<=this.right&&a.y>=this.top&&a.y<=this.bottom:!1};\ng.exp",
    "and=function(a,b,c,d){fa(a)?(this.top-=a.top,this.right+=a.right,this.b",
    "ottom+=a.bottom,this.left-=a.left):(this.top-=a,this.right+=Number(b),t",
    "his.bottom+=Number(c),this.left-=Number(d));return this};g.ceil=functio",
    "n(){this.top=Math.ceil(this.top);this.right=Math.ceil(this.right);this.",
    "bottom=Math.ceil(this.bottom);this.left=Math.ceil(this.left);return thi",
    "s};\ng.floor=function(){this.top=Math.floor(this.top);this.right=Math.f",
    "loor(this.right);this.bottom=Math.floor(this.bottom);this.left=Math.flo",
    "or(this.left);return this};g.round=function(){this.top=Math.round(this.",
    "top);this.right=Math.round(this.right);this.bottom=Math.round(this.bott",
    "om);this.left=Math.round(this.left);return this};g.translate=function(a",
    ",b){a instanceof z?(this.left+=a.x,this.right+=a.x,this.top+=a.y,this.b",
    "ottom+=a.y):(this.left+=a,this.right+=a,n(b)&&(this.top+=b,this.bottom+",
    "=b));return this};\ng.scale=function(a,b){b=n(b)?b:a;this.left*=a;this.",
    "right*=a;this.top*=b;this.bottom*=b;return this};function S(a,b,c,d){th",
    "is.left=a;this.top=b;this.width=c;this.height=d}g=S.prototype;g.clone=f",
    "unction(){return new S(this.left,this.top,this.width,this.height)};g.to",
    "String=function(){return\"(\"+this.left+\", \"+this.top+\" - \"+this.wi",
    "dth+\"w x \"+this.height+\"h)\"};g.contains=function(a){return a instan",
    "ceof z?a.x>=this.left&&a.x<=this.left+this.width&&a.y>=this.top&&a.y<=t",
    "his.top+this.height:this.left<=a.left&&this.left+this.width>=a.left+a.w",
    "idth&&this.top<=a.top&&this.top+this.height>=a.top+a.height};\ng.ceil=f",
    "unction(){this.left=Math.ceil(this.left);this.top=Math.ceil(this.top);t",
    "his.width=Math.ceil(this.width);this.height=Math.ceil(this.height);retu",
    "rn this};g.floor=function(){this.left=Math.floor(this.left);this.top=Ma",
    "th.floor(this.top);this.width=Math.floor(this.width);this.height=Math.f",
    "loor(this.height);return this};g.round=function(){this.left=Math.round(",
    "this.left);this.top=Math.round(this.top);this.width=Math.round(this.wid",
    "th);this.height=Math.round(this.height);return this};\ng.translate=func",
    "tion(a,b){a instanceof z?(this.left+=a.x,this.top+=a.y):(this.left+=a,n",
    "(b)&&(this.top+=b));return this};g.scale=function(a,b){b=n(b)?b:a;this.",
    "left*=a;this.width*=a;this.top*=b;this.height*=b;return this};function ",
    "qc(a,b){var c=A(a);return c.defaultView&&c.defaultView.getComputedStyle",
    "&&(a=c.defaultView.getComputedStyle(a,null))?a[b]||a.getPropertyValue(b",
    ")||\"\":\"\"}function rc(a){var b=a.offsetWidth,c=a.offsetHeight;if((!k",
    "(b)||!b&&!c)&&a.getBoundingClientRect){a:{try{var d=a.getBoundingClient",
    "Rect()}catch(e){a={left:0,top:0,right:0,bottom:0};break a}a=d}return ne",
    "w Ra(a.right-a.left,a.bottom-a.top)}return new Ra(b,c)};var sc=\"functi",
    "on\"===typeof ShadowRoot;function tc(a){return uc(a)&&vc(a)&&\"none\"!=",
    "T(a,\"pointer-events\")}var wc=\"A AREA BUTTON INPUT LABEL SELECT TEXTA",
    "REA\".split(\" \");function xc(a){return sa(wc,function(b){return B(a,b",
    ")})||null!=cb(a)&&0<=Number(a.tabIndex)||((B(a,\"TEXTAREA\")?!0:B(a,\"I",
    "NPUT\")?0<=qa(yc,a.type.toLowerCase()):zc(a)?!0:!1)||(B(a,\"INPUT\")?\"",
    "file\"==a.type.toLowerCase():!1))&&!a.readOnly}var Ac=\"BUTTON INPUT OP",
    "TGROUP OPTION SELECT TEXTAREA\".split(\" \");\nfunction vc(a){return sa",
    "(Ac,function(b){return B(a,b)})?a.disabled?!1:a.parentNode&&1==a.parent",
    "Node.nodeType&&B(a,\"OPTGROUP\")||B(a,\"OPTION\")?vc(a.parentNode):!$a(",
    "a,function(a){var b=a.parentNode;if(b&&B(b,\"FIELDSET\")&&b.disabled){i",
    "f(!B(a,\"LEGEND\"))return!0;for(;a=k(a.previousElementSibling)?a.previo",
    "usElementSibling:Va(a.previousSibling);)if(B(a,\"LEGEND\"))return!0}ret",
    "urn!1},!0):!0}var yc=\"text search tel url email password number\".spli",
    "t(\" \");\nfunction zc(a){function b(a){return\"inherit\"==a.contentEdi",
    "table?(a=Bc(a))?b(a):!1:\"true\"==a.contentEditable}return k(a.contentE",
    "ditable)?k(a.isContentEditable)?a.isContentEditable:b(a):!1}function Bc",
    "(a){for(a=a.parentNode;a&&1!=a.nodeType&&9!=a.nodeType&&11!=a.nodeType;",
    ")a=a.parentNode;return B(a)?a:null}\nfunction T(a,b){b=pa(b);if(\"float",
    "\"==b||\"cssFloat\"==b||\"styleFloat\"==b)b=\"cssFloat\";a=qc(a,b)||Cc(",
    "a,b);if(null===a)a=null;else if(0<=qa(ya,b)){b:{var c=a.match(Ba);if(c)",
    "{b=Number(c[1]);var d=Number(c[2]),e=Number(c[3]),c=Number(c[4]);if(0<=",
    "b&&255>=b&&0<=d&&255>=d&&0<=e&&255>=e&&0<=c&&1>=c){b=[b,d,e,c];break b}",
    "}b=null}if(!b)b:{if(e=a.match(Ca))if(b=Number(e[1]),d=Number(e[2]),e=Nu",
    "mber(e[3]),0<=b&&255>=b&&0<=d&&255>=d&&0<=e&&255>=e){b=[b,d,e,1];break ",
    "b}b=null}if(!b)b:{b=a.toLowerCase();d=xa[b.toLowerCase()];\nif(!d&&(d=",
    "\"#\"==b.charAt(0)?b:\"#\"+b,4==d.length&&(d=d.replace(za,\"#$1$1$2$2$3",
    "$3\")),!Aa.test(d))){b=null;break b}b=[parseInt(d.substr(1,2),16),parse",
    "Int(d.substr(3,2),16),parseInt(d.substr(5,2),16),1]}a=b?\"rgba(\"+b.joi",
    "n(\", \")+\")\":a}return a}function Cc(a,b){var c=a.currentStyle||a.sty",
    "le,d=c[b];!k(d)&&ea(c.getPropertyValue)&&(d=c.getPropertyValue(b));retu",
    "rn\"inherit\"!=d?k(d)?d:null:(a=Bc(a))?Cc(a,b):null}\nfunction Dc(a,b,c",
    "){function d(a){var b=Ec(a);return 0<b.height&&0<b.width?!0:B(a,\"PATH",
    "\")&&(0<b.height||0<b.width)?(a=T(a,\"stroke-width\"),!!a&&0<parseInt(a",
    ",10)):\"hidden\"!=T(a,\"overflow\")&&sa(a.childNodes,function(a){return",
    " 3==a.nodeType||B(a)&&d(a)})}function e(a){return Fc(a)==V&&ta(a.childN",
    "odes,function(a){return!B(a)||e(a)||!d(a)})}if(!B(a))throw Error(\"Argu",
    "ment to isShown must be of type Element\");if(B(a,\"BODY\"))return!0;if",
    "(B(a,\"OPTION\")||B(a,\"OPTGROUP\"))return a=$a(a,function(a){return B(",
    "a,\"SELECT\")}),\n!!a&&Dc(a,!0,c);var f=Gc(a);if(f)return!!f.sa&&0<f.re",
    "ct.width&&0<f.rect.height&&Dc(f.sa,b,c);if(B(a,\"INPUT\")&&\"hidden\"==",
    "a.type.toLowerCase()||B(a,\"NOSCRIPT\"))return!1;f=T(a,\"visibility\");",
    "return\"collapse\"!=f&&\"hidden\"!=f&&c(a)&&(b||0!=Hc(a))&&d(a)?!e(a):!",
    "1}\nfunction uc(a){var b=sc?function(c){if(\"none\"==T(c,\"display\"))r",
    "eturn!1;do{var d=c.parentNode;if(c.getDestinationInsertionPoints){var e",
    "=c.getDestinationInsertionPoints();0<e.length&&(d=e[e.length-1])}if(d i",
    "nstanceof ShadowRoot)return!0;!d||9!=d.nodeType&&11!=d.nodeType||(d=nul",
    "l)}while(a&&1!=a.nodeType);return!d||b(d)}:function(a){if(\"none\"==T(a",
    ",\"display\"))return!1;a=Bc(a);return!a||b(a)};return Dc(a,!0,b)}var V=",
    "\"hidden\";\nfunction Fc(a,b){function c(a){function b(a){return a==h?!",
    "0:0==T(a,\"display\").lastIndexOf(\"inline\",0)||\"absolute\"==c&&\"sta",
    "tic\"==T(a,\"position\")?!1:!0}var c=T(a,\"position\");if(\"fixed\"==c)",
    "return y=!0,a==h?null:h;for(a=Bc(a);a&&!b(a);)a=Bc(a);return a}function",
    " d(a){var b=a;if(\"visible\"==q)if(a==h&&l)b=l;else if(a==l)return{x:\"",
    "visible\",y:\"visible\"};b={x:T(b,\"overflow-x\"),y:T(b,\"overflow-y\")",
    "};a==h&&(b.x=\"visible\"==b.x?\"auto\":b.x,b.y=\"visible\"==b.y?\"auto",
    "\":b.y);return b}function e(a){if(a==h){var b=(new bb(f)).R;\na=b.scrol",
    "lingElement?b.scrollingElement:b.body||b.documentElement;b=b.parentWind",
    "ow||b.defaultView;a=new z(b.pageXOffset||a.scrollLeft,b.pageYOffset||a.",
    "scrollTop)}else a=new z(a.scrollLeft,a.scrollTop);return a}b=Ic(a,b);va",
    "r f=A(a),h=f.documentElement,l=f.body,q=T(h,\"overflow\"),y;for(a=c(a);",
    "a;a=c(a)){var r=d(a);if(\"visible\"!=r.x||\"visible\"!=r.y){var v=Ec(a)",
    ";if(0==v.width||0==v.height)return V;var J=b.right<v.left,U=b.bottom<v.",
    "top;if(J&&\"hidden\"==r.x||U&&\"hidden\"==r.y)return V;if(J&&\"visible",
    "\"!=r.x||\nU&&\"visible\"!=r.y){J=e(a);U=b.bottom<v.top-J.y;if(b.right<",
    "v.left-J.x&&\"visible\"!=r.x||U&&\"visible\"!=r.x)return V;b=Fc(a);retu",
    "rn b==V?V:\"scroll\"}J=b.left>=v.left+v.width;v=b.top>=v.top+v.height;i",
    "f(J&&\"hidden\"==r.x||v&&\"hidden\"==r.y)return V;if(J&&\"visible\"!=r.",
    "x||v&&\"visible\"!=r.y){if(y&&(r=e(a),b.left>=h.scrollWidth-r.x||b.righ",
    "t>=h.scrollHeight-r.y))return V;b=Fc(a);return b==V?V:\"scroll\"}}}retu",
    "rn\"none\"}\nfunction Ec(a){var b=Gc(a);if(b)return b.rect;if(B(a,\"HTM",
    "L\"))return a=A(a),a=(Sa(a)||window).document,a=\"CSS1Compat\"==a.compa",
    "tMode?a.documentElement:a.body,a=new Ra(a.clientWidth,a.clientHeight),n",
    "ew S(0,0,a.width,a.height);try{var c=a.getBoundingClientRect()}catch(d)",
    "{return new S(0,0,0,0)}return new S(c.left,c.top,c.right-c.left,c.botto",
    "m-c.top)}\nfunction Gc(a){var b=B(a,\"MAP\");if(!b&&!B(a,\"AREA\"))retu",
    "rn null;var c=b?a:B(a.parentNode,\"MAP\")?a.parentNode:null,d=null,e=nu",
    "ll;c&&c.name&&(d=R.Ja('/descendant::*[@usemap = \"#'+c.name+'\"]',A(c))",
    ")&&(e=Ec(d),b||\"default\"==a.shape.toLowerCase()||(a=Jc(a),b=Math.min(",
    "Math.max(a.left,0),e.width),c=Math.min(Math.max(a.top,0),e.height),e=ne",
    "w S(b+e.left,c+e.top,Math.min(a.width,e.width-b),Math.min(a.height,e.he",
    "ight-c))));return{sa:d,rect:e||new S(0,0,0,0)}}\nfunction Jc(a){var b=a",
    ".shape.toLowerCase();a=a.coords.split(\",\");if(\"rect\"==b&&4==a.lengt",
    "h){var b=a[0],c=a[1];return new S(b,c,a[2]-b,a[3]-c)}if(\"circle\"==b&&",
    "3==a.length)return b=a[2],new S(a[0]-b,a[1]-b,2*b,2*b);if(\"poly\"==b&&",
    "2<a.length){for(var b=a[0],c=a[1],d=b,e=c,f=2;f+1<a.length;f+=2)b=Math.",
    "min(b,a[f]),d=Math.max(d,a[f]),c=Math.min(c,a[f+1]),e=Math.max(e,a[f+1]",
    ");return new S(b,c,d-b,e-c)}return new S(0,0,0,0)}\nfunction Ic(a,b){a=",
    "Ec(a);a=new pc(a.top,a.left+a.width,a.top+a.height,a.left);b&&(b=b inst",
    "anceof S?b:new S(b.x,b.y,1,1),a.left=Math.min(Math.max(a.left+b.left,a.",
    "left),a.right),a.top=Math.min(Math.max(a.top+b.top,a.top),a.bottom),a.r",
    "ight=Math.min(Math.max(a.left+b.width,a.left),a.right),a.bottom=Math.mi",
    "n(Math.max(a.top+b.height,a.top),a.bottom));return a}function Hc(a){var",
    " b=1,c=T(a,\"opacity\");c&&(b=Number(c));(a=Bc(a))&&(b*=Hc(a));return b",
    "};function Kc(a,b){this.g=ka.document.documentElement;this.G=null;var c",
    "=ab(A(this.g));c&&Lc(this,c);this.$=a||new Mc;this.pa=b||new Nc}Kc.prot",
    "otype.I=function(){return this.g};function Lc(a,b){a.g=b;a.G=B(b,\"OPTI",
    "ON\")?$a(b,function(a){return B(a,\"SELECT\")}):null}\nKc.prototype.W=f",
    "unction(a,b,c,d,e,f,h,l){if(!f&&!tc(this.g))return!1;if(d&&Oc!=a&&Pc!=a",
    ")throw new u(12,\"Event type does not allow related target: \"+a);b={cl",
    "ientX:b.x,clientY:b.y,button:c,altKey:0!=(this.$.ca&4),ctrlKey:0!=(this",
    ".$.ca&2),shiftKey:0!=(this.$.ca&1),metaKey:0!=(this.$.ca&8),wheelDelta:",
    "e||0,relatedTarget:d||null,count:l||1};h=h||1;c=this.g;a!=Qc&&a!=Rc&&h ",
    "in Sc?c=Sc[h]:this.G&&(c=Tc(this,a));return c?this.pa.W(c,a,b):!0};\nKc",
    ".prototype.S=function(a,b,c,d,e,f,h,l){if(!l&&!tc(this.g))return!1;if(h",
    "&&Uc!=a&&Vc!=a)throw new u(12,\"Event type does not allow related targe",
    "t: \"+a);b={clientX:b.x,clientY:b.y,button:c,altKey:!1,ctrlKey:!1,shift",
    "Key:!1,metaKey:!1,relatedTarget:h||null,width:0,height:0,pressure:0,rot",
    "ation:0,pointerId:d,tiltX:0,tiltY:0,pointerType:e,isPrimary:f};c=this.G",
    "?Tc(this,a):this.g;Sc[d]&&(c=Sc[d]);d=Sa(A(this.g));if(d&&a==Wc){var q=",
    "d.Element.prototype.msSetPointerCapture;d.Element.prototype.msSetPointe",
    "rCapture=\nfunction(a){Sc[a]=this}}a=c?this.pa.S(c,a,b):!0;q&&(d.Elemen",
    "t.prototype.msSetPointerCapture=q);return a};function Tc(a,b){switch(b)",
    "{case Qc:case Xc:return a.G.multiple?a.g:a.G;default:return a.G.multipl",
    "e?a.g:null}}function Yc(a){var b=$a(a.g,function(a){return!!a&&B(a)&&xc",
    "(a)},!0),b=b||a.g;a=ab(A(b));if(b!=a){if(a&&ea(a.blur)&&!B(a,\"BODY\"))",
    "try{a.blur()}catch(c){throw c;}ea(b.focus)&&b.focus()}}function Mc(){th",
    "is.ca=0}var Sc={};function Nc(){}Nc.prototype.W=function(a,b,c){return ",
    "Zc(a,b,c)};\nNc.prototype.S=function(a,b,c){return Zc(a,b,c)};Na();Na()",
    ";function $c(a,b,c){this.B=a;this.la=b;this.ma=c}$c.prototype.create=fu",
    "nction(a){a=A(a).createEvent(\"HTMLEvents\");a.initEvent(this.B,this.la",
    ",this.ma);return a};$c.prototype.toString=function(){return this.B};fun",
    "ction W(a,b,c){$c.call(this,a,b,c)}p(W,$c);\nW.prototype.create=functio",
    "n(a,b){if(this==ad)throw new u(9,\"Browser does not support a mouse pix",
    "el scroll event.\");var c=A(a);a=Sa(c);c=c.createEvent(\"MouseEvents\")",
    ";this==bd&&(c.wheelDelta=b.wheelDelta);c.initMouseEvent(this.B,this.la,",
    "this.ma,a,1,b.clientX,b.clientY,b.clientX,b.clientY,b.ctrlKey,b.altKey,",
    "b.shiftKey,b.metaKey,b.button,b.relatedTarget);return c};function X(a,b",
    ",c){$c.call(this,a,b,c)}p(X,$c);X.prototype.create=function(){throw new",
    " u(9,\"Browser does not support MSPointer events.\");};\nvar cd=new $c(",
    "\"change\",!0,!1),Qc=new W(\"click\",!0,!0),dd=new W(\"contextmenu\",!0",
    ",!0),ed=new W(\"dblclick\",!0,!0),Rc=new W(\"mousedown\",!0,!0),fd=new ",
    "W(\"mousemove\",!0,!1),Pc=new W(\"mouseout\",!0,!0),Oc=new W(\"mouseove",
    "r\",!0,!0),Xc=new W(\"mouseup\",!0,!0),bd=new W(\"mousewheel\",!0,!0),a",
    "d=new W(\"MozMousePixelScroll\",!0,!0),gd=new X(\"MSGotPointerCapture\"",
    ",!0,!1),hd=new X(\"MSLostPointerCapture\",!0,!1),Wc=new X(\"MSPointerDo",
    "wn\",!0,!0),id=new X(\"MSPointerMove\",!0,!0),Uc=new X(\"MSPointerOver",
    "\",!0,!0),Vc=new X(\"MSPointerOut\",\n!0,!0),jd=new X(\"MSPointerUp\",!",
    "0,!0);function Zc(a,b,c){b=b.create(a,c);\"isTrusted\"in b||(b.isTruste",
    "d=!1);return a.dispatchEvent(b)};function kd(a,b){this.D={};this.h=[];t",
    "his.M=0;var c=arguments.length;if(1<c){if(c%2)throw Error(\"Uneven numb",
    "er of arguments\");for(var d=0;d<c;d+=2)this.set(arguments[d],arguments",
    "[d+1])}else a&&this.addAll(a)}function ld(a){md(a);return a.h.concat()}",
    "g=kd.prototype;g.clear=function(){this.D={};this.M=this.h.length=0};g.r",
    "emove=function(a){return Object.prototype.hasOwnProperty.call(this.D,a)",
    "?(delete this.D[a],this.M--,this.h.length>2*this.M&&md(this),!0):!1};\n",
    "function md(a){var b,c;if(a.M!=a.h.length){for(b=c=0;c<a.h.length;){var",
    " d=a.h[c];Object.prototype.hasOwnProperty.call(a.D,d)&&(a.h[b++]=d);c++",
    "}a.h.length=b}if(a.M!=a.h.length){var e={};for(b=c=0;c<a.h.length;)d=a.",
    "h[c],Object.prototype.hasOwnProperty.call(e,d)||(a.h[b++]=d,e[d]=1),c++",
    ";a.h.length=b}}g.get=function(a,b){return Object.prototype.hasOwnProper",
    "ty.call(this.D,a)?this.D[a]:b};g.set=function(a,b){Object.prototype.has",
    "OwnProperty.call(this.D,a)||(this.M++,this.h.push(a));this.D[a]=b};\ng.",
    "addAll=function(a){if(a instanceof kd){var b=ld(a);md(a);for(var c=[],d",
    "=0;d<a.h.length;d++)c.push(a.D[a.h[d]]);a=c}else{b=[];var d=0;for(e in ",
    "a)b[d++]=e;d=[];var e=0;for(c in a)d[e++]=a[c];a=d}for(c=0;c<b.length;c",
    "++)this.set(b[c],a[c])};g.forEach=function(a,b){for(var c=ld(this),d=0;",
    "d<c.length;d++){var e=c[d],f=this.get(e);a.call(b,f,e,this)}};g.clone=f",
    "unction(){return new kd(this)};var nd={};function Y(a,b,c){fa(a)&&(a=a.",
    "b);a=new od(a);!b||b in nd&&!c||(nd[b]={key:a,shift:!1},c&&(nd[c]={key:",
    "a,shift:!0}));return a}function od(a){this.code=a}Y(8);Y(9);Y(13);var p",
    "d=Y(16),qd=Y(17),rd=Y(18);Y(19);Y(20);Y(27);Y(32,\" \");Y(33);Y(34);Y(3",
    "5);Y(36);Y(37);Y(38);Y(39);Y(40);Y(44);Y(45);Y(46);Y(48,\"0\",\")\");Y(",
    "49,\"1\",\"!\");Y(50,\"2\",\"@\");Y(51,\"3\",\"#\");Y(52,\"4\",\"$\");Y",
    "(53,\"5\",\"%\");Y(54,\"6\",\"^\");Y(55,\"7\",\"&\");Y(56,\"8\",\"*\");",
    "Y(57,\"9\",\"(\");Y(65,\"a\",\"A\");Y(66,\"b\",\"B\");Y(67,\"c\",\"C\")",
    ";Y(68,\"d\",\"D\");\nY(69,\"e\",\"E\");Y(70,\"f\",\"F\");Y(71,\"g\",\"G",
    "\");Y(72,\"h\",\"H\");Y(73,\"i\",\"I\");Y(74,\"j\",\"J\");Y(75,\"k\",\"",
    "K\");Y(76,\"l\",\"L\");Y(77,\"m\",\"M\");Y(78,\"n\",\"N\");Y(79,\"o\",",
    "\"O\");Y(80,\"p\",\"P\");Y(81,\"q\",\"Q\");Y(82,\"r\",\"R\");Y(83,\"s\"",
    ",\"S\");Y(84,\"t\",\"T\");Y(85,\"u\",\"U\");Y(86,\"v\",\"V\");Y(87,\"w",
    "\",\"W\");Y(88,\"x\",\"X\");Y(89,\"y\",\"Y\");Y(90,\"z\",\"Z\");var sd=",
    "Y(Ja?{c:91,b:91}:Ia?{c:224,b:91}:{c:0,b:91});Y(Ja?{c:92,b:92}:Ia?{c:224",
    ",b:93}:{c:0,b:92});Y(Ja?{c:93,b:93}:Ia?{c:0,b:0}:{c:93,b:null});Y({c:96",
    ",b:96},\"0\");Y({c:97,b:97},\"1\");\nY({c:98,b:98},\"2\");Y({c:99,b:99}",
    ",\"3\");Y({c:100,b:100},\"4\");Y({c:101,b:101},\"5\");Y({c:102,b:102},",
    "\"6\");Y({c:103,b:103},\"7\");Y({c:104,b:104},\"8\");Y({c:105,b:105},\"",
    "9\");Y({c:106,b:106},\"*\");Y({c:107,b:107},\"+\");Y({c:109,b:109},\"-",
    "\");Y({c:110,b:110},\".\");Y({c:111,b:111},\"/\");Y(144);Y(112);Y(113);",
    "Y(114);Y(115);Y(116);Y(117);Y(118);Y(119);Y(120);Y(121);Y(122);Y(123);Y",
    "({c:107,b:187},\"=\",\"+\");Y(108,\",\");Y({c:109,b:189},\"-\",\"_\");Y",
    "(188,\",\",\"<\");Y(190,\".\",\">\");Y(191,\"/\",\"?\");Y(192,\"`\",\"~",
    "\");Y(219,\"[\",\"{\");\nY(220,\"\\\\\",\"|\");Y(221,\"]\",\"}\");Y({c:",
    "59,b:186},\";\",\":\");Y(222,\"'\",'\"');var td=new kd;td.set(1,pd);td.",
    "set(2,qd);td.set(4,rd);td.set(8,sd);(function(a){var b=new kd;t(ld(a),f",
    "unction(c){b.set(a.get(c).code,c)});return b})(td);function ud(a,b,c){K",
    "c.call(this,b,c);this.K=this.j=null;this.C=new z(0,0);this.Y=this.N=!1;",
    "if(a){n(a.buttonPressed)&&(this.j=a.buttonPressed);try{B(a.elementPress",
    "ed)&&(this.K=a.elementPressed)}catch(d){this.j=null}this.C=new z(a.clie",
    "ntXY.x,a.clientXY.y);this.N=!!a.nextClickIsDoubleClick;this.Y=!!a.hasEv",
    "erInteracted;try{a.element&&B(a.element)&&Lc(this,a.element)}catch(d){t",
    "his.j=null}}}p(ud,Kc);var Z={};Z[Qc]=[0,1,2,null];Z[dd]=[null,null,2,nu",
    "ll];Z[Xc]=[0,1,2,null];Z[Pc]=[0,1,2,4];Z[fd]=[0,1,2,4];\nQa&&(Z[Wc]=Z[X",
    "c],Z[jd]=Z[Xc],Z[id]=[-1,-1,-1,-1],Z[Vc]=Z[id],Z[Uc]=Z[id]);Z[ed]=Z[Qc]",
    ";Z[Rc]=Z[Xc];Z[Oc]=Z[Pc];var vd={};vd[Rc]=Wc;vd[fd]=id;vd[Pc]=Vc;vd[Oc]",
    "=Uc;vd[Xc]=jd;ud.prototype.move=function(a,b){var c=tc(a),d=Ec(a);this.",
    "C.x=b.x+d.left;this.C.y=b.y+d.top;b=this.I();if(a!=b){try{Sa(A(b)).clos",
    "ed&&(b=null)}catch(e){b=null}b&&(d=b===ka.document.documentElement||b==",
    "=ka.document.body,b=!this.Y&&d?null:b,wd(this,Pc,a));Lc(this,a);wd(this",
    ",Oc,b,null,c)}wd(this,fd,null,null,c);this.N=!1};\nud.prototype.scroll=",
    "function(a){if(0==a)throw new u(13,\"Must scroll a non-zero number of t",
    "icks.\");for(var b=0<a?-120:120,c=0;c<Math.abs(a);c++)wd(this,bd,null,b",
    ")};function wd(a,b,c,d,e,f){a.Y=!0;if(Qa){var h=vd[b];if(h&&!a.S(h,a.C,",
    "xd(a,h),1,MSPointerEvent.MSPOINTER_TYPE_MOUSE,!0,c,e))return!1}return a",
    ".W(b,a.C,xd(a,b),c,d,e,null,f)}function xd(a,b){if(!(b in Z))return 0;a",
    "=Z[b][null===a.j?3:a.j];if(null===a)throw new u(13,\"Event does not per",
    "mit the specified mouse button.\");return a}\nud.prototype.getState=fun",
    "ction(){return{buttonPressed:this.j,elementPressed:this.K,clientXY:{x:t",
    "his.C.x,y:this.C.y},nextClickIsDoubleClick:this.N,hasEverInteracted:thi",
    "s.Y,element:this.I()}};function yd(a,b){this.x=a;this.y=b}p(yd,z);g=yd.",
    "prototype;g.clone=function(){return new yd(this.x,this.y)};g.scale=z.pr",
    "ototype.scale;g.normalize=function(){return this.scale(1/Math.sqrt(this",
    ".x*this.x+this.y*this.y))};g.add=function(a){this.x+=a.x;this.y+=a.y;re",
    "turn this};g.rotate=function(a){var b=Math.cos(a);a=Math.sin(a);var c=t",
    "his.y*b+this.x*a;this.x=this.x*b-this.y*a;this.y=c;return this};functio",
    "n zd(a){var b;(b=qc(a,\"display\"))||(b=a.currentStyle?a.currentStyle.d",
    "isplay:null);if(\"none\"!=(b||a.style&&a.style.display))b=rc(a);else{b=",
    "a.style;var c=b.display,d=b.visibility,e=b.position;b.visibility=\"hidd",
    "en\";b.position=\"absolute\";b.display=\"inline\";var f=rc(a);b.display",
    "=c;b.position=e;b.visibility=d;b=f}return 0<b.width&&0<b.height||!a.off",
    "setParent?b:zd(a.offsetParent)};ba(\"_\",function(a,b,c,d){if(!uc(a))th",
    "row new u(11,\"Element is not currently visible and may not be manipula",
    "ted\");b:{var e=b||void 0;if(\"scroll\"==Fc(a,e)){if(a.scrollIntoView&&",
    "(a.scrollIntoView(),\"none\"==Fc(a,e)))break b;for(var f=Ic(a,e),h=Bc(a",
    ");h;h=Bc(h)){var l=h,q=Ec(l);var y=l;var r=qc(y,\"borderLeftWidth\");va",
    "r v=qc(y,\"borderRightWidth\");var J=qc(y,\"borderTopWidth\");y=qc(y,\"",
    "borderBottomWidth\");v=new pc(parseFloat(J),parseFloat(v),parseFloat(y)",
    ",parseFloat(r));r=f.left-q.left-v.left;q=f.top-q.top-\nv.top;v=l.client",
    "Height+f.top-f.bottom;l.scrollLeft+=Math.min(r,Math.max(r-(l.clientWidt",
    "h+f.left-f.right),0));l.scrollTop+=Math.min(q,Math.max(q-v,0))}Fc(a,e)}",
    "}b?b=new yd(b.x,b.y):(b=zd(a),b=new yd(b.width/2,b.height/2));c=c||new ",
    "ud;c.move(a,b);if(null!==c.j)throw new u(13,\"Cannot press more than on",
    "e button or an already pressed button.\");c.j=0;c.K=c.I();if(B(c.I(),\"",
    "OPTION\")||B(c.I(),\"SELECT\")||wd(c,Rc,null,null,!1,void 0))Qa&&0==c.j",
    "&&B(c.K,\"OPTION\")&&c.S(gd,c.C,0,1,MSPointerEvent.MSPOINTER_TYPE_MOUSE",
    ",\n!0),Yc(c);if(null===c.j)throw new u(13,\"Cannot release a button whe",
    "n no button is pressed.\");c.G&&tc(c.g)&&(a=c.G,b=gb(c.g),!b||a.multipl",
    "e)&&(c.g.selected=!b,a.multiple&&!(0<=na(Pa,28))||Zc(a,cd));a=tc(c.I())",
    ";wd(c,Xc,null,null,d,void 0);try{if(0==c.j&&c.I()==c.K){var U=c.C,la=xd",
    "(c,Qc);if(a||tc(c.g))!c.G&&fb(c.g)&&gb(c.g),c.W(Qc,U,la,null,0,a,void 0",
    ");c.N&&wd(c,ed);c.N=!c.N;Qa&&0==c.j&&B(c.K,\"OPTION\")&&c.S(hd,new z(0,",
    "0),0,1,MSPointerEvent.MSPOINTER_TYPE_MOUSE,!1)}else 2==c.j&&wd(c,dd)}ca",
    "tch(Ad){}Sc=\n{};c.j=null;c.K=null});; return this._.apply(null,argumen",
    "ts);}.apply({navigator:typeof window!='undefined'?window.navigator:null",
    ",document:typeof window!='undefined'?window.document:null}, arguments);",
    "}",
    NULL
};

const char* const EXECUTE_ASYNC_SCRIPT[] = {
    "function(){return function(){function e(a){var b=typeof a;if(\"object\"",
    "==b)if(a){if(a instanceof Array)return\"array\";if(a instanceof Object)",
    "return b;var c=Object.prototype.toString.call(a);if(\"[object Window]\"",
    "==c)return\"object\";if(\"[object Array]\"==c||\"number\"==typeof a.len",
    "gth&&\"undefined\"!=typeof a.splice&&\"undefined\"!=typeof a.propertyIs",
    "Enumerable&&!a.propertyIsEnumerable(\"splice\"))return\"array\";if(\"[o",
    "bject Function]\"==c||\"undefined\"!=typeof a.call&&\"undefined\"!=type",
    "of a.propertyIsEnumerable&&!a.propertyIsEnumerable(\"call\"))return\"fu",
    "nction\"}else return\"null\";\nelse if(\"function\"==b&&\"undefined\"==",
    "typeof a.call)return\"object\";return b}function k(a){var b=e(a);return",
    "\"array\"==b||\"object\"==b&&\"number\"==typeof a.length}function m(a){",
    "var b=typeof a;return\"object\"==b&&null!=a||\"function\"==b}function n",
    "(a,b){var c=Array.prototype.slice.call(arguments,1);return function(){v",
    "ar b=c.slice();b.push.apply(b,arguments);return a.apply(this,b)}}var p=",
    "Date.now||function(){return+new Date};function q(a,b){this.code=a;this.",
    "state=r[a]||t;this.message=b||\"\";a=this.state.replace(/((?:^|\\s+)[a-",
    "z])/g,function(a){return a.toUpperCase().replace(/^[\\s\\xa0]+/g,\"\")}",
    ");b=a.length-5;if(0>b||a.indexOf(\"Error\",b)!=b)a+=\"Error\";this.name",
    "=a;a=Error(this.message);a.name=this.name;this.stack=a.stack||\"\"}\n(f",
    "unction(){var a=Error;function b(){}b.prototype=a.prototype;q.f=a.proto",
    "type;q.prototype=new b;q.prototype.constructor=q;q.c=function(b,d,f){fo",
    "r(var c=Array(arguments.length-2),l=2;l<arguments.length;l++)c[l-2]=arg",
    "uments[l];return a.prototype[d].apply(b,c)}})();var t=\"unknown error\"",
    ",r={15:\"element not selectable\",11:\"element not visible\"};r[31]=t;r",
    "[30]=t;r[24]=\"invalid cookie domain\";r[29]=\"invalid element coordina",
    "tes\";r[12]=\"invalid element state\";r[32]=\"invalid selector\";r[51]=",
    "\"invalid selector\";\nr[52]=\"invalid selector\";r[17]=\"javascript er",
    "ror\";r[405]=\"unsupported operation\";r[34]=\"move target out of bound",
    "s\";r[27]=\"no such alert\";r[7]=\"no such element\";r[8]=\"no such fra",
    "me\";r[23]=\"no such window\";r[28]=\"script timeout\";r[33]=\"session ",
    "not created\";r[10]=\"stale element reference\";r[21]=\"timeout\";r[25]",
    "=\"unable to set cookie\";r[26]=\"unexpected alert open\";r[13]=t;r[9]=",
    "\"unknown command\";q.prototype.toString=function(){return this.name+\"",
    ": \"+this.message};function u(a,b){for(var c=a.length,d=Array(c),f=\"st",
    "ring\"==typeof a?a.split(\"\"):a,g=0;g<c;g++)g in f&&(d[g]=b.call(void ",
    "0,f[g],g,a));return d};function w(a,b){var c={},d;for(d in a)b.call(voi",
    "d 0,a[d],d,a)&&(c[d]=a[d]);return c}function x(a,b){var c={},d;for(d in",
    " a)c[d]=b.call(void 0,a[d],d,a);return c}function y(a,b){return null!==",
    "a&&b in a}function z(a,b){for(var c in a)if(b.call(void 0,a[c],c,a))ret",
    "urn c};function A(){this.a=void 0}\nfunction B(a,b,c){if(null==b)c.push",
    "(\"null\");else{if(\"object\"==typeof b){if(\"array\"==e(b)){var d=b;b=",
    "d.length;c.push(\"[\");for(var f=\"\",g=0;g<b;g++)c.push(f),f=d[g],B(a,",
    "a.a?a.a.call(d,String(g),f):f,c),f=\",\";c.push(\"]\");return}if(b inst",
    "anceof String||b instanceof Number||b instanceof Boolean)b=b.valueOf();",
    "else{c.push(\"{\");g=\"\";for(d in b)Object.prototype.hasOwnProperty.ca",
    "ll(b,d)&&(f=b[d],\"function\"!=typeof f&&(c.push(g),C(d,c),c.push(\":\"",
    "),B(a,a.a?a.a.call(b,d,f):f,c),g=\",\"));c.push(\"}\");return}}switch(t",
    "ypeof b){case \"string\":C(b,\nc);break;case \"number\":c.push(isFinite",
    "(b)&&!isNaN(b)?String(b):\"null\");break;case \"boolean\":c.push(String",
    "(b));break;case \"function\":c.push(\"null\");break;default:throw Error",
    "(\"Unknown type: \"+typeof b);}}}var D={'\"':'\\\\\"',\"\\\\\":\"",
    "\\\\\\\\\",\"/\":\"\\\\/\",\"\\b\":\"\\\\b\",\"\\f\":\"\\\\f\",\"\\n\":",
    "\"\\\\n\",\"\\r\":\"\\\\r\",\"\\t\":\"\\\\t\",\"\\x0B\":\"\\\\u000b\"},",
    "E=/\\uffff/.test(\"\\uffff\")?/[\\\\\\\"\\x00-\\x1f\\x7f-\\uffff]/g:/[",
    "\\\\\\\"\\x00-\\x1f\\x7f-\\xff]/g;\nfunction C(a,b){b.push('\"',a.repla",
    "ce(E,function(a){var b=D[a];b||(b=\"\\\\u\"+(a.charCodeAt(0)|65536).toS",
    "tring(16).substr(1),D[a]=b);return b}),'\"')};function F(a){function b(",
    "a,d){switch(e(a)){case \"string\":case \"number\":case \"boolean\":retu",
    "rn a;case \"function\":return a.toString();case \"array\":return u(a,fu",
    "nction(a){return b(a,d)});case \"object\":if(0<=d.indexOf(a))throw new ",
    "q(13,\"Recursive object cannot be transferred\");if(y(a,\"nodeType\")&&",
    "(1==a.nodeType||9==a.nodeType)){var c={};c.ELEMENT=G(a);return c}if(y(a",
    ",\"document\"))return c={},c.WINDOW=G(a),c;d.push(a);if(k(a))return u(a",
    ",function(a){return b(a,d)});a=w(a,function(a,b){return\"number\"==type",
    "of b||\n\"string\"==typeof b});return x(a,function(a){return b(a,d)});d",
    "efault:return null}}return b(a,[])}function H(a,b){return\"array\"==e(a",
    ")?u(a,function(a){return H(a,b)}):m(a)?\"function\"==typeof a?a:y(a,\"E",
    "LEMENT\")?K(a.ELEMENT,b):y(a,\"WINDOW\")?K(a.WINDOW,b):x(a,function(a){",
    "return H(a,b)}):a}function L(a,b){if(\"string\"==typeof a)try{return ne",
    "w b.Function(a)}catch(c){throw c;}return b==window?a:new b.Function(\"r",
    "eturn (\"+a+\").apply(null,arguments);\")}\nfunction M(a){a=a||document",
    ";var b=a.$wdc_;b||(b=a.$wdc_={},b.b=p());b.b||(b.b=p());return b}functi",
    "on G(a){var b=M(a.ownerDocument),c=z(b,function(b){return b==a});c||(c=",
    "\":wdc:\"+b.b++,b[c]=a);return c}\nfunction K(a,b){a=decodeURIComponent",
    "(a);b=b||document;var c=M(b);if(!y(c,a))throw new q(10,\"Element does n",
    "ot exist in cache\");var d=c[a];if(y(d,\"setInterval\")){if(d.closed)th",
    "row delete c[a],new q(23,\"Window has been closed.\");return d}for(var ",
    "f=d;f;){if(f==b.documentElement)return d;f=f.parentNode}delete c[a];thr",
    "ow new q(10,\"Element is no longer attached to the DOM\");};function N(",
    "a,b,c,d,f,g){function l(a,b){J||(h.removeEventListener?h.removeEventLis",
    "tener(\"unload\",v,!0):h.detachEvent(\"onunload\",v),h.clearTimeout(S),",
    "0!=a?(a=new q(a,b.message||b+\"\"),a.stack=b.stack,b={status:y(a,\"code",
    "\")?a.code:13,value:{message:a.message}}):b={status:0,value:F(b)},f&&(a",
    "=[],B(new A,b,a),b=a.join(\"\")),d(b),J=!0)}function v(){l(13,Error(\"D",
    "etected a page unload event; asynchronous script execution does not wor",
    "k across page loads.\"))}var h=g||window,J=!1;g=n(l,13);if(h.closed)g(",
    "\"Unable to execute script; the target window is closed.\");\nelse{a=L(",
    "a,h);b=H(b,h.document);b.push(n(l,0));h.addEventListener?h.addEventList",
    "ener(\"unload\",v,!0):h.attachEvent(\"onunload\",v);var T=p();try{a.app",
    "ly(h,b);var S=h.setTimeout(function(){l(28,Error(\"Timed out waiting fo",
    "r asyncrhonous script result after \"+(p()-T)+\" ms\"))},Math.max(0,c))",
    "}catch(I){l(I.code||13,I)}}}var O=[\"_\"],P=this;O[0]in P||!P.execScrip",
    "t||P.execScript(\"var \"+O[0]);\nfor(var Q;O.length&&(Q=O.shift());){va",
    "r R;if(R=!O.length)R=void 0!==N;R?P[Q]=N:P=P[Q]&&P[Q]!==Object.prototyp",
    "e[Q]?P[Q]:P[Q]={}};; return this._.apply(null,arguments);}.apply({navig",
    "ator:typeof window!='undefined'?window.navigator:null,document:typeof w",
    "indow!='undefined'?window.document:null}, arguments);}",
    NULL
};

const char* const EXECUTE_SCRIPT[] = {
    "function(){return function(){function e(a){var b=typeof a;if(\"object\"",
    "==b)if(a){if(a instanceof Array)return\"array\";if(a instanceof Object)",
    "return b;var c=Object.prototype.toString.call(a);if(\"[object Window]\"",
    "==c)return\"object\";if(\"[object Array]\"==c||\"number\"==typeof a.len",
    "gth&&\"undefined\"!=typeof a.splice&&\"undefined\"!=typeof a.propertyIs",
    "Enumerable&&!a.propertyIsEnumerable(\"splice\"))return\"array\";if(\"[o",
    "bject Function]\"==c||\"undefined\"!=typeof a.call&&\"undefined\"!=type",
    "of a.propertyIsEnumerable&&!a.propertyIsEnumerable(\"call\"))return\"fu",
    "nction\"}else return\"null\";\nelse if(\"function\"==b&&\"undefined\"==",
    "typeof a.call)return\"object\";return b}function h(a){var b=e(a);return",
    "\"array\"==b||\"object\"==b&&\"number\"==typeof a.length}function l(a){",
    "var b=typeof a;return\"object\"==b&&null!=a||\"function\"==b}var m=Date",
    ".now||function(){return+new Date};var n=window;function q(a,b){this.cod",
    "e=a;this.state=r[a]||t;this.message=b||\"\";a=this.state.replace(/((?:^",
    "|\\s+)[a-z])/g,function(a){return a.toUpperCase().replace(/^[\\s\\xa0]+",
    "/g,\"\")});b=a.length-5;if(0>b||a.indexOf(\"Error\",b)!=b)a+=\"Error\";",
    "this.name=a;a=Error(this.message);a.name=this.name;this.stack=a.stack||",
    "\"\"}\n(function(){var a=Error;function b(){}b.prototype=a.prototype;q.",
    "f=a.prototype;q.prototype=new b;q.prototype.constructor=q;q.c=function(",
    "b,d,f){for(var c=Array(arguments.length-2),k=2;k<arguments.length;k++)c",
    "[k-2]=arguments[k];return a.prototype[d].apply(b,c)}})();var t=\"unknow",
    "n error\",r={15:\"element not selectable\",11:\"element not visible\"};",
    "r[31]=t;r[30]=t;r[24]=\"invalid cookie domain\";r[29]=\"invalid element",
    " coordinates\";r[12]=\"invalid element state\";r[32]=\"invalid selector",
    "\";r[51]=\"invalid selector\";\nr[52]=\"invalid selector\";r[17]=\"java",
    "script error\";r[405]=\"unsupported operation\";r[34]=\"move target out",
    " of bounds\";r[27]=\"no such alert\";r[7]=\"no such element\";r[8]=\"no",
    " such frame\";r[23]=\"no such window\";r[28]=\"script timeout\";r[33]=",
    "\"session not created\";r[10]=\"stale element reference\";r[21]=\"timeo",
    "ut\";r[25]=\"unable to set cookie\";r[26]=\"unexpected alert open\";r[1",
    "3]=t;r[9]=\"unknown command\";q.prototype.toString=function(){return th",
    "is.name+\": \"+this.message};function u(a,b){for(var c=a.length,d=Array",
    "(c),f=\"string\"==typeof a?a.split(\"\"):a,g=0;g<c;g++)g in f&&(d[g]=b.",
    "call(void 0,f[g],g,a));return d};function v(a,b){var c={},d;for(d in a)",
    "b.call(void 0,a[d],d,a)&&(c[d]=a[d]);return c}function w(a,b){var c={},",
    "d;for(d in a)c[d]=b.call(void 0,a[d],d,a);return c}function x(a,b){retu",
    "rn null!==a&&b in a}function y(a,b){for(var c in a)if(b.call(void 0,a[c",
    "],c,a))return c};function z(){this.a=void 0}\nfunction A(a,b,c){if(null",
    "==b)c.push(\"null\");else{if(\"object\"==typeof b){if(\"array\"==e(b)){",
    "var d=b;b=d.length;c.push(\"[\");for(var f=\"\",g=0;g<b;g++)c.push(f),f",
    "=d[g],A(a,a.a?a.a.call(d,String(g),f):f,c),f=\",\";c.push(\"]\");return",
    "}if(b instanceof String||b instanceof Number||b instanceof Boolean)b=b.",
    "valueOf();else{c.push(\"{\");g=\"\";for(d in b)Object.prototype.hasOwnP",
    "roperty.call(b,d)&&(f=b[d],\"function\"!=typeof f&&(c.push(g),B(d,c),c.",
    "push(\":\"),A(a,a.a?a.a.call(b,d,f):f,c),g=\",\"));c.push(\"}\");return",
    "}}switch(typeof b){case \"string\":B(b,\nc);break;case \"number\":c.pus",
    "h(isFinite(b)&&!isNaN(b)?String(b):\"null\");break;case \"boolean\":c.p",
    "ush(String(b));break;case \"function\":c.push(\"null\");break;default:t",
    "hrow Error(\"Unknown type: \"+typeof b);}}}var C={'\"':'\\\\\"',\"",
    "\\\\\":\"\\\\\\\\\",\"/\":\"\\\\/\",\"\\b\":\"\\\\b\",\"\\f\":\"\\\\f\"",
    ",\"\\n\":\"\\\\n\",\"\\r\":\"\\\\r\",\"\\t\":\"\\\\t\",\"\\x0B\":\"",
    "\\\\u000b\"},D=/\\uffff/.test(\"\\uffff\")?/[\\\\\\\"\\x00-\\x1f\\x7f-",
    "\\uffff]/g:/[\\\\\\\"\\x00-\\x1f\\x7f-\\xff]/g;\nfunction B(a,b){b.push",
    "('\"',a.replace(D,function(a){var b=C[a];b||(b=\"\\\\u\"+(a.charCodeAt(",
    "0)|65536).toString(16).substr(1),C[a]=b);return b}),'\"')};function E(a",
    "){function b(a,d){switch(e(a)){case \"string\":case \"number\":case \"b",
    "oolean\":return a;case \"function\":return a.toString();case \"array\":",
    "return u(a,function(a){return b(a,d)});case \"object\":if(0<=d.indexOf(",
    "a))throw new q(13,\"Recursive object cannot be transferred\");if(x(a,\"",
    "nodeType\")&&(1==a.nodeType||9==a.nodeType)){var c={};c.ELEMENT=F(a);re",
    "turn c}if(x(a,\"document\"))return c={},c.WINDOW=F(a),c;d.push(a);if(h(",
    "a))return u(a,function(a){return b(a,d)});a=v(a,function(a,b){return\"n",
    "umber\"==typeof b||\n\"string\"==typeof b});return w(a,function(a){retu",
    "rn b(a,d)});default:return null}}return b(a,[])}function G(a,b){return",
    "\"array\"==e(a)?u(a,function(a){return G(a,b)}):l(a)?\"function\"==type",
    "of a?a:x(a,\"ELEMENT\")?H(a.ELEMENT,b):x(a,\"WINDOW\")?H(a.WINDOW,b):w(",
    "a,function(a){return G(a,b)}):a}function I(a){a=a||document;var b=a.$wd",
    "c_;b||(b=a.$wdc_={},b.b=m());b.b||(b.b=m());return b}function F(a){var ",
    "b=I(a.ownerDocument),c=y(b,function(b){return b==a});c||(c=\":wdc:\"+b.",
    "b++,b[c]=a);return c}\nfunction H(a,b){a=decodeURIComponent(a);b=b||doc",
    "ument;var c=I(b);if(!x(c,a))throw new q(10,\"Element does not exist in ",
    "cache\");var d=c[a];if(x(d,\"setInterval\")){if(d.closed)throw delete c",
    "[a],new q(23,\"Window has been closed.\");return d}for(var f=d;f;){if(f",
    "==b.documentElement)return d;f=f.parentNode}delete c[a];throw new q(10,",
    "\"Element is no longer attached to the DOM\");};function J(a,b,c,d){d=d",
    "||n;try{a:{var f=a;if(\"string\"==typeof f)try{a=new d.Function(f);brea",
    "k a}catch(p){throw p;}a=d==window?f:new d.Function(\"return (\"+f+\").a",
    "pply(null,arguments);\")}var g=G(b,d.document);var k={status:0,value:E(",
    "a.apply(null,g))}}catch(p){k={status:x(p,\"code\")?p.code:13,value:{mes",
    "sage:p.message}}}c&&(a=[],A(new z,k,a),k=a.join(\"\"));return k}var K=[",
    "\"_\"],L=this;K[0]in L||!L.execScript||L.execScript(\"var \"+K[0]);\nfo",
    "r(var M;K.length&&(M=K.shift());){var N;if(N=!K.length)N=void 0!==J;N?L",
    "[M]=J:L=L[M]&&L[M]!==Object.prototype[M]?L[M]:L[M]={}};; return this._.",
    "apply(null,arguments);}.apply({navigator:typeof window!='undefined'?win",
    "dow.navigator:null,document:typeof window!='undefined'?window.document:",
    "null}, arguments);}",
    NULL
};

const char* const EXECUTE_SQL[] = {
    "function(){return function(){var b=window;function d(a,c){this.code=a;t",
    "his.state=e[a]||f;this.message=c||\"\";a=this.state.replace(/((?:^|\\s+",
    ")[a-z])/g,function(a){return a.toUpperCase().replace(/^[\\s\\xa0]+/g,\"",
    "\")});c=a.length-5;if(0>c||a.indexOf(\"Error\",c)!=c)a+=\"Error\";this.",
    "name=a;a=Error(this.message);a.name=this.name;this.stack=a.stack||\"\"}",
    "\n(function(){var a=Error;function c(){}c.prototype=a.prototype;d.b=a.p",
    "rototype;d.prototype=new c;d.prototype.constructor=d;d.a=function(c,m,p",
    "){for(var l=Array(arguments.length-2),g=2;g<arguments.length;g++)l[g-2]",
    "=arguments[g];return a.prototype[m].apply(c,l)}})();var f=\"unknown err",
    "or\",e={15:\"element not selectable\",11:\"element not visible\"};e[31]",
    "=f;e[30]=f;e[24]=\"invalid cookie domain\";e[29]=\"invalid element coor",
    "dinates\";e[12]=\"invalid element state\";e[32]=\"invalid selector\";e[",
    "51]=\"invalid selector\";\ne[52]=\"invalid selector\";e[17]=\"javascrip",
    "t error\";e[405]=\"unsupported operation\";e[34]=\"move target out of b",
    "ounds\";e[27]=\"no such alert\";e[7]=\"no such element\";e[8]=\"no such",
    " frame\";e[23]=\"no such window\";e[28]=\"script timeout\";e[33]=\"sess",
    "ion not created\";e[10]=\"stale element reference\";e[21]=\"timeout\";e",
    "[25]=\"unable to set cookie\";e[26]=\"unexpected alert open\";e[13]=f;e",
    "[9]=\"unknown command\";d.prototype.toString=function(){return this.nam",
    "e+\": \"+this.message};function h(a){this.rows=[];for(var c=0;c<a.rows.",
    "length;c++)this.rows[c]=a.rows.item(c);this.rowsAffected=a.rowsAffected",
    ";this.insertId=-1;try{this.insertId=a.insertId}catch(n){}};function k(a",
    ",c,n,m,p,l,g){function u(a,c){c=new h(c);m(a,c)}try{var w=b.openDatabas",
    "e(a,\"\",a+\"name\",5242880)}catch(v){throw new d(13,v.message);}w.tran",
    "saction(function(a){a.executeSql(c,n,u,g)},p,l)}var q=[\"_\"],r=this;q[",
    "0]in r||!r.execScript||r.execScript(\"var \"+q[0]);for(var t;q.length&&",
    "(t=q.shift());)q.length||void 0===k?r=r[t]&&r[t]!==Object.prototype[t]?",
    "r[t]:r[t]={}:r[t]=k;; return this._.apply(null,arguments);}.apply({navi",
    "gator:typeof window!='undefined'?window.navigator:null,document:typeof ",
    "window!='undefined'?window.document:null}, arguments);}",
    NULL
};

const char* const FIND_ELEMENTS[] = {
    "function(){return function(){var h,aa=this;function l(a){return void 0!",
    "==a}function m(a){return\"string\"==typeof a}function n(a){return\"numb",
    "er\"==typeof a}function ba(a,b){a=a.split(\".\");var c=aa;a[0]in c||!c.",
    "execScript||c.execScript(\"var \"+a[0]);for(var d;a.length&&(d=a.shift(",
    "));)!a.length&&l(b)?c[d]=b:c=c[d]&&c[d]!==Object.prototype[d]?c[d]:c[d]",
    "={}}\nfunction ca(a){var b=typeof a;if(\"object\"==b)if(a){if(a instanc",
    "eof Array)return\"array\";if(a instanceof Object)return b;var c=Object.",
    "prototype.toString.call(a);if(\"[object Window]\"==c)return\"object\";i",
    "f(\"[object Array]\"==c||\"number\"==typeof a.length&&\"undefined\"!=ty",
    "peof a.splice&&\"undefined\"!=typeof a.propertyIsEnumerable&&!a.propert",
    "yIsEnumerable(\"splice\"))return\"array\";if(\"[object Function]\"==c||",
    "\"undefined\"!=typeof a.call&&\"undefined\"!=typeof a.propertyIsEnumera",
    "ble&&!a.propertyIsEnumerable(\"call\"))return\"function\"}else return\"",
    "null\";\nelse if(\"function\"==b&&\"undefined\"==typeof a.call)return\"",
    "object\";return b}function da(a){var b=ca(a);return\"array\"==b||\"obje",
    "ct\"==b&&\"number\"==typeof a.length}function p(a){return\"function\"==",
    "ca(a)}function ea(a){var b=typeof a;return\"object\"==b&&null!=a||\"fun",
    "ction\"==b}function fa(a,b,c){return a.call.apply(a.bind,arguments)}\nf",
    "unction ga(a,b,c){if(!a)throw Error();if(2<arguments.length){var d=Arra",
    "y.prototype.slice.call(arguments,2);return function(){var c=Array.proto",
    "type.slice.call(arguments);Array.prototype.unshift.apply(c,d);return a.",
    "apply(b,c)}}return function(){return a.apply(b,arguments)}}function ha(",
    "a,b,c){ha=Function.prototype.bind&&-1!=Function.prototype.bind.toString",
    "().indexOf(\"native code\")?fa:ga;return ha.apply(null,arguments)}\nfun",
    "ction ia(a,b){var c=Array.prototype.slice.call(arguments,1);return func",
    "tion(){var b=c.slice();b.push.apply(b,arguments);return a.apply(this,b)",
    "}}function r(a,b){function c(){}c.prototype=b.prototype;a.xa=b.prototyp",
    "e;a.prototype=new c;a.prototype.constructor=a;a.wa=function(a,c,f){for(",
    "var d=Array(arguments.length-2),e=2;e<arguments.length;e++)d[e-2]=argum",
    "ents[e];return b.prototype[c].apply(a,d)}};var ja=window;function t(a,b",
    "){this.code=a;this.state=v[a]||ka;this.message=b||\"\";a=this.state.rep",
    "lace(/((?:^|\\s+)[a-z])/g,function(a){return a.toUpperCase().replace(/^",
    "[\\s\\xa0]+/g,\"\")});b=a.length-5;if(0>b||a.indexOf(\"Error\",b)!=b)a+",
    "=\"Error\";this.name=a;a=Error(this.message);a.name=this.name;this.stac",
    "k=a.stack||\"\"}r(t,Error);var ka=\"unknown error\",v={15:\"element not",
    " selectable\",11:\"element not visible\"};v[31]=ka;v[30]=ka;v[24]=\"inv",
    "alid cookie domain\";v[29]=\"invalid element coordinates\";v[12]=\"inva",
    "lid element state\";\nv[32]=\"invalid selector\";v[51]=\"invalid select",
    "or\";v[52]=\"invalid selector\";v[17]=\"javascript error\";v[405]=\"uns",
    "upported operation\";v[34]=\"move target out of bounds\";v[27]=\"no suc",
    "h alert\";v[7]=\"no such element\";v[8]=\"no such frame\";v[23]=\"no su",
    "ch window\";v[28]=\"script timeout\";v[33]=\"session not created\";v[10",
    "]=\"stale element reference\";v[21]=\"timeout\";v[25]=\"unable to set c",
    "ookie\";v[26]=\"unexpected alert open\";v[13]=ka;v[9]=\"unknown command",
    "\";t.prototype.toString=function(){return this.name+\": \"+this.message",
    "};var la;function ma(a){var b=a.length-1;return 0<=b&&a.indexOf(\" \",b",
    ")==b}var na=String.prototype.trim?function(a){return a.trim()}:function",
    "(a){return a.replace(/^[\\s\\xa0]+|[\\s\\xa0]+$/g,\"\")};function oa(a)",
    "{return String(a).replace(/\\-([a-z])/g,function(a,c){return c.toUpperC",
    "ase()})};function pa(a,b){if(m(a))return m(b)&&1==b.length?a.indexOf(b,",
    "0):-1;for(var c=0;c<a.length;c++)if(c in a&&a[c]===b)return c;return-1}",
    "function w(a,b){for(var c=a.length,d=m(a)?a.split(\"\"):a,e=0;e<c;e++)e",
    " in d&&b.call(void 0,d[e],e,a)}function qa(a,b){for(var c=a.length,d=[]",
    ",e=0,f=m(a)?a.split(\"\"):a,g=0;g<c;g++)if(g in f){var k=f[g];b.call(vo",
    "id 0,k,g,a)&&(d[e++]=k)}return d}function ra(a,b,c){var d=c;w(a,functio",
    "n(c,f){d=b.call(void 0,d,c,f,a)});return d}\nfunction sa(a,b){for(var c",
    "=a.length,d=m(a)?a.split(\"\"):a,e=0;e<c;e++)if(e in d&&b.call(void 0,d",
    "[e],e,a))return!0;return!1}function ta(a,b){for(var c=a.length,d=m(a)?a",
    ".split(\"\"):a,e=0;e<c;e++)if(e in d&&!b.call(void 0,d[e],e,a))return!1",
    ";return!0}function ua(a,b){a:{for(var c=a.length,d=m(a)?a.split(\"\"):a",
    ",e=0;e<c;e++)if(e in d&&b.call(void 0,d[e],e,a)){b=e;break a}b=-1}retur",
    "n 0>b?null:m(a)?a.charAt(b):a[b]}function va(a){return Array.prototype.",
    "concat.apply([],arguments)}\nfunction wa(a){var b=a.length;if(0<b){for(",
    "var c=Array(b),d=0;d<b;d++)c[d]=a[d];return c}return[]}function xa(a,b,",
    "c){return 2>=arguments.length?Array.prototype.slice.call(a,b):Array.pro",
    "totype.slice.call(a,b,c)};function x(a,b){this.x=l(a)?a:0;this.y=l(b)?b",
    ":0}h=x.prototype;h.clone=function(){return new x(this.x,this.y)};h.toSt",
    "ring=function(){return\"(\"+this.x+\", \"+this.y+\")\"};h.ceil=function",
    "(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);return this};h.flo",
    "or=function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);retur",
    "n this};h.round=function(){this.x=Math.round(this.x);this.y=Math.round(",
    "this.y);return this};\nh.translate=function(a,b){a instanceof x?(this.x",
    "+=a.x,this.y+=a.y):(this.x+=Number(a),n(b)&&(this.y+=b));return this};h",
    ".scale=function(a,b){b=n(b)?b:a;this.x*=a;this.y*=b;return this};functi",
    "on ya(a,b){this.width=a;this.height=b}h=ya.prototype;h.clone=function()",
    "{return new ya(this.width,this.height)};h.toString=function(){return\"(",
    "\"+this.width+\" x \"+this.height+\")\"};h.ceil=function(){this.width=M",
    "ath.ceil(this.width);this.height=Math.ceil(this.height);return this};h.",
    "floor=function(){this.width=Math.floor(this.width);this.height=Math.flo",
    "or(this.height);return this};h.round=function(){this.width=Math.round(t",
    "his.width);this.height=Math.round(this.height);return this};\nh.scale=f",
    "unction(a,b){b=n(b)?b:a;this.width*=a;this.height*=b;return this};funct",
    "ion y(a){return a?new za(z(a)):la||(la=new za)}function Aa(a,b,c){funct",
    "ion d(c){c&&b.appendChild(m(c)?a.createTextNode(c):c)}for(var e=1;e<c.l",
    "ength;e++){var f=c[e];!da(f)||ea(f)&&0<f.nodeType?d(f):w(Ba(f)?wa(f):f,",
    "d)}}function Ca(a){for(;a&&1!=a.nodeType;)a=a.previousSibling;return a}",
    "\nfunction Da(a,b){if(!a||!b)return!1;if(a.contains&&1==b.nodeType)retu",
    "rn a==b||a.contains(b);if(\"undefined\"!=typeof a.compareDocumentPositi",
    "on)return a==b||!!(a.compareDocumentPosition(b)&16);for(;b&&a!=b;)b=b.p",
    "arentNode;return b==a}\nfunction Ea(a,b){if(a==b)return 0;if(a.compareD",
    "ocumentPosition)return a.compareDocumentPosition(b)&2?1:-1;if(\"sourceI",
    "ndex\"in a||a.parentNode&&\"sourceIndex\"in a.parentNode){var c=1==a.no",
    "deType,d=1==b.nodeType;if(c&&d)return a.sourceIndex-b.sourceIndex;var e",
    "=a.parentNode,f=b.parentNode;return e==f?Fa(a,b):!c&&Da(e,b)?-1*Ha(a,b)",
    ":!d&&Da(f,a)?Ha(b,a):(c?a.sourceIndex:e.sourceIndex)-(d?b.sourceIndex:f",
    ".sourceIndex)}d=z(a);c=d.createRange();c.selectNode(a);c.collapse(!0);a",
    "=d.createRange();a.selectNode(b);\na.collapse(!0);return c.compareBound",
    "aryPoints(aa.Range.START_TO_END,a)}function Ha(a,b){var c=a.parentNode;",
    "if(c==b)return-1;for(;b.parentNode!=c;)b=b.parentNode;return Fa(b,a)}fu",
    "nction Fa(a,b){for(;b=b.previousSibling;)if(b==a)return-1;return 1}func",
    "tion z(a){return 9==a.nodeType?a:a.ownerDocument||a.document}function B",
    "a(a){if(a&&\"number\"==typeof a.length){if(ea(a))return\"function\"==ty",
    "peof a.item||\"string\"==typeof a.item;if(p(a))return\"function\"==type",
    "of a.item}return!1}\nfunction Ia(a,b){a&&(a=a.parentNode);for(var c=0;a",
    ";){if(b(a))return a;a=a.parentNode;c++}return null}function za(a){this.",
    "C=a||aa.document||document}h=za.prototype;h.getElementsByTagName=functi",
    "on(a,b){return(b||this.C).getElementsByTagName(String(a))};\nfunction B",
    "(a,b,c,d){a=d||a.C;var e=b&&\"*\"!=b?String(b).toUpperCase():\"\";if(a.",
    "querySelectorAll&&a.querySelector&&(e||c))c=a.querySelectorAll(e+(c?\".",
    "\"+c:\"\"));else if(c&&a.getElementsByClassName)if(d=a.getElementsByCla",
    "ssName(c),e){a={};for(var f=b=0,g;g=d[f];f++)e==g.nodeName&&(a[b++]=g);",
    "a.length=b;c=a}else c=d;else if(d=a.getElementsByTagName(e||\"*\"),c){a",
    "={};for(f=b=0;g=d[f];f++){var e=g.className,k;if(k=\"function\"==typeof",
    " e.split)k=0<=pa(e.split(/\\s+/),c);k&&(a[b++]=g)}a.length=b;c=a}else c",
    "=d;return c}\nh.createElement=function(a){return this.C.createElement(S",
    "tring(a))};h.createTextNode=function(a){return this.C.createTextNode(St",
    "ring(a))};h.appendChild=function(a,b){a.appendChild(b)};h.append=functi",
    "on(a,b){Aa(z(a),a,arguments)};h.canHaveChildren=function(a){if(1!=a.nod",
    "eType)return!1;switch(a.tagName){case \"APPLET\":case \"AREA\":case \"B",
    "ASE\":case \"BR\":case \"COL\":case \"COMMAND\":case \"EMBED\":case \"F",
    "RAME\":case \"HR\":case \"IMG\":case \"INPUT\":case \"IFRAME\":case \"I",
    "SINDEX\":case \"KEYGEN\":case \"LINK\":case \"NOFRAMES\":case \"NOSCRIP",
    "T\":case \"META\":case \"OBJECT\":case \"PARAM\":case \"SCRIPT\":case ",
    "\"SOURCE\":case \"STYLE\":case \"TRACK\":case \"WBR\":return!1}return!0",
    "};\nh.removeNode=function(a){return a&&a.parentNode?a.parentNode.remove",
    "Child(a):null};h.contains=Da;var Ja={K:function(a){return!(!a.querySele",
    "ctorAll||!a.querySelector)},A:function(a,b){if(!a)throw new t(32,\"No c",
    "lass name specified\");a=na(a);if(-1!==a.indexOf(\" \"))throw new t(32,",
    "\"Compound class names not permitted\");if(Ja.K(b))try{return b.querySe",
    "lector(\".\"+a.replace(/\\./g,\"\\\\.\"))||null}catch(c){throw new t(32",
    ",\"An invalid or illegal class name was specified\");}a=B(y(b),\"*\",a,",
    "b);return a.length?a[0]:null},l:function(a,b){if(!a)throw new t(32,\"No",
    " class name specified\");a=na(a);if(-1!==a.indexOf(\" \"))throw new t(3",
    "2,\n\"Compound class names not permitted\");if(Ja.K(b))try{return b.que",
    "rySelectorAll(\".\"+a.replace(/\\./g,\"\\\\.\"))}catch(c){throw new t(3",
    "2,\"An invalid or illegal class name was specified\");}return B(y(b),\"",
    "*\",a,b)}};var Ka={A:function(a,b){p(b.querySelector);if(!a)throw new t",
    "(32,\"No selector specified\");a=na(a);try{var c=b.querySelector(a)}cat",
    "ch(d){throw new t(32,\"An invalid or illegal selector was specified\");",
    "}return c&&1==c.nodeType?c:null},l:function(a,b){p(b.querySelectorAll);",
    "if(!a)throw new t(32,\"No selector specified\");a=na(a);try{return b.qu",
    "erySelectorAll(a)}catch(c){throw new t(32,\"An invalid or illegal selec",
    "tor was specified\");}}};var La={aliceblue:\"#f0f8ff\",antiquewhite:\"#",
    "faebd7\",aqua:\"#00ffff\",aquamarine:\"#7fffd4\",azure:\"#f0ffff\",beig",
    "e:\"#f5f5dc\",bisque:\"#ffe4c4\",black:\"#000000\",blanchedalmond:\"#ff",
    "ebcd\",blue:\"#0000ff\",blueviolet:\"#8a2be2\",brown:\"#a52a2a\",burlyw",
    "ood:\"#deb887\",cadetblue:\"#5f9ea0\",chartreuse:\"#7fff00\",chocolate:",
    "\"#d2691e\",coral:\"#ff7f50\",cornflowerblue:\"#6495ed\",cornsilk:\"#ff",
    "f8dc\",crimson:\"#dc143c\",cyan:\"#00ffff\",darkblue:\"#00008b\",darkcy",
    "an:\"#008b8b\",darkgoldenrod:\"#b8860b\",darkgray:\"#a9a9a9\",darkgreen",
    ":\"#006400\",\ndarkgrey:\"#a9a9a9\",darkkhaki:\"#bdb76b\",darkmagenta:",
    "\"#8b008b\",darkolivegreen:\"#556b2f\",darkorange:\"#ff8c00\",darkorchi",
    "d:\"#9932cc\",darkred:\"#8b0000\",darksalmon:\"#e9967a\",darkseagreen:",
    "\"#8fbc8f\",darkslateblue:\"#483d8b\",darkslategray:\"#2f4f4f\",darksla",
    "tegrey:\"#2f4f4f\",darkturquoise:\"#00ced1\",darkviolet:\"#9400d3\",dee",
    "ppink:\"#ff1493\",deepskyblue:\"#00bfff\",dimgray:\"#696969\",dimgrey:",
    "\"#696969\",dodgerblue:\"#1e90ff\",firebrick:\"#b22222\",floralwhite:\"",
    "#fffaf0\",forestgreen:\"#228b22\",fuchsia:\"#ff00ff\",gainsboro:\"#dcdc",
    "dc\",\nghostwhite:\"#f8f8ff\",gold:\"#ffd700\",goldenrod:\"#daa520\",gr",
    "ay:\"#808080\",green:\"#008000\",greenyellow:\"#adff2f\",grey:\"#808080",
    "\",honeydew:\"#f0fff0\",hotpink:\"#ff69b4\",indianred:\"#cd5c5c\",indig",
    "o:\"#4b0082\",ivory:\"#fffff0\",khaki:\"#f0e68c\",lavender:\"#e6e6fa\",",
    "lavenderblush:\"#fff0f5\",lawngreen:\"#7cfc00\",lemonchiffon:\"#fffacd",
    "\",lightblue:\"#add8e6\",lightcoral:\"#f08080\",lightcyan:\"#e0ffff\",l",
    "ightgoldenrodyellow:\"#fafad2\",lightgray:\"#d3d3d3\",lightgreen:\"#90e",
    "e90\",lightgrey:\"#d3d3d3\",lightpink:\"#ffb6c1\",lightsalmon:\"#ffa07a",
    "\",\nlightseagreen:\"#20b2aa\",lightskyblue:\"#87cefa\",lightslategray:",
    "\"#778899\",lightslategrey:\"#778899\",lightsteelblue:\"#b0c4de\",light",
    "yellow:\"#ffffe0\",lime:\"#00ff00\",limegreen:\"#32cd32\",linen:\"#faf0",
    "e6\",magenta:\"#ff00ff\",maroon:\"#800000\",mediumaquamarine:\"#66cdaa",
    "\",mediumblue:\"#0000cd\",mediumorchid:\"#ba55d3\",mediumpurple:\"#9370",
    "db\",mediumseagreen:\"#3cb371\",mediumslateblue:\"#7b68ee\",mediumsprin",
    "ggreen:\"#00fa9a\",mediumturquoise:\"#48d1cc\",mediumvioletred:\"#c7158",
    "5\",midnightblue:\"#191970\",mintcream:\"#f5fffa\",mistyrose:\"#ffe4e1",
    "\",\nmoccasin:\"#ffe4b5\",navajowhite:\"#ffdead\",navy:\"#000080\",oldl",
    "ace:\"#fdf5e6\",olive:\"#808000\",olivedrab:\"#6b8e23\",orange:\"#ffa50",
    "0\",orangered:\"#ff4500\",orchid:\"#da70d6\",palegoldenrod:\"#eee8aa\",",
    "palegreen:\"#98fb98\",paleturquoise:\"#afeeee\",palevioletred:\"#db7093",
    "\",papayawhip:\"#ffefd5\",peachpuff:\"#ffdab9\",peru:\"#cd853f\",pink:",
    "\"#ffc0cb\",plum:\"#dda0dd\",powderblue:\"#b0e0e6\",purple:\"#800080\",",
    "red:\"#ff0000\",rosybrown:\"#bc8f8f\",royalblue:\"#4169e1\",saddlebrown",
    ":\"#8b4513\",salmon:\"#fa8072\",sandybrown:\"#f4a460\",seagreen:\"#2e8b",
    "57\",\nseashell:\"#fff5ee\",sienna:\"#a0522d\",silver:\"#c0c0c0\",skybl",
    "ue:\"#87ceeb\",slateblue:\"#6a5acd\",slategray:\"#708090\",slategrey:\"",
    "#708090\",snow:\"#fffafa\",springgreen:\"#00ff7f\",steelblue:\"#4682b4",
    "\",tan:\"#d2b48c\",teal:\"#008080\",thistle:\"#d8bfd8\",tomato:\"#ff634",
    "7\",turquoise:\"#40e0d0\",violet:\"#ee82ee\",wheat:\"#f5deb3\",white:\"",
    "#ffffff\",whitesmoke:\"#f5f5f5\",yellow:\"#ffff00\",yellowgreen:\"#9acd",
    "32\"};var Ma=\"backgroundColor borderTopColor borderRightColor borderBo",
    "ttomColor borderLeftColor color outlineColor\".split(\" \"),Na=/#([0-9a",
    "-fA-F])([0-9a-fA-F])([0-9a-fA-F])/,Oa=/^#(?:[0-9a-f]{3}){1,2}$/i,Pa=/^(",
    "?:rgba)?\\((\\d{1,3}),\\s?(\\d{1,3}),\\s?(\\d{1,3}),\\s?(0|1|0\\.\\d*)",
    "\\)$/i,Qa=/^(?:rgb)?\\((0|[1-9]\\d{0,2}),\\s?(0|[1-9]\\d{0,2}),\\s?(0|[",
    "1-9]\\d{0,2})\\)$/i;function Ra(a,b){b=b.toLowerCase();return\"style\"=",
    "=b?Sa(a.style.cssText):(a=a.getAttributeNode(b))&&a.specified?a.value:n",
    "ull}var Ta=/[;]+(?=(?:(?:[^\"]*\"){2})*[^\"]*$)(?=(?:(?:[^']*'){2})*[^'",
    "]*$)(?=(?:[^()]*\\([^()]*\\))*[^()]*$)/;function Sa(a){var b=[];w(a.spl",
    "it(Ta),function(a){var c=a.indexOf(\":\");0<c&&(a=[a.slice(0,c),a.slice",
    "(c+1)],2==a.length&&b.push(a[0].toLowerCase(),\":\",a[1],\";\"))});b=b.",
    "join(\"\");return b=\";\"==b.charAt(b.length-1)?b:b+\";\"}\nfunction C(",
    "a,b){b&&\"string\"!==typeof b&&(b=b.toString());return!!a&&1==a.nodeTyp",
    "e&&(!b||a.tagName.toUpperCase()==b)};/*\n\n The MIT License\n\n Copyrig",
    "ht (c) 2007 Cybozu Labs, Inc.\n Copyright (c) 2012 Google Inc.\n\n Perm",
    "ission is hereby granted, free of charge, to any person obtaining a cop",
    "y\n of this software and associated documentation files (the \"Software",
    "\"), to\n deal in the Software without restriction, including without l",
    "imitation the\n rights to use, copy, modify, merge, publish, distribute",
    ", sublicense, and/or\n sell copies of the Software, and to permit perso",
    "ns to whom the Software is\n furnished to do so, subject to the followi",
    "ng conditions:\n\n The above copyright notice and this permission notic",
    "e shall be included in\n all copies or substantial portions of the Soft",
    "ware.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY K",
    "IND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES ",
    "OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEM",
    "ENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR",
    " ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTR",
    "ACT, TORT OR OTHERWISE, ARISING\n FROM, OUT OF OR IN CONNECTION WITH TH",
    "E SOFTWARE OR THE USE OR OTHER DEALINGS\n IN THE SOFTWARE.\n*/\nfunctio",
    "n Ua(a,b,c){this.m=a;this.ua=b||1;this.j=c||1};function Va(a){this.W=a;",
    "this.M=0}function Wa(a){a=a.match(Xa);for(var b=0;b<a.length;b++)Ya.tes",
    "t(a[b])&&a.splice(b,1);return new Va(a)}var Xa=/\\$?(?:(?![0-9-\\.])(?:",
    "\\*|[\\w-\\.]+):)?(?![0-9-\\.])(?:\\*|[\\w-\\.]+)|\\/\\/|\\.\\.|::|\\d+",
    "(?:\\.\\d*)?|\\.\\d+|\"[^\"]*\"|'[^']*'|[!<>]=|\\s+|./g,Ya=/^\\s/;funct",
    "ion E(a,b){return a.W[a.M+(b||0)]}Va.prototype.next=function(){return t",
    "his.W[this.M++]};Va.prototype.back=function(){this.M--};Va.prototype.em",
    "pty=function(){return this.W.length<=this.M};function F(a){var b=null,c",
    "=a.nodeType;1==c&&(b=a.textContent,b=void 0==b||null==b?a.innerText:b,b",
    "=void 0==b||null==b?\"\":b);if(\"string\"!=typeof b)if(9==c||1==c){a=9=",
    "=c?a.documentElement:a.firstChild;for(var c=0,d=[],b=\"\";a;){do 1!=a.n",
    "odeType&&(b+=a.nodeValue),d[c++]=a;while(a=a.firstChild);for(;c&&!(a=d[",
    "--c].nextSibling););}}else b=a.nodeValue;return\"\"+b}\nfunction Za(a,b",
    ",c){if(null===b)return!0;try{if(!a.getAttribute)return!1}catch(d){retur",
    "n!1}return null==c?!!a.getAttribute(b):a.getAttribute(b,2)==c}function ",
    "$a(a,b,c,d,e){return ab.call(null,a,b,m(c)?c:null,m(d)?d:null,e||new G)",
    "}\nfunction ab(a,b,c,d,e){b.getElementsByName&&d&&\"name\"==c?(b=b.getE",
    "lementsByName(d),w(b,function(b){a.matches(b)&&e.add(b)})):b.getElement",
    "sByClassName&&d&&\"class\"==c?(b=b.getElementsByClassName(d),w(b,functi",
    "on(b){b.className==d&&a.matches(b)&&e.add(b)})):a instanceof H?bb(a,b,c",
    ",d,e):b.getElementsByTagName&&(b=b.getElementsByTagName(a.getName()),w(",
    "b,function(a){Za(a,c,d)&&e.add(a)}));return e}\nfunction bb(a,b,c,d,e){",
    "for(b=b.firstChild;b;b=b.nextSibling)Za(b,c,d)&&a.matches(b)&&e.add(b),",
    "bb(a,b,c,d,e)};function G(){this.j=this.g=null;this.H=0}function cb(a){",
    "this.node=a;this.next=this.B=null}function db(a,b){if(!a.g)return b;if(",
    "!b.g)return a;var c=a.g;b=b.g;for(var d=null,e,f=0;c&&b;)c.node==b.node",
    "?(e=c,c=c.next,b=b.next):0<Ea(c.node,b.node)?(e=b,b=b.next):(e=c,c=c.ne",
    "xt),(e.B=d)?d.next=e:a.g=e,d=e,f++;for(e=c||b;e;)e.B=d,d=d.next=e,f++,e",
    "=e.next;a.j=d;a.H=f;return a}G.prototype.unshift=function(a){a=new cb(a",
    ");a.next=this.g;this.j?this.g.B=a:this.g=this.j=a;this.g=a;this.H++};\n",
    "G.prototype.add=function(a){a=new cb(a);a.B=this.j;this.g?this.j.next=a",
    ":this.g=this.j=a;this.j=a;this.H++};function eb(a){return(a=a.g)?a.node",
    ":null}G.prototype.s=function(){return this.H};function fb(a){return(a=e",
    "b(a))?F(a):\"\"}G.prototype.iterator=function(a){return new gb(this,!!a",
    ")};function gb(a,b){this.qa=a;this.Z=(this.D=b)?a.j:a.g;this.T=null}gb.",
    "prototype.next=function(){var a=this.Z;if(null==a)return null;var b=thi",
    "s.T=a;this.Z=this.D?a.B:a.next;return b.node};\ngb.prototype.remove=fun",
    "ction(){var a=this.qa,b=this.T;if(!b)throw Error(\"Next must be called ",
    "at least once before remove.\");var c=b.B,b=b.next;c?c.next=b:a.g=b;b?b",
    ".B=c:a.j=c;a.H--;this.T=null};function I(a){this.f=a;this.h=this.u=!1;t",
    "his.I=null}function J(a){return\"\\n  \"+a.toString().split(\"\\n\").jo",
    "in(\"\\n  \")}I.prototype.c=function(){return this.u};function hb(a,b){",
    "a.u=b}function ib(a,b){a.h=b}I.prototype.w=function(){return this.I};fu",
    "nction K(a,b){a=a.evaluate(b);return a instanceof G?+fb(a):+a}function ",
    "M(a,b){a=a.evaluate(b);return a instanceof G?fb(a):\"\"+a}function jb(a",
    ",b){a=a.evaluate(b);return a instanceof G?!!a.s():!!a};function kb(a,b,",
    "c){I.call(this,a.f);this.V=a;this.ca=b;this.ia=c;this.u=b.c()||c.c();th",
    "is.h=b.h||c.h;this.V==lb&&(c.h||c.c()||4==c.f||0==c.f||!b.w()?b.h||b.c(",
    ")||4==b.f||0==b.f||!c.w()||(this.I={name:c.w().name,G:b}):this.I={name:",
    "b.w().name,G:c})}r(kb,I);\nfunction mb(a,b,c,d,e){b=b.evaluate(d);c=c.e",
    "valuate(d);var f;if(b instanceof G&&c instanceof G){b=b.iterator();for(",
    "d=b.next();d;d=b.next())for(e=c.iterator(),f=e.next();f;f=e.next())if(a",
    "(F(d),F(f)))return!0;return!1}if(b instanceof G||c instanceof G){b inst",
    "anceof G?(e=b,d=c):(e=c,d=b);f=e.iterator();for(var g=typeof d,k=f.next",
    "();k;k=f.next()){switch(g){case \"number\":k=+F(k);break;case \"boolean",
    "\":k=!!F(k);break;case \"string\":k=F(k);break;default:throw Error(\"Il",
    "legal primitive type for comparison.\");\n}if(e==b&&a(k,d)||e==c&&a(d,k",
    "))return!0}return!1}return e?\"boolean\"==typeof b||\"boolean\"==typeof",
    " c?a(!!b,!!c):\"number\"==typeof b||\"number\"==typeof c?a(+b,+c):a(b,c",
    "):a(+b,+c)}kb.prototype.evaluate=function(a){return this.V.o(this.ca,th",
    "is.ia,a)};kb.prototype.toString=function(){var a=\"Binary Expression: ",
    "\"+this.V,a=a+J(this.ca);return a+=J(this.ia)};function nb(a,b,c,d){thi",
    "s.ta=a;this.ga=b;this.f=c;this.o=d}nb.prototype.toString=function(){ret",
    "urn this.ta};var ob={};\nfunction N(a,b,c,d){if(ob.hasOwnProperty(a))th",
    "row Error(\"Binary operator already created: \"+a);a=new nb(a,b,c,d);re",
    "turn ob[a.toString()]=a}N(\"div\",6,1,function(a,b,c){return K(a,c)/K(b",
    ",c)});N(\"mod\",6,1,function(a,b,c){return K(a,c)%K(b,c)});N(\"*\",6,1,",
    "function(a,b,c){return K(a,c)*K(b,c)});N(\"+\",5,1,function(a,b,c){retu",
    "rn K(a,c)+K(b,c)});N(\"-\",5,1,function(a,b,c){return K(a,c)-K(b,c)});N",
    "(\"<\",4,2,function(a,b,c){return mb(function(a,b){return a<b},a,b,c)})",
    ";\nN(\">\",4,2,function(a,b,c){return mb(function(a,b){return a>b},a,b,",
    "c)});N(\"<=\",4,2,function(a,b,c){return mb(function(a,b){return a<=b},",
    "a,b,c)});N(\">=\",4,2,function(a,b,c){return mb(function(a,b){return a>",
    "=b},a,b,c)});var lb=N(\"=\",3,2,function(a,b,c){return mb(function(a,b)",
    "{return a==b},a,b,c,!0)});N(\"!=\",3,2,function(a,b,c){return mb(functi",
    "on(a,b){return a!=b},a,b,c,!0)});N(\"and\",2,2,function(a,b,c){return j",
    "b(a,c)&&jb(b,c)});N(\"or\",1,2,function(a,b,c){return jb(a,c)||jb(b,c)}",
    ");function pb(a,b){if(b.s()&&4!=a.f)throw Error(\"Primary expression mu",
    "st evaluate to nodeset if filter has predicate(s).\");I.call(this,a.f);",
    "this.ha=a;this.b=b;this.u=a.c();this.h=a.h}r(pb,I);pb.prototype.evaluat",
    "e=function(a){a=this.ha.evaluate(a);return qb(this.b,a)};pb.prototype.t",
    "oString=function(){var a=\"Filter:\"+J(this.ha);return a+=J(this.b)};fu",
    "nction rb(a,b){if(b.length<a.fa)throw Error(\"Function \"+a.i+\" expect",
    "s at least\"+a.fa+\" arguments, \"+b.length+\" given\");if(null!==a.U&&",
    "b.length>a.U)throw Error(\"Function \"+a.i+\" expects at most \"+a.U+\"",
    " arguments, \"+b.length+\" given\");a.ra&&w(b,function(b,d){if(4!=b.f)t",
    "hrow Error(\"Argument \"+d+\" to function \"+a.i+\" is not of type Node",
    "set: \"+b);});I.call(this,a.f);this.L=a;this.R=b;hb(this,a.u||sa(b,func",
    "tion(a){return a.c()}));ib(this,a.pa&&!b.length||a.oa&&!!b.length||sa(b",
    ",function(a){return a.h}))}\nr(rb,I);rb.prototype.evaluate=function(a){",
    "return this.L.o.apply(null,va(a,this.R))};rb.prototype.toString=functio",
    "n(){var a=\"Function: \"+this.L;if(this.R.length)var b=ra(this.R,functi",
    "on(a,b){return a+J(b)},\"Arguments:\"),a=a+J(b);return a};function sb(a",
    ",b,c,d,e,f,g,k,u){this.i=a;this.f=b;this.u=c;this.pa=d;this.oa=e;this.o",
    "=f;this.fa=g;this.U=l(k)?k:g;this.ra=!!u}sb.prototype.toString=function",
    "(){return this.i};var tb={};\nfunction O(a,b,c,d,e,f,g,k){if(tb.hasOwnP",
    "roperty(a))throw Error(\"Function already created: \"+a+\".\");tb[a]=ne",
    "w sb(a,b,c,d,!1,e,f,g,k)}O(\"boolean\",2,!1,!1,function(a,b){return jb(",
    "b,a)},1);O(\"ceiling\",1,!1,!1,function(a,b){return Math.ceil(K(b,a))},",
    "1);O(\"concat\",3,!1,!1,function(a,b){return ra(xa(arguments,1),functio",
    "n(b,d){return b+M(d,a)},\"\")},2,null);O(\"contains\",2,!1,!1,function(",
    "a,b,c){b=M(b,a);a=M(c,a);return-1!=b.indexOf(a)},2);O(\"count\",1,!1,!1",
    ",function(a,b){return b.evaluate(a).s()},1,1,!0);\nO(\"false\",2,!1,!1,",
    "function(){return!1},0);O(\"floor\",1,!1,!1,function(a,b){return Math.f",
    "loor(K(b,a))},1);O(\"id\",4,!1,!1,function(a,b){var c=a.m,d=9==c.nodeTy",
    "pe?c:c.ownerDocument;a=M(b,a).split(/\\s+/);var e=[];w(a,function(a){a=",
    "d.getElementById(a);!a||0<=pa(e,a)||e.push(a)});e.sort(Ea);var f=new G;",
    "w(e,function(a){f.add(a)});return f},1);O(\"lang\",2,!1,!1,function(){r",
    "eturn!1},1);O(\"last\",1,!0,!1,function(a){if(1!=arguments.length)throw",
    " Error(\"Function last expects ()\");return a.j},0);\nO(\"local-name\",",
    "3,!1,!0,function(a,b){return(a=b?eb(b.evaluate(a)):a.m)?a.localName||a.",
    "nodeName.toLowerCase():\"\"},0,1,!0);O(\"name\",3,!1,!0,function(a,b){r",
    "eturn(a=b?eb(b.evaluate(a)):a.m)?a.nodeName.toLowerCase():\"\"},0,1,!0)",
    ";O(\"namespace-uri\",3,!0,!1,function(){return\"\"},0,1,!0);O(\"normali",
    "ze-space\",3,!1,!0,function(a,b){return(b?M(b,a):F(a.m)).replace(/[\\s",
    "\\xa0]+/g,\" \").replace(/^\\s+|\\s+$/g,\"\")},0,1);O(\"not\",2,!1,!1,f",
    "unction(a,b){return!jb(b,a)},1);\nO(\"number\",1,!1,!0,function(a,b){re",
    "turn b?K(b,a):+F(a.m)},0,1);O(\"position\",1,!0,!1,function(a){return a",
    ".ua},0);O(\"round\",1,!1,!1,function(a,b){return Math.round(K(b,a))},1)",
    ";O(\"starts-with\",2,!1,!1,function(a,b,c){b=M(b,a);a=M(c,a);return 0==",
    "b.lastIndexOf(a,0)},2);O(\"string\",3,!1,!0,function(a,b){return b?M(b,",
    "a):F(a.m)},0,1);O(\"string-length\",1,!1,!0,function(a,b){return(b?M(b,",
    "a):F(a.m)).length},0,1);\nO(\"substring\",3,!1,!1,function(a,b,c,d){c=K",
    "(c,a);if(isNaN(c)||Infinity==c||-Infinity==c)return\"\";d=d?K(d,a):Infi",
    "nity;if(isNaN(d)||-Infinity===d)return\"\";c=Math.round(c)-1;var e=Math",
    ".max(c,0);a=M(b,a);return Infinity==d?a.substring(e):a.substring(e,c+Ma",
    "th.round(d))},2,3);O(\"substring-after\",3,!1,!1,function(a,b,c){b=M(b,",
    "a);a=M(c,a);c=b.indexOf(a);return-1==c?\"\":b.substring(c+a.length)},2)",
    ";\nO(\"substring-before\",3,!1,!1,function(a,b,c){b=M(b,a);a=M(c,a);a=b",
    ".indexOf(a);return-1==a?\"\":b.substring(0,a)},2);O(\"sum\",1,!1,!1,fun",
    "ction(a,b){a=b.evaluate(a).iterator();b=0;for(var c=a.next();c;c=a.next",
    "())b+=+F(c);return b},1,1,!0);O(\"translate\",3,!1,!1,function(a,b,c,d)",
    "{b=M(b,a);c=M(c,a);var e=M(d,a);d={};for(var f=0;f<c.length;f++)a=c.cha",
    "rAt(f),a in d||(d[a]=e.charAt(f));c=\"\";for(f=0;f<b.length;f++)a=b.cha",
    "rAt(f),c+=a in d?d[a]:a;return c},3);O(\"true\",2,!1,!1,function(){retu",
    "rn!0},0);function H(a,b){this.la=a;this.da=l(b)?b:null;this.F=null;swit",
    "ch(a){case \"comment\":this.F=8;break;case \"text\":this.F=3;break;case",
    " \"processing-instruction\":this.F=7;break;case \"node\":break;default:",
    "throw Error(\"Unexpected argument\");}}function ub(a){return\"comment\"",
    "==a||\"text\"==a||\"processing-instruction\"==a||\"node\"==a}H.prototyp",
    "e.matches=function(a){return null===this.F||this.F==a.nodeType};H.proto",
    "type.getName=function(){return this.la};\nH.prototype.toString=function",
    "(){var a=\"Kind Test: \"+this.la;null===this.da||(a+=J(this.da));return",
    " a};function vb(a){I.call(this,3);this.ka=a.substring(1,a.length-1)}r(v",
    "b,I);vb.prototype.evaluate=function(){return this.ka};vb.prototype.toSt",
    "ring=function(){return\"Literal: \"+this.ka};function wb(a,b){this.i=a.",
    "toLowerCase();a=\"*\"==this.i?\"*\":\"http://www.w3.org/1999/xhtml\";th",
    "is.N=b?b.toLowerCase():a}wb.prototype.matches=function(a){var b=a.nodeT",
    "ype;if(1!=b&&2!=b)return!1;b=l(a.localName)?a.localName:a.nodeName;retu",
    "rn\"*\"!=this.i&&this.i!=b.toLowerCase()?!1:\"*\"==this.N?!0:this.N==(a",
    ".namespaceURI?a.namespaceURI.toLowerCase():\"http://www.w3.org/1999/xht",
    "ml\")};wb.prototype.getName=function(){return this.i};\nwb.prototype.to",
    "String=function(){return\"Name Test: \"+(\"http://www.w3.org/1999/xhtml",
    "\"==this.N?\"\":this.N+\":\")+this.i};function xb(a){I.call(this,1);thi",
    "s.ma=a}r(xb,I);xb.prototype.evaluate=function(){return this.ma};xb.prot",
    "otype.toString=function(){return\"Number: \"+this.ma};function yb(a,b){",
    "I.call(this,a.f);this.aa=a;this.J=b;this.u=a.c();this.h=a.h;1==this.J.l",
    "ength&&(a=this.J[0],a.S||a.v!=zb||(a=a.P,\"*\"!=a.getName()&&(this.I={n",
    "ame:a.getName(),G:null})))}r(yb,I);function Ab(){I.call(this,4)}r(Ab,I)",
    ";Ab.prototype.evaluate=function(a){var b=new G;a=a.m;9==a.nodeType?b.ad",
    "d(a):b.add(a.ownerDocument);return b};Ab.prototype.toString=function(){",
    "return\"Root Helper Expression\"};function Bb(){I.call(this,4)}r(Bb,I);",
    "Bb.prototype.evaluate=function(a){var b=new G;b.add(a.m);return b};\nBb",
    ".prototype.toString=function(){return\"Context Helper Expression\"};fun",
    "ction Cb(a){return\"/\"==a||\"//\"==a}\nyb.prototype.evaluate=function(",
    "a){var b=this.aa.evaluate(a);if(!(b instanceof G))throw Error(\"Filter ",
    "expression must evaluate to nodeset.\");a=this.J;for(var c=0,d=a.length",
    ";c<d&&b.s();c++){var e=a[c],f=b.iterator(e.v.D);if(e.c()||e.v!=Db)if(e.",
    "c()||e.v!=Eb){var g=f.next();for(b=e.evaluate(new Ua(g));null!=(g=f.nex",
    "t());)g=e.evaluate(new Ua(g)),b=db(b,g)}else g=f.next(),b=e.evaluate(ne",
    "w Ua(g));else{for(g=f.next();(b=f.next())&&(!g.contains||g.contains(b))",
    "&&b.compareDocumentPosition(g)&8;g=b);b=e.evaluate(new Ua(g))}}return b",
    "};\nyb.prototype.toString=function(){var a=\"Path Expression:\"+J(this.",
    "aa);if(this.J.length){var b=ra(this.J,function(a,b){return a+J(b)},\"St",
    "eps:\");a+=J(b)}return a};function P(a,b){this.b=a;this.D=!!b}function ",
    "qb(a,b,c){for(c=c||0;c<a.b.length;c++)for(var d=a.b[c],e=b.iterator(),f",
    "=b.s(),g,k=0;g=e.next();k++){var u=a.D?f-k:k+1;g=d.evaluate(new Ua(g,u,",
    "f));if(\"number\"==typeof g)u=u==g;else if(\"string\"==typeof g||\"bool",
    "ean\"==typeof g)u=!!g;else if(g instanceof G)u=0<g.s();else throw Error",
    "(\"Predicate.evaluate returned an unexpected type.\");u||e.remove()}ret",
    "urn b}P.prototype.w=function(){return 0<this.b.length?this.b[0].w():nul",
    "l};\nP.prototype.c=function(){for(var a=0;a<this.b.length;a++){var b=th",
    "is.b[a];if(b.c()||1==b.f||0==b.f)return!0}return!1};P.prototype.s=funct",
    "ion(){return this.b.length};P.prototype.toString=function(){return ra(t",
    "his.b,function(a,b){return a+J(b)},\"Predicates:\")};function Q(a,b,c,d",
    "){I.call(this,4);this.v=a;this.P=b;this.b=c||new P([]);this.S=!!d;b=thi",
    "s.b.w();a.va&&b&&(this.I={name:b.name,G:b.G});this.u=this.b.c()}r(Q,I);",
    "\nQ.prototype.evaluate=function(a){var b=a.m,c=this.w(),d=null,e=null,f",
    "=0;c&&(d=c.name,e=c.G?M(c.G,a):null,f=1);if(this.S)if(this.c()||this.v!",
    "=Fb)if(b=(new Q(Gb,new H(\"node\"))).evaluate(a).iterator(),c=b.next())",
    "for(a=this.o(c,d,e,f);null!=(c=b.next());)a=db(a,this.o(c,d,e,f));else ",
    "a=new G;else a=$a(this.P,b,d,e),a=qb(this.b,a,f);else a=this.o(a.m,d,e,",
    "f);return a};Q.prototype.o=function(a,b,c,d){a=this.v.L(this.P,a,b,c);r",
    "eturn a=qb(this.b,a,d)};\nQ.prototype.toString=function(){var a=\"Step:",
    "\"+J(\"Operator: \"+(this.S?\"//\":\"/\"));this.v.i&&(a+=J(\"Axis: \"+t",
    "his.v));a+=J(this.P);if(this.b.s()){var b=ra(this.b.b,function(a,b){ret",
    "urn a+J(b)},\"Predicates:\");a+=J(b)}return a};function Hb(a,b,c,d){thi",
    "s.i=a;this.L=b;this.D=c;this.va=d}Hb.prototype.toString=function(){retu",
    "rn this.i};var Ib={};function R(a,b,c,d){if(Ib.hasOwnProperty(a))throw ",
    "Error(\"Axis already created: \"+a);b=new Hb(a,b,c,!!d);return Ib[a]=b}",
    "\nR(\"ancestor\",function(a,b){for(var c=new G;b=b.parentNode;)a.matche",
    "s(b)&&c.unshift(b);return c},!0);R(\"ancestor-or-self\",function(a,b){v",
    "ar c=new G;do a.matches(b)&&c.unshift(b);while(b=b.parentNode);return c",
    "},!0);\nvar zb=R(\"attribute\",function(a,b){var c=new G,d=a.getName();",
    "if(b=b.attributes)if(a instanceof H&&null===a.F||\"*\"==d)for(d=0;a=b[d",
    "];d++)c.add(a);else(a=b.getNamedItem(d))&&c.add(a);return c},!1),Fb=R(",
    "\"child\",function(a,b,c,d,e){c=m(c)?c:null;d=m(d)?d:null;e=e||new G;fo",
    "r(b=b.firstChild;b;b=b.nextSibling)Za(b,c,d)&&a.matches(b)&&e.add(b);re",
    "turn e},!1,!0);R(\"descendant\",$a,!1,!0);\nvar Gb=R(\"descendant-or-se",
    "lf\",function(a,b,c,d){var e=new G;Za(b,c,d)&&a.matches(b)&&e.add(b);re",
    "turn $a(a,b,c,d,e)},!1,!0),Db=R(\"following\",function(a,b,c,d){var e=n",
    "ew G;do for(var f=b;f=f.nextSibling;)Za(f,c,d)&&a.matches(f)&&e.add(f),",
    "e=$a(a,f,c,d,e);while(b=b.parentNode);return e},!1,!0);R(\"following-si",
    "bling\",function(a,b){for(var c=new G;b=b.nextSibling;)a.matches(b)&&c.",
    "add(b);return c},!1);R(\"namespace\",function(){return new G},!1);\nvar",
    " Jb=R(\"parent\",function(a,b){var c=new G;if(9==b.nodeType)return c;if",
    "(2==b.nodeType)return c.add(b.ownerElement),c;b=b.parentNode;a.matches(",
    "b)&&c.add(b);return c},!1),Eb=R(\"preceding\",function(a,b,c,d){var e=n",
    "ew G,f=[];do f.unshift(b);while(b=b.parentNode);for(var g=1,k=f.length;",
    "g<k;g++){var u=[];for(b=f[g];b=b.previousSibling;)u.unshift(b);for(var ",
    "D=0,q=u.length;D<q;D++)b=u[D],Za(b,c,d)&&a.matches(b)&&e.add(b),e=$a(a,",
    "b,c,d,e)}return e},!0,!0);\nR(\"preceding-sibling\",function(a,b){for(v",
    "ar c=new G;b=b.previousSibling;)a.matches(b)&&c.unshift(b);return c},!0",
    ");var Kb=R(\"self\",function(a,b){var c=new G;a.matches(b)&&c.add(b);re",
    "turn c},!1);function Lb(a){I.call(this,1);this.$=a;this.u=a.c();this.h=",
    "a.h}r(Lb,I);Lb.prototype.evaluate=function(a){return-K(this.$,a)};Lb.pr",
    "ototype.toString=function(){return\"Unary Expression: -\"+J(this.$)};fu",
    "nction Mb(a){I.call(this,4);this.O=a;hb(this,sa(this.O,function(a){retu",
    "rn a.c()}));ib(this,sa(this.O,function(a){return a.h}))}r(Mb,I);Mb.prot",
    "otype.evaluate=function(a){var b=new G;w(this.O,function(c){c=c.evaluat",
    "e(a);if(!(c instanceof G))throw Error(\"Path expression must evaluate t",
    "o NodeSet.\");b=db(b,c)});return b};Mb.prototype.toString=function(){re",
    "turn ra(this.O,function(a,b){return a+J(b)},\"Union Expression:\")};fun",
    "ction Nb(a,b){this.a=a;this.sa=b}function Ob(a){for(var b,c=[];;){S(a,",
    "\"Missing right hand side of binary expression.\");b=Pb(a);var d=a.a.ne",
    "xt();if(!d)break;var e=(d=ob[d]||null)&&d.ga;if(!e){a.a.back();break}fo",
    "r(;c.length&&e<=c[c.length-1].ga;)b=new kb(c.pop(),c.pop(),b);c.push(b,",
    "d)}for(;c.length;)b=new kb(c.pop(),c.pop(),b);return b}function S(a,b){",
    "if(a.a.empty())throw Error(b);}function Qb(a,b){a=a.a.next();if(a!=b)th",
    "row Error(\"Bad token, expected: \"+b+\" got: \"+a);}\nfunction Rb(a){a",
    "=a.a.next();if(\")\"!=a)throw Error(\"Bad token: \"+a);}function Sb(a){",
    "a=a.a.next();if(2>a.length)throw Error(\"Unclosed literal string\");ret",
    "urn new vb(a)}\nfunction Tb(a){var b=[];if(Cb(E(a.a))){var c=a.a.next()",
    ";var d=E(a.a);if(\"/\"==c&&(a.a.empty()||\".\"!=d&&\"..\"!=d&&\"@\"!=d&",
    "&\"*\"!=d&&!/(?![0-9])[\\w]/.test(d)))return new Ab;d=new Ab;S(a,\"Miss",
    "ing next location step.\");c=Ub(a,c);b.push(c)}else{a:{c=E(a.a);d=c.cha",
    "rAt(0);switch(d){case \"$\":throw Error(\"Variable reference not allowe",
    "d in HTML XPath\");case \"(\":a.a.next();c=Ob(a);S(a,'unclosed \"(\"');",
    "Qb(a,\")\");break;case '\"':case \"'\":c=Sb(a);break;default:if(isNaN(+",
    "c))if(!ub(c)&&/(?![0-9])[\\w]/.test(d)&&\"(\"==E(a.a,\n1)){c=a.a.next()",
    ";c=tb[c]||null;a.a.next();for(d=[];\")\"!=E(a.a);){S(a,\"Missing functi",
    "on argument list.\");d.push(Ob(a));if(\",\"!=E(a.a))break;a.a.next()}S(",
    "a,\"Unclosed function argument list.\");Rb(a);c=new rb(c,d)}else{c=null",
    ";break a}else c=new xb(+a.a.next())}\"[\"==E(a.a)&&(d=new P(Vb(a)),c=ne",
    "w pb(c,d))}if(c)if(Cb(E(a.a)))d=c;else return c;else c=Ub(a,\"/\"),d=ne",
    "w Bb,b.push(c)}for(;Cb(E(a.a));)c=a.a.next(),S(a,\"Missing next locatio",
    "n step.\"),c=Ub(a,c),b.push(c);return new yb(d,b)}\nfunction Ub(a,b){if",
    "(\"/\"!=b&&\"//\"!=b)throw Error('Step op should be \"/\" or \"//\"');i",
    "f(\".\"==E(a.a)){var c=new Q(Kb,new H(\"node\"));a.a.next();return c}if",
    "(\"..\"==E(a.a))return c=new Q(Jb,new H(\"node\")),a.a.next(),c;if(\"@",
    "\"==E(a.a)){var d=zb;a.a.next();S(a,\"Missing attribute name\")}else if",
    "(\"::\"==E(a.a,1)){if(!/(?![0-9])[\\w]/.test(E(a.a).charAt(0)))throw Er",
    "ror(\"Bad token: \"+a.a.next());var e=a.a.next();d=Ib[e]||null;if(!d)th",
    "row Error(\"No axis with name: \"+e);a.a.next();S(a,\"Missing node name",
    "\")}else d=Fb;e=\nE(a.a);if(/(?![0-9])[\\w\\*]/.test(e.charAt(0)))if(\"",
    "(\"==E(a.a,1)){if(!ub(e))throw Error(\"Invalid node type: \"+e);e=a.a.n",
    "ext();if(!ub(e))throw Error(\"Invalid type name: \"+e);Qb(a,\"(\");S(a,",
    "\"Bad nodetype\");var f=E(a.a).charAt(0),g=null;if('\"'==f||\"'\"==f)g=",
    "Sb(a);S(a,\"Bad nodetype\");Rb(a);e=new H(e,g)}else if(e=a.a.next(),f=e",
    ".indexOf(\":\"),-1==f)e=new wb(e);else{var g=e.substring(0,f);if(\"*\"=",
    "=g)var k=\"*\";else if(k=a.sa(g),!k)throw Error(\"Namespace prefix not ",
    "declared: \"+g);e=e.substr(f+1);e=new wb(e,k)}else throw Error(\"Bad to",
    "ken: \"+\na.a.next());a=new P(Vb(a),d.D);return c||new Q(d,e,a,\"//\"==",
    "b)}function Vb(a){for(var b=[];\"[\"==E(a.a);){a.a.next();S(a,\"Missing",
    " predicate expression.\");var c=Ob(a);b.push(c);S(a,\"Unclosed predicat",
    "e expression.\");Qb(a,\"]\")}return b}function Pb(a){if(\"-\"==E(a.a))r",
    "eturn a.a.next(),new Lb(Pb(a));var b=Tb(a);if(\"|\"!=E(a.a))a=b;else{fo",
    "r(b=[b];\"|\"==a.a.next();)S(a,\"Missing next union location path.\"),b",
    ".push(Tb(a));a.a.back();a=new Mb(b)}return a};function Wb(a){switch(a.n",
    "odeType){case 1:return ia(Xb,a);case 9:return Wb(a.documentElement);cas",
    "e 11:case 10:case 6:case 12:return Yb;default:return a.parentNode?Wb(a.",
    "parentNode):Yb}}function Yb(){return null}function Xb(a,b){if(a.prefix=",
    "=b)return a.namespaceURI||\"http://www.w3.org/1999/xhtml\";var c=a.getA",
    "ttributeNode(\"xmlns:\"+b);return c&&c.specified?c.value||null:a.parent",
    "Node&&9!=a.parentNode.nodeType?Xb(a.parentNode,b):null};function Zb(a,b",
    "){if(!a.length)throw Error(\"Empty XPath expression.\");a=Wa(a);if(a.em",
    "pty())throw Error(\"Invalid XPath expression.\");b?p(b)||(b=ha(b.lookup",
    "NamespaceURI,b)):b=function(){return null};var c=Ob(new Nb(a,b));if(!a.",
    "empty())throw Error(\"Bad token: \"+a.next());this.evaluate=function(a,",
    "b){a=c.evaluate(new Ua(a));return new T(a,b)}}\nfunction T(a,b){if(0==b",
    ")if(a instanceof G)b=4;else if(\"string\"==typeof a)b=2;else if(\"numbe",
    "r\"==typeof a)b=1;else if(\"boolean\"==typeof a)b=3;else throw Error(\"",
    "Unexpected evaluation result.\");if(2!=b&&1!=b&&3!=b&&!(a instanceof G)",
    ")throw Error(\"value could not be converted to the specified type\");th",
    "is.resultType=b;switch(b){case 2:this.stringValue=a instanceof G?fb(a):",
    "\"\"+a;break;case 1:this.numberValue=a instanceof G?+fb(a):+a;break;cas",
    "e 3:this.booleanValue=a instanceof G?0<a.s():!!a;break;case 4:case 5:ca",
    "se 6:case 7:var c=\na.iterator();var d=[];for(var e=c.next();e;e=c.next",
    "())d.push(e);this.snapshotLength=a.s();this.invalidIteratorState=!1;bre",
    "ak;case 8:case 9:this.singleNodeValue=eb(a);break;default:throw Error(",
    "\"Unknown XPathResult type.\");}var f=0;this.iterateNext=function(){if(",
    "4!=b&&5!=b)throw Error(\"iterateNext called with wrong result type\");r",
    "eturn f>=d.length?null:d[f++]};this.snapshotItem=function(a){if(6!=b&&7",
    "!=b)throw Error(\"snapshotItem called with wrong result type\");return ",
    "a>=d.length||0>a?null:d[a]}}\nT.ANY_TYPE=0;T.NUMBER_TYPE=1;T.STRING_TYP",
    "E=2;T.BOOLEAN_TYPE=3;T.UNORDERED_NODE_ITERATOR_TYPE=4;T.ORDERED_NODE_IT",
    "ERATOR_TYPE=5;T.UNORDERED_NODE_SNAPSHOT_TYPE=6;T.ORDERED_NODE_SNAPSHOT_",
    "TYPE=7;T.ANY_UNORDERED_NODE_TYPE=8;T.FIRST_ORDERED_NODE_TYPE=9;function",
    " $b(a){this.lookupNamespaceURI=Wb(a)}\nba(\"wgxpath.install\",function(",
    "a,b){a=a||aa;var c=a.Document&&a.Document.prototype||a.document;if(!c.e",
    "valuate||b)a.XPathResult=T,c.evaluate=function(a,b,c,g){return(new Zb(a",
    ",c)).evaluate(b,g)},c.createExpression=function(a,b){return new Zb(a,b)",
    "},c.createNSResolver=function(a){return new $b(a)}});var U={};U.X=funct",
    "ion(){var a={ya:\"http://www.w3.org/2000/svg\"};return function(b){retu",
    "rn a[b]||null}}();\nU.o=function(a,b,c){var d=z(a);if(!d.documentElemen",
    "t)return null;try{for(var e=d.createNSResolver?d.createNSResolver(d.doc",
    "umentElement):U.X,f={},g=d.getElementsByTagName(\"*\"),k=0;k<g.length;+",
    "+k){var u=g[k],D=u.namespaceURI;if(D&&!f[D]){var q=u.lookupPrefix(D);if",
    "(!q)var A=D.match(\".*/(\\\\w+)/?$\"),q=A?A[1]:\"xhtml\";f[D]=q}}var L=",
    "{},W;for(W in f)L[f[W]]=W;e=function(a){return L[a]||null};try{return d",
    ".evaluate(b,a,e,c,null)}catch(Ga){if(\"TypeError\"===Ga.name)return e=d",
    ".createNSResolver?d.createNSResolver(d.documentElement):\nU.X,d.evaluat",
    "e(b,a,e,c,null);throw Ga;}}catch(Ga){throw new t(32,\"Unable to locate ",
    "an element with the xpath expression \"+b+\" because of the following e",
    "rror:\\n\"+Ga);}};U.Y=function(a,b){if(!a||1!=a.nodeType)throw new t(32",
    ",'The result of the xpath expression \"'+b+'\" is: '+a+\". It should be",
    " an element.\");};\nU.A=function(a,b){var c=function(){var c=U.o(b,a,9)",
    ";return c?c.singleNodeValue||null:b.selectSingleNode?(c=z(b),c.setPrope",
    "rty&&c.setProperty(\"SelectionLanguage\",\"XPath\"),b.selectSingleNode(",
    "a)):null}();null===c||U.Y(c,a);return c};\nU.l=function(a,b){var c=func",
    "tion(){var c=U.o(b,a,7);if(c){for(var e=c.snapshotLength,f=[],g=0;g<e;+",
    "+g)f.push(c.snapshotItem(g));return f}return b.selectNodes?(c=z(b),c.se",
    "tProperty&&c.setProperty(\"SelectionLanguage\",\"XPath\"),b.selectNodes",
    "(a)):[]}();w(c,function(b){U.Y(b,a)});return c};function ac(a,b,c,d){th",
    "is.top=a;this.right=b;this.bottom=c;this.left=d}h=ac.prototype;h.clone=",
    "function(){return new ac(this.top,this.right,this.bottom,this.left)};h.",
    "toString=function(){return\"(\"+this.top+\"t, \"+this.right+\"r, \"+thi",
    "s.bottom+\"b, \"+this.left+\"l)\"};h.contains=function(a){return this&&",
    "a?a instanceof ac?a.left>=this.left&&a.right<=this.right&&a.top>=this.t",
    "op&&a.bottom<=this.bottom:a.x>=this.left&&a.x<=this.right&&a.y>=this.to",
    "p&&a.y<=this.bottom:!1};\nh.expand=function(a,b,c,d){ea(a)?(this.top-=a",
    ".top,this.right+=a.right,this.bottom+=a.bottom,this.left-=a.left):(this",
    ".top-=a,this.right+=Number(b),this.bottom+=Number(c),this.left-=Number(",
    "d));return this};h.ceil=function(){this.top=Math.ceil(this.top);this.ri",
    "ght=Math.ceil(this.right);this.bottom=Math.ceil(this.bottom);this.left=",
    "Math.ceil(this.left);return this};\nh.floor=function(){this.top=Math.fl",
    "oor(this.top);this.right=Math.floor(this.right);this.bottom=Math.floor(",
    "this.bottom);this.left=Math.floor(this.left);return this};h.round=funct",
    "ion(){this.top=Math.round(this.top);this.right=Math.round(this.right);t",
    "his.bottom=Math.round(this.bottom);this.left=Math.round(this.left);retu",
    "rn this};h.translate=function(a,b){a instanceof x?(this.left+=a.x,this.",
    "right+=a.x,this.top+=a.y,this.bottom+=a.y):(this.left+=a,this.right+=a,",
    "n(b)&&(this.top+=b,this.bottom+=b));return this};\nh.scale=function(a,b",
    "){b=n(b)?b:a;this.left*=a;this.right*=a;this.top*=b;this.bottom*=b;retu",
    "rn this};function V(a,b,c,d){this.left=a;this.top=b;this.width=c;this.h",
    "eight=d}h=V.prototype;h.clone=function(){return new V(this.left,this.to",
    "p,this.width,this.height)};h.toString=function(){return\"(\"+this.left+",
    "\", \"+this.top+\" - \"+this.width+\"w x \"+this.height+\"h)\"};h.conta",
    "ins=function(a){return a instanceof x?a.x>=this.left&&a.x<=this.left+th",
    "is.width&&a.y>=this.top&&a.y<=this.top+this.height:this.left<=a.left&&t",
    "his.left+this.width>=a.left+a.width&&this.top<=a.top&&this.top+this.hei",
    "ght>=a.top+a.height};\nh.ceil=function(){this.left=Math.ceil(this.left)",
    ";this.top=Math.ceil(this.top);this.width=Math.ceil(this.width);this.hei",
    "ght=Math.ceil(this.height);return this};h.floor=function(){this.left=Ma",
    "th.floor(this.left);this.top=Math.floor(this.top);this.width=Math.floor",
    "(this.width);this.height=Math.floor(this.height);return this};h.round=f",
    "unction(){this.left=Math.round(this.left);this.top=Math.round(this.top)",
    ";this.width=Math.round(this.width);this.height=Math.round(this.height);",
    "return this};\nh.translate=function(a,b){a instanceof x?(this.left+=a.x",
    ",this.top+=a.y):(this.left+=a,n(b)&&(this.top+=b));return this};h.scale",
    "=function(a,b){b=n(b)?b:a;this.left*=a;this.width*=a;this.top*=b;this.h",
    "eight*=b;return this};var bc=\"function\"===typeof ShadowRoot;function ",
    "cc(a){for(a=a.parentNode;a&&1!=a.nodeType&&9!=a.nodeType&&11!=a.nodeTyp",
    "e;)a=a.parentNode;return C(a)?a:null}\nfunction X(a,b){b=oa(b);if(\"flo",
    "at\"==b||\"cssFloat\"==b||\"styleFloat\"==b)b=\"cssFloat\";a:{var c=b;v",
    "ar d=z(a);if(d.defaultView&&d.defaultView.getComputedStyle&&(d=d.defaul",
    "tView.getComputedStyle(a,null))){c=d[c]||d.getPropertyValue(c)||\"\";br",
    "eak a}c=\"\"}a=c||dc(a,b);if(null===a)a=null;else if(0<=pa(Ma,b)){b:{va",
    "r e=a.match(Pa);if(e&&(b=Number(e[1]),c=Number(e[2]),d=Number(e[3]),e=N",
    "umber(e[4]),0<=b&&255>=b&&0<=c&&255>=c&&0<=d&&255>=d&&0<=e&&1>=e)){b=[b",
    ",c,d,e];break b}b=null}if(!b)b:{if(d=a.match(Qa))if(b=Number(d[1]),\nc=",
    "Number(d[2]),d=Number(d[3]),0<=b&&255>=b&&0<=c&&255>=c&&0<=d&&255>=d){b",
    "=[b,c,d,1];break b}b=null}if(!b)b:{b=a.toLowerCase();c=La[b.toLowerCase",
    "()];if(!c&&(c=\"#\"==b.charAt(0)?b:\"#\"+b,4==c.length&&(c=c.replace(Na",
    ",\"#$1$1$2$2$3$3\")),!Oa.test(c))){b=null;break b}b=[parseInt(c.substr(",
    "1,2),16),parseInt(c.substr(3,2),16),parseInt(c.substr(5,2),16),1]}a=b?",
    "\"rgba(\"+b.join(\", \")+\")\":a}return a}\nfunction dc(a,b){var c=a.cu",
    "rrentStyle||a.style,d=c[b];!l(d)&&p(c.getPropertyValue)&&(d=c.getProper",
    "tyValue(b));return\"inherit\"!=d?l(d)?d:null:(a=cc(a))?dc(a,b):null}\nf",
    "unction ec(a,b,c){function d(a){var b=fc(a);return 0<b.height&&0<b.widt",
    "h?!0:C(a,\"PATH\")&&(0<b.height||0<b.width)?(a=X(a,\"stroke-width\"),!!",
    "a&&0<parseInt(a,10)):\"hidden\"!=X(a,\"overflow\")&&sa(a.childNodes,fun",
    "ction(a){return 3==a.nodeType||C(a)&&d(a)})}function e(a){return gc(a)=",
    "=Y&&ta(a.childNodes,function(a){return!C(a)||e(a)||!d(a)})}if(!C(a))thr",
    "ow Error(\"Argument to isShown must be of type Element\");if(C(a,\"BODY",
    "\"))return!0;if(C(a,\"OPTION\")||C(a,\"OPTGROUP\"))return a=Ia(a,functi",
    "on(a){return C(a,\"SELECT\")}),\n!!a&&ec(a,!0,c);var f=hc(a);if(f)retur",
    "n!!f.ba&&0<f.rect.width&&0<f.rect.height&&ec(f.ba,b,c);if(C(a,\"INPUT\"",
    ")&&\"hidden\"==a.type.toLowerCase()||C(a,\"NOSCRIPT\"))return!1;f=X(a,",
    "\"visibility\");return\"collapse\"!=f&&\"hidden\"!=f&&c(a)&&(b||0!=ic(a",
    "))&&d(a)?!e(a):!1}\nfunction jc(a){var b=bc?function(c){if(\"none\"==X(",
    "c,\"display\"))return!1;do{var d=c.parentNode;if(c.getDestinationInsert",
    "ionPoints){var e=c.getDestinationInsertionPoints();0<e.length&&(d=e[e.l",
    "ength-1])}if(d instanceof ShadowRoot)return!0;!d||9!=d.nodeType&&11!=d.",
    "nodeType||(d=null)}while(a&&1!=a.nodeType);return!d||b(d)}:function(a){",
    "if(\"none\"==X(a,\"display\"))return!1;a=cc(a);return!a||b(a)};return e",
    "c(a,!1,b)}var Y=\"hidden\";\nfunction gc(a){function b(a){function b(a)",
    "{return a==g?!0:0==X(a,\"display\").lastIndexOf(\"inline\",0)||\"absolu",
    "te\"==c&&\"static\"==X(a,\"position\")?!1:!0}var c=X(a,\"position\");if",
    "(\"fixed\"==c)return D=!0,a==g?null:g;for(a=cc(a);a&&!b(a);)a=cc(a);ret",
    "urn a}function c(a){var b=a;if(\"visible\"==u)if(a==g&&k)b=k;else if(a=",
    "=k)return{x:\"visible\",y:\"visible\"};b={x:X(b,\"overflow-x\"),y:X(b,",
    "\"overflow-y\")};a==g&&(b.x=\"visible\"==b.x?\"auto\":b.x,b.y=\"visible",
    "\"==b.y?\"auto\":b.y);return b}function d(a){if(a==g){var b=(new za(f))",
    ".C;\na=b.scrollingElement?b.scrollingElement:b.body||b.documentElement;",
    "b=b.parentWindow||b.defaultView;a=new x(b.pageXOffset||a.scrollLeft,b.p",
    "ageYOffset||a.scrollTop)}else a=new x(a.scrollLeft,a.scrollTop);return ",
    "a}var e=kc(a);var f=z(a),g=f.documentElement,k=f.body,u=X(g,\"overflow",
    "\"),D;for(a=b(a);a;a=b(a)){var q=c(a);if(\"visible\"!=q.x||\"visible\"!",
    "=q.y){var A=fc(a);if(0==A.width||0==A.height)return Y;var L=e.right<A.l",
    "eft,W=e.bottom<A.top;if(L&&\"hidden\"==q.x||W&&\"hidden\"==q.y)return Y",
    ";if(L&&\"visible\"!=q.x||\nW&&\"visible\"!=q.y){L=d(a);W=e.bottom<A.top",
    "-L.y;if(e.right<A.left-L.x&&\"visible\"!=q.x||W&&\"visible\"!=q.x)retur",
    "n Y;e=gc(a);return e==Y?Y:\"scroll\"}L=e.left>=A.left+A.width;A=e.top>=",
    "A.top+A.height;if(L&&\"hidden\"==q.x||A&&\"hidden\"==q.y)return Y;if(L&",
    "&\"visible\"!=q.x||A&&\"visible\"!=q.y){if(D&&(q=d(a),e.left>=g.scrollW",
    "idth-q.x||e.right>=g.scrollHeight-q.y))return Y;e=gc(a);return e==Y?Y:",
    "\"scroll\"}}}return\"none\"}\nfunction fc(a){var b=hc(a);if(b)return b.",
    "rect;if(C(a,\"HTML\"))return a=z(a),a=((a?a.parentWindow||a.defaultView",
    ":window)||window).document,a=\"CSS1Compat\"==a.compatMode?a.documentEle",
    "ment:a.body,a=new ya(a.clientWidth,a.clientHeight),new V(0,0,a.width,a.",
    "height);try{var c=a.getBoundingClientRect()}catch(d){return new V(0,0,0",
    ",0)}return new V(c.left,c.top,c.right-c.left,c.bottom-c.top)}\nfunction",
    " hc(a){var b=C(a,\"MAP\");if(!b&&!C(a,\"AREA\"))return null;var c=b?a:C",
    "(a.parentNode,\"MAP\")?a.parentNode:null,d=null,e=null;c&&c.name&&(d=U.",
    "A('/descendant::*[@usemap = \"#'+c.name+'\"]',z(c)))&&(e=fc(d),b||\"def",
    "ault\"==a.shape.toLowerCase()||(a=lc(a),b=Math.min(Math.max(a.left,0),e",
    ".width),c=Math.min(Math.max(a.top,0),e.height),e=new V(b+e.left,c+e.top",
    ",Math.min(a.width,e.width-b),Math.min(a.height,e.height-c))));return{ba",
    ":d,rect:e||new V(0,0,0,0)}}\nfunction lc(a){var b=a.shape.toLowerCase()",
    ";a=a.coords.split(\",\");if(\"rect\"==b&&4==a.length){var b=a[0],c=a[1]",
    ";return new V(b,c,a[2]-b,a[3]-c)}if(\"circle\"==b&&3==a.length)return b",
    "=a[2],new V(a[0]-b,a[1]-b,2*b,2*b);if(\"poly\"==b&&2<a.length){for(var ",
    "b=a[0],c=a[1],d=b,e=c,f=2;f+1<a.length;f+=2)b=Math.min(b,a[f]),d=Math.m",
    "ax(d,a[f]),c=Math.min(c,a[f+1]),e=Math.max(e,a[f+1]);return new V(b,c,d",
    "-b,e-c)}return new V(0,0,0,0)}function kc(a){a=fc(a);return new ac(a.to",
    "p,a.left+a.width,a.top+a.height,a.left)}\nfunction mc(a){return a.repla",
    "ce(/^[^\\S\\xa0]+|[^\\S\\xa0]+$/g,\"\")}function nc(a){var b=[];bc?oc(a",
    ",b):pc(a,b);var c=b;a=c.length;for(var b=Array(a),c=m(c)?c.split(\"\"):",
    "c,d=0;d<a;d++)d in c&&(b[d]=mc.call(void 0,c[d]));return mc(b.join(\"",
    "\\n\")).replace(/\\xa0/g,\" \")}\nfunction qc(a,b,c){if(C(a,\"BR\"))b.p",
    "ush(\"\");else{var d=C(a,\"TD\"),e=X(a,\"display\"),f=!d&&!(0<=pa(rc,e)",
    "),g=l(a.previousElementSibling)?a.previousElementSibling:Ca(a.previousS",
    "ibling),g=g?X(g,\"display\"):\"\",k=X(a,\"float\")||X(a,\"cssFloat\")||",
    "X(a,\"styleFloat\");!f||\"run-in\"==g&&\"none\"==k||/^[\\s\\xa0]*$/.tes",
    "t(b[b.length-1]||\"\")||b.push(\"\");var u=jc(a),D=null,q=null;u&&(D=X(",
    "a,\"white-space\"),q=X(a,\"text-transform\"));w(a.childNodes,function(a",
    "){c(a,b,u,D,q)});a=b[b.length-1]||\"\";!d&&\"table-cell\"!=e||!a||ma(a)",
    "||(b[b.length-\n1]+=\" \");f&&\"run-in\"!=e&&!/^[\\s\\xa0]*$/.test(a)&&",
    "b.push(\"\")}}function pc(a,b){qc(a,b,function(a,b,e,f,g){3==a.nodeType",
    "&&e?sc(a,b,f,g):C(a)&&pc(a,b)})}var rc=\"inline inline-block inline-tab",
    "le none table-cell table-column table-column-group\".split(\" \");\nfun",
    "ction sc(a,b,c,d){a=a.nodeValue.replace(/[\\u200b\\u200e\\u200f]/g,\"\"",
    ");a=a.replace(/(\\r\\n|\\r|\\n)/g,\"\\n\");if(\"normal\"==c||\"nowrap\"",
    "==c)a=a.replace(/\\n/g,\" \");a=\"pre\"==c||\"pre-wrap\"==c?a.replace(/",
    "[ \\f\\t\\v\\u2028\\u2029]/g,\"\\u00a0\"):a.replace(/[\\ \\f\\t\\v\\u20",
    "28\\u2029]+/g,\" \");\"capitalize\"==d?a=a.replace(/(^|\\s)(\\S)/g,func",
    "tion(a,b,c){return b+c.toUpperCase()}):\"uppercase\"==d?a=a.toUpperCase",
    "():\"lowercase\"==d&&(a=a.toLowerCase());c=b.pop()||\"\";ma(c)&&0==a.la",
    "stIndexOf(\" \",0)&&(a=a.substr(1));b.push(c+a)}\nfunction ic(a){var b=",
    "1,c=X(a,\"opacity\");c&&(b=Number(c));(a=cc(a))&&(b*=ic(a));return b}\n",
    "function tc(a,b,c,d,e){var f;if(3==a.nodeType&&c)sc(a,b,d,e);else if(C(",
    "a))if(C(a,\"CONTENT\")){for(f=a;f.parentNode;)f=f.parentNode;f instance",
    "of ShadowRoot?w(a.getDistributedNodes(),function(a){tc(a,b,c,d,e)}):oc(",
    "a,b)}else if(C(a,\"SHADOW\")){for(f=a;f.parentNode;)f=f.parentNode;if(f",
    " instanceof ShadowRoot&&(a=f))for(a=a.olderShadowRoot;a;)w(a.childNodes",
    ",function(a){tc(a,b,c,d,e)}),a=a.olderShadowRoot}else oc(a,b)}\nfunctio",
    "n oc(a,b){a.shadowRoot&&w(a.shadowRoot.childNodes,function(a){tc(a,b,!0",
    ",null,null)});qc(a,b,function(a,b,e,f,g){var c=null;1==a.nodeType?c=a:3",
    "==a.nodeType&&(c=a);null!=c&&c.getDestinationInsertionPoints&&0<c.getDe",
    "stinationInsertionPoints().length||tc(a,b,e,f,g)})};var uc={K:function(",
    "a,b){return!(!a.querySelectorAll||!a.querySelector)&&!/^\\d.*/.test(b)}",
    ",A:function(a,b){var c=y(b),d=m(a)?c.C.getElementById(a):a;return d?Ra(",
    "d,\"id\")==a&&Da(b,d)?d:ua(B(c,\"*\"),function(c){return Ra(c,\"id\")==",
    "a&&Da(b,c)}):null},l:function(a,b){if(!a)return[];if(uc.K(b,a))try{retu",
    "rn b.querySelectorAll(\"#\"+uc.na(a))}catch(c){return[]}b=B(y(b),\"*\",",
    "null,b);return qa(b,function(b){return Ra(b,\"id\")==a})},na:function(a",
    "){return a.replace(/([\\s'\"\\\\#.:;,!?+<>=~*^$|%&@`{}\\-\\/\\[\\]\\(",
    "\\)])/g,\"\\\\$1\")}};var Z={},vc={};Z.ja=function(a,b,c){try{var d=Ka.",
    "l(\"a\",b)}catch(e){d=B(y(b),\"A\",null,b)}return ua(d,function(b){b=nc",
    "(b);return c&&-1!=b.indexOf(a)||b==a})};Z.ea=function(a,b,c){try{var d=",
    "Ka.l(\"a\",b)}catch(e){d=B(y(b),\"A\",null,b)}return qa(d,function(b){b",
    "=nc(b);return c&&-1!=b.indexOf(a)||b==a})};Z.A=function(a,b){return Z.j",
    "a(a,b,!1)};Z.l=function(a,b){return Z.ea(a,b,!1)};vc.A=function(a,b){re",
    "turn Z.ja(a,b,!0)};vc.l=function(a,b){return Z.ea(a,b,!0)};var wc={A:fu",
    "nction(a,b){if(\"\"===a)throw new t(32,'Unable to locate an element wit",
    "h the tagName \"\"');return b.getElementsByTagName(a)[0]||null},l:funct",
    "ion(a,b){if(\"\"===a)throw new t(32,'Unable to locate an element with t",
    "he tagName \"\"');return b.getElementsByTagName(a)}};var xc={className:",
    "Ja,\"class name\":Ja,css:Ka,\"css selector\":Ka,id:uc,linkText:Z,\"link",
    " text\":Z,name:{A:function(a,b){b=B(y(b),\"*\",null,b);return ua(b,func",
    "tion(b){return Ra(b,\"name\")==a})},l:function(a,b){b=B(y(b),\"*\",null",
    ",b);return qa(b,function(b){return Ra(b,\"name\")==a})}},partialLinkTex",
    "t:vc,\"partial link text\":vc,tagName:wc,\"tag name\":wc,xpath:U};ba(\"",
    "_\",function(a,b){a:{for(c in a)if(a.hasOwnProperty(c))break a;var c=nu",
    "ll}if(c){var d=xc[c];if(d&&p(d.l))return d.l(a[c],b||ja.document)}throw",
    " Error(\"Unsupported locator strategy: \"+c);});; return this._.apply(n",
    "ull,arguments);}.apply({navigator:typeof window!='undefined'?window.nav",
    "igator:null,document:typeof window!='undefined'?window.document:null}, ",
    "arguments);}",
    NULL
};

const char* const GET_EFFECTIVE_STYLE[] = {
    "function(){return function(){var aa=this;function h(a){return\"string\"",
    "==typeof a}function ba(a,b){a=a.split(\".\");var c=aa;a[0]in c||!c.exec",
    "Script||c.execScript(\"var \"+a[0]);for(var d;a.length&&(d=a.shift());)",
    "a.length||void 0===b?c=c[d]&&c[d]!==Object.prototype[d]?c[d]:c[d]={}:c[",
    "d]=b}\nfunction ca(a){var b=typeof a;if(\"object\"==b)if(a){if(a instan",
    "ceof Array)return\"array\";if(a instanceof Object)return b;var c=Object",
    ".prototype.toString.call(a);if(\"[object Window]\"==c)return\"object\";",
    "if(\"[object Array]\"==c||\"number\"==typeof a.length&&\"undefined\"!=t",
    "ypeof a.splice&&\"undefined\"!=typeof a.propertyIsEnumerable&&!a.proper",
    "tyIsEnumerable(\"splice\"))return\"array\";if(\"[object Function]\"==c|",
    "|\"undefined\"!=typeof a.call&&\"undefined\"!=typeof a.propertyIsEnumer",
    "able&&!a.propertyIsEnumerable(\"call\"))return\"function\"}else return",
    "\"null\";\nelse if(\"function\"==b&&\"undefined\"==typeof a.call)return",
    "\"object\";return b}function da(a,b,c){return a.call.apply(a.bind,argum",
    "ents)}function ea(a,b,c){if(!a)throw Error();if(2<arguments.length){var",
    " d=Array.prototype.slice.call(arguments,2);return function(){var c=Arra",
    "y.prototype.slice.call(arguments);Array.prototype.unshift.apply(c,d);re",
    "turn a.apply(b,c)}}return function(){return a.apply(b,arguments)}}\nfun",
    "ction fa(a,b,c){fa=Function.prototype.bind&&-1!=Function.prototype.bind",
    ".toString().indexOf(\"native code\")?da:ea;return fa.apply(null,argumen",
    "ts)}function ga(a,b){var c=Array.prototype.slice.call(arguments,1);retu",
    "rn function(){var b=c.slice();b.push.apply(b,arguments);return a.apply(",
    "this,b)}}\nfunction k(a){var b=m;function c(){}c.prototype=b.prototype;",
    "a.na=b.prototype;a.prototype=new c;a.prototype.constructor=a;a.ma=funct",
    "ion(a,c,f){for(var d=Array(arguments.length-2),e=2;e<arguments.length;e",
    "++)d[e-2]=arguments[e];return b.prototype[c].apply(a,d)}};function ha(a",
    "){return String(a).replace(/\\-([a-z])/g,function(a,c){return c.toUpper",
    "Case()})};function ia(a,b){if(h(a))return h(b)&&1==b.length?a.indexOf(b",
    ",0):-1;for(var c=0;c<a.length;c++)if(c in a&&a[c]===b)return c;return-1",
    "}function n(a,b){for(var c=a.length,d=h(a)?a.split(\"\"):a,e=0;e<c;e++)",
    "e in d&&b.call(void 0,d[e],e,a)}function p(a,b,c){var d=c;n(a,function(",
    "c,f){d=b.call(void 0,d,c,f,a)});return d}function q(a,b){for(var c=a.le",
    "ngth,d=h(a)?a.split(\"\"):a,e=0;e<c;e++)if(e in d&&b.call(void 0,d[e],e",
    ",a))return!0;return!1}function ja(a){return Array.prototype.concat.appl",
    "y([],arguments)}\nfunction ka(a,b,c){return 2>=arguments.length?Array.p",
    "rototype.slice.call(a,b):Array.prototype.slice.call(a,b,c)};var ma={ali",
    "ceblue:\"#f0f8ff\",antiquewhite:\"#faebd7\",aqua:\"#00ffff\",aquamarine",
    ":\"#7fffd4\",azure:\"#f0ffff\",beige:\"#f5f5dc\",bisque:\"#ffe4c4\",bla",
    "ck:\"#000000\",blanchedalmond:\"#ffebcd\",blue:\"#0000ff\",blueviolet:",
    "\"#8a2be2\",brown:\"#a52a2a\",burlywood:\"#deb887\",cadetblue:\"#5f9ea0",
    "\",chartreuse:\"#7fff00\",chocolate:\"#d2691e\",coral:\"#ff7f50\",cornf",
    "lowerblue:\"#6495ed\",cornsilk:\"#fff8dc\",crimson:\"#dc143c\",cyan:\"#",
    "00ffff\",darkblue:\"#00008b\",darkcyan:\"#008b8b\",darkgoldenrod:\"#b88",
    "60b\",darkgray:\"#a9a9a9\",darkgreen:\"#006400\",\ndarkgrey:\"#a9a9a9\"",
    ",darkkhaki:\"#bdb76b\",darkmagenta:\"#8b008b\",darkolivegreen:\"#556b2f",
    "\",darkorange:\"#ff8c00\",darkorchid:\"#9932cc\",darkred:\"#8b0000\",da",
    "rksalmon:\"#e9967a\",darkseagreen:\"#8fbc8f\",darkslateblue:\"#483d8b\"",
    ",darkslategray:\"#2f4f4f\",darkslategrey:\"#2f4f4f\",darkturquoise:\"#0",
    "0ced1\",darkviolet:\"#9400d3\",deeppink:\"#ff1493\",deepskyblue:\"#00bf",
    "ff\",dimgray:\"#696969\",dimgrey:\"#696969\",dodgerblue:\"#1e90ff\",fir",
    "ebrick:\"#b22222\",floralwhite:\"#fffaf0\",forestgreen:\"#228b22\",fuch",
    "sia:\"#ff00ff\",gainsboro:\"#dcdcdc\",\nghostwhite:\"#f8f8ff\",gold:\"#",
    "ffd700\",goldenrod:\"#daa520\",gray:\"#808080\",green:\"#008000\",green",
    "yellow:\"#adff2f\",grey:\"#808080\",honeydew:\"#f0fff0\",hotpink:\"#ff6",
    "9b4\",indianred:\"#cd5c5c\",indigo:\"#4b0082\",ivory:\"#fffff0\",khaki:",
    "\"#f0e68c\",lavender:\"#e6e6fa\",lavenderblush:\"#fff0f5\",lawngreen:\"",
    "#7cfc00\",lemonchiffon:\"#fffacd\",lightblue:\"#add8e6\",lightcoral:\"#",
    "f08080\",lightcyan:\"#e0ffff\",lightgoldenrodyellow:\"#fafad2\",lightgr",
    "ay:\"#d3d3d3\",lightgreen:\"#90ee90\",lightgrey:\"#d3d3d3\",lightpink:",
    "\"#ffb6c1\",lightsalmon:\"#ffa07a\",\nlightseagreen:\"#20b2aa\",lightsk",
    "yblue:\"#87cefa\",lightslategray:\"#778899\",lightslategrey:\"#778899\"",
    ",lightsteelblue:\"#b0c4de\",lightyellow:\"#ffffe0\",lime:\"#00ff00\",li",
    "megreen:\"#32cd32\",linen:\"#faf0e6\",magenta:\"#ff00ff\",maroon:\"#800",
    "000\",mediumaquamarine:\"#66cdaa\",mediumblue:\"#0000cd\",mediumorchid:",
    "\"#ba55d3\",mediumpurple:\"#9370db\",mediumseagreen:\"#3cb371\",mediums",
    "lateblue:\"#7b68ee\",mediumspringgreen:\"#00fa9a\",mediumturquoise:\"#4",
    "8d1cc\",mediumvioletred:\"#c71585\",midnightblue:\"#191970\",mintcream:",
    "\"#f5fffa\",mistyrose:\"#ffe4e1\",\nmoccasin:\"#ffe4b5\",navajowhite:\"",
    "#ffdead\",navy:\"#000080\",oldlace:\"#fdf5e6\",olive:\"#808000\",olived",
    "rab:\"#6b8e23\",orange:\"#ffa500\",orangered:\"#ff4500\",orchid:\"#da70",
    "d6\",palegoldenrod:\"#eee8aa\",palegreen:\"#98fb98\",paleturquoise:\"#a",
    "feeee\",palevioletred:\"#db7093\",papayawhip:\"#ffefd5\",peachpuff:\"#f",
    "fdab9\",peru:\"#cd853f\",pink:\"#ffc0cb\",plum:\"#dda0dd\",powderblue:",
    "\"#b0e0e6\",purple:\"#800080\",red:\"#ff0000\",rosybrown:\"#bc8f8f\",ro",
    "yalblue:\"#4169e1\",saddlebrown:\"#8b4513\",salmon:\"#fa8072\",sandybro",
    "wn:\"#f4a460\",seagreen:\"#2e8b57\",\nseashell:\"#fff5ee\",sienna:\"#a0",
    "522d\",silver:\"#c0c0c0\",skyblue:\"#87ceeb\",slateblue:\"#6a5acd\",sla",
    "tegray:\"#708090\",slategrey:\"#708090\",snow:\"#fffafa\",springgreen:",
    "\"#00ff7f\",steelblue:\"#4682b4\",tan:\"#d2b48c\",teal:\"#008080\",this",
    "tle:\"#d8bfd8\",tomato:\"#ff6347\",turquoise:\"#40e0d0\",violet:\"#ee82",
    "ee\",wheat:\"#f5deb3\",white:\"#ffffff\",whitesmoke:\"#f5f5f5\",yellow:",
    "\"#ffff00\",yellowgreen:\"#9acd32\"};var na=\"backgroundColor borderTop",
    "Color borderRightColor borderBottomColor borderLeftColor color outlineC",
    "olor\".split(\" \"),oa=/#([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])/,pa=/^",
    "#(?:[0-9a-f]{3}){1,2}$/i,qa=/^(?:rgba)?\\((\\d{1,3}),\\s?(\\d{1,3}),\\s",
    "?(\\d{1,3}),\\s?(0|1|0\\.\\d*)\\)$/i,ra=/^(?:rgb)?\\((0|[1-9]\\d{0,2}),",
    "\\s?(0|[1-9]\\d{0,2}),\\s?(0|[1-9]\\d{0,2})\\)$/i;function sa(a,b){if(!",
    "a||!b)return!1;if(a.contains&&1==b.nodeType)return a==b||a.contains(b);",
    "if(\"undefined\"!=typeof a.compareDocumentPosition)return a==b||!!(a.co",
    "mpareDocumentPosition(b)&16);for(;b&&a!=b;)b=b.parentNode;return b==a}",
    "\nfunction ta(a,b){if(a==b)return 0;if(a.compareDocumentPosition)return",
    " a.compareDocumentPosition(b)&2?1:-1;if(\"sourceIndex\"in a||a.parentNo",
    "de&&\"sourceIndex\"in a.parentNode){var c=1==a.nodeType,d=1==b.nodeType",
    ";if(c&&d)return a.sourceIndex-b.sourceIndex;var e=a.parentNode,f=b.pare",
    "ntNode;return e==f?ua(a,b):!c&&sa(e,b)?-1*va(a,b):!d&&sa(f,a)?va(b,a):(",
    "c?a.sourceIndex:e.sourceIndex)-(d?b.sourceIndex:f.sourceIndex)}d=9==a.n",
    "odeType?a:a.ownerDocument||a.document;c=d.createRange();c.selectNode(a)",
    ";c.collapse(!0);\na=d.createRange();a.selectNode(b);a.collapse(!0);retu",
    "rn c.compareBoundaryPoints(aa.Range.START_TO_END,a)}function va(a,b){va",
    "r c=a.parentNode;if(c==b)return-1;for(;b.parentNode!=c;)b=b.parentNode;",
    "return ua(b,a)}function ua(a,b){for(;b=b.previousSibling;)if(b==a)retur",
    "n-1;return 1};/*\n\n The MIT License\n\n Copyright (c) 2007 Cybozu Labs",
    ", Inc.\n Copyright (c) 2012 Google Inc.\n\n Permission is hereby grante",
    "d, free of charge, to any person obtaining a copy\n of this software an",
    "d associated documentation files (the \"Software\"), to\n deal in the S",
    "oftware without restriction, including without limitation the\n rights ",
    "to use, copy, modify, merge, publish, distribute, sublicense, and/or\n ",
    "sell copies of the Software, and to permit persons to whom the Software",
    " is\n furnished to do so, subject to the following conditions:\n\n The ",
    "above copyright notice and this permission notice shall be included in",
    "\n all copies or substantial portions of the Software.\n\n THE SOFTWARE",
    " IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPL",
    "IED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n ",
    "FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL",
    " THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR",
    " OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE",
    ", ARISING\n FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE ",
    "OR OTHER DEALINGS\n IN THE SOFTWARE.\n*/\nfunction r(a,b,c){this.l=a;th",
    "is.ka=b||1;this.j=c||1};function t(a){this.S=a;this.I=0}function wa(a){",
    "a=a.match(xa);for(var b=0;b<a.length;b++)ya.test(a[b])&&a.splice(b,1);r",
    "eturn new t(a)}var xa=/\\$?(?:(?![0-9-\\.])(?:\\*|[\\w-\\.]+):)?(?![0-9",
    "-\\.])(?:\\*|[\\w-\\.]+)|\\/\\/|\\.\\.|::|\\d+(?:\\.\\d*)?|\\.\\d+|\"[^",
    "\"]*\"|'[^']*'|[!<>]=|\\s+|./g,ya=/^\\s/;function u(a,b){return a.S[a.I",
    "+(b||0)]}t.prototype.next=function(){return this.S[this.I++]};t.prototy",
    "pe.back=function(){this.I--};t.prototype.empty=function(){return this.S",
    ".length<=this.I};function v(a){var b=null,c=a.nodeType;1==c&&(b=a.textC",
    "ontent,b=void 0==b||null==b?a.innerText:b,b=void 0==b||null==b?\"\":b);",
    "if(\"string\"!=typeof b)if(9==c||1==c){a=9==c?a.documentElement:a.first",
    "Child;for(var c=0,d=[],b=\"\";a;){do 1!=a.nodeType&&(b+=a.nodeValue),d[",
    "c++]=a;while(a=a.firstChild);for(;c&&!(a=d[--c].nextSibling););}}else b",
    "=a.nodeValue;return\"\"+b}\nfunction x(a,b,c){if(null===b)return!0;try{",
    "if(!a.getAttribute)return!1}catch(d){return!1}return null==c?!!a.getAtt",
    "ribute(b):a.getAttribute(b,2)==c}function y(a,b,c,d,e){return za.call(n",
    "ull,a,b,h(c)?c:null,h(d)?d:null,e||new z)}\nfunction za(a,b,c,d,e){b.ge",
    "tElementsByName&&d&&\"name\"==c?(b=b.getElementsByName(d),n(b,function(",
    "b){a.matches(b)&&e.add(b)})):b.getElementsByClassName&&d&&\"class\"==c?",
    "(b=b.getElementsByClassName(d),n(b,function(b){b.className==d&&a.matche",
    "s(b)&&e.add(b)})):a instanceof A?Aa(a,b,c,d,e):b.getElementsByTagName&&",
    "(b=b.getElementsByTagName(a.getName()),n(b,function(a){x(a,c,d)&&e.add(",
    "a)}));return e}function Aa(a,b,c,d,e){for(b=b.firstChild;b;b=b.nextSibl",
    "ing)x(b,c,d)&&a.matches(b)&&e.add(b),Aa(a,b,c,d,e)};function z(){this.j",
    "=this.g=null;this.D=0}function Ba(a){this.node=a;this.next=this.w=null}",
    "function Ca(a,b){if(!a.g)return b;if(!b.g)return a;var c=a.g;b=b.g;for(",
    "var d=null,e,f=0;c&&b;)c.node==b.node?(e=c,c=c.next,b=b.next):0<ta(c.no",
    "de,b.node)?(e=b,b=b.next):(e=c,c=c.next),(e.w=d)?d.next=e:a.g=e,d=e,f++",
    ";for(e=c||b;e;)e.w=d,d=d.next=e,f++,e=e.next;a.j=d;a.D=f;return a}z.pro",
    "totype.unshift=function(a){a=new Ba(a);a.next=this.g;this.j?this.g.w=a:",
    "this.g=this.j=a;this.g=a;this.D++};\nz.prototype.add=function(a){a=new ",
    "Ba(a);a.w=this.j;this.g?this.j.next=a:this.g=this.j=a;this.j=a;this.D++",
    "};function B(a){return(a=a.g)?a.node:null}z.prototype.m=function(){retu",
    "rn this.D};function C(a){return(a=B(a))?v(a):\"\"}z.prototype.iterator=",
    "function(a){return new Da(this,!!a)};function Da(a,b){this.ga=a;this.T=",
    "(this.A=b)?a.j:a.g;this.O=null}Da.prototype.next=function(){var a=this.",
    "T;if(null==a)return null;var b=this.O=a;this.T=this.A?a.w:a.next;return",
    " b.node};\nDa.prototype.remove=function(){var a=this.ga,b=this.O;if(!b)",
    "throw Error(\"Next must be called at least once before remove.\");var c",
    "=b.w,b=b.next;c?c.next=b:a.g=b;b?b.w=c:a.j=c;a.D--;this.O=null};functio",
    "n m(a){this.f=a;this.h=this.o=!1;this.F=null}function D(a){return\"\\n ",
    " \"+a.toString().split(\"\\n\").join(\"\\n  \")}m.prototype.c=function(",
    "){return this.o};function Ea(a,b){a.o=b}function Fa(a,b){a.h=b}m.protot",
    "ype.u=function(){return this.F};function E(a,b){a=a.evaluate(b);return ",
    "a instanceof z?+C(a):+a}function F(a,b){a=a.evaluate(b);return a instan",
    "ceof z?C(a):\"\"+a}function G(a,b){a=a.evaluate(b);return a instanceof ",
    "z?!!a.m():!!a};function H(a,b,c){m.call(this,a.f);this.R=a;this.W=b;thi",
    "s.aa=c;this.o=b.c()||c.c();this.h=b.h||c.h;this.R==Ga&&(c.h||c.c()||4==",
    "c.f||0==c.f||!b.u()?b.h||b.c()||4==b.f||0==b.f||!c.u()||(this.F={name:c",
    ".u().name,C:b}):this.F={name:b.u().name,C:c})}k(H);\nfunction I(a,b,c,d",
    ",e){b=b.evaluate(d);c=c.evaluate(d);var f;if(b instanceof z&&c instance",
    "of z){b=b.iterator();for(d=b.next();d;d=b.next())for(e=c.iterator(),f=e",
    ".next();f;f=e.next())if(a(v(d),v(f)))return!0;return!1}if(b instanceof ",
    "z||c instanceof z){b instanceof z?(e=b,d=c):(e=c,d=b);f=e.iterator();fo",
    "r(var g=typeof d,l=f.next();l;l=f.next()){switch(g){case \"number\":l=+",
    "v(l);break;case \"boolean\":l=!!v(l);break;case \"string\":l=v(l);break",
    ";default:throw Error(\"Illegal primitive type for comparison.\");\n}if(",
    "e==b&&a(l,d)||e==c&&a(d,l))return!0}return!1}return e?\"boolean\"==type",
    "of b||\"boolean\"==typeof c?a(!!b,!!c):\"number\"==typeof b||\"number\"",
    "==typeof c?a(+b,+c):a(b,c):a(+b,+c)}H.prototype.evaluate=function(a){re",
    "turn this.R.v(this.W,this.aa,a)};H.prototype.toString=function(){var a=",
    "\"Binary Expression: \"+this.R,a=a+D(this.W);return a+=D(this.aa)};func",
    "tion Ha(a,b,c,d){this.ja=a;this.Z=b;this.f=c;this.v=d}Ha.prototype.toSt",
    "ring=function(){return this.ja};var Ia={};\nfunction J(a,b,c,d){if(Ia.h",
    "asOwnProperty(a))throw Error(\"Binary operator already created: \"+a);a",
    "=new Ha(a,b,c,d);return Ia[a.toString()]=a}J(\"div\",6,1,function(a,b,c",
    "){return E(a,c)/E(b,c)});J(\"mod\",6,1,function(a,b,c){return E(a,c)%E(",
    "b,c)});J(\"*\",6,1,function(a,b,c){return E(a,c)*E(b,c)});J(\"+\",5,1,f",
    "unction(a,b,c){return E(a,c)+E(b,c)});J(\"-\",5,1,function(a,b,c){retur",
    "n E(a,c)-E(b,c)});J(\"<\",4,2,function(a,b,c){return I(function(a,b){re",
    "turn a<b},a,b,c)});\nJ(\">\",4,2,function(a,b,c){return I(function(a,b)",
    "{return a>b},a,b,c)});J(\"<=\",4,2,function(a,b,c){return I(function(a,",
    "b){return a<=b},a,b,c)});J(\">=\",4,2,function(a,b,c){return I(function",
    "(a,b){return a>=b},a,b,c)});var Ga=J(\"=\",3,2,function(a,b,c){return I",
    "(function(a,b){return a==b},a,b,c,!0)});J(\"!=\",3,2,function(a,b,c){re",
    "turn I(function(a,b){return a!=b},a,b,c,!0)});J(\"and\",2,2,function(a,",
    "b,c){return G(a,c)&&G(b,c)});J(\"or\",1,2,function(a,b,c){return G(a,c)",
    "||G(b,c)});function K(a,b){if(b.m()&&4!=a.f)throw Error(\"Primary expre",
    "ssion must evaluate to nodeset if filter has predicate(s).\");m.call(th",
    "is,a.f);this.$=a;this.b=b;this.o=a.c();this.h=a.h}k(K);K.prototype.eval",
    "uate=function(a){a=this.$.evaluate(a);return Ja(this.b,a)};K.prototype.",
    "toString=function(){var a=\"Filter:\"+D(this.$);return a+=D(this.b)};fu",
    "nction L(a,b){if(b.length<a.Y)throw Error(\"Function \"+a.i+\" expects ",
    "at least\"+a.Y+\" arguments, \"+b.length+\" given\");if(null!==a.P&&b.l",
    "ength>a.P)throw Error(\"Function \"+a.i+\" expects at most \"+a.P+\" ar",
    "guments, \"+b.length+\" given\");a.ha&&n(b,function(b,d){if(4!=b.f)thro",
    "w Error(\"Argument \"+d+\" to function \"+a.i+\" is not of type Nodeset",
    ": \"+b);});m.call(this,a.f);this.H=a;this.M=b;Ea(this,a.o||q(b,function",
    "(a){return a.c()}));Fa(this,a.fa&&!b.length||a.ea&&!!b.length||q(b,func",
    "tion(a){return a.h}))}k(L);\nL.prototype.evaluate=function(a){return th",
    "is.H.v.apply(null,ja(a,this.M))};L.prototype.toString=function(){var a=",
    "\"Function: \"+this.H;if(this.M.length)var b=p(this.M,function(a,b){ret",
    "urn a+D(b)},\"Arguments:\"),a=a+D(b);return a};function Ka(a,b,c,d,e,f,",
    "g,l,w){this.i=a;this.f=b;this.o=c;this.fa=d;this.ea=e;this.v=f;this.Y=g",
    ";this.P=void 0!==l?l:g;this.ha=!!w}Ka.prototype.toString=function(){ret",
    "urn this.i};var La={};\nfunction M(a,b,c,d,e,f,g,l){if(La.hasOwnPropert",
    "y(a))throw Error(\"Function already created: \"+a+\".\");La[a]=new Ka(a",
    ",b,c,d,!1,e,f,g,l)}M(\"boolean\",2,!1,!1,function(a,b){return G(b,a)},1",
    ");M(\"ceiling\",1,!1,!1,function(a,b){return Math.ceil(E(b,a))},1);M(\"",
    "concat\",3,!1,!1,function(a,b){return p(ka(arguments,1),function(b,d){r",
    "eturn b+F(d,a)},\"\")},2,null);M(\"contains\",2,!1,!1,function(a,b,c){b",
    "=F(b,a);a=F(c,a);return-1!=b.indexOf(a)},2);M(\"count\",1,!1,!1,functio",
    "n(a,b){return b.evaluate(a).m()},1,1,!0);\nM(\"false\",2,!1,!1,function",
    "(){return!1},0);M(\"floor\",1,!1,!1,function(a,b){return Math.floor(E(b",
    ",a))},1);M(\"id\",4,!1,!1,function(a,b){var c=a.l,d=9==c.nodeType?c:c.o",
    "wnerDocument;a=F(b,a).split(/\\s+/);var e=[];n(a,function(a){a=d.getEle",
    "mentById(a);!a||0<=ia(e,a)||e.push(a)});e.sort(ta);var f=new z;n(e,func",
    "tion(a){f.add(a)});return f},1);M(\"lang\",2,!1,!1,function(){return!1}",
    ",1);M(\"last\",1,!0,!1,function(a){if(1!=arguments.length)throw Error(",
    "\"Function last expects ()\");return a.j},0);\nM(\"local-name\",3,!1,!0",
    ",function(a,b){return(a=b?B(b.evaluate(a)):a.l)?a.localName||a.nodeName",
    ".toLowerCase():\"\"},0,1,!0);M(\"name\",3,!1,!0,function(a,b){return(a=",
    "b?B(b.evaluate(a)):a.l)?a.nodeName.toLowerCase():\"\"},0,1,!0);M(\"name",
    "space-uri\",3,!0,!1,function(){return\"\"},0,1,!0);M(\"normalize-space",
    "\",3,!1,!0,function(a,b){return(b?F(b,a):v(a.l)).replace(/[\\s\\xa0]+/g",
    ",\" \").replace(/^\\s+|\\s+$/g,\"\")},0,1);M(\"not\",2,!1,!1,function(a",
    ",b){return!G(b,a)},1);\nM(\"number\",1,!1,!0,function(a,b){return b?E(b",
    ",a):+v(a.l)},0,1);M(\"position\",1,!0,!1,function(a){return a.ka},0);M(",
    "\"round\",1,!1,!1,function(a,b){return Math.round(E(b,a))},1);M(\"start",
    "s-with\",2,!1,!1,function(a,b,c){b=F(b,a);a=F(c,a);return 0==b.lastInde",
    "xOf(a,0)},2);M(\"string\",3,!1,!0,function(a,b){return b?F(b,a):v(a.l)}",
    ",0,1);M(\"string-length\",1,!1,!0,function(a,b){return(b?F(b,a):v(a.l))",
    ".length},0,1);\nM(\"substring\",3,!1,!1,function(a,b,c,d){c=E(c,a);if(i",
    "sNaN(c)||Infinity==c||-Infinity==c)return\"\";d=d?E(d,a):Infinity;if(is",
    "NaN(d)||-Infinity===d)return\"\";c=Math.round(c)-1;var e=Math.max(c,0);",
    "a=F(b,a);return Infinity==d?a.substring(e):a.substring(e,c+Math.round(d",
    "))},2,3);M(\"substring-after\",3,!1,!1,function(a,b,c){b=F(b,a);a=F(c,a",
    ");c=b.indexOf(a);return-1==c?\"\":b.substring(c+a.length)},2);\nM(\"sub",
    "string-before\",3,!1,!1,function(a,b,c){b=F(b,a);a=F(c,a);a=b.indexOf(a",
    ");return-1==a?\"\":b.substring(0,a)},2);M(\"sum\",1,!1,!1,function(a,b)",
    "{a=b.evaluate(a).iterator();b=0;for(var c=a.next();c;c=a.next())b+=+v(c",
    ");return b},1,1,!0);M(\"translate\",3,!1,!1,function(a,b,c,d){b=F(b,a);",
    "c=F(c,a);var e=F(d,a);d={};for(var f=0;f<c.length;f++)a=c.charAt(f),a i",
    "n d||(d[a]=e.charAt(f));c=\"\";for(f=0;f<b.length;f++)a=b.charAt(f),c+=",
    "a in d?d[a]:a;return c},3);M(\"true\",2,!1,!1,function(){return!0},0);f",
    "unction A(a,b){this.ca=a;this.X=void 0!==b?b:null;this.B=null;switch(a)",
    "{case \"comment\":this.B=8;break;case \"text\":this.B=3;break;case \"pr",
    "ocessing-instruction\":this.B=7;break;case \"node\":break;default:throw",
    " Error(\"Unexpected argument\");}}function Ma(a){return\"comment\"==a||",
    "\"text\"==a||\"processing-instruction\"==a||\"node\"==a}A.prototype.mat",
    "ches=function(a){return null===this.B||this.B==a.nodeType};A.prototype.",
    "getName=function(){return this.ca};\nA.prototype.toString=function(){va",
    "r a=\"Kind Test: \"+this.ca;null===this.X||(a+=D(this.X));return a};fun",
    "ction N(a){m.call(this,3);this.ba=a.substring(1,a.length-1)}k(N);N.prot",
    "otype.evaluate=function(){return this.ba};N.prototype.toString=function",
    "(){return\"Literal: \"+this.ba};function O(a,b){this.i=a.toLowerCase();",
    "a=\"*\"==this.i?\"*\":\"http://www.w3.org/1999/xhtml\";this.J=b?b.toLow",
    "erCase():a}O.prototype.matches=function(a){var b=a.nodeType;if(1!=b&&2!",
    "=b)return!1;b=void 0!==a.localName?a.localName:a.nodeName;return\"*\"!=",
    "this.i&&this.i!=b.toLowerCase()?!1:\"*\"==this.J?!0:this.J==(a.namespac",
    "eURI?a.namespaceURI.toLowerCase():\"http://www.w3.org/1999/xhtml\")};O.",
    "prototype.getName=function(){return this.i};\nO.prototype.toString=func",
    "tion(){return\"Name Test: \"+(\"http://www.w3.org/1999/xhtml\"==this.J?",
    "\"\":this.J+\":\")+this.i};function P(a){m.call(this,1);this.da=a}k(P);",
    "P.prototype.evaluate=function(){return this.da};P.prototype.toString=fu",
    "nction(){return\"Number: \"+this.da};function Q(a,b){m.call(this,a.f);t",
    "his.V=a;this.G=b;this.o=a.c();this.h=a.h;1==this.G.length&&(a=this.G[0]",
    ",a.N||a.s!=Na||(a=a.L,\"*\"!=a.getName()&&(this.F={name:a.getName(),C:n",
    "ull})))}k(Q);function R(){m.call(this,4)}k(R);R.prototype.evaluate=func",
    "tion(a){var b=new z;a=a.l;9==a.nodeType?b.add(a):b.add(a.ownerDocument)",
    ";return b};R.prototype.toString=function(){return\"Root Helper Expressi",
    "on\"};function S(){m.call(this,4)}k(S);S.prototype.evaluate=function(a)",
    "{var b=new z;b.add(a.l);return b};\nS.prototype.toString=function(){ret",
    "urn\"Context Helper Expression\"};function Oa(a){return\"/\"==a||\"//\"",
    "==a}\nQ.prototype.evaluate=function(a){var b=this.V.evaluate(a);if(!(b ",
    "instanceof z))throw Error(\"Filter expression must evaluate to nodeset.",
    "\");a=this.G;for(var c=0,d=a.length;c<d&&b.m();c++){var e=a[c],f=b.iter",
    "ator(e.s.A);if(e.c()||e.s!=Pa)if(e.c()||e.s!=Qa){var g=f.next();for(b=e",
    ".evaluate(new r(g));null!=(g=f.next());)g=e.evaluate(new r(g)),b=Ca(b,g",
    ")}else g=f.next(),b=e.evaluate(new r(g));else{for(g=f.next();(b=f.next(",
    "))&&(!g.contains||g.contains(b))&&b.compareDocumentPosition(g)&8;g=b);b",
    "=e.evaluate(new r(g))}}return b};\nQ.prototype.toString=function(){var ",
    "a=\"Path Expression:\"+D(this.V);if(this.G.length){var b=p(this.G,funct",
    "ion(a,b){return a+D(b)},\"Steps:\");a+=D(b)}return a};function T(a,b){t",
    "his.b=a;this.A=!!b}function Ja(a,b,c){for(c=c||0;c<a.b.length;c++)for(v",
    "ar d=a.b[c],e=b.iterator(),f=b.m(),g,l=0;g=e.next();l++){var w=a.A?f-l:",
    "l+1;g=d.evaluate(new r(g,w,f));if(\"number\"==typeof g)w=w==g;else if(",
    "\"string\"==typeof g||\"boolean\"==typeof g)w=!!g;else if(g instanceof ",
    "z)w=0<g.m();else throw Error(\"Predicate.evaluate returned an unexpecte",
    "d type.\");w||e.remove()}return b}T.prototype.u=function(){return 0<thi",
    "s.b.length?this.b[0].u():null};\nT.prototype.c=function(){for(var a=0;a",
    "<this.b.length;a++){var b=this.b[a];if(b.c()||1==b.f||0==b.f)return!0}r",
    "eturn!1};T.prototype.m=function(){return this.b.length};T.prototype.toS",
    "tring=function(){return p(this.b,function(a,b){return a+D(b)},\"Predica",
    "tes:\")};function U(a,b,c,d){m.call(this,4);this.s=a;this.L=b;this.b=c|",
    "|new T([]);this.N=!!d;b=this.b.u();a.la&&b&&(this.F={name:b.name,C:b.C}",
    ");this.o=this.b.c()}k(U);\nU.prototype.evaluate=function(a){var b=a.l,c",
    "=this.u(),d=null,e=null,f=0;c&&(d=c.name,e=c.C?F(c.C,a):null,f=1);if(th",
    "is.N)if(this.c()||this.s!=Ra)if(b=(new U(Sa,new A(\"node\"))).evaluate(",
    "a).iterator(),c=b.next())for(a=this.v(c,d,e,f);null!=(c=b.next());)a=Ca",
    "(a,this.v(c,d,e,f));else a=new z;else a=y(this.L,b,d,e),a=Ja(this.b,a,f",
    ");else a=this.v(a.l,d,e,f);return a};U.prototype.v=function(a,b,c,d){a=",
    "this.s.H(this.L,a,b,c);return a=Ja(this.b,a,d)};\nU.prototype.toString=",
    "function(){var a=\"Step:\"+D(\"Operator: \"+(this.N?\"//\":\"/\"));this",
    ".s.i&&(a+=D(\"Axis: \"+this.s));a+=D(this.L);if(this.b.m()){var b=p(thi",
    "s.b.b,function(a,b){return a+D(b)},\"Predicates:\");a+=D(b)}return a};f",
    "unction Ta(a,b,c,d){this.i=a;this.H=b;this.A=c;this.la=d}Ta.prototype.t",
    "oString=function(){return this.i};var Ua={};function V(a,b,c,d){if(Ua.h",
    "asOwnProperty(a))throw Error(\"Axis already created: \"+a);b=new Ta(a,b",
    ",c,!!d);return Ua[a]=b}\nV(\"ancestor\",function(a,b){for(var c=new z;b",
    "=b.parentNode;)a.matches(b)&&c.unshift(b);return c},!0);V(\"ancestor-or",
    "-self\",function(a,b){var c=new z;do a.matches(b)&&c.unshift(b);while(b",
    "=b.parentNode);return c},!0);\nvar Na=V(\"attribute\",function(a,b){var",
    " c=new z,d=a.getName();if(b=b.attributes)if(a instanceof A&&null===a.B|",
    "|\"*\"==d)for(d=0;a=b[d];d++)c.add(a);else(a=b.getNamedItem(d))&&c.add(",
    "a);return c},!1),Ra=V(\"child\",function(a,b,c,d,e){c=h(c)?c:null;d=h(d",
    ")?d:null;e=e||new z;for(b=b.firstChild;b;b=b.nextSibling)x(b,c,d)&&a.ma",
    "tches(b)&&e.add(b);return e},!1,!0);V(\"descendant\",y,!1,!0);\nvar Sa=",
    "V(\"descendant-or-self\",function(a,b,c,d){var e=new z;x(b,c,d)&&a.matc",
    "hes(b)&&e.add(b);return y(a,b,c,d,e)},!1,!0),Pa=V(\"following\",functio",
    "n(a,b,c,d){var e=new z;do for(var f=b;f=f.nextSibling;)x(f,c,d)&&a.matc",
    "hes(f)&&e.add(f),e=y(a,f,c,d,e);while(b=b.parentNode);return e},!1,!0);",
    "V(\"following-sibling\",function(a,b){for(var c=new z;b=b.nextSibling;)",
    "a.matches(b)&&c.add(b);return c},!1);V(\"namespace\",function(){return ",
    "new z},!1);\nvar Va=V(\"parent\",function(a,b){var c=new z;if(9==b.node",
    "Type)return c;if(2==b.nodeType)return c.add(b.ownerElement),c;b=b.paren",
    "tNode;a.matches(b)&&c.add(b);return c},!1),Qa=V(\"preceding\",function(",
    "a,b,c,d){var e=new z,f=[];do f.unshift(b);while(b=b.parentNode);for(var",
    " g=1,l=f.length;g<l;g++){var w=[];for(b=f[g];b=b.previousSibling;)w.uns",
    "hift(b);for(var la=0,ib=w.length;la<ib;la++)b=w[la],x(b,c,d)&&a.matches",
    "(b)&&e.add(b),e=y(a,b,c,d,e)}return e},!0,!0);\nV(\"preceding-sibling\"",
    ",function(a,b){for(var c=new z;b=b.previousSibling;)a.matches(b)&&c.uns",
    "hift(b);return c},!0);var Wa=V(\"self\",function(a,b){var c=new z;a.mat",
    "ches(b)&&c.add(b);return c},!1);function W(a){m.call(this,1);this.U=a;t",
    "his.o=a.c();this.h=a.h}k(W);W.prototype.evaluate=function(a){return-E(t",
    "his.U,a)};W.prototype.toString=function(){return\"Unary Expression: -\"",
    "+D(this.U)};function X(a){m.call(this,4);this.K=a;Ea(this,q(this.K,func",
    "tion(a){return a.c()}));Fa(this,q(this.K,function(a){return a.h}))}k(X)",
    ";X.prototype.evaluate=function(a){var b=new z;n(this.K,function(c){c=c.",
    "evaluate(a);if(!(c instanceof z))throw Error(\"Path expression must eva",
    "luate to NodeSet.\");b=Ca(b,c)});return b};X.prototype.toString=functio",
    "n(){return p(this.K,function(a,b){return a+D(b)},\"Union Expression:\")",
    "};function Xa(a,b){this.a=a;this.ia=b}function Ya(a){for(var b,c=[];;){",
    "Y(a,\"Missing right hand side of binary expression.\");b=Za(a);var d=a.",
    "a.next();if(!d)break;var e=(d=Ia[d]||null)&&d.Z;if(!e){a.a.back();break",
    "}for(;c.length&&e<=c[c.length-1].Z;)b=new H(c.pop(),c.pop(),b);c.push(b",
    ",d)}for(;c.length;)b=new H(c.pop(),c.pop(),b);return b}function Y(a,b){",
    "if(a.a.empty())throw Error(b);}function $a(a,b){a=a.a.next();if(a!=b)th",
    "row Error(\"Bad token, expected: \"+b+\" got: \"+a);}\nfunction ab(a){a",
    "=a.a.next();if(\")\"!=a)throw Error(\"Bad token: \"+a);}function bb(a){",
    "a=a.a.next();if(2>a.length)throw Error(\"Unclosed literal string\");ret",
    "urn new N(a)}\nfunction cb(a){var b=[];if(Oa(u(a.a))){var c=a.a.next();",
    "var d=u(a.a);if(\"/\"==c&&(a.a.empty()||\".\"!=d&&\"..\"!=d&&\"@\"!=d&&",
    "\"*\"!=d&&!/(?![0-9])[\\w]/.test(d)))return new R;d=new R;Y(a,\"Missing",
    " next location step.\");c=db(a,c);b.push(c)}else{a:{c=u(a.a);d=c.charAt",
    "(0);switch(d){case \"$\":throw Error(\"Variable reference not allowed i",
    "n HTML XPath\");case \"(\":a.a.next();c=Ya(a);Y(a,'unclosed \"(\"');$a(",
    "a,\")\");break;case '\"':case \"'\":c=bb(a);break;default:if(isNaN(+c))",
    "if(!Ma(c)&&/(?![0-9])[\\w]/.test(d)&&\"(\"==u(a.a,\n1)){c=a.a.next();c=",
    "La[c]||null;a.a.next();for(d=[];\")\"!=u(a.a);){Y(a,\"Missing function ",
    "argument list.\");d.push(Ya(a));if(\",\"!=u(a.a))break;a.a.next()}Y(a,",
    "\"Unclosed function argument list.\");ab(a);c=new L(c,d)}else{c=null;br",
    "eak a}else c=new P(+a.a.next())}\"[\"==u(a.a)&&(d=new T(eb(a)),c=new K(",
    "c,d))}if(c)if(Oa(u(a.a)))d=c;else return c;else c=db(a,\"/\"),d=new S,b",
    ".push(c)}for(;Oa(u(a.a));)c=a.a.next(),Y(a,\"Missing next location step",
    ".\"),c=db(a,c),b.push(c);return new Q(d,b)}\nfunction db(a,b){if(\"/\"!",
    "=b&&\"//\"!=b)throw Error('Step op should be \"/\" or \"//\"');if(\".\"",
    "==u(a.a)){var c=new U(Wa,new A(\"node\"));a.a.next();return c}if(\"..\"",
    "==u(a.a))return c=new U(Va,new A(\"node\")),a.a.next(),c;if(\"@\"==u(a.",
    "a)){var d=Na;a.a.next();Y(a,\"Missing attribute name\")}else if(\"::\"=",
    "=u(a.a,1)){if(!/(?![0-9])[\\w]/.test(u(a.a).charAt(0)))throw Error(\"Ba",
    "d token: \"+a.a.next());var e=a.a.next();d=Ua[e]||null;if(!d)throw Erro",
    "r(\"No axis with name: \"+e);a.a.next();Y(a,\"Missing node name\")}else",
    " d=Ra;e=\nu(a.a);if(/(?![0-9])[\\w\\*]/.test(e.charAt(0)))if(\"(\"==u(a",
    ".a,1)){if(!Ma(e))throw Error(\"Invalid node type: \"+e);e=a.a.next();if",
    "(!Ma(e))throw Error(\"Invalid type name: \"+e);$a(a,\"(\");Y(a,\"Bad no",
    "detype\");var f=u(a.a).charAt(0),g=null;if('\"'==f||\"'\"==f)g=bb(a);Y(",
    "a,\"Bad nodetype\");ab(a);e=new A(e,g)}else if(e=a.a.next(),f=e.indexOf",
    "(\":\"),-1==f)e=new O(e);else{var g=e.substring(0,f);if(\"*\"==g)var l=",
    "\"*\";else if(l=a.ia(g),!l)throw Error(\"Namespace prefix not declared:",
    " \"+g);e=e.substr(f+1);e=new O(e,l)}else throw Error(\"Bad token: \"+\n",
    "a.a.next());a=new T(eb(a),d.A);return c||new U(d,e,a,\"//\"==b)}functio",
    "n eb(a){for(var b=[];\"[\"==u(a.a);){a.a.next();Y(a,\"Missing predicate",
    " expression.\");var c=Ya(a);b.push(c);Y(a,\"Unclosed predicate expressi",
    "on.\");$a(a,\"]\")}return b}function Za(a){if(\"-\"==u(a.a))return a.a.",
    "next(),new W(Za(a));var b=cb(a);if(\"|\"!=u(a.a))a=b;else{for(b=[b];\"|",
    "\"==a.a.next();)Y(a,\"Missing next union location path.\"),b.push(cb(a)",
    ");a.a.back();a=new X(b)}return a};function fb(a){switch(a.nodeType){cas",
    "e 1:return ga(gb,a);case 9:return fb(a.documentElement);case 11:case 10",
    ":case 6:case 12:return hb;default:return a.parentNode?fb(a.parentNode):",
    "hb}}function hb(){return null}function gb(a,b){if(a.prefix==b)return a.",
    "namespaceURI||\"http://www.w3.org/1999/xhtml\";var c=a.getAttributeNode",
    "(\"xmlns:\"+b);return c&&c.specified?c.value||null:a.parentNode&&9!=a.p",
    "arentNode.nodeType?gb(a.parentNode,b):null};function jb(a,b){if(!a.leng",
    "th)throw Error(\"Empty XPath expression.\");a=wa(a);if(a.empty())throw ",
    "Error(\"Invalid XPath expression.\");b?\"function\"==ca(b)||(b=fa(b.loo",
    "kupNamespaceURI,b)):b=function(){return null};var c=Ya(new Xa(a,b));if(",
    "!a.empty())throw Error(\"Bad token: \"+a.next());this.evaluate=function",
    "(a,b){a=c.evaluate(new r(a));return new Z(a,b)}}\nfunction Z(a,b){if(0=",
    "=b)if(a instanceof z)b=4;else if(\"string\"==typeof a)b=2;else if(\"num",
    "ber\"==typeof a)b=1;else if(\"boolean\"==typeof a)b=3;else throw Error(",
    "\"Unexpected evaluation result.\");if(2!=b&&1!=b&&3!=b&&!(a instanceof ",
    "z))throw Error(\"value could not be converted to the specified type\");",
    "this.resultType=b;switch(b){case 2:this.stringValue=a instanceof z?C(a)",
    ":\"\"+a;break;case 1:this.numberValue=a instanceof z?+C(a):+a;break;cas",
    "e 3:this.booleanValue=a instanceof z?0<a.m():!!a;break;case 4:case 5:ca",
    "se 6:case 7:var c=\na.iterator();var d=[];for(var e=c.next();e;e=c.next",
    "())d.push(e);this.snapshotLength=a.m();this.invalidIteratorState=!1;bre",
    "ak;case 8:case 9:this.singleNodeValue=B(a);break;default:throw Error(\"",
    "Unknown XPathResult type.\");}var f=0;this.iterateNext=function(){if(4!",
    "=b&&5!=b)throw Error(\"iterateNext called with wrong result type\");ret",
    "urn f>=d.length?null:d[f++]};this.snapshotItem=function(a){if(6!=b&&7!=",
    "b)throw Error(\"snapshotItem called with wrong result type\");return a>",
    "=d.length||0>a?null:d[a]}}\nZ.ANY_TYPE=0;Z.NUMBER_TYPE=1;Z.STRING_TYPE=",
    "2;Z.BOOLEAN_TYPE=3;Z.UNORDERED_NODE_ITERATOR_TYPE=4;Z.ORDERED_NODE_ITER",
    "ATOR_TYPE=5;Z.UNORDERED_NODE_SNAPSHOT_TYPE=6;Z.ORDERED_NODE_SNAPSHOT_TY",
    "PE=7;Z.ANY_UNORDERED_NODE_TYPE=8;Z.FIRST_ORDERED_NODE_TYPE=9;function k",
    "b(a){this.lookupNamespaceURI=fb(a)}\nba(\"wgxpath.install\",function(a,",
    "b){a=a||aa;var c=a.Document&&a.Document.prototype||a.document;if(!c.eva",
    "luate||b)a.XPathResult=Z,c.evaluate=function(a,b,c,g){return(new jb(a,c",
    ")).evaluate(b,g)},c.createExpression=function(a,b){return new jb(a,b)},",
    "c.createNSResolver=function(a){return new kb(a)}});function lb(a,b){var",
    " c=a.currentStyle||a.style,d=c[b];void 0===d&&\"function\"==ca(c.getPro",
    "pertyValue)&&(d=c.getPropertyValue(b));if(\"inherit\"!=d)return void 0!",
    "==d?d:null;var e;for(a=a.parentNode;a&&1!=a.nodeType&&9!=a.nodeType&&11",
    "!=a.nodeType;)a=a.parentNode;e&&\"string\"!==typeof e&&(e=e.toString())",
    ";return(e=!a||1!=a.nodeType||e&&a.tagName.toUpperCase()!=e?null:a)?lb(e",
    ",b):null};ba(\"_\",function(a,b){b=ha(b);if(\"float\"==b||\"cssFloat\"=",
    "=b||\"styleFloat\"==b)b=\"cssFloat\";a:{var c=b;var d=9==a.nodeType?a:a",
    ".ownerDocument||a.document;if(d.defaultView&&d.defaultView.getComputedS",
    "tyle&&(d=d.defaultView.getComputedStyle(a,null))){c=d[c]||d.getProperty",
    "Value(c)||\"\";break a}c=\"\"}a=c||lb(a,b);if(null===a)a=null;else if(0",
    "<=ia(na,b)){b:{var e=a.match(qa);if(e&&(b=Number(e[1]),c=Number(e[2]),d",
    "=Number(e[3]),e=Number(e[4]),0<=b&&255>=b&&0<=c&&255>=c&&0<=d&&255>=d&&",
    "0<=e&&1>=e)){b=[b,c,d,e];break b}b=\nnull}if(!b)b:{if(d=a.match(ra))if(",
    "b=Number(d[1]),c=Number(d[2]),d=Number(d[3]),0<=b&&255>=b&&0<=c&&255>=c",
    "&&0<=d&&255>=d){b=[b,c,d,1];break b}b=null}if(!b)b:{b=a.toLowerCase();c",
    "=ma[b.toLowerCase()];if(!c&&(c=\"#\"==b.charAt(0)?b:\"#\"+b,4==c.length",
    "&&(c=c.replace(oa,\"#$1$1$2$2$3$3\")),!pa.test(c))){b=null;break b}b=[p",
    "arseInt(c.substr(1,2),16),parseInt(c.substr(3,2),16),parseInt(c.substr(",
    "5,2),16),1]}a=b?\"rgba(\"+b.join(\", \")+\")\":a}return a});; return th",
    "is._.apply(null,arguments);}.apply({navigator:typeof window!='undefined",
    "'?window.navigator:null,document:typeof window!='undefined'?window.docu",
    "ment:null}, arguments);}",
    NULL
};

const char* const GET_LOCATION[] = {
    "function(){return function(){var d,h=this;\nfunction k(a){var b=typeof ",
    "a;if(\"object\"==b)if(a){if(a instanceof Array)return\"array\";if(a ins",
    "tanceof Object)return b;var e=Object.prototype.toString.call(a);if(\"[o",
    "bject Window]\"==e)return\"object\";if(\"[object Array]\"==e||\"number",
    "\"==typeof a.length&&\"undefined\"!=typeof a.splice&&\"undefined\"!=typ",
    "eof a.propertyIsEnumerable&&!a.propertyIsEnumerable(\"splice\"))return",
    "\"array\";if(\"[object Function]\"==e||\"undefined\"!=typeof a.call&&\"",
    "undefined\"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable(\"c",
    "all\"))return\"function\"}else return\"null\";else if(\"function\"==\nb",
    "&&\"undefined\"==typeof a.call)return\"object\";return b}function l(a){",
    "var b=k(a);return\"array\"==b||\"object\"==b&&\"number\"==typeof a.leng",
    "th}function m(a){var b=typeof a;return\"object\"==b&&null!=a||\"functio",
    "n\"==b};var n;function q(a,b){for(var e=a.length,c=\"string\"==typeof a",
    "?a.split(\"\"):a,g=0;g<e;g++)g in c&&b.call(void 0,c[g],g,a)}function r",
    "(a){var b=a.length;if(0<b){for(var e=Array(b),c=0;c<b;c++)e[c]=a[c];ret",
    "urn e}return[]};function t(a,b){this.x=void 0!==a?a:0;this.y=void 0!==b",
    "?b:0}d=t.prototype;d.clone=function(){return new t(this.x,this.y)};d.to",
    "String=function(){return\"(\"+this.x+\", \"+this.y+\")\"};d.ceil=functi",
    "on(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);return this};d.f",
    "loor=function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);ret",
    "urn this};d.round=function(){this.x=Math.round(this.x);this.y=Math.roun",
    "d(this.y);return this};\nd.translate=function(a,b){a instanceof t?(this",
    ".x+=a.x,this.y+=a.y):(this.x+=Number(a),\"number\"==typeof b&&(this.y+=",
    "b));return this};d.scale=function(a,b){this.x*=a;this.y*=\"number\"==ty",
    "peof b?b:a;return this};function u(a,b,e){function c(c){c&&b.appendChil",
    "d(\"string\"==typeof c?a.createTextNode(c):c)}for(var g=1;g<e.length;g+",
    "+){var f=e[g];if(!l(f)||m(f)&&0<f.nodeType)c(f);else{a:{if(f&&\"number",
    "\"==typeof f.length){if(m(f)){var p=\"function\"==typeof f.item||\"stri",
    "ng\"==typeof f.item;break a}if(\"function\"==k(f)){p=\"function\"==type",
    "of f.item;break a}}p=!1}q(p?r(f):f,c)}}}function v(a){return 9==a.nodeT",
    "ype?a:a.ownerDocument||a.document}function w(a){this.a=a||h.document||d",
    "ocument}d=w.prototype;\nd.getElementsByTagName=function(a,b){return(b||",
    "this.a).getElementsByTagName(String(a))};d.createElement=function(a){re",
    "turn this.a.createElement(String(a))};d.createTextNode=function(a){retu",
    "rn this.a.createTextNode(String(a))};d.appendChild=function(a,b){a.appe",
    "ndChild(b)};d.append=function(a,b){u(v(a),a,arguments)};d.canHaveChildr",
    "en=function(a){if(1!=a.nodeType)return!1;switch(a.tagName){case \"APPLE",
    "T\":case \"AREA\":case \"BASE\":case \"BR\":case \"COL\":case \"COMMAND",
    "\":case \"EMBED\":case \"FRAME\":case \"HR\":case \"IMG\":case \"INPUT",
    "\":case \"IFRAME\":case \"ISINDEX\":case \"KEYGEN\":case \"LINK\":case ",
    "\"NOFRAMES\":case \"NOSCRIPT\":case \"META\":case \"OBJECT\":case \"PAR",
    "AM\":case \"SCRIPT\":case \"SOURCE\":case \"STYLE\":case \"TRACK\":case",
    " \"WBR\":return!1}return!0};\nd.removeNode=function(a){return a&&a.pare",
    "ntNode?a.parentNode.removeChild(a):null};d.contains=function(a,b){if(!a",
    "||!b)return!1;if(a.contains&&1==b.nodeType)return a==b||a.contains(b);i",
    "f(\"undefined\"!=typeof a.compareDocumentPosition)return a==b||!!(a.com",
    "pareDocumentPosition(b)&16);for(;b&&a!=b;)b=b.parentNode;return b==a};f",
    "unction x(a){var b=v(a),e=new t(0,0);if(a==(b?v(b):document).documentEl",
    "ement)return e;a:{try{var c=a.getBoundingClientRect()}catch(g){a={left:",
    "0,top:0,right:0,bottom:0};break a}a=c}c=(b?new w(v(b)):n||(n=new w)).a;",
    "b=c.scrollingElement?c.scrollingElement:c.body||c.documentElement;c=c.p",
    "arentWindow||c.defaultView;b=new t(c.pageXOffset||b.scrollLeft,c.pageYO",
    "ffset||b.scrollTop);e.x=a.left+b.x;e.y=a.top+b.y;return e}var y=[\"_\"]",
    ",z=h;y[0]in z||!z.execScript||z.execScript(\"var \"+y[0]);\nfor(var A;y",
    ".length&&(A=y.shift());)y.length||void 0===x?z=z[A]&&z[A]!==Object.prot",
    "otype[A]?z[A]:z[A]={}:z[A]=x;; return this._.apply(null,arguments);}.ap",
    "ply({navigator:typeof window!='undefined'?window.navigator:null,documen",
    "t:typeof window!='undefined'?window.document:null}, arguments);}",
    NULL
};

const char* const GET_SIZE[] = {
    "function(){return function(){function c(a,b){this.width=a;this.height=b",
    "}c.prototype.clone=function(){return new c(this.width,this.height)};c.p",
    "rototype.toString=function(){return\"(\"+this.width+\" x \"+this.height",
    "+\")\"};c.prototype.ceil=function(){this.width=Math.ceil(this.width);th",
    "is.height=Math.ceil(this.height);return this};c.prototype.floor=functio",
    "n(){this.width=Math.floor(this.width);this.height=Math.floor(this.heigh",
    "t);return this};\nc.prototype.round=function(){this.width=Math.round(th",
    "is.width);this.height=Math.round(this.height);return this};c.prototype.",
    "scale=function(a,b){this.width*=a;this.height*=\"number\"==typeof b?b:a",
    ";return this};function d(a){var b=a.offsetWidth,g=a.offsetHeight;if((vo",
    "id 0===b||!b&&!g)&&a.getBoundingClientRect){a:{try{var h=a.getBoundingC",
    "lientRect()}catch(l){a={left:0,top:0,right:0,bottom:0};break a}a=h}retu",
    "rn new c(a.right-a.left,a.bottom-a.top)}return new c(b,g)};function e(a",
    "){b:{var b=9==a.nodeType?a:a.ownerDocument||a.document;if(b.defaultView",
    "&&b.defaultView.getComputedStyle&&(b=b.defaultView.getComputedStyle(a,n",
    "ull))){b=b.display||b.getPropertyValue(\"display\")||\"\";break b}b=\"",
    "\"}if(\"none\"!=(b||(a.currentStyle?a.currentStyle.display:null)||a.sty",
    "le&&a.style.display))a=d(a);else{b=a.style;var g=b.display,h=b.visibili",
    "ty,l=b.position;b.visibility=\"hidden\";b.position=\"absolute\";b.displ",
    "ay=\"inline\";a=d(a);b.display=g;b.position=l;b.visibility=h}return a}",
    "\nvar f=[\"_\"],k=this;f[0]in k||!k.execScript||k.execScript(\"var \"+f",
    "[0]);for(var m;f.length&&(m=f.shift());)f.length||void 0===e?k=k[m]&&k[",
    "m]!==Object.prototype[m]?k[m]:k[m]={}:k[m]=e;; return this._.apply(null",
    ",arguments);}.apply({navigator:typeof window!='undefined'?window.naviga",
    "tor:null,document:typeof window!='undefined'?window.document:null}, arg",
    "uments);}",
    NULL
};

const char* const IS_DISPLAYED[] = {
    "function(){return function(){var h,aa=this;function k(a){return void 0!",
    "==a}function m(a){return\"string\"==typeof a}function n(a){return\"numb",
    "er\"==typeof a}function ba(a,b){a=a.split(\".\");var c=aa;a[0]in c||!c.",
    "execScript||c.execScript(\"var \"+a[0]);for(var d;a.length&&(d=a.shift(",
    "));)!a.length&&k(b)?c[d]=b:c=c[d]&&c[d]!==Object.prototype[d]?c[d]:c[d]",
    "={}}\nfunction ca(a){var b=typeof a;if(\"object\"==b)if(a){if(a instanc",
    "eof Array)return\"array\";if(a instanceof Object)return b;var c=Object.",
    "prototype.toString.call(a);if(\"[object Window]\"==c)return\"object\";i",
    "f(\"[object Array]\"==c||\"number\"==typeof a.length&&\"undefined\"!=ty",
    "peof a.splice&&\"undefined\"!=typeof a.propertyIsEnumerable&&!a.propert",
    "yIsEnumerable(\"splice\"))return\"array\";if(\"[object Function]\"==c||",
    "\"undefined\"!=typeof a.call&&\"undefined\"!=typeof a.propertyIsEnumera",
    "ble&&!a.propertyIsEnumerable(\"call\"))return\"function\"}else return\"",
    "null\";\nelse if(\"function\"==b&&\"undefined\"==typeof a.call)return\"",
    "object\";return b}function da(a){var b=ca(a);return\"array\"==b||\"obje",
    "ct\"==b&&\"number\"==typeof a.length}function ea(a){var b=typeof a;retu",
    "rn\"object\"==b&&null!=a||\"function\"==b}function fa(a,b,c){return a.c",
    "all.apply(a.bind,arguments)}\nfunction ga(a,b,c){if(!a)throw Error();if",
    "(2<arguments.length){var d=Array.prototype.slice.call(arguments,2);retu",
    "rn function(){var c=Array.prototype.slice.call(arguments);Array.prototy",
    "pe.unshift.apply(c,d);return a.apply(b,c)}}return function(){return a.a",
    "pply(b,arguments)}}function ha(a,b,c){ha=Function.prototype.bind&&-1!=F",
    "unction.prototype.bind.toString().indexOf(\"native code\")?fa:ga;return",
    " ha.apply(null,arguments)}\nfunction ia(a,b){var c=Array.prototype.slic",
    "e.call(arguments,1);return function(){var b=c.slice();b.push.apply(b,ar",
    "guments);return a.apply(this,b)}}function p(a,b){function c(){}c.protot",
    "ype=b.prototype;a.pa=b.prototype;a.prototype=new c;a.prototype.construc",
    "tor=a;a.oa=function(a,c,f){for(var d=Array(arguments.length-2),e=2;e<ar",
    "guments.length;e++)d[e-2]=arguments[e];return b.prototype[c].apply(a,d)",
    "}};function ja(a){return String(a).replace(/\\-([a-z])/g,function(a,c){",
    "return c.toUpperCase()})};function ka(a,b){if(m(a))return m(b)&&1==b.le",
    "ngth?a.indexOf(b,0):-1;for(var c=0;c<a.length;c++)if(c in a&&a[c]===b)r",
    "eturn c;return-1}function q(a,b){for(var c=a.length,d=m(a)?a.split(\"\"",
    "):a,e=0;e<c;e++)e in d&&b.call(void 0,d[e],e,a)}function u(a,b,c){var d",
    "=c;q(a,function(c,f){d=b.call(void 0,d,c,f,a)});return d}function v(a,b",
    "){for(var c=a.length,d=m(a)?a.split(\"\"):a,e=0;e<c;e++)if(e in d&&b.ca",
    "ll(void 0,d[e],e,a))return!0;return!1}\nfunction la(a,b){for(var c=a.le",
    "ngth,d=m(a)?a.split(\"\"):a,e=0;e<c;e++)if(e in d&&!b.call(void 0,d[e],",
    "e,a))return!1;return!0}function ma(a){return Array.prototype.concat.app",
    "ly([],arguments)}function na(a){var b=a.length;if(0<b){for(var c=Array(",
    "b),d=0;d<b;d++)c[d]=a[d];return c}return[]}function oa(a,b,c){return 2>",
    "=arguments.length?Array.prototype.slice.call(a,b):Array.prototype.slice",
    ".call(a,b,c)};var pa={aliceblue:\"#f0f8ff\",antiquewhite:\"#faebd7\",aq",
    "ua:\"#00ffff\",aquamarine:\"#7fffd4\",azure:\"#f0ffff\",beige:\"#f5f5dc",
    "\",bisque:\"#ffe4c4\",black:\"#000000\",blanchedalmond:\"#ffebcd\",blue",
    ":\"#0000ff\",blueviolet:\"#8a2be2\",brown:\"#a52a2a\",burlywood:\"#deb8",
    "87\",cadetblue:\"#5f9ea0\",chartreuse:\"#7fff00\",chocolate:\"#d2691e\"",
    ",coral:\"#ff7f50\",cornflowerblue:\"#6495ed\",cornsilk:\"#fff8dc\",crim",
    "son:\"#dc143c\",cyan:\"#00ffff\",darkblue:\"#00008b\",darkcyan:\"#008b8",
    "b\",darkgoldenrod:\"#b8860b\",darkgray:\"#a9a9a9\",darkgreen:\"#006400",
    "\",\ndarkgrey:\"#a9a9a9\",darkkhaki:\"#bdb76b\",darkmagenta:\"#8b008b\"",
    ",darkolivegreen:\"#556b2f\",darkorange:\"#ff8c00\",darkorchid:\"#9932cc",
    "\",darkred:\"#8b0000\",darksalmon:\"#e9967a\",darkseagreen:\"#8fbc8f\",",
    "darkslateblue:\"#483d8b\",darkslategray:\"#2f4f4f\",darkslategrey:\"#2f",
    "4f4f\",darkturquoise:\"#00ced1\",darkviolet:\"#9400d3\",deeppink:\"#ff1",
    "493\",deepskyblue:\"#00bfff\",dimgray:\"#696969\",dimgrey:\"#696969\",d",
    "odgerblue:\"#1e90ff\",firebrick:\"#b22222\",floralwhite:\"#fffaf0\",for",
    "estgreen:\"#228b22\",fuchsia:\"#ff00ff\",gainsboro:\"#dcdcdc\",\nghostw",
    "hite:\"#f8f8ff\",gold:\"#ffd700\",goldenrod:\"#daa520\",gray:\"#808080",
    "\",green:\"#008000\",greenyellow:\"#adff2f\",grey:\"#808080\",honeydew:",
    "\"#f0fff0\",hotpink:\"#ff69b4\",indianred:\"#cd5c5c\",indigo:\"#4b0082",
    "\",ivory:\"#fffff0\",khaki:\"#f0e68c\",lavender:\"#e6e6fa\",lavenderblu",
    "sh:\"#fff0f5\",lawngreen:\"#7cfc00\",lemonchiffon:\"#fffacd\",lightblue",
    ":\"#add8e6\",lightcoral:\"#f08080\",lightcyan:\"#e0ffff\",lightgoldenro",
    "dyellow:\"#fafad2\",lightgray:\"#d3d3d3\",lightgreen:\"#90ee90\",lightg",
    "rey:\"#d3d3d3\",lightpink:\"#ffb6c1\",lightsalmon:\"#ffa07a\",\nlightse",
    "agreen:\"#20b2aa\",lightskyblue:\"#87cefa\",lightslategray:\"#778899\",",
    "lightslategrey:\"#778899\",lightsteelblue:\"#b0c4de\",lightyellow:\"#ff",
    "ffe0\",lime:\"#00ff00\",limegreen:\"#32cd32\",linen:\"#faf0e6\",magenta",
    ":\"#ff00ff\",maroon:\"#800000\",mediumaquamarine:\"#66cdaa\",mediumblue",
    ":\"#0000cd\",mediumorchid:\"#ba55d3\",mediumpurple:\"#9370db\",mediumse",
    "agreen:\"#3cb371\",mediumslateblue:\"#7b68ee\",mediumspringgreen:\"#00f",
    "a9a\",mediumturquoise:\"#48d1cc\",mediumvioletred:\"#c71585\",midnightb",
    "lue:\"#191970\",mintcream:\"#f5fffa\",mistyrose:\"#ffe4e1\",\nmoccasin:",
    "\"#ffe4b5\",navajowhite:\"#ffdead\",navy:\"#000080\",oldlace:\"#fdf5e6",
    "\",olive:\"#808000\",olivedrab:\"#6b8e23\",orange:\"#ffa500\",orangered",
    ":\"#ff4500\",orchid:\"#da70d6\",palegoldenrod:\"#eee8aa\",palegreen:\"#",
    "98fb98\",paleturquoise:\"#afeeee\",palevioletred:\"#db7093\",papayawhip",
    ":\"#ffefd5\",peachpuff:\"#ffdab9\",peru:\"#cd853f\",pink:\"#ffc0cb\",pl",
    "um:\"#dda0dd\",powderblue:\"#b0e0e6\",purple:\"#800080\",red:\"#ff0000",
    "\",rosybrown:\"#bc8f8f\",royalblue:\"#4169e1\",saddlebrown:\"#8b4513\",",
    "salmon:\"#fa8072\",sandybrown:\"#f4a460\",seagreen:\"#2e8b57\",\nseashe",
    "ll:\"#fff5ee\",sienna:\"#a0522d\",silver:\"#c0c0c0\",skyblue:\"#87ceeb",
    "\",slateblue:\"#6a5acd\",slategray:\"#708090\",slategrey:\"#708090\",sn",
    "ow:\"#fffafa\",springgreen:\"#00ff7f\",steelblue:\"#4682b4\",tan:\"#d2b",
    "48c\",teal:\"#008080\",thistle:\"#d8bfd8\",tomato:\"#ff6347\",turquoise",
    ":\"#40e0d0\",violet:\"#ee82ee\",wheat:\"#f5deb3\",white:\"#ffffff\",whi",
    "tesmoke:\"#f5f5f5\",yellow:\"#ffff00\",yellowgreen:\"#9acd32\"};var qa=",
    "\"backgroundColor borderTopColor borderRightColor borderBottomColor bor",
    "derLeftColor color outlineColor\".split(\" \"),ra=/#([0-9a-fA-F])([0-9a",
    "-fA-F])([0-9a-fA-F])/,sa=/^#(?:[0-9a-f]{3}){1,2}$/i,ta=/^(?:rgba)?\\((",
    "\\d{1,3}),\\s?(\\d{1,3}),\\s?(\\d{1,3}),\\s?(0|1|0\\.\\d*)\\)$/i,ua=/^(",
    "?:rgb)?\\((0|[1-9]\\d{0,2}),\\s?(0|[1-9]\\d{0,2}),\\s?(0|[1-9]\\d{0,2})",
    "\\)$/i;function va(a,b){this.code=a;this.state=w[a]||wa;this.message=b|",
    "|\"\";a=this.state.replace(/((?:^|\\s+)[a-z])/g,function(a){return a.to",
    "UpperCase().replace(/^[\\s\\xa0]+/g,\"\")});b=a.length-5;if(0>b||a.inde",
    "xOf(\"Error\",b)!=b)a+=\"Error\";this.name=a;a=Error(this.message);a.na",
    "me=this.name;this.stack=a.stack||\"\"}p(va,Error);var wa=\"unknown erro",
    "r\",w={15:\"element not selectable\",11:\"element not visible\"};w[31]=",
    "wa;w[30]=wa;w[24]=\"invalid cookie domain\";w[29]=\"invalid element coo",
    "rdinates\";w[12]=\"invalid element state\";\nw[32]=\"invalid selector\"",
    ";w[51]=\"invalid selector\";w[52]=\"invalid selector\";w[17]=\"javascri",
    "pt error\";w[405]=\"unsupported operation\";w[34]=\"move target out of ",
    "bounds\";w[27]=\"no such alert\";w[7]=\"no such element\";w[8]=\"no suc",
    "h frame\";w[23]=\"no such window\";w[28]=\"script timeout\";w[33]=\"ses",
    "sion not created\";w[10]=\"stale element reference\";w[21]=\"timeout\";",
    "w[25]=\"unable to set cookie\";w[26]=\"unexpected alert open\";w[13]=wa",
    ";w[9]=\"unknown command\";va.prototype.toString=function(){return this.",
    "name+\": \"+this.message};function y(a,b){this.x=k(a)?a:0;this.y=k(b)?b",
    ":0}h=y.prototype;h.clone=function(){return new y(this.x,this.y)};h.toSt",
    "ring=function(){return\"(\"+this.x+\", \"+this.y+\")\"};h.ceil=function",
    "(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);return this};h.flo",
    "or=function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);retur",
    "n this};h.round=function(){this.x=Math.round(this.x);this.y=Math.round(",
    "this.y);return this};\nh.translate=function(a,b){a instanceof y?(this.x",
    "+=a.x,this.y+=a.y):(this.x+=Number(a),n(b)&&(this.y+=b));return this};h",
    ".scale=function(a,b){b=n(b)?b:a;this.x*=a;this.y*=b;return this};functi",
    "on xa(a,b){this.width=a;this.height=b}h=xa.prototype;h.clone=function()",
    "{return new xa(this.width,this.height)};h.toString=function(){return\"(",
    "\"+this.width+\" x \"+this.height+\")\"};h.ceil=function(){this.width=M",
    "ath.ceil(this.width);this.height=Math.ceil(this.height);return this};h.",
    "floor=function(){this.width=Math.floor(this.width);this.height=Math.flo",
    "or(this.height);return this};h.round=function(){this.width=Math.round(t",
    "his.width);this.height=Math.round(this.height);return this};\nh.scale=f",
    "unction(a,b){b=n(b)?b:a;this.width*=a;this.height*=b;return this};funct",
    "ion ya(a,b,c){function d(c){c&&b.appendChild(m(c)?a.createTextNode(c):c",
    ")}for(var e=1;e<c.length;e++){var f=c[e];!da(f)||ea(f)&&0<f.nodeType?d(",
    "f):q(za(f)?na(f):f,d)}}function Aa(a,b){if(!a||!b)return!1;if(a.contain",
    "s&&1==b.nodeType)return a==b||a.contains(b);if(\"undefined\"!=typeof a.",
    "compareDocumentPosition)return a==b||!!(a.compareDocumentPosition(b)&16",
    ");for(;b&&a!=b;)b=b.parentNode;return b==a}\nfunction Ba(a,b){if(a==b)r",
    "eturn 0;if(a.compareDocumentPosition)return a.compareDocumentPosition(b",
    ")&2?1:-1;if(\"sourceIndex\"in a||a.parentNode&&\"sourceIndex\"in a.pare",
    "ntNode){var c=1==a.nodeType,d=1==b.nodeType;if(c&&d)return a.sourceInde",
    "x-b.sourceIndex;var e=a.parentNode,f=b.parentNode;return e==f?Ca(a,b):!",
    "c&&Aa(e,b)?-1*Da(a,b):!d&&Aa(f,a)?Da(b,a):(c?a.sourceIndex:e.sourceInde",
    "x)-(d?b.sourceIndex:f.sourceIndex)}d=z(a);c=d.createRange();c.selectNod",
    "e(a);c.collapse(!0);a=d.createRange();a.selectNode(b);\na.collapse(!0);",
    "return c.compareBoundaryPoints(aa.Range.START_TO_END,a)}function Da(a,b",
    "){var c=a.parentNode;if(c==b)return-1;for(;b.parentNode!=c;)b=b.parentN",
    "ode;return Ca(b,a)}function Ca(a,b){for(;b=b.previousSibling;)if(b==a)r",
    "eturn-1;return 1}function z(a){return 9==a.nodeType?a:a.ownerDocument||",
    "a.document}function za(a){if(a&&\"number\"==typeof a.length){if(ea(a))r",
    "eturn\"function\"==typeof a.item||\"string\"==typeof a.item;if(\"functi",
    "on\"==ca(a))return\"function\"==typeof a.item}return!1}\nfunction Ea(a,",
    "b){a&&(a=a.parentNode);for(var c=0;a;){if(b(a))return a;a=a.parentNode;",
    "c++}return null}function Fa(a){this.H=a||aa.document||document}h=Fa.pro",
    "totype;h.getElementsByTagName=function(a,b){return(b||this.H).getElemen",
    "tsByTagName(String(a))};h.createElement=function(a){return this.H.creat",
    "eElement(String(a))};h.createTextNode=function(a){return this.H.createT",
    "extNode(String(a))};h.appendChild=function(a,b){a.appendChild(b)};h.app",
    "end=function(a,b){ya(z(a),a,arguments)};\nh.canHaveChildren=function(a)",
    "{if(1!=a.nodeType)return!1;switch(a.tagName){case \"APPLET\":case \"ARE",
    "A\":case \"BASE\":case \"BR\":case \"COL\":case \"COMMAND\":case \"EMBE",
    "D\":case \"FRAME\":case \"HR\":case \"IMG\":case \"INPUT\":case \"IFRAM",
    "E\":case \"ISINDEX\":case \"KEYGEN\":case \"LINK\":case \"NOFRAMES\":ca",
    "se \"NOSCRIPT\":case \"META\":case \"OBJECT\":case \"PARAM\":case \"SCR",
    "IPT\":case \"SOURCE\":case \"STYLE\":case \"TRACK\":case \"WBR\":return",
    "!1}return!0};h.removeNode=function(a){return a&&a.parentNode?a.parentNo",
    "de.removeChild(a):null};\nh.contains=Aa;function A(a,b){b&&\"string\"!=",
    "=typeof b&&(b=b.toString());return!!a&&1==a.nodeType&&(!b||a.tagName.to",
    "UpperCase()==b)};/*\n\n The MIT License\n\n Copyright (c) 2007 Cybozu L",
    "abs, Inc.\n Copyright (c) 2012 Google Inc.\n\n Permission is hereby gra",
    "nted, free of charge, to any person obtaining a copy\n of this software",
    " and associated documentation files (the \"Software\"), to\n deal in th",
    "e Software without restriction, including without limitation the\n righ",
    "ts to use, copy, modify, merge, publish, distribute, sublicense, and/or",
    "\n sell copies of the Software, and to permit persons to whom the Softw",
    "are is\n furnished to do so, subject to the following conditions:\n\n T",
    "he above copyright notice and this permission notice shall be included ",
    "in\n all copies or substantial portions of the Software.\n\n THE SOFTWA",
    "RE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IM",
    "PLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,",
    "\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SH",
    "ALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES",
    " OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERW",
    "ISE, ARISING\n FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE U",
    "SE OR OTHER DEALINGS\n IN THE SOFTWARE.\n*/\nfunction B(a,b,c){this.l=a",
    ";this.ma=b||1;this.j=c||1};function Ga(a){this.T=a;this.J=0}function Ha",
    "(a){a=a.match(Ia);for(var b=0;b<a.length;b++)Ja.test(a[b])&&a.splice(b,",
    "1);return new Ga(a)}var Ia=/\\$?(?:(?![0-9-\\.])(?:\\*|[\\w-\\.]+):)?(?",
    "![0-9-\\.])(?:\\*|[\\w-\\.]+)|\\/\\/|\\.\\.|::|\\d+(?:\\.\\d*)?|\\.\\d+",
    "|\"[^\"]*\"|'[^']*'|[!<>]=|\\s+|./g,Ja=/^\\s/;function C(a,b){return a.",
    "T[a.J+(b||0)]}Ga.prototype.next=function(){return this.T[this.J++]};Ga.",
    "prototype.back=function(){this.J--};Ga.prototype.empty=function(){retur",
    "n this.T.length<=this.J};function D(a){var b=null,c=a.nodeType;1==c&&(b",
    "=a.textContent,b=void 0==b||null==b?a.innerText:b,b=void 0==b||null==b?",
    "\"\":b);if(\"string\"!=typeof b)if(9==c||1==c){a=9==c?a.documentElement",
    ":a.firstChild;for(var c=0,d=[],b=\"\";a;){do 1!=a.nodeType&&(b+=a.nodeV",
    "alue),d[c++]=a;while(a=a.firstChild);for(;c&&!(a=d[--c].nextSibling););",
    "}}else b=a.nodeValue;return\"\"+b}\nfunction F(a,b,c){if(null===b)retur",
    "n!0;try{if(!a.getAttribute)return!1}catch(d){return!1}return null==c?!!",
    "a.getAttribute(b):a.getAttribute(b,2)==c}function Ka(a,b,c,d,e){return ",
    "La.call(null,a,b,m(c)?c:null,m(d)?d:null,e||new G)}\nfunction La(a,b,c,",
    "d,e){b.getElementsByName&&d&&\"name\"==c?(b=b.getElementsByName(d),q(b,",
    "function(b){a.matches(b)&&e.add(b)})):b.getElementsByClassName&&d&&\"cl",
    "ass\"==c?(b=b.getElementsByClassName(d),q(b,function(b){b.className==d&",
    "&a.matches(b)&&e.add(b)})):a instanceof H?Ma(a,b,c,d,e):b.getElementsBy",
    "TagName&&(b=b.getElementsByTagName(a.getName()),q(b,function(a){F(a,c,d",
    ")&&e.add(a)}));return e}function Ma(a,b,c,d,e){for(b=b.firstChild;b;b=b",
    ".nextSibling)F(b,c,d)&&a.matches(b)&&e.add(b),Ma(a,b,c,d,e)};function G",
    "(){this.j=this.g=null;this.D=0}function Na(a){this.node=a;this.next=thi",
    "s.w=null}function Oa(a,b){if(!a.g)return b;if(!b.g)return a;var c=a.g;b",
    "=b.g;for(var d=null,e,f=0;c&&b;)c.node==b.node?(e=c,c=c.next,b=b.next):",
    "0<Ba(c.node,b.node)?(e=b,b=b.next):(e=c,c=c.next),(e.w=d)?d.next=e:a.g=",
    "e,d=e,f++;for(e=c||b;e;)e.w=d,d=d.next=e,f++,e=e.next;a.j=d;a.D=f;retur",
    "n a}G.prototype.unshift=function(a){a=new Na(a);a.next=this.g;this.j?th",
    "is.g.w=a:this.g=this.j=a;this.g=a;this.D++};\nG.prototype.add=function(",
    "a){a=new Na(a);a.w=this.j;this.g?this.j.next=a:this.g=this.j=a;this.j=a",
    ";this.D++};function Pa(a){return(a=a.g)?a.node:null}G.prototype.m=funct",
    "ion(){return this.D};function Qa(a){return(a=Pa(a))?D(a):\"\"}G.prototy",
    "pe.iterator=function(a){return new Ra(this,!!a)};function Ra(a,b){this.",
    "ia=a;this.U=(this.A=b)?a.j:a.g;this.P=null}Ra.prototype.next=function()",
    "{var a=this.U;if(null==a)return null;var b=this.P=a;this.U=this.A?a.w:a",
    ".next;return b.node};\nRa.prototype.remove=function(){var a=this.ia,b=t",
    "his.P;if(!b)throw Error(\"Next must be called at least once before remo",
    "ve.\");var c=b.w,b=b.next;c?c.next=b:a.g=b;b?b.w=c:a.j=c;a.D--;this.P=n",
    "ull};function I(a){this.f=a;this.h=this.o=!1;this.F=null}function K(a){",
    "return\"\\n  \"+a.toString().split(\"\\n\").join(\"\\n  \")}I.prototype",
    ".c=function(){return this.o};function Sa(a,b){a.o=b}function Ta(a,b){a.",
    "h=b}I.prototype.u=function(){return this.F};function L(a,b){a=a.evaluat",
    "e(b);return a instanceof G?+Qa(a):+a}function M(a,b){a=a.evaluate(b);re",
    "turn a instanceof G?Qa(a):\"\"+a}function O(a,b){a=a.evaluate(b);return",
    " a instanceof G?!!a.m():!!a};function Ua(a,b,c){I.call(this,a.f);this.S",
    "=a;this.Y=b;this.ca=c;this.o=b.c()||c.c();this.h=b.h||c.h;this.S==Va&&(",
    "c.h||c.c()||4==c.f||0==c.f||!b.u()?b.h||b.c()||4==b.f||0==b.f||!c.u()||",
    "(this.F={name:c.u().name,C:b}):this.F={name:b.u().name,C:c})}p(Ua,I);\n",
    "function P(a,b,c,d,e){b=b.evaluate(d);c=c.evaluate(d);var f;if(b instan",
    "ceof G&&c instanceof G){b=b.iterator();for(d=b.next();d;d=b.next())for(",
    "e=c.iterator(),f=e.next();f;f=e.next())if(a(D(d),D(f)))return!0;return!",
    "1}if(b instanceof G||c instanceof G){b instanceof G?(e=b,d=c):(e=c,d=b)",
    ";f=e.iterator();for(var g=typeof d,l=f.next();l;l=f.next()){switch(g){c",
    "ase \"number\":l=+D(l);break;case \"boolean\":l=!!D(l);break;case \"str",
    "ing\":l=D(l);break;default:throw Error(\"Illegal primitive type for com",
    "parison.\");\n}if(e==b&&a(l,d)||e==c&&a(d,l))return!0}return!1}return e",
    "?\"boolean\"==typeof b||\"boolean\"==typeof c?a(!!b,!!c):\"number\"==ty",
    "peof b||\"number\"==typeof c?a(+b,+c):a(b,c):a(+b,+c)}Ua.prototype.eval",
    "uate=function(a){return this.S.v(this.Y,this.ca,a)};Ua.prototype.toStri",
    "ng=function(){var a=\"Binary Expression: \"+this.S,a=a+K(this.Y);return",
    " a+=K(this.ca)};function Wa(a,b,c,d){this.la=a;this.aa=b;this.f=c;this.",
    "v=d}Wa.prototype.toString=function(){return this.la};var Xa={};\nfuncti",
    "on Q(a,b,c,d){if(Xa.hasOwnProperty(a))throw Error(\"Binary operator alr",
    "eady created: \"+a);a=new Wa(a,b,c,d);return Xa[a.toString()]=a}Q(\"div",
    "\",6,1,function(a,b,c){return L(a,c)/L(b,c)});Q(\"mod\",6,1,function(a,",
    "b,c){return L(a,c)%L(b,c)});Q(\"*\",6,1,function(a,b,c){return L(a,c)*L",
    "(b,c)});Q(\"+\",5,1,function(a,b,c){return L(a,c)+L(b,c)});Q(\"-\",5,1,",
    "function(a,b,c){return L(a,c)-L(b,c)});Q(\"<\",4,2,function(a,b,c){retu",
    "rn P(function(a,b){return a<b},a,b,c)});\nQ(\">\",4,2,function(a,b,c){r",
    "eturn P(function(a,b){return a>b},a,b,c)});Q(\"<=\",4,2,function(a,b,c)",
    "{return P(function(a,b){return a<=b},a,b,c)});Q(\">=\",4,2,function(a,b",
    ",c){return P(function(a,b){return a>=b},a,b,c)});var Va=Q(\"=\",3,2,fun",
    "ction(a,b,c){return P(function(a,b){return a==b},a,b,c,!0)});Q(\"!=\",3",
    ",2,function(a,b,c){return P(function(a,b){return a!=b},a,b,c,!0)});Q(\"",
    "and\",2,2,function(a,b,c){return O(a,c)&&O(b,c)});Q(\"or\",1,2,function",
    "(a,b,c){return O(a,c)||O(b,c)});function Ya(a,b){if(b.m()&&4!=a.f)throw",
    " Error(\"Primary expression must evaluate to nodeset if filter has pred",
    "icate(s).\");I.call(this,a.f);this.ba=a;this.b=b;this.o=a.c();this.h=a.",
    "h}p(Ya,I);Ya.prototype.evaluate=function(a){a=this.ba.evaluate(a);retur",
    "n Za(this.b,a)};Ya.prototype.toString=function(){var a=\"Filter:\"+K(th",
    "is.ba);return a+=K(this.b)};function $a(a,b){if(b.length<a.$)throw Erro",
    "r(\"Function \"+a.i+\" expects at least\"+a.$+\" arguments, \"+b.length",
    "+\" given\");if(null!==a.R&&b.length>a.R)throw Error(\"Function \"+a.i+",
    "\" expects at most \"+a.R+\" arguments, \"+b.length+\" given\");a.ja&&q",
    "(b,function(b,d){if(4!=b.f)throw Error(\"Argument \"+d+\" to function ",
    "\"+a.i+\" is not of type Nodeset: \"+b);});I.call(this,a.f);this.I=a;th",
    "is.N=b;Sa(this,a.o||v(b,function(a){return a.c()}));Ta(this,a.ha&&!b.le",
    "ngth||a.ga&&!!b.length||v(b,function(a){return a.h}))}\np($a,I);$a.prot",
    "otype.evaluate=function(a){return this.I.v.apply(null,ma(a,this.N))};$a",
    ".prototype.toString=function(){var a=\"Function: \"+this.I;if(this.N.le",
    "ngth)var b=u(this.N,function(a,b){return a+K(b)},\"Arguments:\"),a=a+K(",
    "b);return a};function ab(a,b,c,d,e,f,g,l,r){this.i=a;this.f=b;this.o=c;",
    "this.ha=d;this.ga=e;this.v=f;this.$=g;this.R=k(l)?l:g;this.ja=!!r}ab.pr",
    "ototype.toString=function(){return this.i};var bb={};\nfunction R(a,b,c",
    ",d,e,f,g,l){if(bb.hasOwnProperty(a))throw Error(\"Function already crea",
    "ted: \"+a+\".\");bb[a]=new ab(a,b,c,d,!1,e,f,g,l)}R(\"boolean\",2,!1,!1",
    ",function(a,b){return O(b,a)},1);R(\"ceiling\",1,!1,!1,function(a,b){re",
    "turn Math.ceil(L(b,a))},1);R(\"concat\",3,!1,!1,function(a,b){return u(",
    "oa(arguments,1),function(b,d){return b+M(d,a)},\"\")},2,null);R(\"conta",
    "ins\",2,!1,!1,function(a,b,c){b=M(b,a);a=M(c,a);return-1!=b.indexOf(a)}",
    ",2);R(\"count\",1,!1,!1,function(a,b){return b.evaluate(a).m()},1,1,!0)",
    ";\nR(\"false\",2,!1,!1,function(){return!1},0);R(\"floor\",1,!1,!1,func",
    "tion(a,b){return Math.floor(L(b,a))},1);R(\"id\",4,!1,!1,function(a,b){",
    "var c=a.l,d=9==c.nodeType?c:c.ownerDocument;a=M(b,a).split(/\\s+/);var ",
    "e=[];q(a,function(a){a=d.getElementById(a);!a||0<=ka(e,a)||e.push(a)});",
    "e.sort(Ba);var f=new G;q(e,function(a){f.add(a)});return f},1);R(\"lang",
    "\",2,!1,!1,function(){return!1},1);R(\"last\",1,!0,!1,function(a){if(1!",
    "=arguments.length)throw Error(\"Function last expects ()\");return a.j}",
    ",0);\nR(\"local-name\",3,!1,!0,function(a,b){return(a=b?Pa(b.evaluate(a",
    ")):a.l)?a.localName||a.nodeName.toLowerCase():\"\"},0,1,!0);R(\"name\",",
    "3,!1,!0,function(a,b){return(a=b?Pa(b.evaluate(a)):a.l)?a.nodeName.toLo",
    "werCase():\"\"},0,1,!0);R(\"namespace-uri\",3,!0,!1,function(){return\"",
    "\"},0,1,!0);R(\"normalize-space\",3,!1,!0,function(a,b){return(b?M(b,a)",
    ":D(a.l)).replace(/[\\s\\xa0]+/g,\" \").replace(/^\\s+|\\s+$/g,\"\")},0,",
    "1);R(\"not\",2,!1,!1,function(a,b){return!O(b,a)},1);\nR(\"number\",1,!",
    "1,!0,function(a,b){return b?L(b,a):+D(a.l)},0,1);R(\"position\",1,!0,!1",
    ",function(a){return a.ma},0);R(\"round\",1,!1,!1,function(a,b){return M",
    "ath.round(L(b,a))},1);R(\"starts-with\",2,!1,!1,function(a,b,c){b=M(b,a",
    ");a=M(c,a);return 0==b.lastIndexOf(a,0)},2);R(\"string\",3,!1,!0,functi",
    "on(a,b){return b?M(b,a):D(a.l)},0,1);R(\"string-length\",1,!1,!0,functi",
    "on(a,b){return(b?M(b,a):D(a.l)).length},0,1);\nR(\"substring\",3,!1,!1,",
    "function(a,b,c,d){c=L(c,a);if(isNaN(c)||Infinity==c||-Infinity==c)retur",
    "n\"\";d=d?L(d,a):Infinity;if(isNaN(d)||-Infinity===d)return\"\";c=Math.",
    "round(c)-1;var e=Math.max(c,0);a=M(b,a);return Infinity==d?a.substring(",
    "e):a.substring(e,c+Math.round(d))},2,3);R(\"substring-after\",3,!1,!1,f",
    "unction(a,b,c){b=M(b,a);a=M(c,a);c=b.indexOf(a);return-1==c?\"\":b.subs",
    "tring(c+a.length)},2);\nR(\"substring-before\",3,!1,!1,function(a,b,c){",
    "b=M(b,a);a=M(c,a);a=b.indexOf(a);return-1==a?\"\":b.substring(0,a)},2);",
    "R(\"sum\",1,!1,!1,function(a,b){a=b.evaluate(a).iterator();b=0;for(var ",
    "c=a.next();c;c=a.next())b+=+D(c);return b},1,1,!0);R(\"translate\",3,!1",
    ",!1,function(a,b,c,d){b=M(b,a);c=M(c,a);var e=M(d,a);d={};for(var f=0;f",
    "<c.length;f++)a=c.charAt(f),a in d||(d[a]=e.charAt(f));c=\"\";for(f=0;f",
    "<b.length;f++)a=b.charAt(f),c+=a in d?d[a]:a;return c},3);R(\"true\",2,",
    "!1,!1,function(){return!0},0);function H(a,b){this.ea=a;this.Z=k(b)?b:n",
    "ull;this.B=null;switch(a){case \"comment\":this.B=8;break;case \"text\"",
    ":this.B=3;break;case \"processing-instruction\":this.B=7;break;case \"n",
    "ode\":break;default:throw Error(\"Unexpected argument\");}}function cb(",
    "a){return\"comment\"==a||\"text\"==a||\"processing-instruction\"==a||\"",
    "node\"==a}H.prototype.matches=function(a){return null===this.B||this.B=",
    "=a.nodeType};H.prototype.getName=function(){return this.ea};\nH.prototy",
    "pe.toString=function(){var a=\"Kind Test: \"+this.ea;null===this.Z||(a+",
    "=K(this.Z));return a};function db(a){I.call(this,3);this.da=a.substring",
    "(1,a.length-1)}p(db,I);db.prototype.evaluate=function(){return this.da}",
    ";db.prototype.toString=function(){return\"Literal: \"+this.da};function",
    " eb(a,b){this.i=a.toLowerCase();a=\"*\"==this.i?\"*\":\"http://www.w3.o",
    "rg/1999/xhtml\";this.K=b?b.toLowerCase():a}eb.prototype.matches=functio",
    "n(a){var b=a.nodeType;if(1!=b&&2!=b)return!1;b=k(a.localName)?a.localNa",
    "me:a.nodeName;return\"*\"!=this.i&&this.i!=b.toLowerCase()?!1:\"*\"==th",
    "is.K?!0:this.K==(a.namespaceURI?a.namespaceURI.toLowerCase():\"http://w",
    "ww.w3.org/1999/xhtml\")};eb.prototype.getName=function(){return this.i}",
    ";\neb.prototype.toString=function(){return\"Name Test: \"+(\"http://www",
    ".w3.org/1999/xhtml\"==this.K?\"\":this.K+\":\")+this.i};function fb(a){",
    "I.call(this,1);this.fa=a}p(fb,I);fb.prototype.evaluate=function(){retur",
    "n this.fa};fb.prototype.toString=function(){return\"Number: \"+this.fa}",
    ";function gb(a,b){I.call(this,a.f);this.W=a;this.G=b;this.o=a.c();this.",
    "h=a.h;1==this.G.length&&(a=this.G[0],a.O||a.s!=hb||(a=a.M,\"*\"!=a.getN",
    "ame()&&(this.F={name:a.getName(),C:null})))}p(gb,I);function ib(){I.cal",
    "l(this,4)}p(ib,I);ib.prototype.evaluate=function(a){var b=new G;a=a.l;9",
    "==a.nodeType?b.add(a):b.add(a.ownerDocument);return b};ib.prototype.toS",
    "tring=function(){return\"Root Helper Expression\"};function jb(){I.call",
    "(this,4)}p(jb,I);jb.prototype.evaluate=function(a){var b=new G;b.add(a.",
    "l);return b};\njb.prototype.toString=function(){return\"Context Helper ",
    "Expression\"};function kb(a){return\"/\"==a||\"//\"==a}\ngb.prototype.e",
    "valuate=function(a){var b=this.W.evaluate(a);if(!(b instanceof G))throw",
    " Error(\"Filter expression must evaluate to nodeset.\");a=this.G;for(va",
    "r c=0,d=a.length;c<d&&b.m();c++){var e=a[c],f=b.iterator(e.s.A);if(e.c(",
    ")||e.s!=lb)if(e.c()||e.s!=mb){var g=f.next();for(b=e.evaluate(new B(g))",
    ";null!=(g=f.next());)g=e.evaluate(new B(g)),b=Oa(b,g)}else g=f.next(),b",
    "=e.evaluate(new B(g));else{for(g=f.next();(b=f.next())&&(!g.contains||g",
    ".contains(b))&&b.compareDocumentPosition(g)&8;g=b);b=e.evaluate(new B(g",
    "))}}return b};\ngb.prototype.toString=function(){var a=\"Path Expressio",
    "n:\"+K(this.W);if(this.G.length){var b=u(this.G,function(a,b){return a+",
    "K(b)},\"Steps:\");a+=K(b)}return a};function S(a,b){this.b=a;this.A=!!b",
    "}function Za(a,b,c){for(c=c||0;c<a.b.length;c++)for(var d=a.b[c],e=b.it",
    "erator(),f=b.m(),g,l=0;g=e.next();l++){var r=a.A?f-l:l+1;g=d.evaluate(n",
    "ew B(g,r,f));if(\"number\"==typeof g)r=r==g;else if(\"string\"==typeof ",
    "g||\"boolean\"==typeof g)r=!!g;else if(g instanceof G)r=0<g.m();else th",
    "row Error(\"Predicate.evaluate returned an unexpected type.\");r||e.rem",
    "ove()}return b}S.prototype.u=function(){return 0<this.b.length?this.b[0",
    "].u():null};\nS.prototype.c=function(){for(var a=0;a<this.b.length;a++)",
    "{var b=this.b[a];if(b.c()||1==b.f||0==b.f)return!0}return!1};S.prototyp",
    "e.m=function(){return this.b.length};S.prototype.toString=function(){re",
    "turn u(this.b,function(a,b){return a+K(b)},\"Predicates:\")};function T",
    "(a,b,c,d){I.call(this,4);this.s=a;this.M=b;this.b=c||new S([]);this.O=!",
    "!d;b=this.b.u();a.na&&b&&(this.F={name:b.name,C:b.C});this.o=this.b.c()",
    "}p(T,I);\nT.prototype.evaluate=function(a){var b=a.l,c=this.u(),d=null,",
    "e=null,f=0;c&&(d=c.name,e=c.C?M(c.C,a):null,f=1);if(this.O)if(this.c()|",
    "|this.s!=nb)if(b=(new T(ob,new H(\"node\"))).evaluate(a).iterator(),c=b",
    ".next())for(a=this.v(c,d,e,f);null!=(c=b.next());)a=Oa(a,this.v(c,d,e,f",
    "));else a=new G;else a=Ka(this.M,b,d,e),a=Za(this.b,a,f);else a=this.v(",
    "a.l,d,e,f);return a};T.prototype.v=function(a,b,c,d){a=this.s.I(this.M,",
    "a,b,c);return a=Za(this.b,a,d)};\nT.prototype.toString=function(){var a",
    "=\"Step:\"+K(\"Operator: \"+(this.O?\"//\":\"/\"));this.s.i&&(a+=K(\"Ax",
    "is: \"+this.s));a+=K(this.M);if(this.b.m()){var b=u(this.b.b,function(a",
    ",b){return a+K(b)},\"Predicates:\");a+=K(b)}return a};function pb(a,b,c",
    ",d){this.i=a;this.I=b;this.A=c;this.na=d}pb.prototype.toString=function",
    "(){return this.i};var qb={};function U(a,b,c,d){if(qb.hasOwnProperty(a)",
    ")throw Error(\"Axis already created: \"+a);b=new pb(a,b,c,!!d);return q",
    "b[a]=b}\nU(\"ancestor\",function(a,b){for(var c=new G;b=b.parentNode;)a",
    ".matches(b)&&c.unshift(b);return c},!0);U(\"ancestor-or-self\",function",
    "(a,b){var c=new G;do a.matches(b)&&c.unshift(b);while(b=b.parentNode);r",
    "eturn c},!0);\nvar hb=U(\"attribute\",function(a,b){var c=new G,d=a.get",
    "Name();if(b=b.attributes)if(a instanceof H&&null===a.B||\"*\"==d)for(d=",
    "0;a=b[d];d++)c.add(a);else(a=b.getNamedItem(d))&&c.add(a);return c},!1)",
    ",nb=U(\"child\",function(a,b,c,d,e){c=m(c)?c:null;d=m(d)?d:null;e=e||ne",
    "w G;for(b=b.firstChild;b;b=b.nextSibling)F(b,c,d)&&a.matches(b)&&e.add(",
    "b);return e},!1,!0);U(\"descendant\",Ka,!1,!0);\nvar ob=U(\"descendant-",
    "or-self\",function(a,b,c,d){var e=new G;F(b,c,d)&&a.matches(b)&&e.add(b",
    ");return Ka(a,b,c,d,e)},!1,!0),lb=U(\"following\",function(a,b,c,d){var",
    " e=new G;do for(var f=b;f=f.nextSibling;)F(f,c,d)&&a.matches(f)&&e.add(",
    "f),e=Ka(a,f,c,d,e);while(b=b.parentNode);return e},!1,!0);U(\"following",
    "-sibling\",function(a,b){for(var c=new G;b=b.nextSibling;)a.matches(b)&",
    "&c.add(b);return c},!1);U(\"namespace\",function(){return new G},!1);\n",
    "var rb=U(\"parent\",function(a,b){var c=new G;if(9==b.nodeType)return c",
    ";if(2==b.nodeType)return c.add(b.ownerElement),c;b=b.parentNode;a.match",
    "es(b)&&c.add(b);return c},!1),mb=U(\"preceding\",function(a,b,c,d){var ",
    "e=new G,f=[];do f.unshift(b);while(b=b.parentNode);for(var g=1,l=f.leng",
    "th;g<l;g++){var r=[];for(b=f[g];b=b.previousSibling;)r.unshift(b);for(v",
    "ar J=0,t=r.length;J<t;J++)b=r[J],F(b,c,d)&&a.matches(b)&&e.add(b),e=Ka(",
    "a,b,c,d,e)}return e},!0,!0);\nU(\"preceding-sibling\",function(a,b){for",
    "(var c=new G;b=b.previousSibling;)a.matches(b)&&c.unshift(b);return c},",
    "!0);var sb=U(\"self\",function(a,b){var c=new G;a.matches(b)&&c.add(b);",
    "return c},!1);function tb(a){I.call(this,1);this.V=a;this.o=a.c();this.",
    "h=a.h}p(tb,I);tb.prototype.evaluate=function(a){return-L(this.V,a)};tb.",
    "prototype.toString=function(){return\"Unary Expression: -\"+K(this.V)};",
    "function ub(a){I.call(this,4);this.L=a;Sa(this,v(this.L,function(a){ret",
    "urn a.c()}));Ta(this,v(this.L,function(a){return a.h}))}p(ub,I);ub.prot",
    "otype.evaluate=function(a){var b=new G;q(this.L,function(c){c=c.evaluat",
    "e(a);if(!(c instanceof G))throw Error(\"Path expression must evaluate t",
    "o NodeSet.\");b=Oa(b,c)});return b};ub.prototype.toString=function(){re",
    "turn u(this.L,function(a,b){return a+K(b)},\"Union Expression:\")};func",
    "tion vb(a,b){this.a=a;this.ka=b}function wb(a){for(var b,c=[];;){V(a,\"",
    "Missing right hand side of binary expression.\");b=xb(a);var d=a.a.next",
    "();if(!d)break;var e=(d=Xa[d]||null)&&d.aa;if(!e){a.a.back();break}for(",
    ";c.length&&e<=c[c.length-1].aa;)b=new Ua(c.pop(),c.pop(),b);c.push(b,d)",
    "}for(;c.length;)b=new Ua(c.pop(),c.pop(),b);return b}function V(a,b){if",
    "(a.a.empty())throw Error(b);}function yb(a,b){a=a.a.next();if(a!=b)thro",
    "w Error(\"Bad token, expected: \"+b+\" got: \"+a);}\nfunction zb(a){a=a",
    ".a.next();if(\")\"!=a)throw Error(\"Bad token: \"+a);}function Ab(a){a=",
    "a.a.next();if(2>a.length)throw Error(\"Unclosed literal string\");retur",
    "n new db(a)}\nfunction Bb(a){var b=[];if(kb(C(a.a))){var c=a.a.next();v",
    "ar d=C(a.a);if(\"/\"==c&&(a.a.empty()||\".\"!=d&&\"..\"!=d&&\"@\"!=d&&",
    "\"*\"!=d&&!/(?![0-9])[\\w]/.test(d)))return new ib;d=new ib;V(a,\"Missi",
    "ng next location step.\");c=Cb(a,c);b.push(c)}else{a:{c=C(a.a);d=c.char",
    "At(0);switch(d){case \"$\":throw Error(\"Variable reference not allowed",
    " in HTML XPath\");case \"(\":a.a.next();c=wb(a);V(a,'unclosed \"(\"');y",
    "b(a,\")\");break;case '\"':case \"'\":c=Ab(a);break;default:if(isNaN(+c",
    "))if(!cb(c)&&/(?![0-9])[\\w]/.test(d)&&\"(\"==C(a.a,\n1)){c=a.a.next();",
    "c=bb[c]||null;a.a.next();for(d=[];\")\"!=C(a.a);){V(a,\"Missing functio",
    "n argument list.\");d.push(wb(a));if(\",\"!=C(a.a))break;a.a.next()}V(a",
    ",\"Unclosed function argument list.\");zb(a);c=new $a(c,d)}else{c=null;",
    "break a}else c=new fb(+a.a.next())}\"[\"==C(a.a)&&(d=new S(Db(a)),c=new",
    " Ya(c,d))}if(c)if(kb(C(a.a)))d=c;else return c;else c=Cb(a,\"/\"),d=new",
    " jb,b.push(c)}for(;kb(C(a.a));)c=a.a.next(),V(a,\"Missing next location",
    " step.\"),c=Cb(a,c),b.push(c);return new gb(d,b)}\nfunction Cb(a,b){if(",
    "\"/\"!=b&&\"//\"!=b)throw Error('Step op should be \"/\" or \"//\"');if",
    "(\".\"==C(a.a)){var c=new T(sb,new H(\"node\"));a.a.next();return c}if(",
    "\"..\"==C(a.a))return c=new T(rb,new H(\"node\")),a.a.next(),c;if(\"@\"",
    "==C(a.a)){var d=hb;a.a.next();V(a,\"Missing attribute name\")}else if(",
    "\"::\"==C(a.a,1)){if(!/(?![0-9])[\\w]/.test(C(a.a).charAt(0)))throw Err",
    "or(\"Bad token: \"+a.a.next());var e=a.a.next();d=qb[e]||null;if(!d)thr",
    "ow Error(\"No axis with name: \"+e);a.a.next();V(a,\"Missing node name",
    "\")}else d=nb;e=\nC(a.a);if(/(?![0-9])[\\w\\*]/.test(e.charAt(0)))if(\"",
    "(\"==C(a.a,1)){if(!cb(e))throw Error(\"Invalid node type: \"+e);e=a.a.n",
    "ext();if(!cb(e))throw Error(\"Invalid type name: \"+e);yb(a,\"(\");V(a,",
    "\"Bad nodetype\");var f=C(a.a).charAt(0),g=null;if('\"'==f||\"'\"==f)g=",
    "Ab(a);V(a,\"Bad nodetype\");zb(a);e=new H(e,g)}else if(e=a.a.next(),f=e",
    ".indexOf(\":\"),-1==f)e=new eb(e);else{var g=e.substring(0,f);if(\"*\"=",
    "=g)var l=\"*\";else if(l=a.ka(g),!l)throw Error(\"Namespace prefix not ",
    "declared: \"+g);e=e.substr(f+1);e=new eb(e,l)}else throw Error(\"Bad to",
    "ken: \"+\na.a.next());a=new S(Db(a),d.A);return c||new T(d,e,a,\"//\"==",
    "b)}function Db(a){for(var b=[];\"[\"==C(a.a);){a.a.next();V(a,\"Missing",
    " predicate expression.\");var c=wb(a);b.push(c);V(a,\"Unclosed predicat",
    "e expression.\");yb(a,\"]\")}return b}function xb(a){if(\"-\"==C(a.a))r",
    "eturn a.a.next(),new tb(xb(a));var b=Bb(a);if(\"|\"!=C(a.a))a=b;else{fo",
    "r(b=[b];\"|\"==a.a.next();)V(a,\"Missing next union location path.\"),b",
    ".push(Bb(a));a.a.back();a=new ub(b)}return a};function Eb(a){switch(a.n",
    "odeType){case 1:return ia(Fb,a);case 9:return Eb(a.documentElement);cas",
    "e 11:case 10:case 6:case 12:return Gb;default:return a.parentNode?Eb(a.",
    "parentNode):Gb}}function Gb(){return null}function Fb(a,b){if(a.prefix=",
    "=b)return a.namespaceURI||\"http://www.w3.org/1999/xhtml\";var c=a.getA",
    "ttributeNode(\"xmlns:\"+b);return c&&c.specified?c.value||null:a.parent",
    "Node&&9!=a.parentNode.nodeType?Fb(a.parentNode,b):null};function Hb(a,b",
    "){if(!a.length)throw Error(\"Empty XPath expression.\");a=Ha(a);if(a.em",
    "pty())throw Error(\"Invalid XPath expression.\");b?\"function\"==ca(b)|",
    "|(b=ha(b.lookupNamespaceURI,b)):b=function(){return null};var c=wb(new ",
    "vb(a,b));if(!a.empty())throw Error(\"Bad token: \"+a.next());this.evalu",
    "ate=function(a,b){a=c.evaluate(new B(a));return new W(a,b)}}\nfunction ",
    "W(a,b){if(0==b)if(a instanceof G)b=4;else if(\"string\"==typeof a)b=2;e",
    "lse if(\"number\"==typeof a)b=1;else if(\"boolean\"==typeof a)b=3;else ",
    "throw Error(\"Unexpected evaluation result.\");if(2!=b&&1!=b&&3!=b&&!(a",
    " instanceof G))throw Error(\"value could not be converted to the specif",
    "ied type\");this.resultType=b;switch(b){case 2:this.stringValue=a insta",
    "nceof G?Qa(a):\"\"+a;break;case 1:this.numberValue=a instanceof G?+Qa(a",
    "):+a;break;case 3:this.booleanValue=a instanceof G?0<a.m():!!a;break;ca",
    "se 4:case 5:case 6:case 7:var c=\na.iterator();var d=[];for(var e=c.nex",
    "t();e;e=c.next())d.push(e);this.snapshotLength=a.m();this.invalidIterat",
    "orState=!1;break;case 8:case 9:this.singleNodeValue=Pa(a);break;default",
    ":throw Error(\"Unknown XPathResult type.\");}var f=0;this.iterateNext=f",
    "unction(){if(4!=b&&5!=b)throw Error(\"iterateNext called with wrong res",
    "ult type\");return f>=d.length?null:d[f++]};this.snapshotItem=function(",
    "a){if(6!=b&&7!=b)throw Error(\"snapshotItem called with wrong result ty",
    "pe\");return a>=d.length||0>a?null:d[a]}}\nW.ANY_TYPE=0;W.NUMBER_TYPE=1",
    ";W.STRING_TYPE=2;W.BOOLEAN_TYPE=3;W.UNORDERED_NODE_ITERATOR_TYPE=4;W.OR",
    "DERED_NODE_ITERATOR_TYPE=5;W.UNORDERED_NODE_SNAPSHOT_TYPE=6;W.ORDERED_N",
    "ODE_SNAPSHOT_TYPE=7;W.ANY_UNORDERED_NODE_TYPE=8;W.FIRST_ORDERED_NODE_TY",
    "PE=9;function Ib(a){this.lookupNamespaceURI=Eb(a)}\nba(\"wgxpath.instal",
    "l\",function(a,b){a=a||aa;var c=a.Document&&a.Document.prototype||a.doc",
    "ument;if(!c.evaluate||b)a.XPathResult=W,c.evaluate=function(a,b,c,g){re",
    "turn(new Hb(a,c)).evaluate(b,g)},c.createExpression=function(a,b){retur",
    "n new Hb(a,b)},c.createNSResolver=function(a){return new Ib(a)}});var J",
    "b=function(){var a={qa:\"http://www.w3.org/2000/svg\"};return function(",
    "b){return a[b]||null}}();\nfunction Kb(a,b){var c=z(a);if(!c.documentEl",
    "ement)return null;try{for(var d=c.createNSResolver?c.createNSResolver(c",
    ".documentElement):Jb,e={},f=c.getElementsByTagName(\"*\"),g=0;g<f.lengt",
    "h;++g){var l=f[g],r=l.namespaceURI;if(r&&!e[r]){var J=l.lookupPrefix(r)",
    ";if(!J)var t=r.match(\".*/(\\\\w+)/?$\"),J=t?t[1]:\"xhtml\";e[r]=J}}var",
    " x={},E;for(E in e)x[e[E]]=E;d=function(a){return x[a]||null};try{retur",
    "n c.evaluate(b,a,d,9,null)}catch(N){if(\"TypeError\"===N.name)return d=",
    "c.createNSResolver?c.createNSResolver(c.documentElement):\nJb,c.evaluat",
    "e(b,a,d,9,null);throw N;}}catch(N){throw new va(32,\"Unable to locate a",
    "n element with the xpath expression \"+b+\" because of the following er",
    "ror:\\n\"+N);}}\nfunction Lb(a,b){var c=function(){var c=Kb(b,a);return",
    " c?c.singleNodeValue||null:b.selectSingleNode?(c=z(b),c.setProperty&&c.",
    "setProperty(\"SelectionLanguage\",\"XPath\"),b.selectSingleNode(a)):nul",
    "l}();if(null!==c&&(!c||1!=c.nodeType))throw new va(32,'The result of th",
    "e xpath expression \"'+a+'\" is: '+c+\". It should be an element.\");re",
    "turn c};function Mb(a,b,c,d){this.top=a;this.right=b;this.bottom=c;this",
    ".left=d}h=Mb.prototype;h.clone=function(){return new Mb(this.top,this.r",
    "ight,this.bottom,this.left)};h.toString=function(){return\"(\"+this.top",
    "+\"t, \"+this.right+\"r, \"+this.bottom+\"b, \"+this.left+\"l)\"};h.con",
    "tains=function(a){return this&&a?a instanceof Mb?a.left>=this.left&&a.r",
    "ight<=this.right&&a.top>=this.top&&a.bottom<=this.bottom:a.x>=this.left",
    "&&a.x<=this.right&&a.y>=this.top&&a.y<=this.bottom:!1};\nh.expand=funct",
    "ion(a,b,c,d){ea(a)?(this.top-=a.top,this.right+=a.right,this.bottom+=a.",
    "bottom,this.left-=a.left):(this.top-=a,this.right+=Number(b),this.botto",
    "m+=Number(c),this.left-=Number(d));return this};h.ceil=function(){this.",
    "top=Math.ceil(this.top);this.right=Math.ceil(this.right);this.bottom=Ma",
    "th.ceil(this.bottom);this.left=Math.ceil(this.left);return this};\nh.fl",
    "oor=function(){this.top=Math.floor(this.top);this.right=Math.floor(this",
    ".right);this.bottom=Math.floor(this.bottom);this.left=Math.floor(this.l",
    "eft);return this};h.round=function(){this.top=Math.round(this.top);this",
    ".right=Math.round(this.right);this.bottom=Math.round(this.bottom);this.",
    "left=Math.round(this.left);return this};h.translate=function(a,b){a ins",
    "tanceof y?(this.left+=a.x,this.right+=a.x,this.top+=a.y,this.bottom+=a.",
    "y):(this.left+=a,this.right+=a,n(b)&&(this.top+=b,this.bottom+=b));retu",
    "rn this};\nh.scale=function(a,b){b=n(b)?b:a;this.left*=a;this.right*=a;",
    "this.top*=b;this.bottom*=b;return this};function X(a,b,c,d){this.left=a",
    ";this.top=b;this.width=c;this.height=d}h=X.prototype;h.clone=function()",
    "{return new X(this.left,this.top,this.width,this.height)};h.toString=fu",
    "nction(){return\"(\"+this.left+\", \"+this.top+\" - \"+this.width+\"w x",
    " \"+this.height+\"h)\"};h.contains=function(a){return a instanceof y?a.",
    "x>=this.left&&a.x<=this.left+this.width&&a.y>=this.top&&a.y<=this.top+t",
    "his.height:this.left<=a.left&&this.left+this.width>=a.left+a.width&&thi",
    "s.top<=a.top&&this.top+this.height>=a.top+a.height};\nh.ceil=function()",
    "{this.left=Math.ceil(this.left);this.top=Math.ceil(this.top);this.width",
    "=Math.ceil(this.width);this.height=Math.ceil(this.height);return this};",
    "h.floor=function(){this.left=Math.floor(this.left);this.top=Math.floor(",
    "this.top);this.width=Math.floor(this.width);this.height=Math.floor(this",
    ".height);return this};h.round=function(){this.left=Math.round(this.left",
    ");this.top=Math.round(this.top);this.width=Math.round(this.width);this.",
    "height=Math.round(this.height);return this};\nh.translate=function(a,b)",
    "{a instanceof y?(this.left+=a.x,this.top+=a.y):(this.left+=a,n(b)&&(thi",
    "s.top+=b));return this};h.scale=function(a,b){b=n(b)?b:a;this.left*=a;t",
    "his.width*=a;this.top*=b;this.height*=b;return this};var Nb=\"function",
    "\"===typeof ShadowRoot;function Ob(a){for(a=a.parentNode;a&&1!=a.nodeTy",
    "pe&&9!=a.nodeType&&11!=a.nodeType;)a=a.parentNode;return A(a)?a:null}\n",
    "function Y(a,b){b=ja(b);if(\"float\"==b||\"cssFloat\"==b||\"styleFloat",
    "\"==b)b=\"cssFloat\";a:{var c=b;var d=z(a);if(d.defaultView&&d.defaultV",
    "iew.getComputedStyle&&(d=d.defaultView.getComputedStyle(a,null))){c=d[c",
    "]||d.getPropertyValue(c)||\"\";break a}c=\"\"}a=c||Pb(a,b);if(null===a)",
    "a=null;else if(0<=ka(qa,b)){b:{var e=a.match(ta);if(e&&(b=Number(e[1]),",
    "c=Number(e[2]),d=Number(e[3]),e=Number(e[4]),0<=b&&255>=b&&0<=c&&255>=c",
    "&&0<=d&&255>=d&&0<=e&&1>=e)){b=[b,c,d,e];break b}b=null}if(!b)b:{if(d=a",
    ".match(ua))if(b=Number(d[1]),\nc=Number(d[2]),d=Number(d[3]),0<=b&&255>",
    "=b&&0<=c&&255>=c&&0<=d&&255>=d){b=[b,c,d,1];break b}b=null}if(!b)b:{b=a",
    ".toLowerCase();c=pa[b.toLowerCase()];if(!c&&(c=\"#\"==b.charAt(0)?b:\"#",
    "\"+b,4==c.length&&(c=c.replace(ra,\"#$1$1$2$2$3$3\")),!sa.test(c))){b=n",
    "ull;break b}b=[parseInt(c.substr(1,2),16),parseInt(c.substr(3,2),16),pa",
    "rseInt(c.substr(5,2),16),1]}a=b?\"rgba(\"+b.join(\", \")+\")\":a}return",
    " a}\nfunction Pb(a,b){var c=a.currentStyle||a.style,d=c[b];!k(d)&&\"fun",
    "ction\"==ca(c.getPropertyValue)&&(d=c.getPropertyValue(b));return\"inhe",
    "rit\"!=d?k(d)?d:null:(a=Ob(a))?Pb(a,b):null}\nfunction Qb(a,b,c){functi",
    "on d(a){var b=Rb(a);return 0<b.height&&0<b.width?!0:A(a,\"PATH\")&&(0<b",
    ".height||0<b.width)?(a=Y(a,\"stroke-width\"),!!a&&0<parseInt(a,10)):\"h",
    "idden\"!=Y(a,\"overflow\")&&v(a.childNodes,function(a){return 3==a.node",
    "Type||A(a)&&d(a)})}function e(a){return Sb(a)==Z&&la(a.childNodes,funct",
    "ion(a){return!A(a)||e(a)||!d(a)})}if(!A(a))throw Error(\"Argument to is",
    "Shown must be of type Element\");if(A(a,\"BODY\"))return!0;if(A(a,\"OPT",
    "ION\")||A(a,\"OPTGROUP\"))return a=Ea(a,function(a){return A(a,\"SELECT",
    "\")}),\n!!a&&Qb(a,!0,c);var f=Tb(a);if(f)return!!f.X&&0<f.rect.width&&0",
    "<f.rect.height&&Qb(f.X,b,c);if(A(a,\"INPUT\")&&\"hidden\"==a.type.toLow",
    "erCase()||A(a,\"NOSCRIPT\"))return!1;f=Y(a,\"visibility\");return\"coll",
    "apse\"!=f&&\"hidden\"!=f&&c(a)&&(b||0!=Ub(a))&&d(a)?!e(a):!1}var Z=\"hi",
    "dden\";\nfunction Sb(a){function b(a){function b(a){return a==g?!0:0==Y",
    "(a,\"display\").lastIndexOf(\"inline\",0)||\"absolute\"==c&&\"static\"=",
    "=Y(a,\"position\")?!1:!0}var c=Y(a,\"position\");if(\"fixed\"==c)return",
    " J=!0,a==g?null:g;for(a=Ob(a);a&&!b(a);)a=Ob(a);return a}function c(a){",
    "var b=a;if(\"visible\"==r)if(a==g&&l)b=l;else if(a==l)return{x:\"visibl",
    "e\",y:\"visible\"};b={x:Y(b,\"overflow-x\"),y:Y(b,\"overflow-y\")};a==g",
    "&&(b.x=\"visible\"==b.x?\"auto\":b.x,b.y=\"visible\"==b.y?\"auto\":b.y)",
    ";return b}function d(a){if(a==g){var b=(new Fa(f)).H;\na=b.scrollingEle",
    "ment?b.scrollingElement:b.body||b.documentElement;b=b.parentWindow||b.d",
    "efaultView;a=new y(b.pageXOffset||a.scrollLeft,b.pageYOffset||a.scrollT",
    "op)}else a=new y(a.scrollLeft,a.scrollTop);return a}var e=Vb(a);var f=z",
    "(a),g=f.documentElement,l=f.body,r=Y(g,\"overflow\"),J;for(a=b(a);a;a=b",
    "(a)){var t=c(a);if(\"visible\"!=t.x||\"visible\"!=t.y){var x=Rb(a);if(0",
    "==x.width||0==x.height)return Z;var E=e.right<x.left,N=e.bottom<x.top;i",
    "f(E&&\"hidden\"==t.x||N&&\"hidden\"==t.y)return Z;if(E&&\"visible\"!=t.",
    "x||\nN&&\"visible\"!=t.y){E=d(a);N=e.bottom<x.top-E.y;if(e.right<x.left",
    "-E.x&&\"visible\"!=t.x||N&&\"visible\"!=t.x)return Z;e=Sb(a);return e==",
    "Z?Z:\"scroll\"}E=e.left>=x.left+x.width;x=e.top>=x.top+x.height;if(E&&",
    "\"hidden\"==t.x||x&&\"hidden\"==t.y)return Z;if(E&&\"visible\"!=t.x||x&",
    "&\"visible\"!=t.y){if(J&&(t=d(a),e.left>=g.scrollWidth-t.x||e.right>=g.",
    "scrollHeight-t.y))return Z;e=Sb(a);return e==Z?Z:\"scroll\"}}}return\"n",
    "one\"}\nfunction Rb(a){var b=Tb(a);if(b)return b.rect;if(A(a,\"HTML\"))",
    "return a=z(a),a=((a?a.parentWindow||a.defaultView:window)||window).docu",
    "ment,a=\"CSS1Compat\"==a.compatMode?a.documentElement:a.body,a=new xa(a",
    ".clientWidth,a.clientHeight),new X(0,0,a.width,a.height);try{var c=a.ge",
    "tBoundingClientRect()}catch(d){return new X(0,0,0,0)}return new X(c.lef",
    "t,c.top,c.right-c.left,c.bottom-c.top)}\nfunction Tb(a){var b=A(a,\"MAP",
    "\");if(!b&&!A(a,\"AREA\"))return null;var c=b?a:A(a.parentNode,\"MAP\")",
    "?a.parentNode:null,d=null,e=null;c&&c.name&&(d=Lb('/descendant::*[@usem",
    "ap = \"#'+c.name+'\"]',z(c)))&&(e=Rb(d),b||\"default\"==a.shape.toLower",
    "Case()||(a=Wb(a),b=Math.min(Math.max(a.left,0),e.width),c=Math.min(Math",
    ".max(a.top,0),e.height),e=new X(b+e.left,c+e.top,Math.min(a.width,e.wid",
    "th-b),Math.min(a.height,e.height-c))));return{X:d,rect:e||new X(0,0,0,0",
    ")}}\nfunction Wb(a){var b=a.shape.toLowerCase();a=a.coords.split(\",\")",
    ";if(\"rect\"==b&&4==a.length){var b=a[0],c=a[1];return new X(b,c,a[2]-b",
    ",a[3]-c)}if(\"circle\"==b&&3==a.length)return b=a[2],new X(a[0]-b,a[1]-",
    "b,2*b,2*b);if(\"poly\"==b&&2<a.length){for(var b=a[0],c=a[1],d=b,e=c,f=",
    "2;f+1<a.length;f+=2)b=Math.min(b,a[f]),d=Math.max(d,a[f]),c=Math.min(c,",
    "a[f+1]),e=Math.max(e,a[f+1]);return new X(b,c,d-b,e-c)}return new X(0,0",
    ",0,0)}function Vb(a){a=Rb(a);return new Mb(a.top,a.left+a.width,a.top+a",
    ".height,a.left)}\nfunction Ub(a){var b=1,c=Y(a,\"opacity\");c&&(b=Numbe",
    "r(c));(a=Ob(a))&&(b*=Ub(a));return b};ba(\"_\",function(a,b){var c=Nb?f",
    "unction(b){if(\"none\"==Y(b,\"display\"))return!1;do{var d=b.parentNode",
    ";if(b.getDestinationInsertionPoints){var f=b.getDestinationInsertionPoi",
    "nts();0<f.length&&(d=f[f.length-1])}if(d instanceof ShadowRoot)return!0",
    ";!d||9!=d.nodeType&&11!=d.nodeType||(d=null)}while(a&&1!=a.nodeType);re",
    "turn!d||c(d)}:function(a){if(\"none\"==Y(a,\"display\"))return!1;a=Ob(a",
    ");return!a||c(a)};return Qb(a,!!b,c)});; return this._.apply(null,argum",
    "ents);}.apply({navigator:typeof window!='undefined'?window.navigator:nu",
    "ll,document:typeof window!='undefined'?window.document:null}, arguments",
    ");}",
    NULL
};

const char* const IS_ENABLED[] = {
    "function(){return function(){var aa=this;function h(a){return\"string\"",
    "==typeof a}function ba(a,b){a=a.split(\".\");var c=aa;a[0]in c||!c.exec",
    "Script||c.execScript(\"var \"+a[0]);for(var d;a.length&&(d=a.shift());)",
    "a.length||void 0===b?c=c[d]&&c[d]!==Object.prototype[d]?c[d]:c[d]={}:c[",
    "d]=b}\nfunction ca(a){var b=typeof a;if(\"object\"==b)if(a){if(a instan",
    "ceof Array)return\"array\";if(a instanceof Object)return b;var c=Object",
    ".prototype.toString.call(a);if(\"[object Window]\"==c)return\"object\";",
    "if(\"[object Array]\"==c||\"number\"==typeof a.length&&\"undefined\"!=t",
    "ypeof a.splice&&\"undefined\"!=typeof a.propertyIsEnumerable&&!a.proper",
    "tyIsEnumerable(\"splice\"))return\"array\";if(\"[object Function]\"==c|",
    "|\"undefined\"!=typeof a.call&&\"undefined\"!=typeof a.propertyIsEnumer",
    "able&&!a.propertyIsEnumerable(\"call\"))return\"function\"}else return",
    "\"null\";\nelse if(\"function\"==b&&\"undefined\"==typeof a.call)return",
    "\"object\";return b}function da(a,b,c){return a.call.apply(a.bind,argum",
    "ents)}function ea(a,b,c){if(!a)throw Error();if(2<arguments.length){var",
    " d=Array.prototype.slice.call(arguments,2);return function(){var c=Arra",
    "y.prototype.slice.call(arguments);Array.prototype.unshift.apply(c,d);re",
    "turn a.apply(b,c)}}return function(){return a.apply(b,arguments)}}\nfun",
    "ction fa(a,b,c){fa=Function.prototype.bind&&-1!=Function.prototype.bind",
    ".toString().indexOf(\"native code\")?da:ea;return fa.apply(null,argumen",
    "ts)}function ga(a,b){var c=Array.prototype.slice.call(arguments,1);retu",
    "rn function(){var b=c.slice();b.push.apply(b,arguments);return a.apply(",
    "this,b)}}\nfunction k(a){var b=m;function c(){}c.prototype=b.prototype;",
    "a.na=b.prototype;a.prototype=new c;a.prototype.constructor=a;a.ma=funct",
    "ion(a,c,f){for(var d=Array(arguments.length-2),e=2;e<arguments.length;e",
    "++)d[e-2]=arguments[e];return b.prototype[c].apply(a,d)}};function n(a,",
    "b){for(var c=a.length,d=h(a)?a.split(\"\"):a,e=0;e<c;e++)e in d&&b.call",
    "(void 0,d[e],e,a)}function p(a,b,c){var d=c;n(a,function(c,f){d=b.call(",
    "void 0,d,c,f,a)});return d}function q(a,b){for(var c=a.length,d=h(a)?a.",
    "split(\"\"):a,e=0;e<c;e++)if(e in d&&b.call(void 0,d[e],e,a))return!0;r",
    "eturn!1}function ha(a){return Array.prototype.concat.apply([],arguments",
    ")}function ia(a,b,c){return 2>=arguments.length?Array.prototype.slice.c",
    "all(a,b):Array.prototype.slice.call(a,b,c)};function ja(a){for(;a&&1!=a",
    ".nodeType;)a=a.previousSibling;return a}function ka(a,b){if(!a||!b)retu",
    "rn!1;if(a.contains&&1==b.nodeType)return a==b||a.contains(b);if(\"undef",
    "ined\"!=typeof a.compareDocumentPosition)return a==b||!!(a.compareDocum",
    "entPosition(b)&16);for(;b&&a!=b;)b=b.parentNode;return b==a}\nfunction ",
    "la(a,b){if(a==b)return 0;if(a.compareDocumentPosition)return a.compareD",
    "ocumentPosition(b)&2?1:-1;if(\"sourceIndex\"in a||a.parentNode&&\"sourc",
    "eIndex\"in a.parentNode){var c=1==a.nodeType,d=1==b.nodeType;if(c&&d)re",
    "turn a.sourceIndex-b.sourceIndex;var e=a.parentNode,f=b.parentNode;retu",
    "rn e==f?na(a,b):!c&&ka(e,b)?-1*oa(a,b):!d&&ka(f,a)?oa(b,a):(c?a.sourceI",
    "ndex:e.sourceIndex)-(d?b.sourceIndex:f.sourceIndex)}d=9==a.nodeType?a:a",
    ".ownerDocument||a.document;c=d.createRange();c.selectNode(a);c.collapse",
    "(!0);\na=d.createRange();a.selectNode(b);a.collapse(!0);return c.compar",
    "eBoundaryPoints(aa.Range.START_TO_END,a)}function oa(a,b){var c=a.paren",
    "tNode;if(c==b)return-1;for(;b.parentNode!=c;)b=b.parentNode;return na(b",
    ",a)}function na(a,b){for(;b=b.previousSibling;)if(b==a)return-1;return ",
    "1}function pa(a,b){for(var c=0;a;){if(b(a))return a;a=a.parentNode;c++}",
    "return null};function r(a,b){b&&\"string\"!==typeof b&&(b=b.toString())",
    ";return!!a&&1==a.nodeType&&(!b||a.tagName.toUpperCase()==b)};/*\n\n The",
    " MIT License\n\n Copyright (c) 2007 Cybozu Labs, Inc.\n Copyright (c) 2",
    "012 Google Inc.\n\n Permission is hereby granted, free of charge, to an",
    "y person obtaining a copy\n of this software and associated documentati",
    "on files (the \"Software\"), to\n deal in the Software without restrict",
    "ion, including without limitation the\n rights to use, copy, modify, me",
    "rge, publish, distribute, sublicense, and/or\n sell copies of the Softw",
    "are, and to permit persons to whom the Software is\n furnished to do so",
    ", subject to the following conditions:\n\n The above copyright notice a",
    "nd this permission notice shall be included in\n all copies or substant",
    "ial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", W",
    "ITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LI",
    "MITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR ",
    "PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIG",
    "HT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETH",
    "ER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n FROM, OUT OF ",
    "OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n IN TH",
    "E SOFTWARE.\n*/\nfunction t(a,b,c){this.l=a;this.ka=b||1;this.j=c||1};f",
    "unction u(a){this.S=a;this.I=0}function qa(a){a=a.match(ra);for(var b=0",
    ";b<a.length;b++)sa.test(a[b])&&a.splice(b,1);return new u(a)}var ra=/",
    "\\$?(?:(?![0-9-\\.])(?:\\*|[\\w-\\.]+):)?(?![0-9-\\.])(?:\\*|[\\w-\\.]+",
    ")|\\/\\/|\\.\\.|::|\\d+(?:\\.\\d*)?|\\.\\d+|\"[^\"]*\"|'[^']*'|[!<>]=|",
    "\\s+|./g,sa=/^\\s/;function v(a,b){return a.S[a.I+(b||0)]}u.prototype.n",
    "ext=function(){return this.S[this.I++]};u.prototype.back=function(){thi",
    "s.I--};u.prototype.empty=function(){return this.S.length<=this.I};funct",
    "ion x(a){var b=null,c=a.nodeType;1==c&&(b=a.textContent,b=void 0==b||nu",
    "ll==b?a.innerText:b,b=void 0==b||null==b?\"\":b);if(\"string\"!=typeof ",
    "b)if(9==c||1==c){a=9==c?a.documentElement:a.firstChild;for(var c=0,d=[]",
    ",b=\"\";a;){do 1!=a.nodeType&&(b+=a.nodeValue),d[c++]=a;while(a=a.first",
    "Child);for(;c&&!(a=d[--c].nextSibling););}}else b=a.nodeValue;return\"",
    "\"+b}\nfunction y(a,b,c){if(null===b)return!0;try{if(!a.getAttribute)re",
    "turn!1}catch(d){return!1}return null==c?!!a.getAttribute(b):a.getAttrib",
    "ute(b,2)==c}function z(a,b,c,d,e){return ta.call(null,a,b,h(c)?c:null,h",
    "(d)?d:null,e||new A)}\nfunction ta(a,b,c,d,e){b.getElementsByName&&d&&",
    "\"name\"==c?(b=b.getElementsByName(d),n(b,function(b){a.matches(b)&&e.a",
    "dd(b)})):b.getElementsByClassName&&d&&\"class\"==c?(b=b.getElementsByCl",
    "assName(d),n(b,function(b){b.className==d&&a.matches(b)&&e.add(b)})):a ",
    "instanceof B?ua(a,b,c,d,e):b.getElementsByTagName&&(b=b.getElementsByTa",
    "gName(a.getName()),n(b,function(a){y(a,c,d)&&e.add(a)}));return e}funct",
    "ion ua(a,b,c,d,e){for(b=b.firstChild;b;b=b.nextSibling)y(b,c,d)&&a.matc",
    "hes(b)&&e.add(b),ua(a,b,c,d,e)};function A(){this.j=this.g=null;this.D=",
    "0}function va(a){this.node=a;this.next=this.w=null}function wa(a,b){if(",
    "!a.g)return b;if(!b.g)return a;var c=a.g;b=b.g;for(var d=null,e,f=0;c&&",
    "b;)c.node==b.node?(e=c,c=c.next,b=b.next):0<la(c.node,b.node)?(e=b,b=b.",
    "next):(e=c,c=c.next),(e.w=d)?d.next=e:a.g=e,d=e,f++;for(e=c||b;e;)e.w=d",
    ",d=d.next=e,f++,e=e.next;a.j=d;a.D=f;return a}A.prototype.unshift=funct",
    "ion(a){a=new va(a);a.next=this.g;this.j?this.g.w=a:this.g=this.j=a;this",
    ".g=a;this.D++};\nA.prototype.add=function(a){a=new va(a);a.w=this.j;thi",
    "s.g?this.j.next=a:this.g=this.j=a;this.j=a;this.D++};function C(a){retu",
    "rn(a=a.g)?a.node:null}A.prototype.m=function(){return this.D};function ",
    "D(a){return(a=C(a))?x(a):\"\"}A.prototype.iterator=function(a){return n",
    "ew xa(this,!!a)};function xa(a,b){this.ga=a;this.T=(this.A=b)?a.j:a.g;t",
    "his.O=null}xa.prototype.next=function(){var a=this.T;if(null==a)return ",
    "null;var b=this.O=a;this.T=this.A?a.w:a.next;return b.node};\nxa.protot",
    "ype.remove=function(){var a=this.ga,b=this.O;if(!b)throw Error(\"Next m",
    "ust be called at least once before remove.\");var c=b.w,b=b.next;c?c.ne",
    "xt=b:a.g=b;b?b.w=c:a.j=c;a.D--;this.O=null};function m(a){this.f=a;this",
    ".h=this.o=!1;this.F=null}function E(a){return\"\\n  \"+a.toString().spl",
    "it(\"\\n\").join(\"\\n  \")}m.prototype.c=function(){return this.o};fun",
    "ction ya(a,b){a.o=b}function za(a,b){a.h=b}m.prototype.u=function(){ret",
    "urn this.F};function F(a,b){a=a.evaluate(b);return a instanceof A?+D(a)",
    ":+a}function G(a,b){a=a.evaluate(b);return a instanceof A?D(a):\"\"+a}f",
    "unction H(a,b){a=a.evaluate(b);return a instanceof A?!!a.m():!!a};funct",
    "ion I(a,b,c){m.call(this,a.f);this.R=a;this.W=b;this.aa=c;this.o=b.c()|",
    "|c.c();this.h=b.h||c.h;this.R==Aa&&(c.h||c.c()||4==c.f||0==c.f||!b.u()?",
    "b.h||b.c()||4==b.f||0==b.f||!c.u()||(this.F={name:c.u().name,C:b}):this",
    ".F={name:b.u().name,C:c})}k(I);\nfunction J(a,b,c,d,e){b=b.evaluate(d);",
    "c=c.evaluate(d);var f;if(b instanceof A&&c instanceof A){b=b.iterator()",
    ";for(d=b.next();d;d=b.next())for(e=c.iterator(),f=e.next();f;f=e.next()",
    ")if(a(x(d),x(f)))return!0;return!1}if(b instanceof A||c instanceof A){b",
    " instanceof A?(e=b,d=c):(e=c,d=b);f=e.iterator();for(var g=typeof d,l=f",
    ".next();l;l=f.next()){switch(g){case \"number\":l=+x(l);break;case \"bo",
    "olean\":l=!!x(l);break;case \"string\":l=x(l);break;default:throw Error",
    "(\"Illegal primitive type for comparison.\");\n}if(e==b&&a(l,d)||e==c&&",
    "a(d,l))return!0}return!1}return e?\"boolean\"==typeof b||\"boolean\"==t",
    "ypeof c?a(!!b,!!c):\"number\"==typeof b||\"number\"==typeof c?a(+b,+c):",
    "a(b,c):a(+b,+c)}I.prototype.evaluate=function(a){return this.R.v(this.W",
    ",this.aa,a)};I.prototype.toString=function(){var a=\"Binary Expression:",
    " \"+this.R,a=a+E(this.W);return a+=E(this.aa)};function Ba(a,b,c,d){thi",
    "s.ja=a;this.Z=b;this.f=c;this.v=d}Ba.prototype.toString=function(){retu",
    "rn this.ja};var Ca={};\nfunction K(a,b,c,d){if(Ca.hasOwnProperty(a))thr",
    "ow Error(\"Binary operator already created: \"+a);a=new Ba(a,b,c,d);ret",
    "urn Ca[a.toString()]=a}K(\"div\",6,1,function(a,b,c){return F(a,c)/F(b,",
    "c)});K(\"mod\",6,1,function(a,b,c){return F(a,c)%F(b,c)});K(\"*\",6,1,f",
    "unction(a,b,c){return F(a,c)*F(b,c)});K(\"+\",5,1,function(a,b,c){retur",
    "n F(a,c)+F(b,c)});K(\"-\",5,1,function(a,b,c){return F(a,c)-F(b,c)});K(",
    "\"<\",4,2,function(a,b,c){return J(function(a,b){return a<b},a,b,c)});",
    "\nK(\">\",4,2,function(a,b,c){return J(function(a,b){return a>b},a,b,c)",
    "});K(\"<=\",4,2,function(a,b,c){return J(function(a,b){return a<=b},a,b",
    ",c)});K(\">=\",4,2,function(a,b,c){return J(function(a,b){return a>=b},",
    "a,b,c)});var Aa=K(\"=\",3,2,function(a,b,c){return J(function(a,b){retu",
    "rn a==b},a,b,c,!0)});K(\"!=\",3,2,function(a,b,c){return J(function(a,b",
    "){return a!=b},a,b,c,!0)});K(\"and\",2,2,function(a,b,c){return H(a,c)&",
    "&H(b,c)});K(\"or\",1,2,function(a,b,c){return H(a,c)||H(b,c)});function",
    " L(a,b){if(b.m()&&4!=a.f)throw Error(\"Primary expression must evaluate",
    " to nodeset if filter has predicate(s).\");m.call(this,a.f);this.$=a;th",
    "is.b=b;this.o=a.c();this.h=a.h}k(L);L.prototype.evaluate=function(a){a=",
    "this.$.evaluate(a);return Da(this.b,a)};L.prototype.toString=function()",
    "{var a=\"Filter:\"+E(this.$);return a+=E(this.b)};function M(a,b){if(b.",
    "length<a.Y)throw Error(\"Function \"+a.i+\" expects at least\"+a.Y+\" a",
    "rguments, \"+b.length+\" given\");if(null!==a.P&&b.length>a.P)throw Err",
    "or(\"Function \"+a.i+\" expects at most \"+a.P+\" arguments, \"+b.lengt",
    "h+\" given\");a.ha&&n(b,function(b,d){if(4!=b.f)throw Error(\"Argument ",
    "\"+d+\" to function \"+a.i+\" is not of type Nodeset: \"+b);});m.call(t",
    "his,a.f);this.H=a;this.M=b;ya(this,a.o||q(b,function(a){return a.c()}))",
    ";za(this,a.fa&&!b.length||a.ea&&!!b.length||q(b,function(a){return a.h}",
    "))}k(M);\nM.prototype.evaluate=function(a){return this.H.v.apply(null,h",
    "a(a,this.M))};M.prototype.toString=function(){var a=\"Function: \"+this",
    ".H;if(this.M.length)var b=p(this.M,function(a,b){return a+E(b)},\"Argum",
    "ents:\"),a=a+E(b);return a};function Ea(a,b,c,d,e,f,g,l,w){this.i=a;thi",
    "s.f=b;this.o=c;this.fa=d;this.ea=e;this.v=f;this.Y=g;this.P=void 0!==l?",
    "l:g;this.ha=!!w}Ea.prototype.toString=function(){return this.i};var Fa=",
    "{};\nfunction N(a,b,c,d,e,f,g,l){if(Fa.hasOwnProperty(a))throw Error(\"",
    "Function already created: \"+a+\".\");Fa[a]=new Ea(a,b,c,d,!1,e,f,g,l)}",
    "N(\"boolean\",2,!1,!1,function(a,b){return H(b,a)},1);N(\"ceiling\",1,!",
    "1,!1,function(a,b){return Math.ceil(F(b,a))},1);N(\"concat\",3,!1,!1,fu",
    "nction(a,b){return p(ia(arguments,1),function(b,d){return b+G(d,a)},\"",
    "\")},2,null);N(\"contains\",2,!1,!1,function(a,b,c){b=G(b,a);a=G(c,a);r",
    "eturn-1!=b.indexOf(a)},2);N(\"count\",1,!1,!1,function(a,b){return b.ev",
    "aluate(a).m()},1,1,!0);\nN(\"false\",2,!1,!1,function(){return!1},0);N(",
    "\"floor\",1,!1,!1,function(a,b){return Math.floor(F(b,a))},1);N(\"id\",",
    "4,!1,!1,function(a,b){var c=a.l,d=9==c.nodeType?c:c.ownerDocument;a=G(b",
    ",a).split(/\\s+/);var e=[];n(a,function(a){a=d.getElementById(a);var b;",
    "if(!(b=!a)){a:if(h(e))b=h(a)&&1==a.length?e.indexOf(a,0):-1;else{for(b=",
    "0;b<e.length;b++)if(b in e&&e[b]===a)break a;b=-1}b=0<=b}b||e.push(a)})",
    ";e.sort(la);var f=new A;n(e,function(a){f.add(a)});return f},1);N(\"lan",
    "g\",2,!1,!1,function(){return!1},1);\nN(\"last\",1,!0,!1,function(a){if",
    "(1!=arguments.length)throw Error(\"Function last expects ()\");return a",
    ".j},0);N(\"local-name\",3,!1,!0,function(a,b){return(a=b?C(b.evaluate(a",
    ")):a.l)?a.localName||a.nodeName.toLowerCase():\"\"},0,1,!0);N(\"name\",",
    "3,!1,!0,function(a,b){return(a=b?C(b.evaluate(a)):a.l)?a.nodeName.toLow",
    "erCase():\"\"},0,1,!0);N(\"namespace-uri\",3,!0,!1,function(){return\"",
    "\"},0,1,!0);\nN(\"normalize-space\",3,!1,!0,function(a,b){return(b?G(b,",
    "a):x(a.l)).replace(/[\\s\\xa0]+/g,\" \").replace(/^\\s+|\\s+$/g,\"\")},",
    "0,1);N(\"not\",2,!1,!1,function(a,b){return!H(b,a)},1);N(\"number\",1,!",
    "1,!0,function(a,b){return b?F(b,a):+x(a.l)},0,1);N(\"position\",1,!0,!1",
    ",function(a){return a.ka},0);N(\"round\",1,!1,!1,function(a,b){return M",
    "ath.round(F(b,a))},1);N(\"starts-with\",2,!1,!1,function(a,b,c){b=G(b,a",
    ");a=G(c,a);return 0==b.lastIndexOf(a,0)},2);N(\"string\",3,!1,!0,functi",
    "on(a,b){return b?G(b,a):x(a.l)},0,1);\nN(\"string-length\",1,!1,!0,func",
    "tion(a,b){return(b?G(b,a):x(a.l)).length},0,1);N(\"substring\",3,!1,!1,",
    "function(a,b,c,d){c=F(c,a);if(isNaN(c)||Infinity==c||-Infinity==c)retur",
    "n\"\";d=d?F(d,a):Infinity;if(isNaN(d)||-Infinity===d)return\"\";c=Math.",
    "round(c)-1;var e=Math.max(c,0);a=G(b,a);return Infinity==d?a.substring(",
    "e):a.substring(e,c+Math.round(d))},2,3);N(\"substring-after\",3,!1,!1,f",
    "unction(a,b,c){b=G(b,a);a=G(c,a);c=b.indexOf(a);return-1==c?\"\":b.subs",
    "tring(c+a.length)},2);\nN(\"substring-before\",3,!1,!1,function(a,b,c){",
    "b=G(b,a);a=G(c,a);a=b.indexOf(a);return-1==a?\"\":b.substring(0,a)},2);",
    "N(\"sum\",1,!1,!1,function(a,b){a=b.evaluate(a).iterator();b=0;for(var ",
    "c=a.next();c;c=a.next())b+=+x(c);return b},1,1,!0);N(\"translate\",3,!1",
    ",!1,function(a,b,c,d){b=G(b,a);c=G(c,a);var e=G(d,a);d={};for(var f=0;f",
    "<c.length;f++)a=c.charAt(f),a in d||(d[a]=e.charAt(f));c=\"\";for(f=0;f",
    "<b.length;f++)a=b.charAt(f),c+=a in d?d[a]:a;return c},3);N(\"true\",2,",
    "!1,!1,function(){return!0},0);function B(a,b){this.ca=a;this.X=void 0!=",
    "=b?b:null;this.B=null;switch(a){case \"comment\":this.B=8;break;case \"",
    "text\":this.B=3;break;case \"processing-instruction\":this.B=7;break;ca",
    "se \"node\":break;default:throw Error(\"Unexpected argument\");}}functi",
    "on Ga(a){return\"comment\"==a||\"text\"==a||\"processing-instruction\"=",
    "=a||\"node\"==a}B.prototype.matches=function(a){return null===this.B||t",
    "his.B==a.nodeType};B.prototype.getName=function(){return this.ca};\nB.p",
    "rototype.toString=function(){var a=\"Kind Test: \"+this.ca;null===this.",
    "X||(a+=E(this.X));return a};function O(a){m.call(this,3);this.ba=a.subs",
    "tring(1,a.length-1)}k(O);O.prototype.evaluate=function(){return this.ba",
    "};O.prototype.toString=function(){return\"Literal: \"+this.ba};function",
    " P(a,b){this.i=a.toLowerCase();a=\"*\"==this.i?\"*\":\"http://www.w3.or",
    "g/1999/xhtml\";this.J=b?b.toLowerCase():a}P.prototype.matches=function(",
    "a){var b=a.nodeType;if(1!=b&&2!=b)return!1;b=void 0!==a.localName?a.loc",
    "alName:a.nodeName;return\"*\"!=this.i&&this.i!=b.toLowerCase()?!1:\"*\"",
    "==this.J?!0:this.J==(a.namespaceURI?a.namespaceURI.toLowerCase():\"http",
    "://www.w3.org/1999/xhtml\")};P.prototype.getName=function(){return this",
    ".i};\nP.prototype.toString=function(){return\"Name Test: \"+(\"http://w",
    "ww.w3.org/1999/xhtml\"==this.J?\"\":this.J+\":\")+this.i};function Q(a)",
    "{m.call(this,1);this.da=a}k(Q);Q.prototype.evaluate=function(){return t",
    "his.da};Q.prototype.toString=function(){return\"Number: \"+this.da};fun",
    "ction R(a,b){m.call(this,a.f);this.V=a;this.G=b;this.o=a.c();this.h=a.h",
    ";1==this.G.length&&(a=this.G[0],a.N||a.s!=Ha||(a=a.L,\"*\"!=a.getName()",
    "&&(this.F={name:a.getName(),C:null})))}k(R);function S(){m.call(this,4)",
    "}k(S);S.prototype.evaluate=function(a){var b=new A;a=a.l;9==a.nodeType?",
    "b.add(a):b.add(a.ownerDocument);return b};S.prototype.toString=function",
    "(){return\"Root Helper Expression\"};function T(){m.call(this,4)}k(T);T",
    ".prototype.evaluate=function(a){var b=new A;b.add(a.l);return b};\nT.pr",
    "ototype.toString=function(){return\"Context Helper Expression\"};functi",
    "on Ia(a){return\"/\"==a||\"//\"==a}\nR.prototype.evaluate=function(a){v",
    "ar b=this.V.evaluate(a);if(!(b instanceof A))throw Error(\"Filter expre",
    "ssion must evaluate to nodeset.\");a=this.G;for(var c=0,d=a.length;c<d&",
    "&b.m();c++){var e=a[c],f=b.iterator(e.s.A);if(e.c()||e.s!=Ja)if(e.c()||",
    "e.s!=Ka){var g=f.next();for(b=e.evaluate(new t(g));null!=(g=f.next());)",
    "g=e.evaluate(new t(g)),b=wa(b,g)}else g=f.next(),b=e.evaluate(new t(g))",
    ";else{for(g=f.next();(b=f.next())&&(!g.contains||g.contains(b))&&b.comp",
    "areDocumentPosition(g)&8;g=b);b=e.evaluate(new t(g))}}return b};\nR.pro",
    "totype.toString=function(){var a=\"Path Expression:\"+E(this.V);if(this",
    ".G.length){var b=p(this.G,function(a,b){return a+E(b)},\"Steps:\");a+=E",
    "(b)}return a};function U(a,b){this.b=a;this.A=!!b}function Da(a,b,c){fo",
    "r(c=c||0;c<a.b.length;c++)for(var d=a.b[c],e=b.iterator(),f=b.m(),g,l=0",
    ";g=e.next();l++){var w=a.A?f-l:l+1;g=d.evaluate(new t(g,w,f));if(\"numb",
    "er\"==typeof g)w=w==g;else if(\"string\"==typeof g||\"boolean\"==typeof",
    " g)w=!!g;else if(g instanceof A)w=0<g.m();else throw Error(\"Predicate.",
    "evaluate returned an unexpected type.\");w||e.remove()}return b}U.proto",
    "type.u=function(){return 0<this.b.length?this.b[0].u():null};\nU.protot",
    "ype.c=function(){for(var a=0;a<this.b.length;a++){var b=this.b[a];if(b.",
    "c()||1==b.f||0==b.f)return!0}return!1};U.prototype.m=function(){return ",
    "this.b.length};U.prototype.toString=function(){return p(this.b,function",
    "(a,b){return a+E(b)},\"Predicates:\")};function V(a,b,c,d){m.call(this,",
    "4);this.s=a;this.L=b;this.b=c||new U([]);this.N=!!d;b=this.b.u();a.la&&",
    "b&&(this.F={name:b.name,C:b.C});this.o=this.b.c()}k(V);\nV.prototype.ev",
    "aluate=function(a){var b=a.l,c=this.u(),d=null,e=null,f=0;c&&(d=c.name,",
    "e=c.C?G(c.C,a):null,f=1);if(this.N)if(this.c()||this.s!=La)if(b=(new V(",
    "Ma,new B(\"node\"))).evaluate(a).iterator(),c=b.next())for(a=this.v(c,d",
    ",e,f);null!=(c=b.next());)a=wa(a,this.v(c,d,e,f));else a=new A;else a=z",
    "(this.L,b,d,e),a=Da(this.b,a,f);else a=this.v(a.l,d,e,f);return a};V.pr",
    "ototype.v=function(a,b,c,d){a=this.s.H(this.L,a,b,c);return a=Da(this.b",
    ",a,d)};\nV.prototype.toString=function(){var a=\"Step:\"+E(\"Operator: ",
    "\"+(this.N?\"//\":\"/\"));this.s.i&&(a+=E(\"Axis: \"+this.s));a+=E(this",
    ".L);if(this.b.m()){var b=p(this.b.b,function(a,b){return a+E(b)},\"Pred",
    "icates:\");a+=E(b)}return a};function Na(a,b,c,d){this.i=a;this.H=b;thi",
    "s.A=c;this.la=d}Na.prototype.toString=function(){return this.i};var Oa=",
    "{};function W(a,b,c,d){if(Oa.hasOwnProperty(a))throw Error(\"Axis alrea",
    "dy created: \"+a);b=new Na(a,b,c,!!d);return Oa[a]=b}\nW(\"ancestor\",f",
    "unction(a,b){for(var c=new A;b=b.parentNode;)a.matches(b)&&c.unshift(b)",
    ";return c},!0);W(\"ancestor-or-self\",function(a,b){var c=new A;do a.ma",
    "tches(b)&&c.unshift(b);while(b=b.parentNode);return c},!0);\nvar Ha=W(",
    "\"attribute\",function(a,b){var c=new A,d=a.getName();if(b=b.attributes",
    ")if(a instanceof B&&null===a.B||\"*\"==d)for(d=0;a=b[d];d++)c.add(a);el",
    "se(a=b.getNamedItem(d))&&c.add(a);return c},!1),La=W(\"child\",function",
    "(a,b,c,d,e){c=h(c)?c:null;d=h(d)?d:null;e=e||new A;for(b=b.firstChild;b",
    ";b=b.nextSibling)y(b,c,d)&&a.matches(b)&&e.add(b);return e},!1,!0);W(\"",
    "descendant\",z,!1,!0);\nvar Ma=W(\"descendant-or-self\",function(a,b,c,",
    "d){var e=new A;y(b,c,d)&&a.matches(b)&&e.add(b);return z(a,b,c,d,e)},!1",
    ",!0),Ja=W(\"following\",function(a,b,c,d){var e=new A;do for(var f=b;f=",
    "f.nextSibling;)y(f,c,d)&&a.matches(f)&&e.add(f),e=z(a,f,c,d,e);while(b=",
    "b.parentNode);return e},!1,!0);W(\"following-sibling\",function(a,b){fo",
    "r(var c=new A;b=b.nextSibling;)a.matches(b)&&c.add(b);return c},!1);W(",
    "\"namespace\",function(){return new A},!1);\nvar Pa=W(\"parent\",functi",
    "on(a,b){var c=new A;if(9==b.nodeType)return c;if(2==b.nodeType)return c",
    ".add(b.ownerElement),c;b=b.parentNode;a.matches(b)&&c.add(b);return c},",
    "!1),Ka=W(\"preceding\",function(a,b,c,d){var e=new A,f=[];do f.unshift(",
    "b);while(b=b.parentNode);for(var g=1,l=f.length;g<l;g++){var w=[];for(b",
    "=f[g];b=b.previousSibling;)w.unshift(b);for(var ma=0,db=w.length;ma<db;",
    "ma++)b=w[ma],y(b,c,d)&&a.matches(b)&&e.add(b),e=z(a,b,c,d,e)}return e},",
    "!0,!0);\nW(\"preceding-sibling\",function(a,b){for(var c=new A;b=b.prev",
    "iousSibling;)a.matches(b)&&c.unshift(b);return c},!0);var Qa=W(\"self\"",
    ",function(a,b){var c=new A;a.matches(b)&&c.add(b);return c},!1);functio",
    "n X(a){m.call(this,1);this.U=a;this.o=a.c();this.h=a.h}k(X);X.prototype",
    ".evaluate=function(a){return-F(this.U,a)};X.prototype.toString=function",
    "(){return\"Unary Expression: -\"+E(this.U)};function Ra(a){m.call(this,",
    "4);this.K=a;ya(this,q(this.K,function(a){return a.c()}));za(this,q(this",
    ".K,function(a){return a.h}))}k(Ra);Ra.prototype.evaluate=function(a){va",
    "r b=new A;n(this.K,function(c){c=c.evaluate(a);if(!(c instanceof A))thr",
    "ow Error(\"Path expression must evaluate to NodeSet.\");b=wa(b,c)});ret",
    "urn b};Ra.prototype.toString=function(){return p(this.K,function(a,b){r",
    "eturn a+E(b)},\"Union Expression:\")};function Sa(a,b){this.a=a;this.ia",
    "=b}function Ta(a){for(var b,c=[];;){Y(a,\"Missing right hand side of bi",
    "nary expression.\");b=Ua(a);var d=a.a.next();if(!d)break;var e=(d=Ca[d]",
    "||null)&&d.Z;if(!e){a.a.back();break}for(;c.length&&e<=c[c.length-1].Z;",
    ")b=new I(c.pop(),c.pop(),b);c.push(b,d)}for(;c.length;)b=new I(c.pop(),",
    "c.pop(),b);return b}function Y(a,b){if(a.a.empty())throw Error(b);}func",
    "tion Va(a,b){a=a.a.next();if(a!=b)throw Error(\"Bad token, expected: \"",
    "+b+\" got: \"+a);}\nfunction Wa(a){a=a.a.next();if(\")\"!=a)throw Error",
    "(\"Bad token: \"+a);}function Xa(a){a=a.a.next();if(2>a.length)throw Er",
    "ror(\"Unclosed literal string\");return new O(a)}\nfunction Ya(a){var b",
    "=[];if(Ia(v(a.a))){var c=a.a.next();var d=v(a.a);if(\"/\"==c&&(a.a.empt",
    "y()||\".\"!=d&&\"..\"!=d&&\"@\"!=d&&\"*\"!=d&&!/(?![0-9])[\\w]/.test(d)",
    "))return new S;d=new S;Y(a,\"Missing next location step.\");c=Za(a,c);b",
    ".push(c)}else{a:{c=v(a.a);d=c.charAt(0);switch(d){case \"$\":throw Erro",
    "r(\"Variable reference not allowed in HTML XPath\");case \"(\":a.a.next",
    "();c=Ta(a);Y(a,'unclosed \"(\"');Va(a,\")\");break;case '\"':case \"'\"",
    ":c=Xa(a);break;default:if(isNaN(+c))if(!Ga(c)&&/(?![0-9])[\\w]/.test(d)",
    "&&\"(\"==v(a.a,\n1)){c=a.a.next();c=Fa[c]||null;a.a.next();for(d=[];\")",
    "\"!=v(a.a);){Y(a,\"Missing function argument list.\");d.push(Ta(a));if(",
    "\",\"!=v(a.a))break;a.a.next()}Y(a,\"Unclosed function argument list.\"",
    ");Wa(a);c=new M(c,d)}else{c=null;break a}else c=new Q(+a.a.next())}\"[",
    "\"==v(a.a)&&(d=new U($a(a)),c=new L(c,d))}if(c)if(Ia(v(a.a)))d=c;else r",
    "eturn c;else c=Za(a,\"/\"),d=new T,b.push(c)}for(;Ia(v(a.a));)c=a.a.nex",
    "t(),Y(a,\"Missing next location step.\"),c=Za(a,c),b.push(c);return new",
    " R(d,b)}\nfunction Za(a,b){if(\"/\"!=b&&\"//\"!=b)throw Error('Step op ",
    "should be \"/\" or \"//\"');if(\".\"==v(a.a)){var c=new V(Qa,new B(\"no",
    "de\"));a.a.next();return c}if(\"..\"==v(a.a))return c=new V(Pa,new B(\"",
    "node\")),a.a.next(),c;if(\"@\"==v(a.a)){var d=Ha;a.a.next();Y(a,\"Missi",
    "ng attribute name\")}else if(\"::\"==v(a.a,1)){if(!/(?![0-9])[\\w]/.tes",
    "t(v(a.a).charAt(0)))throw Error(\"Bad token: \"+a.a.next());var e=a.a.n",
    "ext();d=Oa[e]||null;if(!d)throw Error(\"No axis with name: \"+e);a.a.ne",
    "xt();Y(a,\"Missing node name\")}else d=La;e=\nv(a.a);if(/(?![0-9])[\\w",
    "\\*]/.test(e.charAt(0)))if(\"(\"==v(a.a,1)){if(!Ga(e))throw Error(\"Inv",
    "alid node type: \"+e);e=a.a.next();if(!Ga(e))throw Error(\"Invalid type",
    " name: \"+e);Va(a,\"(\");Y(a,\"Bad nodetype\");var f=v(a.a).charAt(0),g",
    "=null;if('\"'==f||\"'\"==f)g=Xa(a);Y(a,\"Bad nodetype\");Wa(a);e=new B(",
    "e,g)}else if(e=a.a.next(),f=e.indexOf(\":\"),-1==f)e=new P(e);else{var ",
    "g=e.substring(0,f);if(\"*\"==g)var l=\"*\";else if(l=a.ia(g),!l)throw E",
    "rror(\"Namespace prefix not declared: \"+g);e=e.substr(f+1);e=new P(e,l",
    ")}else throw Error(\"Bad token: \"+\na.a.next());a=new U($a(a),d.A);ret",
    "urn c||new V(d,e,a,\"//\"==b)}function $a(a){for(var b=[];\"[\"==v(a.a)",
    ";){a.a.next();Y(a,\"Missing predicate expression.\");var c=Ta(a);b.push",
    "(c);Y(a,\"Unclosed predicate expression.\");Va(a,\"]\")}return b}functi",
    "on Ua(a){if(\"-\"==v(a.a))return a.a.next(),new X(Ua(a));var b=Ya(a);if",
    "(\"|\"!=v(a.a))a=b;else{for(b=[b];\"|\"==a.a.next();)Y(a,\"Missing next",
    " union location path.\"),b.push(Ya(a));a.a.back();a=new Ra(b)}return a}",
    ";function ab(a){switch(a.nodeType){case 1:return ga(bb,a);case 9:return",
    " ab(a.documentElement);case 11:case 10:case 6:case 12:return cb;default",
    ":return a.parentNode?ab(a.parentNode):cb}}function cb(){return null}fun",
    "ction bb(a,b){if(a.prefix==b)return a.namespaceURI||\"http://www.w3.org",
    "/1999/xhtml\";var c=a.getAttributeNode(\"xmlns:\"+b);return c&&c.specif",
    "ied?c.value||null:a.parentNode&&9!=a.parentNode.nodeType?bb(a.parentNod",
    "e,b):null};function eb(a,b){if(!a.length)throw Error(\"Empty XPath expr",
    "ession.\");a=qa(a);if(a.empty())throw Error(\"Invalid XPath expression.",
    "\");b?\"function\"==ca(b)||(b=fa(b.lookupNamespaceURI,b)):b=function(){",
    "return null};var c=Ta(new Sa(a,b));if(!a.empty())throw Error(\"Bad toke",
    "n: \"+a.next());this.evaluate=function(a,b){a=c.evaluate(new t(a));retu",
    "rn new Z(a,b)}}\nfunction Z(a,b){if(0==b)if(a instanceof A)b=4;else if(",
    "\"string\"==typeof a)b=2;else if(\"number\"==typeof a)b=1;else if(\"boo",
    "lean\"==typeof a)b=3;else throw Error(\"Unexpected evaluation result.\"",
    ");if(2!=b&&1!=b&&3!=b&&!(a instanceof A))throw Error(\"value could not ",
    "be converted to the specified type\");this.resultType=b;switch(b){case ",
    "2:this.stringValue=a instanceof A?D(a):\"\"+a;break;case 1:this.numberV",
    "alue=a instanceof A?+D(a):+a;break;case 3:this.booleanValue=a instanceo",
    "f A?0<a.m():!!a;break;case 4:case 5:case 6:case 7:var c=\na.iterator();",
    "var d=[];for(var e=c.next();e;e=c.next())d.push(e);this.snapshotLength=",
    "a.m();this.invalidIteratorState=!1;break;case 8:case 9:this.singleNodeV",
    "alue=C(a);break;default:throw Error(\"Unknown XPathResult type.\");}var",
    " f=0;this.iterateNext=function(){if(4!=b&&5!=b)throw Error(\"iterateNex",
    "t called with wrong result type\");return f>=d.length?null:d[f++]};this",
    ".snapshotItem=function(a){if(6!=b&&7!=b)throw Error(\"snapshotItem call",
    "ed with wrong result type\");return a>=d.length||0>a?null:d[a]}}\nZ.ANY",
    "_TYPE=0;Z.NUMBER_TYPE=1;Z.STRING_TYPE=2;Z.BOOLEAN_TYPE=3;Z.UNORDERED_NO",
    "DE_ITERATOR_TYPE=4;Z.ORDERED_NODE_ITERATOR_TYPE=5;Z.UNORDERED_NODE_SNAP",
    "SHOT_TYPE=6;Z.ORDERED_NODE_SNAPSHOT_TYPE=7;Z.ANY_UNORDERED_NODE_TYPE=8;",
    "Z.FIRST_ORDERED_NODE_TYPE=9;function fb(a){this.lookupNamespaceURI=ab(a",
    ")}\nba(\"wgxpath.install\",function(a,b){a=a||aa;var c=a.Document&&a.Do",
    "cument.prototype||a.document;if(!c.evaluate||b)a.XPathResult=Z,c.evalua",
    "te=function(a,b,c,g){return(new eb(a,c)).evaluate(b,g)},c.createExpress",
    "ion=function(a,b){return new eb(a,b)},c.createNSResolver=function(a){re",
    "turn new fb(a)}});var gb=\"BUTTON INPUT OPTGROUP OPTION SELECT TEXTAREA",
    "\".split(\" \");function hb(a){return q(gb,function(b){return r(a,b)})?",
    "a.disabled?!1:a.parentNode&&1==a.parentNode.nodeType&&r(a,\"OPTGROUP\")",
    "||r(a,\"OPTION\")?hb(a.parentNode):!pa(a,function(a){var b=a.parentNode",
    ";if(b&&r(b,\"FIELDSET\")&&b.disabled){if(!r(a,\"LEGEND\"))return!0;for(",
    ";a=void 0!==a.previousElementSibling?a.previousElementSibling:ja(a.prev",
    "iousSibling);)if(r(a,\"LEGEND\"))return!0}return!1}):!0};ba(\"_\",hb);;",
    " return this._.apply(null,arguments);}.apply({navigator:typeof window!=",
    "'undefined'?window.navigator:null,document:typeof window!='undefined'?w",
    "indow.document:null}, arguments);}",
    NULL
};

const char* const SUBMIT[] = {
    "function(){return function(){var f,k=this;function l(a){return\"string",
    "\"==typeof a}function aa(a,b){a=a.split(\".\");var c=k;a[0]in c||!c.exe",
    "cScript||c.execScript(\"var \"+a[0]);for(var d;a.length&&(d=a.shift());",
    ")a.length||void 0===b?c=c[d]&&c[d]!==Object.prototype[d]?c[d]:c[d]={}:c",
    "[d]=b}\nfunction ba(a){var b=typeof a;if(\"object\"==b)if(a){if(a insta",
    "nceof Array)return\"array\";if(a instanceof Object)return b;var c=Objec",
    "t.prototype.toString.call(a);if(\"[object Window]\"==c)return\"object\"",
    ";if(\"[object Array]\"==c||\"number\"==typeof a.length&&\"undefined\"!=",
    "typeof a.splice&&\"undefined\"!=typeof a.propertyIsEnumerable&&!a.prope",
    "rtyIsEnumerable(\"splice\"))return\"array\";if(\"[object Function]\"==c",
    "||\"undefined\"!=typeof a.call&&\"undefined\"!=typeof a.propertyIsEnume",
    "rable&&!a.propertyIsEnumerable(\"call\"))return\"function\"}else return",
    "\"null\";\nelse if(\"function\"==b&&\"undefined\"==typeof a.call)return",
    "\"object\";return b}function ca(a,b,c){return a.call.apply(a.bind,argum",
    "ents)}function da(a,b,c){if(!a)throw Error();if(2<arguments.length){var",
    " d=Array.prototype.slice.call(arguments,2);return function(){var c=Arra",
    "y.prototype.slice.call(arguments);Array.prototype.unshift.apply(c,d);re",
    "turn a.apply(b,c)}}return function(){return a.apply(b,arguments)}}\nfun",
    "ction ea(a,b,c){ea=Function.prototype.bind&&-1!=Function.prototype.bind",
    ".toString().indexOf(\"native code\")?ca:da;return ea.apply(null,argumen",
    "ts)}function fa(a,b){var c=Array.prototype.slice.call(arguments,1);retu",
    "rn function(){var b=c.slice();b.push.apply(b,arguments);return a.apply(",
    "this,b)}}\nfunction n(a,b){function c(){}c.prototype=b.prototype;a.xa=b",
    ".prototype;a.prototype=new c;a.prototype.constructor=a;a.wa=function(a,",
    "c,g){for(var d=Array(arguments.length-2),e=2;e<arguments.length;e++)d[e",
    "-2]=arguments[e];return b.prototype[c].apply(a,d)}};var ga=window;var h",
    "a=String.prototype.trim?function(a){return a.trim()}:function(a){return",
    " a.replace(/^[\\s\\xa0]+|[\\s\\xa0]+$/g,\"\")};function ia(a,b){return ",
    "a<b?-1:a>b?1:0};function p(a,b){for(var c=a.length,d=l(a)?a.split(\"\")",
    ":a,e=0;e<c;e++)e in d&&b.call(void 0,d[e],e,a)}function q(a,b,c){var d=",
    "c;p(a,function(c,g){d=b.call(void 0,d,c,g,a)});return d}function r(a,b)",
    "{for(var c=a.length,d=l(a)?a.split(\"\"):a,e=0;e<c;e++)if(e in d&&b.cal",
    "l(void 0,d[e],e,a))return!0;return!1}function ja(a){return Array.protot",
    "ype.concat.apply([],arguments)}function ka(a,b,c){return 2>=arguments.l",
    "ength?Array.prototype.slice.call(a,b):Array.prototype.slice.call(a,b,c)",
    "};function t(a,b){this.code=a;this.state=u[a]||v;this.message=b||\"\";a",
    "=this.state.replace(/((?:^|\\s+)[a-z])/g,function(a){return a.toUpperCa",
    "se().replace(/^[\\s\\xa0]+/g,\"\")});b=a.length-5;if(0>b||a.indexOf(\"E",
    "rror\",b)!=b)a+=\"Error\";this.name=a;a=Error(this.message);a.name=this",
    ".name;this.stack=a.stack||\"\"}n(t,Error);var v=\"unknown error\",u={15",
    ":\"element not selectable\",11:\"element not visible\"};u[31]=v;u[30]=v",
    ";u[24]=\"invalid cookie domain\";u[29]=\"invalid element coordinates\";",
    "u[12]=\"invalid element state\";\nu[32]=\"invalid selector\";u[51]=\"in",
    "valid selector\";u[52]=\"invalid selector\";u[17]=\"javascript error\";",
    "u[405]=\"unsupported operation\";u[34]=\"move target out of bounds\";u[",
    "27]=\"no such alert\";u[7]=\"no such element\";u[8]=\"no such frame\";u",
    "[23]=\"no such window\";u[28]=\"script timeout\";u[33]=\"session not cr",
    "eated\";u[10]=\"stale element reference\";u[21]=\"timeout\";u[25]=\"una",
    "ble to set cookie\";u[26]=\"unexpected alert open\";u[13]=v;u[9]=\"unkn",
    "own command\";t.prototype.toString=function(){return this.name+\": \"+t",
    "his.message};var w;a:{var la=k.navigator;if(la){var ma=la.userAgent;if(",
    "ma){w=ma;break a}}w=\"\"};function na(a){var b=oa;Object.prototype.hasO",
    "wnProperty.call(b,\"528\")||(b[\"528\"]=a(\"528\"))};var pa=-1!=w.index",
    "Of(\"Macintosh\"),qa=-1!=w.indexOf(\"Windows\"),ra,sa=\"\",ta=/WebKit",
    "\\/(\\S+)/.exec(w);ta&&(sa=ta?ta[1]:\"\");ra=sa;var oa={};\nfunction ua",
    "(){na(function(){for(var a=0,b=ha(String(ra)).split(\".\"),c=ha(\"528\"",
    ").split(\".\"),d=Math.max(b.length,c.length),e=0;0==a&&e<d;e++){var g=b",
    "[e]||\"\",h=c[e]||\"\";do{g=/(\\d*)(\\D*)(.*)/.exec(g)||[\"\",\"\",\"\"",
    ",\"\"];h=/(\\d*)(\\D*)(.*)/.exec(h)||[\"\",\"\",\"\",\"\"];if(0==g[0].l",
    "ength&&0==h[0].length)break;a=ia(0==g[1].length?0:parseInt(g[1],10),0==",
    "h[1].length?0:parseInt(h[1],10))||ia(0==g[2].length,0==h[2].length)||ia",
    "(g[2],h[2]);g=g[3];h=h[3]}while(0==a)}return 0<=a})};function va(a,b){i",
    "f(!a||!b)return!1;if(a.contains&&1==b.nodeType)return a==b||a.contains(",
    "b);if(\"undefined\"!=typeof a.compareDocumentPosition)return a==b||!!(a",
    ".compareDocumentPosition(b)&16);for(;b&&a!=b;)b=b.parentNode;return b==",
    "a}\nfunction wa(a,b){if(a==b)return 0;if(a.compareDocumentPosition)retu",
    "rn a.compareDocumentPosition(b)&2?1:-1;if(\"sourceIndex\"in a||a.parent",
    "Node&&\"sourceIndex\"in a.parentNode){var c=1==a.nodeType,d=1==b.nodeTy",
    "pe;if(c&&d)return a.sourceIndex-b.sourceIndex;var e=a.parentNode,g=b.pa",
    "rentNode;return e==g?xa(a,b):!c&&va(e,b)?-1*ya(a,b):!d&&va(g,a)?ya(b,a)",
    ":(c?a.sourceIndex:e.sourceIndex)-(d?b.sourceIndex:g.sourceIndex)}d=za(a",
    ");c=d.createRange();c.selectNode(a);c.collapse(!0);a=d.createRange();a.",
    "selectNode(b);\na.collapse(!0);return c.compareBoundaryPoints(k.Range.S",
    "TART_TO_END,a)}function ya(a,b){var c=a.parentNode;if(c==b)return-1;for",
    "(;b.parentNode!=c;)b=b.parentNode;return xa(b,a)}function xa(a,b){for(;",
    "b=b.previousSibling;)if(b==a)return-1;return 1}function za(a){return 9=",
    "=a.nodeType?a:a.ownerDocument||a.document}function Ba(a,b,c){a&&!c&&(a=",
    "a.parentNode);for(c=0;a;){if(b(a))return a;a=a.parentNode;c++}return nu",
    "ll};function x(a,b){b&&\"string\"!==typeof b&&(b=b.toString());return!!",
    "a&&1==a.nodeType&&(!b||a.tagName.toUpperCase()==b)};/*\n\n The MIT Lice",
    "nse\n\n Copyright (c) 2007 Cybozu Labs, Inc.\n Copyright (c) 2012 Googl",
    "e Inc.\n\n Permission is hereby granted, free of charge, to any person ",
    "obtaining a copy\n of this software and associated documentation files ",
    "(the \"Software\"), to\n deal in the Software without restriction, incl",
    "uding without limitation the\n rights to use, copy, modify, merge, publ",
    "ish, distribute, sublicense, and/or\n sell copies of the Software, and ",
    "to permit persons to whom the Software is\n furnished to do so, subject",
    " to the following conditions:\n\n The above copyright notice and this p",
    "ermission notice shall be included in\n all copies or substantial porti",
    "ons of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WA",
    "RRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO ",
    "THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE A",
    "ND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDER",
    "S BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ",
    "ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n FROM, OUT OF OR IN CON",
    "NECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n IN THE SOFTWAR",
    "E.\n*/\nfunction y(a,b,c){this.s=a;this.ua=b||1;this.o=c||1};function C",
    "a(a){this.Y=a;this.N=0}function Da(a){a=a.match(Ea);for(var b=0;b<a.len",
    "gth;b++)Fa.test(a[b])&&a.splice(b,1);return new Ca(a)}var Ea=/\\$?(?:(?",
    "![0-9-\\.])(?:\\*|[\\w-\\.]+):)?(?![0-9-\\.])(?:\\*|[\\w-\\.]+)|\\/\\/|",
    "\\.\\.|::|\\d+(?:\\.\\d*)?|\\.\\d+|\"[^\"]*\"|'[^']*'|[!<>]=|\\s+|./g,F",
    "a=/^\\s/;function A(a,b){return a.Y[a.N+(b||0)]}Ca.prototype.next=funct",
    "ion(){return this.Y[this.N++]};Ca.prototype.back=function(){this.N--};C",
    "a.prototype.empty=function(){return this.Y.length<=this.N};function B(a",
    "){var b=null,c=a.nodeType;1==c&&(b=a.textContent,b=void 0==b||null==b?a",
    ".innerText:b,b=void 0==b||null==b?\"\":b);if(\"string\"!=typeof b)if(9=",
    "=c||1==c){a=9==c?a.documentElement:a.firstChild;for(var c=0,d=[],b=\"\"",
    ";a;){do 1!=a.nodeType&&(b+=a.nodeValue),d[c++]=a;while(a=a.firstChild);",
    "for(;c&&!(a=d[--c].nextSibling););}}else b=a.nodeValue;return\"\"+b}\nf",
    "unction C(a,b,c){if(null===b)return!0;try{if(!a.getAttribute)return!1}c",
    "atch(d){return!1}return null==c?!!a.getAttribute(b):a.getAttribute(b,2)",
    "==c}function D(a,b,c,d,e){return Ga.call(null,a,b,l(c)?c:null,l(d)?d:nu",
    "ll,e||new E)}\nfunction Ga(a,b,c,d,e){b.getElementsByName&&d&&\"name\"=",
    "=c?(b=b.getElementsByName(d),p(b,function(b){a.matches(b)&&e.add(b)})):",
    "b.getElementsByClassName&&d&&\"class\"==c?(b=b.getElementsByClassName(d",
    "),p(b,function(b){b.className==d&&a.matches(b)&&e.add(b)})):a instanceo",
    "f F?Ha(a,b,c,d,e):b.getElementsByTagName&&(b=b.getElementsByTagName(a.g",
    "etName()),p(b,function(a){C(a,c,d)&&e.add(a)}));return e}function Ha(a,",
    "b,c,d,e){for(b=b.firstChild;b;b=b.nextSibling)C(b,c,d)&&a.matches(b)&&e",
    ".add(b),Ha(a,b,c,d,e)};function E(){this.o=this.j=null;this.J=0}functio",
    "n Ia(a){this.node=a;this.next=this.F=null}function Ja(a,b){if(!a.j)retu",
    "rn b;if(!b.j)return a;var c=a.j;b=b.j;for(var d=null,e,g=0;c&&b;)c.node",
    "==b.node?(e=c,c=c.next,b=b.next):0<wa(c.node,b.node)?(e=b,b=b.next):(e=",
    "c,c=c.next),(e.F=d)?d.next=e:a.j=e,d=e,g++;for(e=c||b;e;)e.F=d,d=d.next",
    "=e,g++,e=e.next;a.o=d;a.J=g;return a}E.prototype.unshift=function(a){a=",
    "new Ia(a);a.next=this.j;this.o?this.j.F=a:this.j=this.o=a;this.j=a;this",
    ".J++};\nE.prototype.add=function(a){a=new Ia(a);a.F=this.o;this.j?this.",
    "o.next=a:this.j=this.o=a;this.o=a;this.J++};function Ka(a){return(a=a.j",
    ")?a.node:null}E.prototype.u=function(){return this.J};function La(a){re",
    "turn(a=Ka(a))?B(a):\"\"}E.prototype.iterator=function(a){return new Ma(",
    "this,!!a)};function Ma(a,b){this.qa=a;this.Z=(this.H=b)?a.o:a.j;this.V=",
    "null}Ma.prototype.next=function(){var a=this.Z;if(null==a)return null;v",
    "ar b=this.V=a;this.Z=this.H?a.F:a.next;return b.node};\nMa.prototype.re",
    "move=function(){var a=this.qa,b=this.V;if(!b)throw Error(\"Next must be",
    " called at least once before remove.\");var c=b.F,b=b.next;c?c.next=b:a",
    ".j=b;b?b.F=c:a.o=c;a.J--;this.V=null};function G(a){this.i=a;this.l=thi",
    "s.w=!1;this.K=null}function H(a){return\"\\n  \"+a.toString().split(\"",
    "\\n\").join(\"\\n  \")}G.prototype.h=function(){return this.w};function",
    " Na(a,b){a.w=b}function Oa(a,b){a.l=b}G.prototype.C=function(){return t",
    "his.K};function I(a,b){a=a.evaluate(b);return a instanceof E?+La(a):+a}",
    "function J(a,b){a=a.evaluate(b);return a instanceof E?La(a):\"\"+a}func",
    "tion K(a,b){a=a.evaluate(b);return a instanceof E?!!a.u():!!a};function",
    " L(a,b,c){G.call(this,a.i);this.X=a;this.ca=b;this.ha=c;this.w=b.h()||c",
    ".h();this.l=b.l||c.l;this.X==Pa&&(c.l||c.h()||4==c.i||0==c.i||!b.C()?b.",
    "l||b.h()||4==b.i||0==b.i||!c.C()||(this.K={name:c.C().name,I:b}):this.K",
    "={name:b.C().name,I:c})}n(L,G);\nfunction M(a,b,c,d,e){b=b.evaluate(d);",
    "c=c.evaluate(d);var g;if(b instanceof E&&c instanceof E){b=b.iterator()",
    ";for(d=b.next();d;d=b.next())for(e=c.iterator(),g=e.next();g;g=e.next()",
    ")if(a(B(d),B(g)))return!0;return!1}if(b instanceof E||c instanceof E){b",
    " instanceof E?(e=b,d=c):(e=c,d=b);g=e.iterator();for(var h=typeof d,m=g",
    ".next();m;m=g.next()){switch(h){case \"number\":m=+B(m);break;case \"bo",
    "olean\":m=!!B(m);break;case \"string\":m=B(m);break;default:throw Error",
    "(\"Illegal primitive type for comparison.\");\n}if(e==b&&a(m,d)||e==c&&",
    "a(d,m))return!0}return!1}return e?\"boolean\"==typeof b||\"boolean\"==t",
    "ypeof c?a(!!b,!!c):\"number\"==typeof b||\"number\"==typeof c?a(+b,+c):",
    "a(b,c):a(+b,+c)}L.prototype.evaluate=function(a){return this.X.D(this.c",
    "a,this.ha,a)};L.prototype.toString=function(){var a=\"Binary Expression",
    ": \"+this.X,a=a+H(this.ca);return a+=H(this.ha)};function Qa(a,b,c,d){t",
    "his.ta=a;this.fa=b;this.i=c;this.D=d}Qa.prototype.toString=function(){r",
    "eturn this.ta};var Ra={};\nfunction N(a,b,c,d){if(Ra.hasOwnProperty(a))",
    "throw Error(\"Binary operator already created: \"+a);a=new Qa(a,b,c,d);",
    "return Ra[a.toString()]=a}N(\"div\",6,1,function(a,b,c){return I(a,c)/I",
    "(b,c)});N(\"mod\",6,1,function(a,b,c){return I(a,c)%I(b,c)});N(\"*\",6,",
    "1,function(a,b,c){return I(a,c)*I(b,c)});N(\"+\",5,1,function(a,b,c){re",
    "turn I(a,c)+I(b,c)});N(\"-\",5,1,function(a,b,c){return I(a,c)-I(b,c)})",
    ";N(\"<\",4,2,function(a,b,c){return M(function(a,b){return a<b},a,b,c)}",
    ");\nN(\">\",4,2,function(a,b,c){return M(function(a,b){return a>b},a,b,",
    "c)});N(\"<=\",4,2,function(a,b,c){return M(function(a,b){return a<=b},a",
    ",b,c)});N(\">=\",4,2,function(a,b,c){return M(function(a,b){return a>=b",
    "},a,b,c)});var Pa=N(\"=\",3,2,function(a,b,c){return M(function(a,b){re",
    "turn a==b},a,b,c,!0)});N(\"!=\",3,2,function(a,b,c){return M(function(a",
    ",b){return a!=b},a,b,c,!0)});N(\"and\",2,2,function(a,b,c){return K(a,c",
    ")&&K(b,c)});N(\"or\",1,2,function(a,b,c){return K(a,c)||K(b,c)});functi",
    "on Sa(a,b){if(b.u()&&4!=a.i)throw Error(\"Primary expression must evalu",
    "ate to nodeset if filter has predicate(s).\");G.call(this,a.i);this.ga=",
    "a;this.f=b;this.w=a.h();this.l=a.l}n(Sa,G);Sa.prototype.evaluate=functi",
    "on(a){a=this.ga.evaluate(a);return Ta(this.f,a)};Sa.prototype.toString=",
    "function(){var a=\"Filter:\"+H(this.ga);return a+=H(this.f)};function U",
    "a(a,b){if(b.length<a.ea)throw Error(\"Function \"+a.m+\" expects at lea",
    "st\"+a.ea+\" arguments, \"+b.length+\" given\");if(null!==a.W&&b.length",
    ">a.W)throw Error(\"Function \"+a.m+\" expects at most \"+a.W+\" argumen",
    "ts, \"+b.length+\" given\");a.ra&&p(b,function(b,d){if(4!=b.i)throw Err",
    "or(\"Argument \"+d+\" to function \"+a.m+\" is not of type Nodeset: \"+",
    "b);});G.call(this,a.i);this.M=a;this.S=b;Na(this,a.w||r(b,function(a){r",
    "eturn a.h()}));Oa(this,a.pa&&!b.length||a.oa&&!!b.length||r(b,function(",
    "a){return a.l}))}\nn(Ua,G);Ua.prototype.evaluate=function(a){return thi",
    "s.M.D.apply(null,ja(a,this.S))};Ua.prototype.toString=function(){var a=",
    "\"Function: \"+this.M;if(this.S.length)var b=q(this.S,function(a,b){ret",
    "urn a+H(b)},\"Arguments:\"),a=a+H(b);return a};function Va(a,b,c,d,e,g,",
    "h,m,z){this.m=a;this.i=b;this.w=c;this.pa=d;this.oa=e;this.D=g;this.ea=",
    "h;this.W=void 0!==m?m:h;this.ra=!!z}Va.prototype.toString=function(){re",
    "turn this.m};var Wa={};\nfunction O(a,b,c,d,e,g,h,m){if(Wa.hasOwnProper",
    "ty(a))throw Error(\"Function already created: \"+a+\".\");Wa[a]=new Va(",
    "a,b,c,d,!1,e,g,h,m)}O(\"boolean\",2,!1,!1,function(a,b){return K(b,a)},",
    "1);O(\"ceiling\",1,!1,!1,function(a,b){return Math.ceil(I(b,a))},1);O(",
    "\"concat\",3,!1,!1,function(a,b){return q(ka(arguments,1),function(b,d)",
    "{return b+J(d,a)},\"\")},2,null);O(\"contains\",2,!1,!1,function(a,b,c)",
    "{b=J(b,a);a=J(c,a);return-1!=b.indexOf(a)},2);O(\"count\",1,!1,!1,funct",
    "ion(a,b){return b.evaluate(a).u()},1,1,!0);\nO(\"false\",2,!1,!1,functi",
    "on(){return!1},0);O(\"floor\",1,!1,!1,function(a,b){return Math.floor(I",
    "(b,a))},1);O(\"id\",4,!1,!1,function(a,b){var c=a.s,d=9==c.nodeType?c:c",
    ".ownerDocument;a=J(b,a).split(/\\s+/);var e=[];p(a,function(a){a=d.getE",
    "lementById(a);var b;if(!(b=!a)){a:if(l(e))b=l(a)&&1==a.length?e.indexOf",
    "(a,0):-1;else{for(b=0;b<e.length;b++)if(b in e&&e[b]===a)break a;b=-1}b",
    "=0<=b}b||e.push(a)});e.sort(wa);var g=new E;p(e,function(a){g.add(a)});",
    "return g},1);O(\"lang\",2,!1,!1,function(){return!1},1);\nO(\"last\",1,",
    "!0,!1,function(a){if(1!=arguments.length)throw Error(\"Function last ex",
    "pects ()\");return a.o},0);O(\"local-name\",3,!1,!0,function(a,b){retur",
    "n(a=b?Ka(b.evaluate(a)):a.s)?a.localName||a.nodeName.toLowerCase():\"\"",
    "},0,1,!0);O(\"name\",3,!1,!0,function(a,b){return(a=b?Ka(b.evaluate(a))",
    ":a.s)?a.nodeName.toLowerCase():\"\"},0,1,!0);O(\"namespace-uri\",3,!0,!",
    "1,function(){return\"\"},0,1,!0);\nO(\"normalize-space\",3,!1,!0,functi",
    "on(a,b){return(b?J(b,a):B(a.s)).replace(/[\\s\\xa0]+/g,\" \").replace(/",
    "^\\s+|\\s+$/g,\"\")},0,1);O(\"not\",2,!1,!1,function(a,b){return!K(b,a)",
    "},1);O(\"number\",1,!1,!0,function(a,b){return b?I(b,a):+B(a.s)},0,1);O",
    "(\"position\",1,!0,!1,function(a){return a.ua},0);O(\"round\",1,!1,!1,f",
    "unction(a,b){return Math.round(I(b,a))},1);O(\"starts-with\",2,!1,!1,fu",
    "nction(a,b,c){b=J(b,a);a=J(c,a);return 0==b.lastIndexOf(a,0)},2);O(\"st",
    "ring\",3,!1,!0,function(a,b){return b?J(b,a):B(a.s)},0,1);\nO(\"string-",
    "length\",1,!1,!0,function(a,b){return(b?J(b,a):B(a.s)).length},0,1);O(",
    "\"substring\",3,!1,!1,function(a,b,c,d){c=I(c,a);if(isNaN(c)||Infinity=",
    "=c||-Infinity==c)return\"\";d=d?I(d,a):Infinity;if(isNaN(d)||-Infinity=",
    "==d)return\"\";c=Math.round(c)-1;var e=Math.max(c,0);a=J(b,a);return In",
    "finity==d?a.substring(e):a.substring(e,c+Math.round(d))},2,3);O(\"subst",
    "ring-after\",3,!1,!1,function(a,b,c){b=J(b,a);a=J(c,a);c=b.indexOf(a);r",
    "eturn-1==c?\"\":b.substring(c+a.length)},2);\nO(\"substring-before\",3,",
    "!1,!1,function(a,b,c){b=J(b,a);a=J(c,a);a=b.indexOf(a);return-1==a?\"\"",
    ":b.substring(0,a)},2);O(\"sum\",1,!1,!1,function(a,b){a=b.evaluate(a).i",
    "terator();b=0;for(var c=a.next();c;c=a.next())b+=+B(c);return b},1,1,!0",
    ");O(\"translate\",3,!1,!1,function(a,b,c,d){b=J(b,a);c=J(c,a);var e=J(d",
    ",a);d={};for(var g=0;g<c.length;g++)a=c.charAt(g),a in d||(d[a]=e.charA",
    "t(g));c=\"\";for(g=0;g<b.length;g++)a=b.charAt(g),c+=a in d?d[a]:a;retu",
    "rn c},3);O(\"true\",2,!1,!1,function(){return!0},0);function F(a,b){thi",
    "s.ja=a;this.da=void 0!==b?b:null;this.A=null;switch(a){case \"comment\"",
    ":this.A=8;break;case \"text\":this.A=3;break;case \"processing-instruct",
    "ion\":this.A=7;break;case \"node\":break;default:throw Error(\"Unexpect",
    "ed argument\");}}function Xa(a){return\"comment\"==a||\"text\"==a||\"pr",
    "ocessing-instruction\"==a||\"node\"==a}F.prototype.matches=function(a){",
    "return null===this.A||this.A==a.nodeType};F.prototype.getName=function(",
    "){return this.ja};\nF.prototype.toString=function(){var a=\"Kind Test: ",
    "\"+this.ja;null===this.da||(a+=H(this.da));return a};function Ya(a){G.c",
    "all(this,3);this.ia=a.substring(1,a.length-1)}n(Ya,G);Ya.prototype.eval",
    "uate=function(){return this.ia};Ya.prototype.toString=function(){return",
    "\"Literal: \"+this.ia};function P(a,b){this.m=a.toLowerCase();a=\"*\"==",
    "this.m?\"*\":\"http://www.w3.org/1999/xhtml\";this.O=b?b.toLowerCase():",
    "a}P.prototype.matches=function(a){var b=a.nodeType;if(1!=b&&2!=b)return",
    "!1;b=void 0!==a.localName?a.localName:a.nodeName;return\"*\"!=this.m&&t",
    "his.m!=b.toLowerCase()?!1:\"*\"==this.O?!0:this.O==(a.namespaceURI?a.na",
    "mespaceURI.toLowerCase():\"http://www.w3.org/1999/xhtml\")};P.prototype",
    ".getName=function(){return this.m};\nP.prototype.toString=function(){re",
    "turn\"Name Test: \"+(\"http://www.w3.org/1999/xhtml\"==this.O?\"\":this",
    ".O+\":\")+this.m};function Za(a){G.call(this,1);this.ka=a}n(Za,G);Za.pr",
    "ototype.evaluate=function(){return this.ka};Za.prototype.toString=funct",
    "ion(){return\"Number: \"+this.ka};function $a(a,b){G.call(this,a.i);thi",
    "s.ba=a;this.L=b;this.w=a.h();this.l=a.l;1==this.L.length&&(a=this.L[0],",
    "a.T||a.B!=ab||(a=a.R,\"*\"!=a.getName()&&(this.K={name:a.getName(),I:nu",
    "ll})))}n($a,G);function Q(){G.call(this,4)}n(Q,G);Q.prototype.evaluate=",
    "function(a){var b=new E;a=a.s;9==a.nodeType?b.add(a):b.add(a.ownerDocum",
    "ent);return b};Q.prototype.toString=function(){return\"Root Helper Expr",
    "ession\"};function bb(){G.call(this,4)}n(bb,G);bb.prototype.evaluate=fu",
    "nction(a){var b=new E;b.add(a.s);return b};\nbb.prototype.toString=func",
    "tion(){return\"Context Helper Expression\"};function cb(a){return\"/\"=",
    "=a||\"//\"==a}\n$a.prototype.evaluate=function(a){var b=this.ba.evaluat",
    "e(a);if(!(b instanceof E))throw Error(\"Filter expression must evaluate",
    " to nodeset.\");a=this.L;for(var c=0,d=a.length;c<d&&b.u();c++){var e=a",
    "[c],g=b.iterator(e.B.H);if(e.h()||e.B!=db)if(e.h()||e.B!=eb){var h=g.ne",
    "xt();for(b=e.evaluate(new y(h));null!=(h=g.next());)h=e.evaluate(new y(",
    "h)),b=Ja(b,h)}else h=g.next(),b=e.evaluate(new y(h));else{for(h=g.next(",
    ");(b=g.next())&&(!h.contains||h.contains(b))&&b.compareDocumentPosition",
    "(h)&8;h=b);b=e.evaluate(new y(h))}}return b};\n$a.prototype.toString=fu",
    "nction(){var a=\"Path Expression:\"+H(this.ba);if(this.L.length){var b=",
    "q(this.L,function(a,b){return a+H(b)},\"Steps:\");a+=H(b)}return a};fun",
    "ction R(a,b){this.f=a;this.H=!!b}function Ta(a,b,c){for(c=c||0;c<a.f.le",
    "ngth;c++)for(var d=a.f[c],e=b.iterator(),g=b.u(),h,m=0;h=e.next();m++){",
    "var z=a.H?g-m:m+1;h=d.evaluate(new y(h,z,g));if(\"number\"==typeof h)z=",
    "z==h;else if(\"string\"==typeof h||\"boolean\"==typeof h)z=!!h;else if(",
    "h instanceof E)z=0<h.u();else throw Error(\"Predicate.evaluate returned",
    " an unexpected type.\");z||e.remove()}return b}R.prototype.C=function()",
    "{return 0<this.f.length?this.f[0].C():null};\nR.prototype.h=function(){",
    "for(var a=0;a<this.f.length;a++){var b=this.f[a];if(b.h()||1==b.i||0==b",
    ".i)return!0}return!1};R.prototype.u=function(){return this.f.length};R.",
    "prototype.toString=function(){return q(this.f,function(a,b){return a+H(",
    "b)},\"Predicates:\")};function S(a,b,c,d){G.call(this,4);this.B=a;this.",
    "R=b;this.f=c||new R([]);this.T=!!d;b=this.f.C();a.va&&b&&(this.K={name:",
    "b.name,I:b.I});this.w=this.f.h()}n(S,G);\nS.prototype.evaluate=function",
    "(a){var b=a.s,c=this.C(),d=null,e=null,g=0;c&&(d=c.name,e=c.I?J(c.I,a):",
    "null,g=1);if(this.T)if(this.h()||this.B!=fb)if(b=(new S(gb,new F(\"node",
    "\"))).evaluate(a).iterator(),c=b.next())for(a=this.D(c,d,e,g);null!=(c=",
    "b.next());)a=Ja(a,this.D(c,d,e,g));else a=new E;else a=D(this.R,b,d,e),",
    "a=Ta(this.f,a,g);else a=this.D(a.s,d,e,g);return a};S.prototype.D=funct",
    "ion(a,b,c,d){a=this.B.M(this.R,a,b,c);return a=Ta(this.f,a,d)};\nS.prot",
    "otype.toString=function(){var a=\"Step:\"+H(\"Operator: \"+(this.T?\"//",
    "\":\"/\"));this.B.m&&(a+=H(\"Axis: \"+this.B));a+=H(this.R);if(this.f.u",
    "()){var b=q(this.f.f,function(a,b){return a+H(b)},\"Predicates:\");a+=H",
    "(b)}return a};function hb(a,b,c,d){this.m=a;this.M=b;this.H=c;this.va=d",
    "}hb.prototype.toString=function(){return this.m};var ib={};function T(a",
    ",b,c,d){if(ib.hasOwnProperty(a))throw Error(\"Axis already created: \"+",
    "a);b=new hb(a,b,c,!!d);return ib[a]=b}\nT(\"ancestor\",function(a,b){fo",
    "r(var c=new E;b=b.parentNode;)a.matches(b)&&c.unshift(b);return c},!0);",
    "T(\"ancestor-or-self\",function(a,b){var c=new E;do a.matches(b)&&c.uns",
    "hift(b);while(b=b.parentNode);return c},!0);\nvar ab=T(\"attribute\",fu",
    "nction(a,b){var c=new E,d=a.getName();if(b=b.attributes)if(a instanceof",
    " F&&null===a.A||\"*\"==d)for(d=0;a=b[d];d++)c.add(a);else(a=b.getNamedI",
    "tem(d))&&c.add(a);return c},!1),fb=T(\"child\",function(a,b,c,d,e){c=l(",
    "c)?c:null;d=l(d)?d:null;e=e||new E;for(b=b.firstChild;b;b=b.nextSibling",
    ")C(b,c,d)&&a.matches(b)&&e.add(b);return e},!1,!0);T(\"descendant\",D,!",
    "1,!0);\nvar gb=T(\"descendant-or-self\",function(a,b,c,d){var e=new E;C",
    "(b,c,d)&&a.matches(b)&&e.add(b);return D(a,b,c,d,e)},!1,!0),db=T(\"foll",
    "owing\",function(a,b,c,d){var e=new E;do for(var g=b;g=g.nextSibling;)C",
    "(g,c,d)&&a.matches(g)&&e.add(g),e=D(a,g,c,d,e);while(b=b.parentNode);re",
    "turn e},!1,!0);T(\"following-sibling\",function(a,b){for(var c=new E;b=",
    "b.nextSibling;)a.matches(b)&&c.add(b);return c},!1);T(\"namespace\",fun",
    "ction(){return new E},!1);\nvar jb=T(\"parent\",function(a,b){var c=new",
    " E;if(9==b.nodeType)return c;if(2==b.nodeType)return c.add(b.ownerEleme",
    "nt),c;b=b.parentNode;a.matches(b)&&c.add(b);return c},!1),eb=T(\"preced",
    "ing\",function(a,b,c,d){var e=new E,g=[];do g.unshift(b);while(b=b.pare",
    "ntNode);for(var h=1,m=g.length;h<m;h++){var z=[];for(b=g[h];b=b.previou",
    "sSibling;)z.unshift(b);for(var Aa=0,Fb=z.length;Aa<Fb;Aa++)b=z[Aa],C(b,",
    "c,d)&&a.matches(b)&&e.add(b),e=D(a,b,c,d,e)}return e},!0,!0);\nT(\"prec",
    "eding-sibling\",function(a,b){for(var c=new E;b=b.previousSibling;)a.ma",
    "tches(b)&&c.unshift(b);return c},!0);var kb=T(\"self\",function(a,b){va",
    "r c=new E;a.matches(b)&&c.add(b);return c},!1);function lb(a){G.call(th",
    "is,1);this.aa=a;this.w=a.h();this.l=a.l}n(lb,G);lb.prototype.evaluate=f",
    "unction(a){return-I(this.aa,a)};lb.prototype.toString=function(){return",
    "\"Unary Expression: -\"+H(this.aa)};function mb(a){G.call(this,4);this.",
    "P=a;Na(this,r(this.P,function(a){return a.h()}));Oa(this,r(this.P,funct",
    "ion(a){return a.l}))}n(mb,G);mb.prototype.evaluate=function(a){var b=ne",
    "w E;p(this.P,function(c){c=c.evaluate(a);if(!(c instanceof E))throw Err",
    "or(\"Path expression must evaluate to NodeSet.\");b=Ja(b,c)});return b}",
    ";mb.prototype.toString=function(){return q(this.P,function(a,b){return ",
    "a+H(b)},\"Union Expression:\")};function nb(a,b){this.a=a;this.sa=b}fun",
    "ction ob(a){for(var b,c=[];;){U(a,\"Missing right hand side of binary e",
    "xpression.\");b=pb(a);var d=a.a.next();if(!d)break;var e=(d=Ra[d]||null",
    ")&&d.fa;if(!e){a.a.back();break}for(;c.length&&e<=c[c.length-1].fa;)b=n",
    "ew L(c.pop(),c.pop(),b);c.push(b,d)}for(;c.length;)b=new L(c.pop(),c.po",
    "p(),b);return b}function U(a,b){if(a.a.empty())throw Error(b);}function",
    " qb(a,b){a=a.a.next();if(a!=b)throw Error(\"Bad token, expected: \"+b+",
    "\" got: \"+a);}\nfunction rb(a){a=a.a.next();if(\")\"!=a)throw Error(\"",
    "Bad token: \"+a);}function sb(a){a=a.a.next();if(2>a.length)throw Error",
    "(\"Unclosed literal string\");return new Ya(a)}\nfunction tb(a){var b=[",
    "];if(cb(A(a.a))){var c=a.a.next();var d=A(a.a);if(\"/\"==c&&(a.a.empty(",
    ")||\".\"!=d&&\"..\"!=d&&\"@\"!=d&&\"*\"!=d&&!/(?![0-9])[\\w]/.test(d)))",
    "return new Q;d=new Q;U(a,\"Missing next location step.\");c=ub(a,c);b.p",
    "ush(c)}else{a:{c=A(a.a);d=c.charAt(0);switch(d){case \"$\":throw Error(",
    "\"Variable reference not allowed in HTML XPath\");case \"(\":a.a.next()",
    ";c=ob(a);U(a,'unclosed \"(\"');qb(a,\")\");break;case '\"':case \"'\":c",
    "=sb(a);break;default:if(isNaN(+c))if(!Xa(c)&&/(?![0-9])[\\w]/.test(d)&&",
    "\"(\"==A(a.a,\n1)){c=a.a.next();c=Wa[c]||null;a.a.next();for(d=[];\")\"",
    "!=A(a.a);){U(a,\"Missing function argument list.\");d.push(ob(a));if(\"",
    ",\"!=A(a.a))break;a.a.next()}U(a,\"Unclosed function argument list.\");",
    "rb(a);c=new Ua(c,d)}else{c=null;break a}else c=new Za(+a.a.next())}\"[",
    "\"==A(a.a)&&(d=new R(vb(a)),c=new Sa(c,d))}if(c)if(cb(A(a.a)))d=c;else ",
    "return c;else c=ub(a,\"/\"),d=new bb,b.push(c)}for(;cb(A(a.a));)c=a.a.n",
    "ext(),U(a,\"Missing next location step.\"),c=ub(a,c),b.push(c);return n",
    "ew $a(d,b)}\nfunction ub(a,b){if(\"/\"!=b&&\"//\"!=b)throw Error('Step ",
    "op should be \"/\" or \"//\"');if(\".\"==A(a.a)){var c=new S(kb,new F(",
    "\"node\"));a.a.next();return c}if(\"..\"==A(a.a))return c=new S(jb,new ",
    "F(\"node\")),a.a.next(),c;if(\"@\"==A(a.a)){var d=ab;a.a.next();U(a,\"M",
    "issing attribute name\")}else if(\"::\"==A(a.a,1)){if(!/(?![0-9])[\\w]/",
    ".test(A(a.a).charAt(0)))throw Error(\"Bad token: \"+a.a.next());var e=a",
    ".a.next();d=ib[e]||null;if(!d)throw Error(\"No axis with name: \"+e);a.",
    "a.next();U(a,\"Missing node name\")}else d=fb;e=\nA(a.a);if(/(?![0-9])[",
    "\\w\\*]/.test(e.charAt(0)))if(\"(\"==A(a.a,1)){if(!Xa(e))throw Error(\"",
    "Invalid node type: \"+e);e=a.a.next();if(!Xa(e))throw Error(\"Invalid t",
    "ype name: \"+e);qb(a,\"(\");U(a,\"Bad nodetype\");var g=A(a.a).charAt(0",
    "),h=null;if('\"'==g||\"'\"==g)h=sb(a);U(a,\"Bad nodetype\");rb(a);e=new",
    " F(e,h)}else if(e=a.a.next(),g=e.indexOf(\":\"),-1==g)e=new P(e);else{v",
    "ar h=e.substring(0,g);if(\"*\"==h)var m=\"*\";else if(m=a.sa(h),!m)thro",
    "w Error(\"Namespace prefix not declared: \"+h);e=e.substr(g+1);e=new P(",
    "e,m)}else throw Error(\"Bad token: \"+\na.a.next());a=new R(vb(a),d.H);",
    "return c||new S(d,e,a,\"//\"==b)}function vb(a){for(var b=[];\"[\"==A(a",
    ".a);){a.a.next();U(a,\"Missing predicate expression.\");var c=ob(a);b.p",
    "ush(c);U(a,\"Unclosed predicate expression.\");qb(a,\"]\")}return b}fun",
    "ction pb(a){if(\"-\"==A(a.a))return a.a.next(),new lb(pb(a));var b=tb(a",
    ");if(\"|\"!=A(a.a))a=b;else{for(b=[b];\"|\"==a.a.next();)U(a,\"Missing ",
    "next union location path.\"),b.push(tb(a));a.a.back();a=new mb(b)}retur",
    "n a};function wb(a){switch(a.nodeType){case 1:return fa(xb,a);case 9:re",
    "turn wb(a.documentElement);case 11:case 10:case 6:case 12:return yb;def",
    "ault:return a.parentNode?wb(a.parentNode):yb}}function yb(){return null",
    "}function xb(a,b){if(a.prefix==b)return a.namespaceURI||\"http://www.w3",
    ".org/1999/xhtml\";var c=a.getAttributeNode(\"xmlns:\"+b);return c&&c.sp",
    "ecified?c.value||null:a.parentNode&&9!=a.parentNode.nodeType?xb(a.paren",
    "tNode,b):null};function zb(a,b){if(!a.length)throw Error(\"Empty XPath ",
    "expression.\");a=Da(a);if(a.empty())throw Error(\"Invalid XPath express",
    "ion.\");b?\"function\"==ba(b)||(b=ea(b.lookupNamespaceURI,b)):b=functio",
    "n(){return null};var c=ob(new nb(a,b));if(!a.empty())throw Error(\"Bad ",
    "token: \"+a.next());this.evaluate=function(a,b){a=c.evaluate(new y(a));",
    "return new V(a,b)}}\nfunction V(a,b){if(0==b)if(a instanceof E)b=4;else",
    " if(\"string\"==typeof a)b=2;else if(\"number\"==typeof a)b=1;else if(",
    "\"boolean\"==typeof a)b=3;else throw Error(\"Unexpected evaluation resu",
    "lt.\");if(2!=b&&1!=b&&3!=b&&!(a instanceof E))throw Error(\"value could",
    " not be converted to the specified type\");this.resultType=b;switch(b){",
    "case 2:this.stringValue=a instanceof E?La(a):\"\"+a;break;case 1:this.n",
    "umberValue=a instanceof E?+La(a):+a;break;case 3:this.booleanValue=a in",
    "stanceof E?0<a.u():!!a;break;case 4:case 5:case 6:case 7:var c=\na.iter",
    "ator();var d=[];for(var e=c.next();e;e=c.next())d.push(e);this.snapshot",
    "Length=a.u();this.invalidIteratorState=!1;break;case 8:case 9:this.sing",
    "leNodeValue=Ka(a);break;default:throw Error(\"Unknown XPathResult type.",
    "\");}var g=0;this.iterateNext=function(){if(4!=b&&5!=b)throw Error(\"it",
    "erateNext called with wrong result type\");return g>=d.length?null:d[g+",
    "+]};this.snapshotItem=function(a){if(6!=b&&7!=b)throw Error(\"snapshotI",
    "tem called with wrong result type\");return a>=d.length||0>a?null:d[a]}",
    "}\nV.ANY_TYPE=0;V.NUMBER_TYPE=1;V.STRING_TYPE=2;V.BOOLEAN_TYPE=3;V.UNOR",
    "DERED_NODE_ITERATOR_TYPE=4;V.ORDERED_NODE_ITERATOR_TYPE=5;V.UNORDERED_N",
    "ODE_SNAPSHOT_TYPE=6;V.ORDERED_NODE_SNAPSHOT_TYPE=7;V.ANY_UNORDERED_NODE",
    "_TYPE=8;V.FIRST_ORDERED_NODE_TYPE=9;function Ab(a){this.lookupNamespace",
    "URI=wb(a)}\naa(\"wgxpath.install\",function(a,b){a=a||k;var c=a.Documen",
    "t&&a.Document.prototype||a.document;if(!c.evaluate||b)a.XPathResult=V,c",
    ".evaluate=function(a,b,c,h){return(new zb(a,c)).evaluate(b,h)},c.create",
    "Expression=function(a,b){return new zb(a,b)},c.createNSResolver=functio",
    "n(a){return new Ab(a)}});function Bb(){this.$=ga.document.documentEleme",
    "nt;a:{var a=za(this.$);try{var b=a&&a.activeElement;break a}catch(c){}b",
    "=null}b&&Cb(this,b)}function Cb(a,b){a.$=b;x(b,\"OPTION\")&&Ba(b,functi",
    "on(a){return x(a,\"SELECT\")})}function Db(a){return x(a,\"FORM\")};ua(",
    ");ua();function Eb(a,b,c){this.A=a;this.la=b;this.ma=c}Eb.prototype.cre",
    "ate=function(a){a=za(a).createEvent(\"HTMLEvents\");a.initEvent(this.A,",
    "this.la,this.ma);return a};Eb.prototype.toString=function(){return this",
    ".A};var Gb=new Eb(\"submit\",!0,!0);function W(a,b){this.v={};this.g=[]",
    ";this.G=0;var c=arguments.length;if(1<c){if(c%2)throw Error(\"Uneven nu",
    "mber of arguments\");for(var d=0;d<c;d+=2)this.set(arguments[d],argumen",
    "ts[d+1])}else a&&this.addAll(a)}function Hb(a){Ib(a);return a.g.concat(",
    ")}f=W.prototype;f.clear=function(){this.v={};this.G=this.g.length=0};f.",
    "remove=function(a){return Object.prototype.hasOwnProperty.call(this.v,a",
    ")?(delete this.v[a],this.G--,this.g.length>2*this.G&&Ib(this),!0):!1};",
    "\nfunction Ib(a){var b,c;if(a.G!=a.g.length){for(b=c=0;c<a.g.length;){v",
    "ar d=a.g[c];Object.prototype.hasOwnProperty.call(a.v,d)&&(a.g[b++]=d);c",
    "++}a.g.length=b}if(a.G!=a.g.length){var e={};for(b=c=0;c<a.g.length;)d=",
    "a.g[c],Object.prototype.hasOwnProperty.call(e,d)||(a.g[b++]=d,e[d]=1),c",
    "++;a.g.length=b}}f.get=function(a,b){return Object.prototype.hasOwnProp",
    "erty.call(this.v,a)?this.v[a]:b};f.set=function(a,b){Object.prototype.h",
    "asOwnProperty.call(this.v,a)||(this.G++,this.g.push(a));this.v[a]=b};\n",
    "f.addAll=function(a){if(a instanceof W){var b=Hb(a);Ib(a);for(var c=[],",
    "d=0;d<a.g.length;d++)c.push(a.v[a.g[d]]);a=c}else{b=[];var d=0;for(e in",
    " a)b[d++]=e;d=[];var e=0;for(c in a)d[e++]=a[c];a=d}for(c=0;c<b.length;",
    "c++)this.set(b[c],a[c])};f.forEach=function(a,b){for(var c=Hb(this),d=0",
    ";d<c.length;d++){var e=c[d],g=this.get(e);a.call(b,g,e,this)}};f.clone=",
    "function(){return new W(this)};var Jb={};function X(a,b,c){var d=typeof",
    " a;(\"object\"==d&&null!=a||\"function\"==d)&&(a=a.b);a=new Kb(a);!b||b",
    " in Jb&&!c||(Jb[b]={key:a,shift:!1},c&&(Jb[c]={key:a,shift:!0}));return",
    " a}function Kb(a){this.code=a}X(8);X(9);X(13);var Lb=X(16),Mb=X(17),Nb=",
    "X(18);X(19);X(20);X(27);X(32,\" \");X(33);X(34);X(35);X(36);X(37);X(38)",
    ";X(39);X(40);X(44);X(45);X(46);X(48,\"0\",\")\");X(49,\"1\",\"!\");X(50",
    ",\"2\",\"@\");X(51,\"3\",\"#\");X(52,\"4\",\"$\");X(53,\"5\",\"%\");X(5",
    "4,\"6\",\"^\");X(55,\"7\",\"&\");X(56,\"8\",\"*\");X(57,\"9\",\"(\");X(",
    "65,\"a\",\"A\");\nX(66,\"b\",\"B\");X(67,\"c\",\"C\");X(68,\"d\",\"D\")",
    ";X(69,\"e\",\"E\");X(70,\"f\",\"F\");X(71,\"g\",\"G\");X(72,\"h\",\"H\"",
    ");X(73,\"i\",\"I\");X(74,\"j\",\"J\");X(75,\"k\",\"K\");X(76,\"l\",\"L",
    "\");X(77,\"m\",\"M\");X(78,\"n\",\"N\");X(79,\"o\",\"O\");X(80,\"p\",\"",
    "P\");X(81,\"q\",\"Q\");X(82,\"r\",\"R\");X(83,\"s\",\"S\");X(84,\"t\",",
    "\"T\");X(85,\"u\",\"U\");X(86,\"v\",\"V\");X(87,\"w\",\"W\");X(88,\"x\"",
    ",\"X\");X(89,\"y\",\"Y\");X(90,\"z\",\"Z\");var Ob=X(qa?{c:91,b:91}:pa?",
    "{c:224,b:91}:{c:0,b:91});X(qa?{c:92,b:92}:pa?{c:224,b:93}:{c:0,b:92});X",
    "(qa?{c:93,b:93}:pa?{c:0,b:0}:{c:93,b:null});\nX({c:96,b:96},\"0\");X({c",
    ":97,b:97},\"1\");X({c:98,b:98},\"2\");X({c:99,b:99},\"3\");X({c:100,b:1",
    "00},\"4\");X({c:101,b:101},\"5\");X({c:102,b:102},\"6\");X({c:103,b:103",
    "},\"7\");X({c:104,b:104},\"8\");X({c:105,b:105},\"9\");X({c:106,b:106},",
    "\"*\");X({c:107,b:107},\"+\");X({c:109,b:109},\"-\");X({c:110,b:110},\"",
    ".\");X({c:111,b:111},\"/\");X(144);X(112);X(113);X(114);X(115);X(116);X",
    "(117);X(118);X(119);X(120);X(121);X(122);X(123);X({c:107,b:187},\"=\",",
    "\"+\");X(108,\",\");X({c:109,b:189},\"-\",\"_\");X(188,\",\",\"<\");X(1",
    "90,\".\",\">\");X(191,\"/\",\"?\");\nX(192,\"`\",\"~\");X(219,\"[\",\"{",
    "\");X(220,\"\\\\\",\"|\");X(221,\"]\",\"}\");X({c:59,b:186},\";\",\":\"",
    ");X(222,\"'\",'\"');var Y=new W;Y.set(1,Lb);Y.set(2,Mb);Y.set(4,Nb);Y.s",
    "et(8,Ob);(function(a){var b=new W;p(Hb(a),function(c){b.set(a.get(c).co",
    "de,c)});return b})(Y);function Z(){Bb.call(this)}n(Z,Bb);Z.U=void 0;Z.n",
    "a=function(){return Z.U?Z.U:Z.U=new Z};aa(\"_\",function(a){var b=Ba(a,",
    "Db,!0);if(!b)throw new t(7,\"Element was not in a form, so could not su",
    "bmit.\");var c=Z.na();Cb(c,a);if(!Db(b))throw new t(12,\"Element is not",
    " a form, so could not submit.\");a=Gb.create(b,void 0);\"isTrusted\"in ",
    "a||(a.isTrusted=!1);b.dispatchEvent(a)&&(x(b.submit)?b.constructor.prot",
    "otype.submit.call(b):b.submit())});; return this._.apply(null,arguments",
    ");}.apply({navigator:typeof window!='undefined'?window.navigator:null,d",
    "ocument:typeof window!='undefined'?window.document:null}, arguments);}",
    NULL
};

const char* const FIND_ELEMENT[] = {
    "function(){return function(){var h,aa=this;function l(a){return void 0!",
    "==a}function m(a){return\"string\"==typeof a}function n(a){return\"numb",
    "er\"==typeof a}function ba(a,b){a=a.split(\".\");var c=aa;a[0]in c||!c.",
    "execScript||c.execScript(\"var \"+a[0]);for(var d;a.length&&(d=a.shift(",
    "));)!a.length&&l(b)?c[d]=b:c=c[d]&&c[d]!==Object.prototype[d]?c[d]:c[d]",
    "={}}\nfunction ca(a){var b=typeof a;if(\"object\"==b)if(a){if(a instanc",
    "eof Array)return\"array\";if(a instanceof Object)return b;var c=Object.",
    "prototype.toString.call(a);if(\"[object Window]\"==c)return\"object\";i",
    "f(\"[object Array]\"==c||\"number\"==typeof a.length&&\"undefined\"!=ty",
    "peof a.splice&&\"undefined\"!=typeof a.propertyIsEnumerable&&!a.propert",
    "yIsEnumerable(\"splice\"))return\"array\";if(\"[object Function]\"==c||",
    "\"undefined\"!=typeof a.call&&\"undefined\"!=typeof a.propertyIsEnumera",
    "ble&&!a.propertyIsEnumerable(\"call\"))return\"function\"}else return\"",
    "null\";\nelse if(\"function\"==b&&\"undefined\"==typeof a.call)return\"",
    "object\";return b}function da(a){var b=ca(a);return\"array\"==b||\"obje",
    "ct\"==b&&\"number\"==typeof a.length}function p(a){return\"function\"==",
    "ca(a)}function ea(a){var b=typeof a;return\"object\"==b&&null!=a||\"fun",
    "ction\"==b}function fa(a,b,c){return a.call.apply(a.bind,arguments)}\nf",
    "unction ga(a,b,c){if(!a)throw Error();if(2<arguments.length){var d=Arra",
    "y.prototype.slice.call(arguments,2);return function(){var c=Array.proto",
    "type.slice.call(arguments);Array.prototype.unshift.apply(c,d);return a.",
    "apply(b,c)}}return function(){return a.apply(b,arguments)}}function ha(",
    "a,b,c){ha=Function.prototype.bind&&-1!=Function.prototype.bind.toString",
    "().indexOf(\"native code\")?fa:ga;return ha.apply(null,arguments)}\nfun",
    "ction ia(a,b){var c=Array.prototype.slice.call(arguments,1);return func",
    "tion(){var b=c.slice();b.push.apply(b,arguments);return a.apply(this,b)",
    "}}function r(a,b){function c(){}c.prototype=b.prototype;a.xa=b.prototyp",
    "e;a.prototype=new c;a.prototype.constructor=a;a.wa=function(a,c,f){for(",
    "var d=Array(arguments.length-2),e=2;e<arguments.length;e++)d[e-2]=argum",
    "ents[e];return b.prototype[c].apply(a,d)}};var ja=window;var ka;functio",
    "n la(a){var b=a.length-1;return 0<=b&&a.indexOf(\" \",b)==b}var ma=Stri",
    "ng.prototype.trim?function(a){return a.trim()}:function(a){return a.rep",
    "lace(/^[\\s\\xa0]+|[\\s\\xa0]+$/g,\"\")};function na(a){return String(a",
    ").replace(/\\-([a-z])/g,function(a,c){return c.toUpperCase()})};functio",
    "n oa(a,b){if(m(a))return m(b)&&1==b.length?a.indexOf(b,0):-1;for(var c=",
    "0;c<a.length;c++)if(c in a&&a[c]===b)return c;return-1}function t(a,b){",
    "for(var c=a.length,d=m(a)?a.split(\"\"):a,e=0;e<c;e++)e in d&&b.call(vo",
    "id 0,d[e],e,a)}function pa(a,b){for(var c=a.length,d=[],e=0,f=m(a)?a.sp",
    "lit(\"\"):a,g=0;g<c;g++)if(g in f){var k=f[g];b.call(void 0,k,g,a)&&(d[",
    "e++]=k)}return d}function qa(a,b,c){var d=c;t(a,function(c,f){d=b.call(",
    "void 0,d,c,f,a)});return d}\nfunction ra(a,b){for(var c=a.length,d=m(a)",
    "?a.split(\"\"):a,e=0;e<c;e++)if(e in d&&b.call(void 0,d[e],e,a))return!",
    "0;return!1}function sa(a,b){for(var c=a.length,d=m(a)?a.split(\"\"):a,e",
    "=0;e<c;e++)if(e in d&&!b.call(void 0,d[e],e,a))return!1;return!0}functi",
    "on ta(a,b){a:{for(var c=a.length,d=m(a)?a.split(\"\"):a,e=0;e<c;e++)if(",
    "e in d&&b.call(void 0,d[e],e,a)){b=e;break a}b=-1}return 0>b?null:m(a)?",
    "a.charAt(b):a[b]}function ua(a){return Array.prototype.concat.apply([],",
    "arguments)}\nfunction va(a){var b=a.length;if(0<b){for(var c=Array(b),d",
    "=0;d<b;d++)c[d]=a[d];return c}return[]}function wa(a,b,c){return 2>=arg",
    "uments.length?Array.prototype.slice.call(a,b):Array.prototype.slice.cal",
    "l(a,b,c)};var xa={aliceblue:\"#f0f8ff\",antiquewhite:\"#faebd7\",aqua:",
    "\"#00ffff\",aquamarine:\"#7fffd4\",azure:\"#f0ffff\",beige:\"#f5f5dc\",",
    "bisque:\"#ffe4c4\",black:\"#000000\",blanchedalmond:\"#ffebcd\",blue:\"",
    "#0000ff\",blueviolet:\"#8a2be2\",brown:\"#a52a2a\",burlywood:\"#deb887",
    "\",cadetblue:\"#5f9ea0\",chartreuse:\"#7fff00\",chocolate:\"#d2691e\",c",
    "oral:\"#ff7f50\",cornflowerblue:\"#6495ed\",cornsilk:\"#fff8dc\",crimso",
    "n:\"#dc143c\",cyan:\"#00ffff\",darkblue:\"#00008b\",darkcyan:\"#008b8b",
    "\",darkgoldenrod:\"#b8860b\",darkgray:\"#a9a9a9\",darkgreen:\"#006400\"",
    ",\ndarkgrey:\"#a9a9a9\",darkkhaki:\"#bdb76b\",darkmagenta:\"#8b008b\",d",
    "arkolivegreen:\"#556b2f\",darkorange:\"#ff8c00\",darkorchid:\"#9932cc\"",
    ",darkred:\"#8b0000\",darksalmon:\"#e9967a\",darkseagreen:\"#8fbc8f\",da",
    "rkslateblue:\"#483d8b\",darkslategray:\"#2f4f4f\",darkslategrey:\"#2f4f",
    "4f\",darkturquoise:\"#00ced1\",darkviolet:\"#9400d3\",deeppink:\"#ff149",
    "3\",deepskyblue:\"#00bfff\",dimgray:\"#696969\",dimgrey:\"#696969\",dod",
    "gerblue:\"#1e90ff\",firebrick:\"#b22222\",floralwhite:\"#fffaf0\",fores",
    "tgreen:\"#228b22\",fuchsia:\"#ff00ff\",gainsboro:\"#dcdcdc\",\nghostwhi",
    "te:\"#f8f8ff\",gold:\"#ffd700\",goldenrod:\"#daa520\",gray:\"#808080\",",
    "green:\"#008000\",greenyellow:\"#adff2f\",grey:\"#808080\",honeydew:\"#",
    "f0fff0\",hotpink:\"#ff69b4\",indianred:\"#cd5c5c\",indigo:\"#4b0082\",i",
    "vory:\"#fffff0\",khaki:\"#f0e68c\",lavender:\"#e6e6fa\",lavenderblush:",
    "\"#fff0f5\",lawngreen:\"#7cfc00\",lemonchiffon:\"#fffacd\",lightblue:\"",
    "#add8e6\",lightcoral:\"#f08080\",lightcyan:\"#e0ffff\",lightgoldenrodye",
    "llow:\"#fafad2\",lightgray:\"#d3d3d3\",lightgreen:\"#90ee90\",lightgrey",
    ":\"#d3d3d3\",lightpink:\"#ffb6c1\",lightsalmon:\"#ffa07a\",\nlightseagr",
    "een:\"#20b2aa\",lightskyblue:\"#87cefa\",lightslategray:\"#778899\",lig",
    "htslategrey:\"#778899\",lightsteelblue:\"#b0c4de\",lightyellow:\"#ffffe",
    "0\",lime:\"#00ff00\",limegreen:\"#32cd32\",linen:\"#faf0e6\",magenta:\"",
    "#ff00ff\",maroon:\"#800000\",mediumaquamarine:\"#66cdaa\",mediumblue:\"",
    "#0000cd\",mediumorchid:\"#ba55d3\",mediumpurple:\"#9370db\",mediumseagr",
    "een:\"#3cb371\",mediumslateblue:\"#7b68ee\",mediumspringgreen:\"#00fa9a",
    "\",mediumturquoise:\"#48d1cc\",mediumvioletred:\"#c71585\",midnightblue",
    ":\"#191970\",mintcream:\"#f5fffa\",mistyrose:\"#ffe4e1\",\nmoccasin:\"#",
    "ffe4b5\",navajowhite:\"#ffdead\",navy:\"#000080\",oldlace:\"#fdf5e6\",o",
    "live:\"#808000\",olivedrab:\"#6b8e23\",orange:\"#ffa500\",orangered:\"#",
    "ff4500\",orchid:\"#da70d6\",palegoldenrod:\"#eee8aa\",palegreen:\"#98fb",
    "98\",paleturquoise:\"#afeeee\",palevioletred:\"#db7093\",papayawhip:\"#",
    "ffefd5\",peachpuff:\"#ffdab9\",peru:\"#cd853f\",pink:\"#ffc0cb\",plum:",
    "\"#dda0dd\",powderblue:\"#b0e0e6\",purple:\"#800080\",red:\"#ff0000\",r",
    "osybrown:\"#bc8f8f\",royalblue:\"#4169e1\",saddlebrown:\"#8b4513\",salm",
    "on:\"#fa8072\",sandybrown:\"#f4a460\",seagreen:\"#2e8b57\",\nseashell:",
    "\"#fff5ee\",sienna:\"#a0522d\",silver:\"#c0c0c0\",skyblue:\"#87ceeb\",s",
    "lateblue:\"#6a5acd\",slategray:\"#708090\",slategrey:\"#708090\",snow:",
    "\"#fffafa\",springgreen:\"#00ff7f\",steelblue:\"#4682b4\",tan:\"#d2b48c",
    "\",teal:\"#008080\",thistle:\"#d8bfd8\",tomato:\"#ff6347\",turquoise:\"",
    "#40e0d0\",violet:\"#ee82ee\",wheat:\"#f5deb3\",white:\"#ffffff\",whites",
    "moke:\"#f5f5f5\",yellow:\"#ffff00\",yellowgreen:\"#9acd32\"};var ya=\"b",
    "ackgroundColor borderTopColor borderRightColor borderBottomColor border",
    "LeftColor color outlineColor\".split(\" \"),za=/#([0-9a-fA-F])([0-9a-fA",
    "-F])([0-9a-fA-F])/,Aa=/^#(?:[0-9a-f]{3}){1,2}$/i,Ba=/^(?:rgba)?\\((\\d{",
    "1,3}),\\s?(\\d{1,3}),\\s?(\\d{1,3}),\\s?(0|1|0\\.\\d*)\\)$/i,Ca=/^(?:rg",
    "b)?\\((0|[1-9]\\d{0,2}),\\s?(0|[1-9]\\d{0,2}),\\s?(0|[1-9]\\d{0,2})\\)$",
    "/i;function v(a,b){this.code=a;this.state=w[a]||Da;this.message=b||\"\"",
    ";a=this.state.replace(/((?:^|\\s+)[a-z])/g,function(a){return a.toUpper",
    "Case().replace(/^[\\s\\xa0]+/g,\"\")});b=a.length-5;if(0>b||a.indexOf(",
    "\"Error\",b)!=b)a+=\"Error\";this.name=a;a=Error(this.message);a.name=t",
    "his.name;this.stack=a.stack||\"\"}r(v,Error);var Da=\"unknown error\",w",
    "={15:\"element not selectable\",11:\"element not visible\"};w[31]=Da;w[",
    "30]=Da;w[24]=\"invalid cookie domain\";w[29]=\"invalid element coordina",
    "tes\";w[12]=\"invalid element state\";\nw[32]=\"invalid selector\";w[51",
    "]=\"invalid selector\";w[52]=\"invalid selector\";w[17]=\"javascript er",
    "ror\";w[405]=\"unsupported operation\";w[34]=\"move target out of bound",
    "s\";w[27]=\"no such alert\";w[7]=\"no such element\";w[8]=\"no such fra",
    "me\";w[23]=\"no such window\";w[28]=\"script timeout\";w[33]=\"session ",
    "not created\";w[10]=\"stale element reference\";w[21]=\"timeout\";w[25]",
    "=\"unable to set cookie\";w[26]=\"unexpected alert open\";w[13]=Da;w[9]",
    "=\"unknown command\";v.prototype.toString=function(){return this.name+",
    "\": \"+this.message};function x(a,b){this.x=l(a)?a:0;this.y=l(b)?b:0}h=",
    "x.prototype;h.clone=function(){return new x(this.x,this.y)};h.toString=",
    "function(){return\"(\"+this.x+\", \"+this.y+\")\"};h.ceil=function(){th",
    "is.x=Math.ceil(this.x);this.y=Math.ceil(this.y);return this};h.floor=fu",
    "nction(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);return thi",
    "s};h.round=function(){this.x=Math.round(this.x);this.y=Math.round(this.",
    "y);return this};\nh.translate=function(a,b){a instanceof x?(this.x+=a.x",
    ",this.y+=a.y):(this.x+=Number(a),n(b)&&(this.y+=b));return this};h.scal",
    "e=function(a,b){b=n(b)?b:a;this.x*=a;this.y*=b;return this};function Fa",
    "(a,b){this.width=a;this.height=b}h=Fa.prototype;h.clone=function(){retu",
    "rn new Fa(this.width,this.height)};h.toString=function(){return\"(\"+th",
    "is.width+\" x \"+this.height+\")\"};h.ceil=function(){this.width=Math.c",
    "eil(this.width);this.height=Math.ceil(this.height);return this};h.floor",
    "=function(){this.width=Math.floor(this.width);this.height=Math.floor(th",
    "is.height);return this};h.round=function(){this.width=Math.round(this.w",
    "idth);this.height=Math.round(this.height);return this};\nh.scale=functi",
    "on(a,b){b=n(b)?b:a;this.width*=a;this.height*=b;return this};function y",
    "(a){return a?new Ga(z(a)):ka||(ka=new Ga)}function Ha(a,b,c){function d",
    "(c){c&&b.appendChild(m(c)?a.createTextNode(c):c)}for(var e=1;e<c.length",
    ";e++){var f=c[e];!da(f)||ea(f)&&0<f.nodeType?d(f):t(Ia(f)?va(f):f,d)}}f",
    "unction Ja(a){for(;a&&1!=a.nodeType;)a=a.previousSibling;return a}\nfun",
    "ction Ka(a,b){if(!a||!b)return!1;if(a.contains&&1==b.nodeType)return a=",
    "=b||a.contains(b);if(\"undefined\"!=typeof a.compareDocumentPosition)re",
    "turn a==b||!!(a.compareDocumentPosition(b)&16);for(;b&&a!=b;)b=b.parent",
    "Node;return b==a}\nfunction La(a,b){if(a==b)return 0;if(a.compareDocume",
    "ntPosition)return a.compareDocumentPosition(b)&2?1:-1;if(\"sourceIndex",
    "\"in a||a.parentNode&&\"sourceIndex\"in a.parentNode){var c=1==a.nodeTy",
    "pe,d=1==b.nodeType;if(c&&d)return a.sourceIndex-b.sourceIndex;var e=a.p",
    "arentNode,f=b.parentNode;return e==f?Ma(a,b):!c&&Ka(e,b)?-1*Na(a,b):!d&",
    "&Ka(f,a)?Na(b,a):(c?a.sourceIndex:e.sourceIndex)-(d?b.sourceIndex:f.sou",
    "rceIndex)}d=z(a);c=d.createRange();c.selectNode(a);c.collapse(!0);a=d.c",
    "reateRange();a.selectNode(b);\na.collapse(!0);return c.compareBoundaryP",
    "oints(aa.Range.START_TO_END,a)}function Na(a,b){var c=a.parentNode;if(c",
    "==b)return-1;for(;b.parentNode!=c;)b=b.parentNode;return Ma(b,a)}functi",
    "on Ma(a,b){for(;b=b.previousSibling;)if(b==a)return-1;return 1}function",
    " z(a){return 9==a.nodeType?a:a.ownerDocument||a.document}function Ia(a)",
    "{if(a&&\"number\"==typeof a.length){if(ea(a))return\"function\"==typeof",
    " a.item||\"string\"==typeof a.item;if(p(a))return\"function\"==typeof a",
    ".item}return!1}\nfunction Oa(a,b){a&&(a=a.parentNode);for(var c=0;a;){i",
    "f(b(a))return a;a=a.parentNode;c++}return null}function Ga(a){this.C=a|",
    "|aa.document||document}h=Ga.prototype;h.getElementsByTagName=function(a",
    ",b){return(b||this.C).getElementsByTagName(String(a))};\nfunction B(a,b",
    ",c,d){a=d||a.C;var e=b&&\"*\"!=b?String(b).toUpperCase():\"\";if(a.quer",
    "ySelectorAll&&a.querySelector&&(e||c))c=a.querySelectorAll(e+(c?\".\"+c",
    ":\"\"));else if(c&&a.getElementsByClassName)if(d=a.getElementsByClassNa",
    "me(c),e){a={};for(var f=b=0,g;g=d[f];f++)e==g.nodeName&&(a[b++]=g);a.le",
    "ngth=b;c=a}else c=d;else if(d=a.getElementsByTagName(e||\"*\"),c){a={};",
    "for(f=b=0;g=d[f];f++){var e=g.className,k;if(k=\"function\"==typeof e.s",
    "plit)k=0<=oa(e.split(/\\s+/),c);k&&(a[b++]=g)}a.length=b;c=a}else c=d;r",
    "eturn c}\nh.createElement=function(a){return this.C.createElement(Strin",
    "g(a))};h.createTextNode=function(a){return this.C.createTextNode(String",
    "(a))};h.appendChild=function(a,b){a.appendChild(b)};h.append=function(a",
    ",b){Ha(z(a),a,arguments)};h.canHaveChildren=function(a){if(1!=a.nodeTyp",
    "e)return!1;switch(a.tagName){case \"APPLET\":case \"AREA\":case \"BASE",
    "\":case \"BR\":case \"COL\":case \"COMMAND\":case \"EMBED\":case \"FRAM",
    "E\":case \"HR\":case \"IMG\":case \"INPUT\":case \"IFRAME\":case \"ISIN",
    "DEX\":case \"KEYGEN\":case \"LINK\":case \"NOFRAMES\":case \"NOSCRIPT\"",
    ":case \"META\":case \"OBJECT\":case \"PARAM\":case \"SCRIPT\":case \"SO",
    "URCE\":case \"STYLE\":case \"TRACK\":case \"WBR\":return!1}return!0};\n",
    "h.removeNode=function(a){return a&&a.parentNode?a.parentNode.removeChil",
    "d(a):null};h.contains=Ka;function Pa(a,b){b=b.toLowerCase();return\"sty",
    "le\"==b?Qa(a.style.cssText):(a=a.getAttributeNode(b))&&a.specified?a.va",
    "lue:null}var Ra=/[;]+(?=(?:(?:[^\"]*\"){2})*[^\"]*$)(?=(?:(?:[^']*'){2}",
    ")*[^']*$)(?=(?:[^()]*\\([^()]*\\))*[^()]*$)/;function Qa(a){var b=[];t(",
    "a.split(Ra),function(a){var c=a.indexOf(\":\");0<c&&(a=[a.slice(0,c),a.",
    "slice(c+1)],2==a.length&&b.push(a[0].toLowerCase(),\":\",a[1],\";\"))})",
    ";b=b.join(\"\");return b=\";\"==b.charAt(b.length-1)?b:b+\";\"}\nfuncti",
    "on C(a,b){b&&\"string\"!==typeof b&&(b=b.toString());return!!a&&1==a.no",
    "deType&&(!b||a.tagName.toUpperCase()==b)};/*\n\n The MIT License\n\n Co",
    "pyright (c) 2007 Cybozu Labs, Inc.\n Copyright (c) 2012 Google Inc.\n\n",
    " Permission is hereby granted, free of charge, to any person obtaining ",
    "a copy\n of this software and associated documentation files (the \"Sof",
    "tware\"), to\n deal in the Software without restriction, including with",
    "out limitation the\n rights to use, copy, modify, merge, publish, distr",
    "ibute, sublicense, and/or\n sell copies of the Software, and to permit ",
    "persons to whom the Software is\n furnished to do so, subject to the fo",
    "llowing conditions:\n\n The above copyright notice and this permission ",
    "notice shall be included in\n all copies or substantial portions of the",
    " Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ",
    "ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRAN",
    "TIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFR",
    "INGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABL",
    "E FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF ",
    "CONTRACT, TORT OR OTHERWISE, ARISING\n FROM, OUT OF OR IN CONNECTION WI",
    "TH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n IN THE SOFTWARE.\n*/\nfu",
    "nction Sa(a,b,c){this.m=a;this.ua=b||1;this.j=c||1};function Ta(a){this",
    ".W=a;this.M=0}function Ua(a){a=a.match(Va);for(var b=0;b<a.length;b++)W",
    "a.test(a[b])&&a.splice(b,1);return new Ta(a)}var Va=/\\$?(?:(?![0-9-\\.",
    "])(?:\\*|[\\w-\\.]+):)?(?![0-9-\\.])(?:\\*|[\\w-\\.]+)|\\/\\/|\\.\\.|::",
    "|\\d+(?:\\.\\d*)?|\\.\\d+|\"[^\"]*\"|'[^']*'|[!<>]=|\\s+|./g,Wa=/^\\s/;",
    "function E(a,b){return a.W[a.M+(b||0)]}Ta.prototype.next=function(){ret",
    "urn this.W[this.M++]};Ta.prototype.back=function(){this.M--};Ta.prototy",
    "pe.empty=function(){return this.W.length<=this.M};function F(a){var b=n",
    "ull,c=a.nodeType;1==c&&(b=a.textContent,b=void 0==b||null==b?a.innerTex",
    "t:b,b=void 0==b||null==b?\"\":b);if(\"string\"!=typeof b)if(9==c||1==c)",
    "{a=9==c?a.documentElement:a.firstChild;for(var c=0,d=[],b=\"\";a;){do 1",
    "!=a.nodeType&&(b+=a.nodeValue),d[c++]=a;while(a=a.firstChild);for(;c&&!",
    "(a=d[--c].nextSibling););}}else b=a.nodeValue;return\"\"+b}\nfunction X",
    "a(a,b,c){if(null===b)return!0;try{if(!a.getAttribute)return!1}catch(d){",
    "return!1}return null==c?!!a.getAttribute(b):a.getAttribute(b,2)==c}func",
    "tion Ya(a,b,c,d,e){return Za.call(null,a,b,m(c)?c:null,m(d)?d:null,e||n",
    "ew G)}\nfunction Za(a,b,c,d,e){b.getElementsByName&&d&&\"name\"==c?(b=b",
    ".getElementsByName(d),t(b,function(b){a.matches(b)&&e.add(b)})):b.getEl",
    "ementsByClassName&&d&&\"class\"==c?(b=b.getElementsByClassName(d),t(b,f",
    "unction(b){b.className==d&&a.matches(b)&&e.add(b)})):a instanceof H?$a(",
    "a,b,c,d,e):b.getElementsByTagName&&(b=b.getElementsByTagName(a.getName(",
    ")),t(b,function(a){Xa(a,c,d)&&e.add(a)}));return e}\nfunction $a(a,b,c,",
    "d,e){for(b=b.firstChild;b;b=b.nextSibling)Xa(b,c,d)&&a.matches(b)&&e.ad",
    "d(b),$a(a,b,c,d,e)};function G(){this.j=this.g=null;this.H=0}function a",
    "b(a){this.node=a;this.next=this.B=null}function bb(a,b){if(!a.g)return ",
    "b;if(!b.g)return a;var c=a.g;b=b.g;for(var d=null,e,f=0;c&&b;)c.node==b",
    ".node?(e=c,c=c.next,b=b.next):0<La(c.node,b.node)?(e=b,b=b.next):(e=c,c",
    "=c.next),(e.B=d)?d.next=e:a.g=e,d=e,f++;for(e=c||b;e;)e.B=d,d=d.next=e,",
    "f++,e=e.next;a.j=d;a.H=f;return a}G.prototype.unshift=function(a){a=new",
    " ab(a);a.next=this.g;this.j?this.g.B=a:this.g=this.j=a;this.g=a;this.H+",
    "+};\nG.prototype.add=function(a){a=new ab(a);a.B=this.j;this.g?this.j.n",
    "ext=a:this.g=this.j=a;this.j=a;this.H++};function cb(a){return(a=a.g)?a",
    ".node:null}G.prototype.s=function(){return this.H};function db(a){retur",
    "n(a=cb(a))?F(a):\"\"}G.prototype.iterator=function(a){return new eb(thi",
    "s,!!a)};function eb(a,b){this.qa=a;this.Z=(this.D=b)?a.j:a.g;this.T=nul",
    "l}eb.prototype.next=function(){var a=this.Z;if(null==a)return null;var ",
    "b=this.T=a;this.Z=this.D?a.B:a.next;return b.node};\neb.prototype.remov",
    "e=function(){var a=this.qa,b=this.T;if(!b)throw Error(\"Next must be ca",
    "lled at least once before remove.\");var c=b.B,b=b.next;c?c.next=b:a.g=",
    "b;b?b.B=c:a.j=c;a.H--;this.T=null};function I(a){this.f=a;this.h=this.v",
    "=!1;this.I=null}function J(a){return\"\\n  \"+a.toString().split(\"\\n",
    "\").join(\"\\n  \")}I.prototype.c=function(){return this.v};function fb",
    "(a,b){a.v=b}function gb(a,b){a.h=b}I.prototype.A=function(){return this",
    ".I};function K(a,b){a=a.evaluate(b);return a instanceof G?+db(a):+a}fun",
    "ction M(a,b){a=a.evaluate(b);return a instanceof G?db(a):\"\"+a}functio",
    "n hb(a,b){a=a.evaluate(b);return a instanceof G?!!a.s():!!a};function i",
    "b(a,b,c){I.call(this,a.f);this.V=a;this.ca=b;this.ia=c;this.v=b.c()||c.",
    "c();this.h=b.h||c.h;this.V==jb&&(c.h||c.c()||4==c.f||0==c.f||!b.A()?b.h",
    "||b.c()||4==b.f||0==b.f||!c.A()||(this.I={name:c.A().name,G:b}):this.I=",
    "{name:b.A().name,G:c})}r(ib,I);\nfunction kb(a,b,c,d,e){b=b.evaluate(d)",
    ";c=c.evaluate(d);var f;if(b instanceof G&&c instanceof G){b=b.iterator(",
    ");for(d=b.next();d;d=b.next())for(e=c.iterator(),f=e.next();f;f=e.next(",
    "))if(a(F(d),F(f)))return!0;return!1}if(b instanceof G||c instanceof G){",
    "b instanceof G?(e=b,d=c):(e=c,d=b);f=e.iterator();for(var g=typeof d,k=",
    "f.next();k;k=f.next()){switch(g){case \"number\":k=+F(k);break;case \"b",
    "oolean\":k=!!F(k);break;case \"string\":k=F(k);break;default:throw Erro",
    "r(\"Illegal primitive type for comparison.\");\n}if(e==b&&a(k,d)||e==c&",
    "&a(d,k))return!0}return!1}return e?\"boolean\"==typeof b||\"boolean\"==",
    "typeof c?a(!!b,!!c):\"number\"==typeof b||\"number\"==typeof c?a(+b,+c)",
    ":a(b,c):a(+b,+c)}ib.prototype.evaluate=function(a){return this.V.o(this",
    ".ca,this.ia,a)};ib.prototype.toString=function(){var a=\"Binary Express",
    "ion: \"+this.V,a=a+J(this.ca);return a+=J(this.ia)};function lb(a,b,c,d",
    "){this.ta=a;this.ga=b;this.f=c;this.o=d}lb.prototype.toString=function(",
    "){return this.ta};var mb={};\nfunction N(a,b,c,d){if(mb.hasOwnProperty(",
    "a))throw Error(\"Binary operator already created: \"+a);a=new lb(a,b,c,",
    "d);return mb[a.toString()]=a}N(\"div\",6,1,function(a,b,c){return K(a,c",
    ")/K(b,c)});N(\"mod\",6,1,function(a,b,c){return K(a,c)%K(b,c)});N(\"*\"",
    ",6,1,function(a,b,c){return K(a,c)*K(b,c)});N(\"+\",5,1,function(a,b,c)",
    "{return K(a,c)+K(b,c)});N(\"-\",5,1,function(a,b,c){return K(a,c)-K(b,c",
    ")});N(\"<\",4,2,function(a,b,c){return kb(function(a,b){return a<b},a,b",
    ",c)});\nN(\">\",4,2,function(a,b,c){return kb(function(a,b){return a>b}",
    ",a,b,c)});N(\"<=\",4,2,function(a,b,c){return kb(function(a,b){return a",
    "<=b},a,b,c)});N(\">=\",4,2,function(a,b,c){return kb(function(a,b){retu",
    "rn a>=b},a,b,c)});var jb=N(\"=\",3,2,function(a,b,c){return kb(function",
    "(a,b){return a==b},a,b,c,!0)});N(\"!=\",3,2,function(a,b,c){return kb(f",
    "unction(a,b){return a!=b},a,b,c,!0)});N(\"and\",2,2,function(a,b,c){ret",
    "urn hb(a,c)&&hb(b,c)});N(\"or\",1,2,function(a,b,c){return hb(a,c)||hb(",
    "b,c)});function nb(a,b){if(b.s()&&4!=a.f)throw Error(\"Primary expressi",
    "on must evaluate to nodeset if filter has predicate(s).\");I.call(this,",
    "a.f);this.ha=a;this.b=b;this.v=a.c();this.h=a.h}r(nb,I);nb.prototype.ev",
    "aluate=function(a){a=this.ha.evaluate(a);return ob(this.b,a)};nb.protot",
    "ype.toString=function(){var a=\"Filter:\"+J(this.ha);return a+=J(this.b",
    ")};function pb(a,b){if(b.length<a.fa)throw Error(\"Function \"+a.i+\" e",
    "xpects at least\"+a.fa+\" arguments, \"+b.length+\" given\");if(null!==",
    "a.U&&b.length>a.U)throw Error(\"Function \"+a.i+\" expects at most \"+a",
    ".U+\" arguments, \"+b.length+\" given\");a.ra&&t(b,function(b,d){if(4!=",
    "b.f)throw Error(\"Argument \"+d+\" to function \"+a.i+\" is not of type",
    " Nodeset: \"+b);});I.call(this,a.f);this.L=a;this.R=b;fb(this,a.v||ra(b",
    ",function(a){return a.c()}));gb(this,a.pa&&!b.length||a.oa&&!!b.length|",
    "|ra(b,function(a){return a.h}))}\nr(pb,I);pb.prototype.evaluate=functio",
    "n(a){return this.L.o.apply(null,ua(a,this.R))};pb.prototype.toString=fu",
    "nction(){var a=\"Function: \"+this.L;if(this.R.length)var b=qa(this.R,f",
    "unction(a,b){return a+J(b)},\"Arguments:\"),a=a+J(b);return a};function",
    " qb(a,b,c,d,e,f,g,k,u){this.i=a;this.f=b;this.v=c;this.pa=d;this.oa=e;t",
    "his.o=f;this.fa=g;this.U=l(k)?k:g;this.ra=!!u}qb.prototype.toString=fun",
    "ction(){return this.i};var rb={};\nfunction O(a,b,c,d,e,f,g,k){if(rb.ha",
    "sOwnProperty(a))throw Error(\"Function already created: \"+a+\".\");rb[",
    "a]=new qb(a,b,c,d,!1,e,f,g,k)}O(\"boolean\",2,!1,!1,function(a,b){retur",
    "n hb(b,a)},1);O(\"ceiling\",1,!1,!1,function(a,b){return Math.ceil(K(b,",
    "a))},1);O(\"concat\",3,!1,!1,function(a,b){return qa(wa(arguments,1),fu",
    "nction(b,d){return b+M(d,a)},\"\")},2,null);O(\"contains\",2,!1,!1,func",
    "tion(a,b,c){b=M(b,a);a=M(c,a);return-1!=b.indexOf(a)},2);O(\"count\",1,",
    "!1,!1,function(a,b){return b.evaluate(a).s()},1,1,!0);\nO(\"false\",2,!",
    "1,!1,function(){return!1},0);O(\"floor\",1,!1,!1,function(a,b){return M",
    "ath.floor(K(b,a))},1);O(\"id\",4,!1,!1,function(a,b){var c=a.m,d=9==c.n",
    "odeType?c:c.ownerDocument;a=M(b,a).split(/\\s+/);var e=[];t(a,function(",
    "a){a=d.getElementById(a);!a||0<=oa(e,a)||e.push(a)});e.sort(La);var f=n",
    "ew G;t(e,function(a){f.add(a)});return f},1);O(\"lang\",2,!1,!1,functio",
    "n(){return!1},1);O(\"last\",1,!0,!1,function(a){if(1!=arguments.length)",
    "throw Error(\"Function last expects ()\");return a.j},0);\nO(\"local-na",
    "me\",3,!1,!0,function(a,b){return(a=b?cb(b.evaluate(a)):a.m)?a.localNam",
    "e||a.nodeName.toLowerCase():\"\"},0,1,!0);O(\"name\",3,!1,!0,function(a",
    ",b){return(a=b?cb(b.evaluate(a)):a.m)?a.nodeName.toLowerCase():\"\"},0,",
    "1,!0);O(\"namespace-uri\",3,!0,!1,function(){return\"\"},0,1,!0);O(\"no",
    "rmalize-space\",3,!1,!0,function(a,b){return(b?M(b,a):F(a.m)).replace(/",
    "[\\s\\xa0]+/g,\" \").replace(/^\\s+|\\s+$/g,\"\")},0,1);O(\"not\",2,!1,",
    "!1,function(a,b){return!hb(b,a)},1);\nO(\"number\",1,!1,!0,function(a,b",
    "){return b?K(b,a):+F(a.m)},0,1);O(\"position\",1,!0,!1,function(a){retu",
    "rn a.ua},0);O(\"round\",1,!1,!1,function(a,b){return Math.round(K(b,a))",
    "},1);O(\"starts-with\",2,!1,!1,function(a,b,c){b=M(b,a);a=M(c,a);return",
    " 0==b.lastIndexOf(a,0)},2);O(\"string\",3,!1,!0,function(a,b){return b?",
    "M(b,a):F(a.m)},0,1);O(\"string-length\",1,!1,!0,function(a,b){return(b?",
    "M(b,a):F(a.m)).length},0,1);\nO(\"substring\",3,!1,!1,function(a,b,c,d)",
    "{c=K(c,a);if(isNaN(c)||Infinity==c||-Infinity==c)return\"\";d=d?K(d,a):",
    "Infinity;if(isNaN(d)||-Infinity===d)return\"\";c=Math.round(c)-1;var e=",
    "Math.max(c,0);a=M(b,a);return Infinity==d?a.substring(e):a.substring(e,",
    "c+Math.round(d))},2,3);O(\"substring-after\",3,!1,!1,function(a,b,c){b=",
    "M(b,a);a=M(c,a);c=b.indexOf(a);return-1==c?\"\":b.substring(c+a.length)",
    "},2);\nO(\"substring-before\",3,!1,!1,function(a,b,c){b=M(b,a);a=M(c,a)",
    ";a=b.indexOf(a);return-1==a?\"\":b.substring(0,a)},2);O(\"sum\",1,!1,!1",
    ",function(a,b){a=b.evaluate(a).iterator();b=0;for(var c=a.next();c;c=a.",
    "next())b+=+F(c);return b},1,1,!0);O(\"translate\",3,!1,!1,function(a,b,",
    "c,d){b=M(b,a);c=M(c,a);var e=M(d,a);d={};for(var f=0;f<c.length;f++)a=c",
    ".charAt(f),a in d||(d[a]=e.charAt(f));c=\"\";for(f=0;f<b.length;f++)a=b",
    ".charAt(f),c+=a in d?d[a]:a;return c},3);O(\"true\",2,!1,!1,function(){",
    "return!0},0);function H(a,b){this.la=a;this.da=l(b)?b:null;this.F=null;",
    "switch(a){case \"comment\":this.F=8;break;case \"text\":this.F=3;break;",
    "case \"processing-instruction\":this.F=7;break;case \"node\":break;defa",
    "ult:throw Error(\"Unexpected argument\");}}function sb(a){return\"comme",
    "nt\"==a||\"text\"==a||\"processing-instruction\"==a||\"node\"==a}H.prot",
    "otype.matches=function(a){return null===this.F||this.F==a.nodeType};H.p",
    "rototype.getName=function(){return this.la};\nH.prototype.toString=func",
    "tion(){var a=\"Kind Test: \"+this.la;null===this.da||(a+=J(this.da));re",
    "turn a};function tb(a){I.call(this,3);this.ka=a.substring(1,a.length-1)",
    "}r(tb,I);tb.prototype.evaluate=function(){return this.ka};tb.prototype.",
    "toString=function(){return\"Literal: \"+this.ka};function ub(a,b){this.",
    "i=a.toLowerCase();a=\"*\"==this.i?\"*\":\"http://www.w3.org/1999/xhtml",
    "\";this.N=b?b.toLowerCase():a}ub.prototype.matches=function(a){var b=a.",
    "nodeType;if(1!=b&&2!=b)return!1;b=l(a.localName)?a.localName:a.nodeName",
    ";return\"*\"!=this.i&&this.i!=b.toLowerCase()?!1:\"*\"==this.N?!0:this.",
    "N==(a.namespaceURI?a.namespaceURI.toLowerCase():\"http://www.w3.org/199",
    "9/xhtml\")};ub.prototype.getName=function(){return this.i};\nub.prototy",
    "pe.toString=function(){return\"Name Test: \"+(\"http://www.w3.org/1999/",
    "xhtml\"==this.N?\"\":this.N+\":\")+this.i};function vb(a){I.call(this,1",
    ");this.ma=a}r(vb,I);vb.prototype.evaluate=function(){return this.ma};vb",
    ".prototype.toString=function(){return\"Number: \"+this.ma};function wb(",
    "a,b){I.call(this,a.f);this.aa=a;this.J=b;this.v=a.c();this.h=a.h;1==thi",
    "s.J.length&&(a=this.J[0],a.S||a.w!=xb||(a=a.P,\"*\"!=a.getName()&&(this",
    ".I={name:a.getName(),G:null})))}r(wb,I);function yb(){I.call(this,4)}r(",
    "yb,I);yb.prototype.evaluate=function(a){var b=new G;a=a.m;9==a.nodeType",
    "?b.add(a):b.add(a.ownerDocument);return b};yb.prototype.toString=functi",
    "on(){return\"Root Helper Expression\"};function zb(){I.call(this,4)}r(z",
    "b,I);zb.prototype.evaluate=function(a){var b=new G;b.add(a.m);return b}",
    ";\nzb.prototype.toString=function(){return\"Context Helper Expression\"",
    "};function Ab(a){return\"/\"==a||\"//\"==a}\nwb.prototype.evaluate=func",
    "tion(a){var b=this.aa.evaluate(a);if(!(b instanceof G))throw Error(\"Fi",
    "lter expression must evaluate to nodeset.\");a=this.J;for(var c=0,d=a.l",
    "ength;c<d&&b.s();c++){var e=a[c],f=b.iterator(e.w.D);if(e.c()||e.w!=Bb)",
    "if(e.c()||e.w!=Cb){var g=f.next();for(b=e.evaluate(new Sa(g));null!=(g=",
    "f.next());)g=e.evaluate(new Sa(g)),b=bb(b,g)}else g=f.next(),b=e.evalua",
    "te(new Sa(g));else{for(g=f.next();(b=f.next())&&(!g.contains||g.contain",
    "s(b))&&b.compareDocumentPosition(g)&8;g=b);b=e.evaluate(new Sa(g))}}ret",
    "urn b};\nwb.prototype.toString=function(){var a=\"Path Expression:\"+J(",
    "this.aa);if(this.J.length){var b=qa(this.J,function(a,b){return a+J(b)}",
    ",\"Steps:\");a+=J(b)}return a};function P(a,b){this.b=a;this.D=!!b}func",
    "tion ob(a,b,c){for(c=c||0;c<a.b.length;c++)for(var d=a.b[c],e=b.iterato",
    "r(),f=b.s(),g,k=0;g=e.next();k++){var u=a.D?f-k:k+1;g=d.evaluate(new Sa",
    "(g,u,f));if(\"number\"==typeof g)u=u==g;else if(\"string\"==typeof g||",
    "\"boolean\"==typeof g)u=!!g;else if(g instanceof G)u=0<g.s();else throw",
    " Error(\"Predicate.evaluate returned an unexpected type.\");u||e.remove",
    "()}return b}P.prototype.A=function(){return 0<this.b.length?this.b[0].A",
    "():null};\nP.prototype.c=function(){for(var a=0;a<this.b.length;a++){va",
    "r b=this.b[a];if(b.c()||1==b.f||0==b.f)return!0}return!1};P.prototype.s",
    "=function(){return this.b.length};P.prototype.toString=function(){retur",
    "n qa(this.b,function(a,b){return a+J(b)},\"Predicates:\")};function Q(a",
    ",b,c,d){I.call(this,4);this.w=a;this.P=b;this.b=c||new P([]);this.S=!!d",
    ";b=this.b.A();a.va&&b&&(this.I={name:b.name,G:b.G});this.v=this.b.c()}r",
    "(Q,I);\nQ.prototype.evaluate=function(a){var b=a.m,c=this.A(),d=null,e=",
    "null,f=0;c&&(d=c.name,e=c.G?M(c.G,a):null,f=1);if(this.S)if(this.c()||t",
    "his.w!=Db)if(b=(new Q(Eb,new H(\"node\"))).evaluate(a).iterator(),c=b.n",
    "ext())for(a=this.o(c,d,e,f);null!=(c=b.next());)a=bb(a,this.o(c,d,e,f))",
    ";else a=new G;else a=Ya(this.P,b,d,e),a=ob(this.b,a,f);else a=this.o(a.",
    "m,d,e,f);return a};Q.prototype.o=function(a,b,c,d){a=this.w.L(this.P,a,",
    "b,c);return a=ob(this.b,a,d)};\nQ.prototype.toString=function(){var a=",
    "\"Step:\"+J(\"Operator: \"+(this.S?\"//\":\"/\"));this.w.i&&(a+=J(\"Axi",
    "s: \"+this.w));a+=J(this.P);if(this.b.s()){var b=qa(this.b.b,function(a",
    ",b){return a+J(b)},\"Predicates:\");a+=J(b)}return a};function Fb(a,b,c",
    ",d){this.i=a;this.L=b;this.D=c;this.va=d}Fb.prototype.toString=function",
    "(){return this.i};var Gb={};function R(a,b,c,d){if(Gb.hasOwnProperty(a)",
    ")throw Error(\"Axis already created: \"+a);b=new Fb(a,b,c,!!d);return G",
    "b[a]=b}\nR(\"ancestor\",function(a,b){for(var c=new G;b=b.parentNode;)a",
    ".matches(b)&&c.unshift(b);return c},!0);R(\"ancestor-or-self\",function",
    "(a,b){var c=new G;do a.matches(b)&&c.unshift(b);while(b=b.parentNode);r",
    "eturn c},!0);\nvar xb=R(\"attribute\",function(a,b){var c=new G,d=a.get",
    "Name();if(b=b.attributes)if(a instanceof H&&null===a.F||\"*\"==d)for(d=",
    "0;a=b[d];d++)c.add(a);else(a=b.getNamedItem(d))&&c.add(a);return c},!1)",
    ",Db=R(\"child\",function(a,b,c,d,e){c=m(c)?c:null;d=m(d)?d:null;e=e||ne",
    "w G;for(b=b.firstChild;b;b=b.nextSibling)Xa(b,c,d)&&a.matches(b)&&e.add",
    "(b);return e},!1,!0);R(\"descendant\",Ya,!1,!0);\nvar Eb=R(\"descendant",
    "-or-self\",function(a,b,c,d){var e=new G;Xa(b,c,d)&&a.matches(b)&&e.add",
    "(b);return Ya(a,b,c,d,e)},!1,!0),Bb=R(\"following\",function(a,b,c,d){v",
    "ar e=new G;do for(var f=b;f=f.nextSibling;)Xa(f,c,d)&&a.matches(f)&&e.a",
    "dd(f),e=Ya(a,f,c,d,e);while(b=b.parentNode);return e},!1,!0);R(\"follow",
    "ing-sibling\",function(a,b){for(var c=new G;b=b.nextSibling;)a.matches(",
    "b)&&c.add(b);return c},!1);R(\"namespace\",function(){return new G},!1)",
    ";\nvar Hb=R(\"parent\",function(a,b){var c=new G;if(9==b.nodeType)retur",
    "n c;if(2==b.nodeType)return c.add(b.ownerElement),c;b=b.parentNode;a.ma",
    "tches(b)&&c.add(b);return c},!1),Cb=R(\"preceding\",function(a,b,c,d){v",
    "ar e=new G,f=[];do f.unshift(b);while(b=b.parentNode);for(var g=1,k=f.l",
    "ength;g<k;g++){var u=[];for(b=f[g];b=b.previousSibling;)u.unshift(b);fo",
    "r(var D=0,q=u.length;D<q;D++)b=u[D],Xa(b,c,d)&&a.matches(b)&&e.add(b),e",
    "=Ya(a,b,c,d,e)}return e},!0,!0);\nR(\"preceding-sibling\",function(a,b)",
    "{for(var c=new G;b=b.previousSibling;)a.matches(b)&&c.unshift(b);return",
    " c},!0);var Ib=R(\"self\",function(a,b){var c=new G;a.matches(b)&&c.add",
    "(b);return c},!1);function Jb(a){I.call(this,1);this.$=a;this.v=a.c();t",
    "his.h=a.h}r(Jb,I);Jb.prototype.evaluate=function(a){return-K(this.$,a)}",
    ";Jb.prototype.toString=function(){return\"Unary Expression: -\"+J(this.",
    "$)};function Kb(a){I.call(this,4);this.O=a;fb(this,ra(this.O,function(a",
    "){return a.c()}));gb(this,ra(this.O,function(a){return a.h}))}r(Kb,I);K",
    "b.prototype.evaluate=function(a){var b=new G;t(this.O,function(c){c=c.e",
    "valuate(a);if(!(c instanceof G))throw Error(\"Path expression must eval",
    "uate to NodeSet.\");b=bb(b,c)});return b};Kb.prototype.toString=functio",
    "n(){return qa(this.O,function(a,b){return a+J(b)},\"Union Expression:\"",
    ")};function Lb(a,b){this.a=a;this.sa=b}function Mb(a){for(var b,c=[];;)",
    "{S(a,\"Missing right hand side of binary expression.\");b=Nb(a);var d=a",
    ".a.next();if(!d)break;var e=(d=mb[d]||null)&&d.ga;if(!e){a.a.back();bre",
    "ak}for(;c.length&&e<=c[c.length-1].ga;)b=new ib(c.pop(),c.pop(),b);c.pu",
    "sh(b,d)}for(;c.length;)b=new ib(c.pop(),c.pop(),b);return b}function S(",
    "a,b){if(a.a.empty())throw Error(b);}function Ob(a,b){a=a.a.next();if(a!",
    "=b)throw Error(\"Bad token, expected: \"+b+\" got: \"+a);}\nfunction Pb",
    "(a){a=a.a.next();if(\")\"!=a)throw Error(\"Bad token: \"+a);}function Q",
    "b(a){a=a.a.next();if(2>a.length)throw Error(\"Unclosed literal string\"",
    ");return new tb(a)}\nfunction Rb(a){var b=[];if(Ab(E(a.a))){var c=a.a.n",
    "ext();var d=E(a.a);if(\"/\"==c&&(a.a.empty()||\".\"!=d&&\"..\"!=d&&\"@",
    "\"!=d&&\"*\"!=d&&!/(?![0-9])[\\w]/.test(d)))return new yb;d=new yb;S(a,",
    "\"Missing next location step.\");c=Sb(a,c);b.push(c)}else{a:{c=E(a.a);d",
    "=c.charAt(0);switch(d){case \"$\":throw Error(\"Variable reference not ",
    "allowed in HTML XPath\");case \"(\":a.a.next();c=Mb(a);S(a,'unclosed \"",
    "(\"');Ob(a,\")\");break;case '\"':case \"'\":c=Qb(a);break;default:if(i",
    "sNaN(+c))if(!sb(c)&&/(?![0-9])[\\w]/.test(d)&&\"(\"==E(a.a,\n1)){c=a.a.",
    "next();c=rb[c]||null;a.a.next();for(d=[];\")\"!=E(a.a);){S(a,\"Missing ",
    "function argument list.\");d.push(Mb(a));if(\",\"!=E(a.a))break;a.a.nex",
    "t()}S(a,\"Unclosed function argument list.\");Pb(a);c=new pb(c,d)}else{",
    "c=null;break a}else c=new vb(+a.a.next())}\"[\"==E(a.a)&&(d=new P(Tb(a)",
    "),c=new nb(c,d))}if(c)if(Ab(E(a.a)))d=c;else return c;else c=Sb(a,\"/\"",
    "),d=new zb,b.push(c)}for(;Ab(E(a.a));)c=a.a.next(),S(a,\"Missing next l",
    "ocation step.\"),c=Sb(a,c),b.push(c);return new wb(d,b)}\nfunction Sb(a",
    ",b){if(\"/\"!=b&&\"//\"!=b)throw Error('Step op should be \"/\" or \"//",
    "\"');if(\".\"==E(a.a)){var c=new Q(Ib,new H(\"node\"));a.a.next();retur",
    "n c}if(\"..\"==E(a.a))return c=new Q(Hb,new H(\"node\")),a.a.next(),c;i",
    "f(\"@\"==E(a.a)){var d=xb;a.a.next();S(a,\"Missing attribute name\")}el",
    "se if(\"::\"==E(a.a,1)){if(!/(?![0-9])[\\w]/.test(E(a.a).charAt(0)))thr",
    "ow Error(\"Bad token: \"+a.a.next());var e=a.a.next();d=Gb[e]||null;if(",
    "!d)throw Error(\"No axis with name: \"+e);a.a.next();S(a,\"Missing node",
    " name\")}else d=Db;e=\nE(a.a);if(/(?![0-9])[\\w\\*]/.test(e.charAt(0)))",
    "if(\"(\"==E(a.a,1)){if(!sb(e))throw Error(\"Invalid node type: \"+e);e=",
    "a.a.next();if(!sb(e))throw Error(\"Invalid type name: \"+e);Ob(a,\"(\")",
    ";S(a,\"Bad nodetype\");var f=E(a.a).charAt(0),g=null;if('\"'==f||\"'\"=",
    "=f)g=Qb(a);S(a,\"Bad nodetype\");Pb(a);e=new H(e,g)}else if(e=a.a.next(",
    "),f=e.indexOf(\":\"),-1==f)e=new ub(e);else{var g=e.substring(0,f);if(",
    "\"*\"==g)var k=\"*\";else if(k=a.sa(g),!k)throw Error(\"Namespace prefi",
    "x not declared: \"+g);e=e.substr(f+1);e=new ub(e,k)}else throw Error(\"",
    "Bad token: \"+\na.a.next());a=new P(Tb(a),d.D);return c||new Q(d,e,a,\"",
    "//\"==b)}function Tb(a){for(var b=[];\"[\"==E(a.a);){a.a.next();S(a,\"M",
    "issing predicate expression.\");var c=Mb(a);b.push(c);S(a,\"Unclosed pr",
    "edicate expression.\");Ob(a,\"]\")}return b}function Nb(a){if(\"-\"==E(",
    "a.a))return a.a.next(),new Jb(Nb(a));var b=Rb(a);if(\"|\"!=E(a.a))a=b;e",
    "lse{for(b=[b];\"|\"==a.a.next();)S(a,\"Missing next union location path",
    ".\"),b.push(Rb(a));a.a.back();a=new Kb(b)}return a};function Ub(a){swit",
    "ch(a.nodeType){case 1:return ia(Vb,a);case 9:return Ub(a.documentElemen",
    "t);case 11:case 10:case 6:case 12:return Wb;default:return a.parentNode",
    "?Ub(a.parentNode):Wb}}function Wb(){return null}function Vb(a,b){if(a.p",
    "refix==b)return a.namespaceURI||\"http://www.w3.org/1999/xhtml\";var c=",
    "a.getAttributeNode(\"xmlns:\"+b);return c&&c.specified?c.value||null:a.",
    "parentNode&&9!=a.parentNode.nodeType?Vb(a.parentNode,b):null};function ",
    "Xb(a,b){if(!a.length)throw Error(\"Empty XPath expression.\");a=Ua(a);i",
    "f(a.empty())throw Error(\"Invalid XPath expression.\");b?p(b)||(b=ha(b.",
    "lookupNamespaceURI,b)):b=function(){return null};var c=Mb(new Lb(a,b));",
    "if(!a.empty())throw Error(\"Bad token: \"+a.next());this.evaluate=funct",
    "ion(a,b){a=c.evaluate(new Sa(a));return new T(a,b)}}\nfunction T(a,b){i",
    "f(0==b)if(a instanceof G)b=4;else if(\"string\"==typeof a)b=2;else if(",
    "\"number\"==typeof a)b=1;else if(\"boolean\"==typeof a)b=3;else throw E",
    "rror(\"Unexpected evaluation result.\");if(2!=b&&1!=b&&3!=b&&!(a instan",
    "ceof G))throw Error(\"value could not be converted to the specified typ",
    "e\");this.resultType=b;switch(b){case 2:this.stringValue=a instanceof G",
    "?db(a):\"\"+a;break;case 1:this.numberValue=a instanceof G?+db(a):+a;br",
    "eak;case 3:this.booleanValue=a instanceof G?0<a.s():!!a;break;case 4:ca",
    "se 5:case 6:case 7:var c=\na.iterator();var d=[];for(var e=c.next();e;e",
    "=c.next())d.push(e);this.snapshotLength=a.s();this.invalidIteratorState",
    "=!1;break;case 8:case 9:this.singleNodeValue=cb(a);break;default:throw ",
    "Error(\"Unknown XPathResult type.\");}var f=0;this.iterateNext=function",
    "(){if(4!=b&&5!=b)throw Error(\"iterateNext called with wrong result typ",
    "e\");return f>=d.length?null:d[f++]};this.snapshotItem=function(a){if(6",
    "!=b&&7!=b)throw Error(\"snapshotItem called with wrong result type\");r",
    "eturn a>=d.length||0>a?null:d[a]}}\nT.ANY_TYPE=0;T.NUMBER_TYPE=1;T.STRI",
    "NG_TYPE=2;T.BOOLEAN_TYPE=3;T.UNORDERED_NODE_ITERATOR_TYPE=4;T.ORDERED_N",
    "ODE_ITERATOR_TYPE=5;T.UNORDERED_NODE_SNAPSHOT_TYPE=6;T.ORDERED_NODE_SNA",
    "PSHOT_TYPE=7;T.ANY_UNORDERED_NODE_TYPE=8;T.FIRST_ORDERED_NODE_TYPE=9;fu",
    "nction Yb(a){this.lookupNamespaceURI=Ub(a)}\nba(\"wgxpath.install\",fun",
    "ction(a,b){a=a||aa;var c=a.Document&&a.Document.prototype||a.document;i",
    "f(!c.evaluate||b)a.XPathResult=T,c.evaluate=function(a,b,c,g){return(ne",
    "w Xb(a,c)).evaluate(b,g)},c.createExpression=function(a,b){return new X",
    "b(a,b)},c.createNSResolver=function(a){return new Yb(a)}});var U={};U.X",
    "=function(){var a={ya:\"http://www.w3.org/2000/svg\"};return function(b",
    "){return a[b]||null}}();\nU.o=function(a,b,c){var d=z(a);if(!d.document",
    "Element)return null;try{for(var e=d.createNSResolver?d.createNSResolver",
    "(d.documentElement):U.X,f={},g=d.getElementsByTagName(\"*\"),k=0;k<g.le",
    "ngth;++k){var u=g[k],D=u.namespaceURI;if(D&&!f[D]){var q=u.lookupPrefix",
    "(D);if(!q)var A=D.match(\".*/(\\\\w+)/?$\"),q=A?A[1]:\"xhtml\";f[D]=q}}",
    "var L={},W;for(W in f)L[f[W]]=W;e=function(a){return L[a]||null};try{re",
    "turn d.evaluate(b,a,e,c,null)}catch(Ea){if(\"TypeError\"===Ea.name)retu",
    "rn e=d.createNSResolver?d.createNSResolver(d.documentElement):\nU.X,d.e",
    "valuate(b,a,e,c,null);throw Ea;}}catch(Ea){throw new v(32,\"Unable to l",
    "ocate an element with the xpath expression \"+b+\" because of the follo",
    "wing error:\\n\"+Ea);}};U.Y=function(a,b){if(!a||1!=a.nodeType)throw ne",
    "w v(32,'The result of the xpath expression \"'+b+'\" is: '+a+\". It sho",
    "uld be an element.\");};\nU.u=function(a,b){var c=function(){var c=U.o(",
    "b,a,9);return c?c.singleNodeValue||null:b.selectSingleNode?(c=z(b),c.se",
    "tProperty&&c.setProperty(\"SelectionLanguage\",\"XPath\"),b.selectSingl",
    "eNode(a)):null}();null===c||U.Y(c,a);return c};\nU.l=function(a,b){var ",
    "c=function(){var c=U.o(b,a,7);if(c){for(var e=c.snapshotLength,f=[],g=0",
    ";g<e;++g)f.push(c.snapshotItem(g));return f}return b.selectNodes?(c=z(b",
    "),c.setProperty&&c.setProperty(\"SelectionLanguage\",\"XPath\"),b.selec",
    "tNodes(a)):[]}();t(c,function(b){U.Y(b,a)});return c};function Zb(a,b,c",
    ",d){this.top=a;this.right=b;this.bottom=c;this.left=d}h=Zb.prototype;h.",
    "clone=function(){return new Zb(this.top,this.right,this.bottom,this.lef",
    "t)};h.toString=function(){return\"(\"+this.top+\"t, \"+this.right+\"r, ",
    "\"+this.bottom+\"b, \"+this.left+\"l)\"};h.contains=function(a){return ",
    "this&&a?a instanceof Zb?a.left>=this.left&&a.right<=this.right&&a.top>=",
    "this.top&&a.bottom<=this.bottom:a.x>=this.left&&a.x<=this.right&&a.y>=t",
    "his.top&&a.y<=this.bottom:!1};\nh.expand=function(a,b,c,d){ea(a)?(this.",
    "top-=a.top,this.right+=a.right,this.bottom+=a.bottom,this.left-=a.left)",
    ":(this.top-=a,this.right+=Number(b),this.bottom+=Number(c),this.left-=N",
    "umber(d));return this};h.ceil=function(){this.top=Math.ceil(this.top);t",
    "his.right=Math.ceil(this.right);this.bottom=Math.ceil(this.bottom);this",
    ".left=Math.ceil(this.left);return this};\nh.floor=function(){this.top=M",
    "ath.floor(this.top);this.right=Math.floor(this.right);this.bottom=Math.",
    "floor(this.bottom);this.left=Math.floor(this.left);return this};h.round",
    "=function(){this.top=Math.round(this.top);this.right=Math.round(this.ri",
    "ght);this.bottom=Math.round(this.bottom);this.left=Math.round(this.left",
    ");return this};h.translate=function(a,b){a instanceof x?(this.left+=a.x",
    ",this.right+=a.x,this.top+=a.y,this.bottom+=a.y):(this.left+=a,this.rig",
    "ht+=a,n(b)&&(this.top+=b,this.bottom+=b));return this};\nh.scale=functi",
    "on(a,b){b=n(b)?b:a;this.left*=a;this.right*=a;this.top*=b;this.bottom*=",
    "b;return this};function V(a,b,c,d){this.left=a;this.top=b;this.width=c;",
    "this.height=d}h=V.prototype;h.clone=function(){return new V(this.left,t",
    "his.top,this.width,this.height)};h.toString=function(){return\"(\"+this",
    ".left+\", \"+this.top+\" - \"+this.width+\"w x \"+this.height+\"h)\"};h",
    ".contains=function(a){return a instanceof x?a.x>=this.left&&a.x<=this.l",
    "eft+this.width&&a.y>=this.top&&a.y<=this.top+this.height:this.left<=a.l",
    "eft&&this.left+this.width>=a.left+a.width&&this.top<=a.top&&this.top+th",
    "is.height>=a.top+a.height};\nh.ceil=function(){this.left=Math.ceil(this",
    ".left);this.top=Math.ceil(this.top);this.width=Math.ceil(this.width);th",
    "is.height=Math.ceil(this.height);return this};h.floor=function(){this.l",
    "eft=Math.floor(this.left);this.top=Math.floor(this.top);this.width=Math",
    ".floor(this.width);this.height=Math.floor(this.height);return this};h.r",
    "ound=function(){this.left=Math.round(this.left);this.top=Math.round(thi",
    "s.top);this.width=Math.round(this.width);this.height=Math.round(this.he",
    "ight);return this};\nh.translate=function(a,b){a instanceof x?(this.lef",
    "t+=a.x,this.top+=a.y):(this.left+=a,n(b)&&(this.top+=b));return this};h",
    ".scale=function(a,b){b=n(b)?b:a;this.left*=a;this.width*=a;this.top*=b;",
    "this.height*=b;return this};var $b=\"function\"===typeof ShadowRoot;fun",
    "ction ac(a){for(a=a.parentNode;a&&1!=a.nodeType&&9!=a.nodeType&&11!=a.n",
    "odeType;)a=a.parentNode;return C(a)?a:null}\nfunction X(a,b){b=na(b);if",
    "(\"float\"==b||\"cssFloat\"==b||\"styleFloat\"==b)b=\"cssFloat\";a:{var",
    " c=b;var d=z(a);if(d.defaultView&&d.defaultView.getComputedStyle&&(d=d.",
    "defaultView.getComputedStyle(a,null))){c=d[c]||d.getPropertyValue(c)||",
    "\"\";break a}c=\"\"}a=c||bc(a,b);if(null===a)a=null;else if(0<=oa(ya,b)",
    "){b:{var e=a.match(Ba);if(e&&(b=Number(e[1]),c=Number(e[2]),d=Number(e[",
    "3]),e=Number(e[4]),0<=b&&255>=b&&0<=c&&255>=c&&0<=d&&255>=d&&0<=e&&1>=e",
    ")){b=[b,c,d,e];break b}b=null}if(!b)b:{if(d=a.match(Ca))if(b=Number(d[1",
    "]),\nc=Number(d[2]),d=Number(d[3]),0<=b&&255>=b&&0<=c&&255>=c&&0<=d&&25",
    "5>=d){b=[b,c,d,1];break b}b=null}if(!b)b:{b=a.toLowerCase();c=xa[b.toLo",
    "werCase()];if(!c&&(c=\"#\"==b.charAt(0)?b:\"#\"+b,4==c.length&&(c=c.rep",
    "lace(za,\"#$1$1$2$2$3$3\")),!Aa.test(c))){b=null;break b}b=[parseInt(c.",
    "substr(1,2),16),parseInt(c.substr(3,2),16),parseInt(c.substr(5,2),16),1",
    "]}a=b?\"rgba(\"+b.join(\", \")+\")\":a}return a}\nfunction bc(a,b){var ",
    "c=a.currentStyle||a.style,d=c[b];!l(d)&&p(c.getPropertyValue)&&(d=c.get",
    "PropertyValue(b));return\"inherit\"!=d?l(d)?d:null:(a=ac(a))?bc(a,b):nu",
    "ll}\nfunction cc(a,b,c){function d(a){var b=dc(a);return 0<b.height&&0<",
    "b.width?!0:C(a,\"PATH\")&&(0<b.height||0<b.width)?(a=X(a,\"stroke-width",
    "\"),!!a&&0<parseInt(a,10)):\"hidden\"!=X(a,\"overflow\")&&ra(a.childNod",
    "es,function(a){return 3==a.nodeType||C(a)&&d(a)})}function e(a){return ",
    "ec(a)==Y&&sa(a.childNodes,function(a){return!C(a)||e(a)||!d(a)})}if(!C(",
    "a))throw Error(\"Argument to isShown must be of type Element\");if(C(a,",
    "\"BODY\"))return!0;if(C(a,\"OPTION\")||C(a,\"OPTGROUP\"))return a=Oa(a,",
    "function(a){return C(a,\"SELECT\")}),\n!!a&&cc(a,!0,c);var f=fc(a);if(f",
    ")return!!f.ba&&0<f.rect.width&&0<f.rect.height&&cc(f.ba,b,c);if(C(a,\"I",
    "NPUT\")&&\"hidden\"==a.type.toLowerCase()||C(a,\"NOSCRIPT\"))return!1;f",
    "=X(a,\"visibility\");return\"collapse\"!=f&&\"hidden\"!=f&&c(a)&&(b||0!",
    "=gc(a))&&d(a)?!e(a):!1}\nfunction hc(a){var b=$b?function(c){if(\"none",
    "\"==X(c,\"display\"))return!1;do{var d=c.parentNode;if(c.getDestination",
    "InsertionPoints){var e=c.getDestinationInsertionPoints();0<e.length&&(d",
    "=e[e.length-1])}if(d instanceof ShadowRoot)return!0;!d||9!=d.nodeType&&",
    "11!=d.nodeType||(d=null)}while(a&&1!=a.nodeType);return!d||b(d)}:functi",
    "on(a){if(\"none\"==X(a,\"display\"))return!1;a=ac(a);return!a||b(a)};re",
    "turn cc(a,!1,b)}var Y=\"hidden\";\nfunction ec(a){function b(a){functio",
    "n b(a){return a==g?!0:0==X(a,\"display\").lastIndexOf(\"inline\",0)||\"",
    "absolute\"==c&&\"static\"==X(a,\"position\")?!1:!0}var c=X(a,\"position",
    "\");if(\"fixed\"==c)return D=!0,a==g?null:g;for(a=ac(a);a&&!b(a);)a=ac(",
    "a);return a}function c(a){var b=a;if(\"visible\"==u)if(a==g&&k)b=k;else",
    " if(a==k)return{x:\"visible\",y:\"visible\"};b={x:X(b,\"overflow-x\"),y",
    ":X(b,\"overflow-y\")};a==g&&(b.x=\"visible\"==b.x?\"auto\":b.x,b.y=\"vi",
    "sible\"==b.y?\"auto\":b.y);return b}function d(a){if(a==g){var b=(new G",
    "a(f)).C;\na=b.scrollingElement?b.scrollingElement:b.body||b.documentEle",
    "ment;b=b.parentWindow||b.defaultView;a=new x(b.pageXOffset||a.scrollLef",
    "t,b.pageYOffset||a.scrollTop)}else a=new x(a.scrollLeft,a.scrollTop);re",
    "turn a}var e=ic(a);var f=z(a),g=f.documentElement,k=f.body,u=X(g,\"over",
    "flow\"),D;for(a=b(a);a;a=b(a)){var q=c(a);if(\"visible\"!=q.x||\"visibl",
    "e\"!=q.y){var A=dc(a);if(0==A.width||0==A.height)return Y;var L=e.right",
    "<A.left,W=e.bottom<A.top;if(L&&\"hidden\"==q.x||W&&\"hidden\"==q.y)retu",
    "rn Y;if(L&&\"visible\"!=q.x||\nW&&\"visible\"!=q.y){L=d(a);W=e.bottom<A",
    ".top-L.y;if(e.right<A.left-L.x&&\"visible\"!=q.x||W&&\"visible\"!=q.x)r",
    "eturn Y;e=ec(a);return e==Y?Y:\"scroll\"}L=e.left>=A.left+A.width;A=e.t",
    "op>=A.top+A.height;if(L&&\"hidden\"==q.x||A&&\"hidden\"==q.y)return Y;i",
    "f(L&&\"visible\"!=q.x||A&&\"visible\"!=q.y){if(D&&(q=d(a),e.left>=g.scr",
    "ollWidth-q.x||e.right>=g.scrollHeight-q.y))return Y;e=ec(a);return e==Y",
    "?Y:\"scroll\"}}}return\"none\"}\nfunction dc(a){var b=fc(a);if(b)return",
    " b.rect;if(C(a,\"HTML\"))return a=z(a),a=((a?a.parentWindow||a.defaultV",
    "iew:window)||window).document,a=\"CSS1Compat\"==a.compatMode?a.document",
    "Element:a.body,a=new Fa(a.clientWidth,a.clientHeight),new V(0,0,a.width",
    ",a.height);try{var c=a.getBoundingClientRect()}catch(d){return new V(0,",
    "0,0,0)}return new V(c.left,c.top,c.right-c.left,c.bottom-c.top)}\nfunct",
    "ion fc(a){var b=C(a,\"MAP\");if(!b&&!C(a,\"AREA\"))return null;var c=b?",
    "a:C(a.parentNode,\"MAP\")?a.parentNode:null,d=null,e=null;c&&c.name&&(d",
    "=U.u('/descendant::*[@usemap = \"#'+c.name+'\"]',z(c)))&&(e=dc(d),b||\"",
    "default\"==a.shape.toLowerCase()||(a=jc(a),b=Math.min(Math.max(a.left,0",
    "),e.width),c=Math.min(Math.max(a.top,0),e.height),e=new V(b+e.left,c+e.",
    "top,Math.min(a.width,e.width-b),Math.min(a.height,e.height-c))));return",
    "{ba:d,rect:e||new V(0,0,0,0)}}\nfunction jc(a){var b=a.shape.toLowerCas",
    "e();a=a.coords.split(\",\");if(\"rect\"==b&&4==a.length){var b=a[0],c=a",
    "[1];return new V(b,c,a[2]-b,a[3]-c)}if(\"circle\"==b&&3==a.length)retur",
    "n b=a[2],new V(a[0]-b,a[1]-b,2*b,2*b);if(\"poly\"==b&&2<a.length){for(v",
    "ar b=a[0],c=a[1],d=b,e=c,f=2;f+1<a.length;f+=2)b=Math.min(b,a[f]),d=Mat",
    "h.max(d,a[f]),c=Math.min(c,a[f+1]),e=Math.max(e,a[f+1]);return new V(b,",
    "c,d-b,e-c)}return new V(0,0,0,0)}function ic(a){a=dc(a);return new Zb(a",
    ".top,a.left+a.width,a.top+a.height,a.left)}\nfunction kc(a){return a.re",
    "place(/^[^\\S\\xa0]+|[^\\S\\xa0]+$/g,\"\")}function lc(a){var b=[];$b?m",
    "c(a,b):nc(a,b);var c=b;a=c.length;for(var b=Array(a),c=m(c)?c.split(\"",
    "\"):c,d=0;d<a;d++)d in c&&(b[d]=kc.call(void 0,c[d]));return kc(b.join(",
    "\"\\n\")).replace(/\\xa0/g,\" \")}\nfunction oc(a,b,c){if(C(a,\"BR\"))b",
    ".push(\"\");else{var d=C(a,\"TD\"),e=X(a,\"display\"),f=!d&&!(0<=oa(pc,",
    "e)),g=l(a.previousElementSibling)?a.previousElementSibling:Ja(a.previou",
    "sSibling),g=g?X(g,\"display\"):\"\",k=X(a,\"float\")||X(a,\"cssFloat\")",
    "||X(a,\"styleFloat\");!f||\"run-in\"==g&&\"none\"==k||/^[\\s\\xa0]*$/.t",
    "est(b[b.length-1]||\"\")||b.push(\"\");var u=hc(a),D=null,q=null;u&&(D=",
    "X(a,\"white-space\"),q=X(a,\"text-transform\"));t(a.childNodes,function",
    "(a){c(a,b,u,D,q)});a=b[b.length-1]||\"\";!d&&\"table-cell\"!=e||!a||la(",
    "a)||(b[b.length-\n1]+=\" \");f&&\"run-in\"!=e&&!/^[\\s\\xa0]*$/.test(a)",
    "&&b.push(\"\")}}function nc(a,b){oc(a,b,function(a,b,e,f,g){3==a.nodeTy",
    "pe&&e?qc(a,b,f,g):C(a)&&nc(a,b)})}var pc=\"inline inline-block inline-t",
    "able none table-cell table-column table-column-group\".split(\" \");\nf",
    "unction qc(a,b,c,d){a=a.nodeValue.replace(/[\\u200b\\u200e\\u200f]/g,\"",
    "\");a=a.replace(/(\\r\\n|\\r|\\n)/g,\"\\n\");if(\"normal\"==c||\"nowrap",
    "\"==c)a=a.replace(/\\n/g,\" \");a=\"pre\"==c||\"pre-wrap\"==c?a.replace",
    "(/[ \\f\\t\\v\\u2028\\u2029]/g,\"\\u00a0\"):a.replace(/[\\ \\f\\t\\v\\u",
    "2028\\u2029]+/g,\" \");\"capitalize\"==d?a=a.replace(/(^|\\s)(\\S)/g,fu",
    "nction(a,b,c){return b+c.toUpperCase()}):\"uppercase\"==d?a=a.toUpperCa",
    "se():\"lowercase\"==d&&(a=a.toLowerCase());c=b.pop()||\"\";la(c)&&0==a.",
    "lastIndexOf(\" \",0)&&(a=a.substr(1));b.push(c+a)}\nfunction gc(a){var ",
    "b=1,c=X(a,\"opacity\");c&&(b=Number(c));(a=ac(a))&&(b*=gc(a));return b}",
    "\nfunction rc(a,b,c,d,e){var f;if(3==a.nodeType&&c)qc(a,b,d,e);else if(",
    "C(a))if(C(a,\"CONTENT\")){for(f=a;f.parentNode;)f=f.parentNode;f instan",
    "ceof ShadowRoot?t(a.getDistributedNodes(),function(a){rc(a,b,c,d,e)}):m",
    "c(a,b)}else if(C(a,\"SHADOW\")){for(f=a;f.parentNode;)f=f.parentNode;if",
    "(f instanceof ShadowRoot&&(a=f))for(a=a.olderShadowRoot;a;)t(a.childNod",
    "es,function(a){rc(a,b,c,d,e)}),a=a.olderShadowRoot}else mc(a,b)}\nfunct",
    "ion mc(a,b){a.shadowRoot&&t(a.shadowRoot.childNodes,function(a){rc(a,b,",
    "!0,null,null)});oc(a,b,function(a,b,e,f,g){var c=null;1==a.nodeType?c=a",
    ":3==a.nodeType&&(c=a);null!=c&&c.getDestinationInsertionPoints&&0<c.get",
    "DestinationInsertionPoints().length||rc(a,b,e,f,g)})};var sc={K:functio",
    "n(a){return!(!a.querySelectorAll||!a.querySelector)},u:function(a,b){if",
    "(!a)throw new v(32,\"No class name specified\");a=ma(a);if(-1!==a.index",
    "Of(\" \"))throw new v(32,\"Compound class names not permitted\");if(sc.",
    "K(b))try{return b.querySelector(\".\"+a.replace(/\\./g,\"\\\\.\"))||nul",
    "l}catch(c){throw new v(32,\"An invalid or illegal class name was specif",
    "ied\");}a=B(y(b),\"*\",a,b);return a.length?a[0]:null},l:function(a,b){",
    "if(!a)throw new v(32,\"No class name specified\");a=ma(a);if(-1!==a.ind",
    "exOf(\" \"))throw new v(32,\n\"Compound class names not permitted\");if",
    "(sc.K(b))try{return b.querySelectorAll(\".\"+a.replace(/\\./g,\"\\\\.\"",
    "))}catch(c){throw new v(32,\"An invalid or illegal class name was speci",
    "fied\");}return B(y(b),\"*\",a,b)}};var tc={u:function(a,b){p(b.querySe",
    "lector);if(!a)throw new v(32,\"No selector specified\");a=ma(a);try{var",
    " c=b.querySelector(a)}catch(d){throw new v(32,\"An invalid or illegal s",
    "elector was specified\");}return c&&1==c.nodeType?c:null},l:function(a,",
    "b){p(b.querySelectorAll);if(!a)throw new v(32,\"No selector specified\"",
    ");a=ma(a);try{return b.querySelectorAll(a)}catch(c){throw new v(32,\"An",
    " invalid or illegal selector was specified\");}}};var uc={K:function(a,",
    "b){return!(!a.querySelectorAll||!a.querySelector)&&!/^\\d.*/.test(b)},u",
    ":function(a,b){var c=y(b),d=m(a)?c.C.getElementById(a):a;return d?Pa(d,",
    "\"id\")==a&&Ka(b,d)?d:ta(B(c,\"*\"),function(c){return Pa(c,\"id\")==a&",
    "&Ka(b,c)}):null},l:function(a,b){if(!a)return[];if(uc.K(b,a))try{return",
    " b.querySelectorAll(\"#\"+uc.na(a))}catch(c){return[]}b=B(y(b),\"*\",nu",
    "ll,b);return pa(b,function(b){return Pa(b,\"id\")==a})},na:function(a){",
    "return a.replace(/([\\s'\"\\\\#.:;,!?+<>=~*^$|%&@`{}\\-\\/\\[\\]\\(\\)]",
    ")/g,\"\\\\$1\")}};var Z={},vc={};Z.ja=function(a,b,c){try{var d=tc.l(\"",
    "a\",b)}catch(e){d=B(y(b),\"A\",null,b)}return ta(d,function(b){b=lc(b);",
    "return c&&-1!=b.indexOf(a)||b==a})};Z.ea=function(a,b,c){try{var d=tc.l",
    "(\"a\",b)}catch(e){d=B(y(b),\"A\",null,b)}return pa(d,function(b){b=lc(",
    "b);return c&&-1!=b.indexOf(a)||b==a})};Z.u=function(a,b){return Z.ja(a,",
    "b,!1)};Z.l=function(a,b){return Z.ea(a,b,!1)};vc.u=function(a,b){return",
    " Z.ja(a,b,!0)};vc.l=function(a,b){return Z.ea(a,b,!0)};var wc={u:functi",
    "on(a,b){if(\"\"===a)throw new v(32,'Unable to locate an element with th",
    "e tagName \"\"');return b.getElementsByTagName(a)[0]||null},l:function(",
    "a,b){if(\"\"===a)throw new v(32,'Unable to locate an element with the t",
    "agName \"\"');return b.getElementsByTagName(a)}};var xc={className:sc,",
    "\"class name\":sc,css:tc,\"css selector\":tc,id:uc,linkText:Z,\"link te",
    "xt\":Z,name:{u:function(a,b){b=B(y(b),\"*\",null,b);return ta(b,functio",
    "n(b){return Pa(b,\"name\")==a})},l:function(a,b){b=B(y(b),\"*\",null,b)",
    ";return pa(b,function(b){return Pa(b,\"name\")==a})}},partialLinkText:v",
    "c,\"partial link text\":vc,tagName:wc,\"tag name\":wc,xpath:U};function",
    " yc(a){for(var b in a)if(a.hasOwnProperty(b))return b;return null};var ",
    "zc=\"function\"===typeof ShadowRoot;ba(\"_\",function(a,b){var c;a:{if(",
    "c=yc(a)){var d=xc[c];if(d&&p(d.u)){c=d.u(a[c],b||ja.document);break a}}",
    "throw Error(\"Unsupported locator strategy: \"+c);}if(c)return c;if(zc&",
    "&b){for(c=b;c.parentNode;)c=c.parentNode;if(c instanceof ShadowRoot){a:",
    "{if((c=yc(a))&&(d=xc[c])&&p(d.l)){a=d.l(a[c],b||ja.document);break a}th",
    "row Error(\"Unsupported locator strategy: \"+c);}if(c=a[0])return c}}re",
    "turn null});; return this._.apply(null,arguments);}.apply({navigator:ty",
    "peof window!='undefined'?window.navigator:null,document:typeof window!=",
    "'undefined'?window.document:null}, arguments);}",
    NULL
};

const char* const GET_FIRST_CLIENT_RECT[] = {
    "function(){return function(){var h,aa=this;function k(a){return\"string",
    "\"==typeof a}function m(a){return\"number\"==typeof a}function ba(a,b){",
    "a=a.split(\".\");var c=aa;a[0]in c||!c.execScript||c.execScript(\"var ",
    "\"+a[0]);for(var d;a.length&&(d=a.shift());)a.length||void 0===b?c=c[d]",
    "&&c[d]!==Object.prototype[d]?c[d]:c[d]={}:c[d]=b}\nfunction ca(a){var b",
    "=typeof a;if(\"object\"==b)if(a){if(a instanceof Array)return\"array\";",
    "if(a instanceof Object)return b;var c=Object.prototype.toString.call(a)",
    ";if(\"[object Window]\"==c)return\"object\";if(\"[object Array]\"==c||",
    "\"number\"==typeof a.length&&\"undefined\"!=typeof a.splice&&\"undefine",
    "d\"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable(\"splice\")",
    ")return\"array\";if(\"[object Function]\"==c||\"undefined\"!=typeof a.c",
    "all&&\"undefined\"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumera",
    "ble(\"call\"))return\"function\"}else return\"null\";\nelse if(\"functi",
    "on\"==b&&\"undefined\"==typeof a.call)return\"object\";return b}functio",
    "n da(a,b,c){return a.call.apply(a.bind,arguments)}function ea(a,b,c){if",
    "(!a)throw Error();if(2<arguments.length){var d=Array.prototype.slice.ca",
    "ll(arguments,2);return function(){var c=Array.prototype.slice.call(argu",
    "ments);Array.prototype.unshift.apply(c,d);return a.apply(b,c)}}return f",
    "unction(){return a.apply(b,arguments)}}\nfunction fa(a,b,c){fa=Function",
    ".prototype.bind&&-1!=Function.prototype.bind.toString().indexOf(\"nativ",
    "e code\")?da:ea;return fa.apply(null,arguments)}function ga(a,b){var c=",
    "Array.prototype.slice.call(arguments,1);return function(){var b=c.slice",
    "();b.push.apply(b,arguments);return a.apply(this,b)}}\nfunction n(a){va",
    "r b=p;function c(){}c.prototype=b.prototype;a.na=b.prototype;a.prototyp",
    "e=new c;a.prototype.constructor=a;a.ma=function(a,c,f){for(var d=Array(",
    "arguments.length-2),e=2;e<arguments.length;e++)d[e-2]=arguments[e];retu",
    "rn b.prototype[c].apply(a,d)}};function q(a,b){for(var c=a.length,d=k(a",
    ")?a.split(\"\"):a,e=0;e<c;e++)e in d&&b.call(void 0,d[e],e,a)}function ",
    "r(a,b,c){var d=c;q(a,function(c,f){d=b.call(void 0,d,c,f,a)});return d}",
    "function t(a,b){for(var c=a.length,d=k(a)?a.split(\"\"):a,e=0;e<c;e++)i",
    "f(e in d&&b.call(void 0,d[e],e,a))return!0;return!1}function ha(a){retu",
    "rn Array.prototype.concat.apply([],arguments)}function ia(a,b,c){return",
    " 2>=arguments.length?Array.prototype.slice.call(a,b):Array.prototype.sl",
    "ice.call(a,b,c)};function u(a,b){this.x=void 0!==a?a:0;this.y=void 0!==",
    "b?b:0}h=u.prototype;h.clone=function(){return new u(this.x,this.y)};h.t",
    "oString=function(){return\"(\"+this.x+\", \"+this.y+\")\"};h.ceil=funct",
    "ion(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);return this};h.",
    "floor=function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);re",
    "turn this};h.round=function(){this.x=Math.round(this.x);this.y=Math.rou",
    "nd(this.y);return this};\nh.translate=function(a,b){a instanceof u?(thi",
    "s.x+=a.x,this.y+=a.y):(this.x+=Number(a),m(b)&&(this.y+=b));return this",
    "};h.scale=function(a,b){b=m(b)?b:a;this.x*=a;this.y*=b;return this};fun",
    "ction ja(a,b){if(!a||!b)return!1;if(a.contains&&1==b.nodeType)return a=",
    "=b||a.contains(b);if(\"undefined\"!=typeof a.compareDocumentPosition)re",
    "turn a==b||!!(a.compareDocumentPosition(b)&16);for(;b&&a!=b;)b=b.parent",
    "Node;return b==a}\nfunction ka(a,b){if(a==b)return 0;if(a.compareDocume",
    "ntPosition)return a.compareDocumentPosition(b)&2?1:-1;if(\"sourceIndex",
    "\"in a||a.parentNode&&\"sourceIndex\"in a.parentNode){var c=1==a.nodeTy",
    "pe,d=1==b.nodeType;if(c&&d)return a.sourceIndex-b.sourceIndex;var e=a.p",
    "arentNode,f=b.parentNode;return e==f?la(a,b):!c&&ja(e,b)?-1*ma(a,b):!d&",
    "&ja(f,a)?ma(b,a):(c?a.sourceIndex:e.sourceIndex)-(d?b.sourceIndex:f.sou",
    "rceIndex)}d=9==a.nodeType?a:a.ownerDocument||a.document;c=d.createRange",
    "();c.selectNode(a);c.collapse(!0);\na=d.createRange();a.selectNode(b);a",
    ".collapse(!0);return c.compareBoundaryPoints(aa.Range.START_TO_END,a)}f",
    "unction ma(a,b){var c=a.parentNode;if(c==b)return-1;for(;b.parentNode!=",
    "c;)b=b.parentNode;return la(b,a)}function la(a,b){for(;b=b.previousSibl",
    "ing;)if(b==a)return-1;return 1};/*\n\n The MIT License\n\n Copyright (c",
    ") 2007 Cybozu Labs, Inc.\n Copyright (c) 2012 Google Inc.\n\n Permissio",
    "n is hereby granted, free of charge, to any person obtaining a copy\n o",
    "f this software and associated documentation files (the \"Software\"), ",
    "to\n deal in the Software without restriction, including without limita",
    "tion the\n rights to use, copy, modify, merge, publish, distribute, sub",
    "license, and/or\n sell copies of the Software, and to permit persons to",
    " whom the Software is\n furnished to do so, subject to the following co",
    "nditions:\n\n The above copyright notice and this permission notice sha",
    "ll be included in\n all copies or substantial portions of the Software.",
    "\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, ",
    "EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ME",
    "RCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ",
    "IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY ",
    "CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, ",
    "TORT OR OTHERWISE, ARISING\n FROM, OUT OF OR IN CONNECTION WITH THE SOF",
    "TWARE OR THE USE OR OTHER DEALINGS\n IN THE SOFTWARE.\n*/\nfunction v(a",
    ",b,c){this.l=a;this.ka=b||1;this.j=c||1};function w(a){this.S=a;this.I=",
    "0}function na(a){a=a.match(pa);for(var b=0;b<a.length;b++)qa.test(a[b])",
    "&&a.splice(b,1);return new w(a)}var pa=/\\$?(?:(?![0-9-\\.])(?:\\*|[\\w",
    "-\\.]+):)?(?![0-9-\\.])(?:\\*|[\\w-\\.]+)|\\/\\/|\\.\\.|::|\\d+(?:\\.",
    "\\d*)?|\\.\\d+|\"[^\"]*\"|'[^']*'|[!<>]=|\\s+|./g,qa=/^\\s/;function y(",
    "a,b){return a.S[a.I+(b||0)]}w.prototype.next=function(){return this.S[t",
    "his.I++]};w.prototype.back=function(){this.I--};w.prototype.empty=funct",
    "ion(){return this.S.length<=this.I};function z(a){var b=null,c=a.nodeTy",
    "pe;1==c&&(b=a.textContent,b=void 0==b||null==b?a.innerText:b,b=void 0==",
    "b||null==b?\"\":b);if(\"string\"!=typeof b)if(9==c||1==c){a=9==c?a.docu",
    "mentElement:a.firstChild;for(var c=0,d=[],b=\"\";a;){do 1!=a.nodeType&&",
    "(b+=a.nodeValue),d[c++]=a;while(a=a.firstChild);for(;c&&!(a=d[--c].next",
    "Sibling););}}else b=a.nodeValue;return\"\"+b}\nfunction A(a,b,c){if(nul",
    "l===b)return!0;try{if(!a.getAttribute)return!1}catch(d){return!1}return",
    " null==c?!!a.getAttribute(b):a.getAttribute(b,2)==c}function B(a,b,c,d,",
    "e){return ra.call(null,a,b,k(c)?c:null,k(d)?d:null,e||new C)}\nfunction",
    " ra(a,b,c,d,e){b.getElementsByName&&d&&\"name\"==c?(b=b.getElementsByNa",
    "me(d),q(b,function(b){a.matches(b)&&e.add(b)})):b.getElementsByClassNam",
    "e&&d&&\"class\"==c?(b=b.getElementsByClassName(d),q(b,function(b){b.cla",
    "ssName==d&&a.matches(b)&&e.add(b)})):a instanceof D?sa(a,b,c,d,e):b.get",
    "ElementsByTagName&&(b=b.getElementsByTagName(a.getName()),q(b,function(",
    "a){A(a,c,d)&&e.add(a)}));return e}function sa(a,b,c,d,e){for(b=b.firstC",
    "hild;b;b=b.nextSibling)A(b,c,d)&&a.matches(b)&&e.add(b),sa(a,b,c,d,e)};",
    "function C(){this.j=this.g=null;this.D=0}function ta(a){this.node=a;thi",
    "s.next=this.w=null}function ua(a,b){if(!a.g)return b;if(!b.g)return a;v",
    "ar c=a.g;b=b.g;for(var d=null,e,f=0;c&&b;)c.node==b.node?(e=c,c=c.next,",
    "b=b.next):0<ka(c.node,b.node)?(e=b,b=b.next):(e=c,c=c.next),(e.w=d)?d.n",
    "ext=e:a.g=e,d=e,f++;for(e=c||b;e;)e.w=d,d=d.next=e,f++,e=e.next;a.j=d;a",
    ".D=f;return a}C.prototype.unshift=function(a){a=new ta(a);a.next=this.g",
    ";this.j?this.g.w=a:this.g=this.j=a;this.g=a;this.D++};\nC.prototype.add",
    "=function(a){a=new ta(a);a.w=this.j;this.g?this.j.next=a:this.g=this.j=",
    "a;this.j=a;this.D++};function E(a){return(a=a.g)?a.node:null}C.prototyp",
    "e.m=function(){return this.D};function F(a){return(a=E(a))?z(a):\"\"}C.",
    "prototype.iterator=function(a){return new va(this,!!a)};function va(a,b",
    "){this.ga=a;this.T=(this.A=b)?a.j:a.g;this.O=null}va.prototype.next=fun",
    "ction(){var a=this.T;if(null==a)return null;var b=this.O=a;this.T=this.",
    "A?a.w:a.next;return b.node};\nva.prototype.remove=function(){var a=this",
    ".ga,b=this.O;if(!b)throw Error(\"Next must be called at least once befo",
    "re remove.\");var c=b.w,b=b.next;c?c.next=b:a.g=b;b?b.w=c:a.j=c;a.D--;t",
    "his.O=null};function p(a){this.f=a;this.h=this.o=!1;this.F=null}functio",
    "n G(a){return\"\\n  \"+a.toString().split(\"\\n\").join(\"\\n  \")}p.pr",
    "ototype.c=function(){return this.o};function wa(a,b){a.o=b}function xa(",
    "a,b){a.h=b}p.prototype.u=function(){return this.F};function H(a,b){a=a.",
    "evaluate(b);return a instanceof C?+F(a):+a}function I(a,b){a=a.evaluate",
    "(b);return a instanceof C?F(a):\"\"+a}function J(a,b){a=a.evaluate(b);r",
    "eturn a instanceof C?!!a.m():!!a};function K(a,b,c){p.call(this,a.f);th",
    "is.R=a;this.W=b;this.aa=c;this.o=b.c()||c.c();this.h=b.h||c.h;this.R==y",
    "a&&(c.h||c.c()||4==c.f||0==c.f||!b.u()?b.h||b.c()||4==b.f||0==b.f||!c.u",
    "()||(this.F={name:c.u().name,C:b}):this.F={name:b.u().name,C:c})}n(K);",
    "\nfunction L(a,b,c,d,e){b=b.evaluate(d);c=c.evaluate(d);var f;if(b inst",
    "anceof C&&c instanceof C){b=b.iterator();for(d=b.next();d;d=b.next())fo",
    "r(e=c.iterator(),f=e.next();f;f=e.next())if(a(z(d),z(f)))return!0;retur",
    "n!1}if(b instanceof C||c instanceof C){b instanceof C?(e=b,d=c):(e=c,d=",
    "b);f=e.iterator();for(var g=typeof d,l=f.next();l;l=f.next()){switch(g)",
    "{case \"number\":l=+z(l);break;case \"boolean\":l=!!z(l);break;case \"s",
    "tring\":l=z(l);break;default:throw Error(\"Illegal primitive type for c",
    "omparison.\");\n}if(e==b&&a(l,d)||e==c&&a(d,l))return!0}return!1}return",
    " e?\"boolean\"==typeof b||\"boolean\"==typeof c?a(!!b,!!c):\"number\"==",
    "typeof b||\"number\"==typeof c?a(+b,+c):a(b,c):a(+b,+c)}K.prototype.eva",
    "luate=function(a){return this.R.v(this.W,this.aa,a)};K.prototype.toStri",
    "ng=function(){var a=\"Binary Expression: \"+this.R,a=a+G(this.W);return",
    " a+=G(this.aa)};function za(a,b,c,d){this.ja=a;this.Z=b;this.f=c;this.v",
    "=d}za.prototype.toString=function(){return this.ja};var Aa={};\nfunctio",
    "n M(a,b,c,d){if(Aa.hasOwnProperty(a))throw Error(\"Binary operator alre",
    "ady created: \"+a);a=new za(a,b,c,d);return Aa[a.toString()]=a}M(\"div",
    "\",6,1,function(a,b,c){return H(a,c)/H(b,c)});M(\"mod\",6,1,function(a,",
    "b,c){return H(a,c)%H(b,c)});M(\"*\",6,1,function(a,b,c){return H(a,c)*H",
    "(b,c)});M(\"+\",5,1,function(a,b,c){return H(a,c)+H(b,c)});M(\"-\",5,1,",
    "function(a,b,c){return H(a,c)-H(b,c)});M(\"<\",4,2,function(a,b,c){retu",
    "rn L(function(a,b){return a<b},a,b,c)});\nM(\">\",4,2,function(a,b,c){r",
    "eturn L(function(a,b){return a>b},a,b,c)});M(\"<=\",4,2,function(a,b,c)",
    "{return L(function(a,b){return a<=b},a,b,c)});M(\">=\",4,2,function(a,b",
    ",c){return L(function(a,b){return a>=b},a,b,c)});var ya=M(\"=\",3,2,fun",
    "ction(a,b,c){return L(function(a,b){return a==b},a,b,c,!0)});M(\"!=\",3",
    ",2,function(a,b,c){return L(function(a,b){return a!=b},a,b,c,!0)});M(\"",
    "and\",2,2,function(a,b,c){return J(a,c)&&J(b,c)});M(\"or\",1,2,function",
    "(a,b,c){return J(a,c)||J(b,c)});function N(a,b){if(b.m()&&4!=a.f)throw ",
    "Error(\"Primary expression must evaluate to nodeset if filter has predi",
    "cate(s).\");p.call(this,a.f);this.$=a;this.b=b;this.o=a.c();this.h=a.h}",
    "n(N);N.prototype.evaluate=function(a){a=this.$.evaluate(a);return Ba(th",
    "is.b,a)};N.prototype.toString=function(){var a=\"Filter:\"+G(this.$);re",
    "turn a+=G(this.b)};function O(a,b){if(b.length<a.Y)throw Error(\"Functi",
    "on \"+a.i+\" expects at least\"+a.Y+\" arguments, \"+b.length+\" given",
    "\");if(null!==a.P&&b.length>a.P)throw Error(\"Function \"+a.i+\" expect",
    "s at most \"+a.P+\" arguments, \"+b.length+\" given\");a.ha&&q(b,functi",
    "on(b,d){if(4!=b.f)throw Error(\"Argument \"+d+\" to function \"+a.i+\" ",
    "is not of type Nodeset: \"+b);});p.call(this,a.f);this.H=a;this.M=b;wa(",
    "this,a.o||t(b,function(a){return a.c()}));xa(this,a.fa&&!b.length||a.ea",
    "&&!!b.length||t(b,function(a){return a.h}))}n(O);\nO.prototype.evaluate",
    "=function(a){return this.H.v.apply(null,ha(a,this.M))};O.prototype.toSt",
    "ring=function(){var a=\"Function: \"+this.H;if(this.M.length)var b=r(th",
    "is.M,function(a,b){return a+G(b)},\"Arguments:\"),a=a+G(b);return a};fu",
    "nction Ca(a,b,c,d,e,f,g,l,x){this.i=a;this.f=b;this.o=c;this.fa=d;this.",
    "ea=e;this.v=f;this.Y=g;this.P=void 0!==l?l:g;this.ha=!!x}Ca.prototype.t",
    "oString=function(){return this.i};var Da={};\nfunction P(a,b,c,d,e,f,g,",
    "l){if(Da.hasOwnProperty(a))throw Error(\"Function already created: \"+a",
    "+\".\");Da[a]=new Ca(a,b,c,d,!1,e,f,g,l)}P(\"boolean\",2,!1,!1,function",
    "(a,b){return J(b,a)},1);P(\"ceiling\",1,!1,!1,function(a,b){return Math",
    ".ceil(H(b,a))},1);P(\"concat\",3,!1,!1,function(a,b){return r(ia(argume",
    "nts,1),function(b,d){return b+I(d,a)},\"\")},2,null);P(\"contains\",2,!",
    "1,!1,function(a,b,c){b=I(b,a);a=I(c,a);return-1!=b.indexOf(a)},2);P(\"c",
    "ount\",1,!1,!1,function(a,b){return b.evaluate(a).m()},1,1,!0);\nP(\"fa",
    "lse\",2,!1,!1,function(){return!1},0);P(\"floor\",1,!1,!1,function(a,b)",
    "{return Math.floor(H(b,a))},1);P(\"id\",4,!1,!1,function(a,b){var c=a.l",
    ",d=9==c.nodeType?c:c.ownerDocument;a=I(b,a).split(/\\s+/);var e=[];q(a,",
    "function(a){a=d.getElementById(a);var b;if(!(b=!a)){a:if(k(e))b=k(a)&&1",
    "==a.length?e.indexOf(a,0):-1;else{for(b=0;b<e.length;b++)if(b in e&&e[b",
    "]===a)break a;b=-1}b=0<=b}b||e.push(a)});e.sort(ka);var f=new C;q(e,fun",
    "ction(a){f.add(a)});return f},1);P(\"lang\",2,!1,!1,function(){return!1",
    "},1);\nP(\"last\",1,!0,!1,function(a){if(1!=arguments.length)throw Erro",
    "r(\"Function last expects ()\");return a.j},0);P(\"local-name\",3,!1,!0",
    ",function(a,b){return(a=b?E(b.evaluate(a)):a.l)?a.localName||a.nodeName",
    ".toLowerCase():\"\"},0,1,!0);P(\"name\",3,!1,!0,function(a,b){return(a=",
    "b?E(b.evaluate(a)):a.l)?a.nodeName.toLowerCase():\"\"},0,1,!0);P(\"name",
    "space-uri\",3,!0,!1,function(){return\"\"},0,1,!0);\nP(\"normalize-spac",
    "e\",3,!1,!0,function(a,b){return(b?I(b,a):z(a.l)).replace(/[\\s\\xa0]+/",
    "g,\" \").replace(/^\\s+|\\s+$/g,\"\")},0,1);P(\"not\",2,!1,!1,function(",
    "a,b){return!J(b,a)},1);P(\"number\",1,!1,!0,function(a,b){return b?H(b,",
    "a):+z(a.l)},0,1);P(\"position\",1,!0,!1,function(a){return a.ka},0);P(",
    "\"round\",1,!1,!1,function(a,b){return Math.round(H(b,a))},1);P(\"start",
    "s-with\",2,!1,!1,function(a,b,c){b=I(b,a);a=I(c,a);return 0==b.lastInde",
    "xOf(a,0)},2);P(\"string\",3,!1,!0,function(a,b){return b?I(b,a):z(a.l)}",
    ",0,1);\nP(\"string-length\",1,!1,!0,function(a,b){return(b?I(b,a):z(a.l",
    ")).length},0,1);P(\"substring\",3,!1,!1,function(a,b,c,d){c=H(c,a);if(i",
    "sNaN(c)||Infinity==c||-Infinity==c)return\"\";d=d?H(d,a):Infinity;if(is",
    "NaN(d)||-Infinity===d)return\"\";c=Math.round(c)-1;var e=Math.max(c,0);",
    "a=I(b,a);return Infinity==d?a.substring(e):a.substring(e,c+Math.round(d",
    "))},2,3);P(\"substring-after\",3,!1,!1,function(a,b,c){b=I(b,a);a=I(c,a",
    ");c=b.indexOf(a);return-1==c?\"\":b.substring(c+a.length)},2);\nP(\"sub",
    "string-before\",3,!1,!1,function(a,b,c){b=I(b,a);a=I(c,a);a=b.indexOf(a",
    ");return-1==a?\"\":b.substring(0,a)},2);P(\"sum\",1,!1,!1,function(a,b)",
    "{a=b.evaluate(a).iterator();b=0;for(var c=a.next();c;c=a.next())b+=+z(c",
    ");return b},1,1,!0);P(\"translate\",3,!1,!1,function(a,b,c,d){b=I(b,a);",
    "c=I(c,a);var e=I(d,a);d={};for(var f=0;f<c.length;f++)a=c.charAt(f),a i",
    "n d||(d[a]=e.charAt(f));c=\"\";for(f=0;f<b.length;f++)a=b.charAt(f),c+=",
    "a in d?d[a]:a;return c},3);P(\"true\",2,!1,!1,function(){return!0},0);f",
    "unction D(a,b){this.ca=a;this.X=void 0!==b?b:null;this.B=null;switch(a)",
    "{case \"comment\":this.B=8;break;case \"text\":this.B=3;break;case \"pr",
    "ocessing-instruction\":this.B=7;break;case \"node\":break;default:throw",
    " Error(\"Unexpected argument\");}}function Ea(a){return\"comment\"==a||",
    "\"text\"==a||\"processing-instruction\"==a||\"node\"==a}D.prototype.mat",
    "ches=function(a){return null===this.B||this.B==a.nodeType};D.prototype.",
    "getName=function(){return this.ca};\nD.prototype.toString=function(){va",
    "r a=\"Kind Test: \"+this.ca;null===this.X||(a+=G(this.X));return a};fun",
    "ction Q(a){p.call(this,3);this.ba=a.substring(1,a.length-1)}n(Q);Q.prot",
    "otype.evaluate=function(){return this.ba};Q.prototype.toString=function",
    "(){return\"Literal: \"+this.ba};function R(a,b){this.i=a.toLowerCase();",
    "a=\"*\"==this.i?\"*\":\"http://www.w3.org/1999/xhtml\";this.J=b?b.toLow",
    "erCase():a}R.prototype.matches=function(a){var b=a.nodeType;if(1!=b&&2!",
    "=b)return!1;b=void 0!==a.localName?a.localName:a.nodeName;return\"*\"!=",
    "this.i&&this.i!=b.toLowerCase()?!1:\"*\"==this.J?!0:this.J==(a.namespac",
    "eURI?a.namespaceURI.toLowerCase():\"http://www.w3.org/1999/xhtml\")};R.",
    "prototype.getName=function(){return this.i};\nR.prototype.toString=func",
    "tion(){return\"Name Test: \"+(\"http://www.w3.org/1999/xhtml\"==this.J?",
    "\"\":this.J+\":\")+this.i};function S(a){p.call(this,1);this.da=a}n(S);",
    "S.prototype.evaluate=function(){return this.da};S.prototype.toString=fu",
    "nction(){return\"Number: \"+this.da};function T(a,b){p.call(this,a.f);t",
    "his.V=a;this.G=b;this.o=a.c();this.h=a.h;1==this.G.length&&(a=this.G[0]",
    ",a.N||a.s!=Fa||(a=a.L,\"*\"!=a.getName()&&(this.F={name:a.getName(),C:n",
    "ull})))}n(T);function U(){p.call(this,4)}n(U);U.prototype.evaluate=func",
    "tion(a){var b=new C;a=a.l;9==a.nodeType?b.add(a):b.add(a.ownerDocument)",
    ";return b};U.prototype.toString=function(){return\"Root Helper Expressi",
    "on\"};function Ga(){p.call(this,4)}n(Ga);Ga.prototype.evaluate=function",
    "(a){var b=new C;b.add(a.l);return b};\nGa.prototype.toString=function()",
    "{return\"Context Helper Expression\"};function Ha(a){return\"/\"==a||\"",
    "//\"==a}\nT.prototype.evaluate=function(a){var b=this.V.evaluate(a);if(",
    "!(b instanceof C))throw Error(\"Filter expression must evaluate to node",
    "set.\");a=this.G;for(var c=0,d=a.length;c<d&&b.m();c++){var e=a[c],f=b.",
    "iterator(e.s.A);if(e.c()||e.s!=Ia)if(e.c()||e.s!=Ja){var g=f.next();for",
    "(b=e.evaluate(new v(g));null!=(g=f.next());)g=e.evaluate(new v(g)),b=ua",
    "(b,g)}else g=f.next(),b=e.evaluate(new v(g));else{for(g=f.next();(b=f.n",
    "ext())&&(!g.contains||g.contains(b))&&b.compareDocumentPosition(g)&8;g=",
    "b);b=e.evaluate(new v(g))}}return b};\nT.prototype.toString=function(){",
    "var a=\"Path Expression:\"+G(this.V);if(this.G.length){var b=r(this.G,f",
    "unction(a,b){return a+G(b)},\"Steps:\");a+=G(b)}return a};function V(a,",
    "b){this.b=a;this.A=!!b}function Ba(a,b,c){for(c=c||0;c<a.b.length;c++)f",
    "or(var d=a.b[c],e=b.iterator(),f=b.m(),g,l=0;g=e.next();l++){var x=a.A?",
    "f-l:l+1;g=d.evaluate(new v(g,x,f));if(\"number\"==typeof g)x=x==g;else ",
    "if(\"string\"==typeof g||\"boolean\"==typeof g)x=!!g;else if(g instance",
    "of C)x=0<g.m();else throw Error(\"Predicate.evaluate returned an unexpe",
    "cted type.\");x||e.remove()}return b}V.prototype.u=function(){return 0<",
    "this.b.length?this.b[0].u():null};\nV.prototype.c=function(){for(var a=",
    "0;a<this.b.length;a++){var b=this.b[a];if(b.c()||1==b.f||0==b.f)return!",
    "0}return!1};V.prototype.m=function(){return this.b.length};V.prototype.",
    "toString=function(){return r(this.b,function(a,b){return a+G(b)},\"Pred",
    "icates:\")};function W(a,b,c,d){p.call(this,4);this.s=a;this.L=b;this.b",
    "=c||new V([]);this.N=!!d;b=this.b.u();a.la&&b&&(this.F={name:b.name,C:b",
    ".C});this.o=this.b.c()}n(W);\nW.prototype.evaluate=function(a){var b=a.",
    "l,c=this.u(),d=null,e=null,f=0;c&&(d=c.name,e=c.C?I(c.C,a):null,f=1);if",
    "(this.N)if(this.c()||this.s!=Ka)if(b=(new W(La,new D(\"node\"))).evalua",
    "te(a).iterator(),c=b.next())for(a=this.v(c,d,e,f);null!=(c=b.next());)a",
    "=ua(a,this.v(c,d,e,f));else a=new C;else a=B(this.L,b,d,e),a=Ba(this.b,",
    "a,f);else a=this.v(a.l,d,e,f);return a};W.prototype.v=function(a,b,c,d)",
    "{a=this.s.H(this.L,a,b,c);return a=Ba(this.b,a,d)};\nW.prototype.toStri",
    "ng=function(){var a=\"Step:\"+G(\"Operator: \"+(this.N?\"//\":\"/\"));t",
    "his.s.i&&(a+=G(\"Axis: \"+this.s));a+=G(this.L);if(this.b.m()){var b=r(",
    "this.b.b,function(a,b){return a+G(b)},\"Predicates:\");a+=G(b)}return a",
    "};function Ma(a,b,c,d){this.i=a;this.H=b;this.A=c;this.la=d}Ma.prototyp",
    "e.toString=function(){return this.i};var Na={};function X(a,b,c,d){if(N",
    "a.hasOwnProperty(a))throw Error(\"Axis already created: \"+a);b=new Ma(",
    "a,b,c,!!d);return Na[a]=b}\nX(\"ancestor\",function(a,b){for(var c=new ",
    "C;b=b.parentNode;)a.matches(b)&&c.unshift(b);return c},!0);X(\"ancestor",
    "-or-self\",function(a,b){var c=new C;do a.matches(b)&&c.unshift(b);whil",
    "e(b=b.parentNode);return c},!0);\nvar Fa=X(\"attribute\",function(a,b){",
    "var c=new C,d=a.getName();if(b=b.attributes)if(a instanceof D&&null===a",
    ".B||\"*\"==d)for(d=0;a=b[d];d++)c.add(a);else(a=b.getNamedItem(d))&&c.a",
    "dd(a);return c},!1),Ka=X(\"child\",function(a,b,c,d,e){c=k(c)?c:null;d=",
    "k(d)?d:null;e=e||new C;for(b=b.firstChild;b;b=b.nextSibling)A(b,c,d)&&a",
    ".matches(b)&&e.add(b);return e},!1,!0);X(\"descendant\",B,!1,!0);\nvar ",
    "La=X(\"descendant-or-self\",function(a,b,c,d){var e=new C;A(b,c,d)&&a.m",
    "atches(b)&&e.add(b);return B(a,b,c,d,e)},!1,!0),Ia=X(\"following\",func",
    "tion(a,b,c,d){var e=new C;do for(var f=b;f=f.nextSibling;)A(f,c,d)&&a.m",
    "atches(f)&&e.add(f),e=B(a,f,c,d,e);while(b=b.parentNode);return e},!1,!",
    "0);X(\"following-sibling\",function(a,b){for(var c=new C;b=b.nextSiblin",
    "g;)a.matches(b)&&c.add(b);return c},!1);X(\"namespace\",function(){retu",
    "rn new C},!1);\nvar Oa=X(\"parent\",function(a,b){var c=new C;if(9==b.n",
    "odeType)return c;if(2==b.nodeType)return c.add(b.ownerElement),c;b=b.pa",
    "rentNode;a.matches(b)&&c.add(b);return c},!1),Ja=X(\"preceding\",functi",
    "on(a,b,c,d){var e=new C,f=[];do f.unshift(b);while(b=b.parentNode);for(",
    "var g=1,l=f.length;g<l;g++){var x=[];for(b=f[g];b=b.previousSibling;)x.",
    "unshift(b);for(var oa=0,db=x.length;oa<db;oa++)b=x[oa],A(b,c,d)&&a.matc",
    "hes(b)&&e.add(b),e=B(a,b,c,d,e)}return e},!0,!0);\nX(\"preceding-siblin",
    "g\",function(a,b){for(var c=new C;b=b.previousSibling;)a.matches(b)&&c.",
    "unshift(b);return c},!0);var Pa=X(\"self\",function(a,b){var c=new C;a.",
    "matches(b)&&c.add(b);return c},!1);function Qa(a){p.call(this,1);this.U",
    "=a;this.o=a.c();this.h=a.h}n(Qa);Qa.prototype.evaluate=function(a){retu",
    "rn-H(this.U,a)};Qa.prototype.toString=function(){return\"Unary Expressi",
    "on: -\"+G(this.U)};function Ra(a){p.call(this,4);this.K=a;wa(this,t(thi",
    "s.K,function(a){return a.c()}));xa(this,t(this.K,function(a){return a.h",
    "}))}n(Ra);Ra.prototype.evaluate=function(a){var b=new C;q(this.K,functi",
    "on(c){c=c.evaluate(a);if(!(c instanceof C))throw Error(\"Path expressio",
    "n must evaluate to NodeSet.\");b=ua(b,c)});return b};Ra.prototype.toStr",
    "ing=function(){return r(this.K,function(a,b){return a+G(b)},\"Union Exp",
    "ression:\")};function Sa(a,b){this.a=a;this.ia=b}function Ta(a){for(var",
    " b,c=[];;){Y(a,\"Missing right hand side of binary expression.\");b=Ua(",
    "a);var d=a.a.next();if(!d)break;var e=(d=Aa[d]||null)&&d.Z;if(!e){a.a.b",
    "ack();break}for(;c.length&&e<=c[c.length-1].Z;)b=new K(c.pop(),c.pop(),",
    "b);c.push(b,d)}for(;c.length;)b=new K(c.pop(),c.pop(),b);return b}funct",
    "ion Y(a,b){if(a.a.empty())throw Error(b);}function Va(a,b){a=a.a.next()",
    ";if(a!=b)throw Error(\"Bad token, expected: \"+b+\" got: \"+a);}\nfunct",
    "ion Wa(a){a=a.a.next();if(\")\"!=a)throw Error(\"Bad token: \"+a);}func",
    "tion Xa(a){a=a.a.next();if(2>a.length)throw Error(\"Unclosed literal st",
    "ring\");return new Q(a)}\nfunction Ya(a){var b=[];if(Ha(y(a.a))){var c=",
    "a.a.next();var d=y(a.a);if(\"/\"==c&&(a.a.empty()||\".\"!=d&&\"..\"!=d&",
    "&\"@\"!=d&&\"*\"!=d&&!/(?![0-9])[\\w]/.test(d)))return new U;d=new U;Y(",
    "a,\"Missing next location step.\");c=Za(a,c);b.push(c)}else{a:{c=y(a.a)",
    ";d=c.charAt(0);switch(d){case \"$\":throw Error(\"Variable reference no",
    "t allowed in HTML XPath\");case \"(\":a.a.next();c=Ta(a);Y(a,'unclosed ",
    "\"(\"');Va(a,\")\");break;case '\"':case \"'\":c=Xa(a);break;default:if",
    "(isNaN(+c))if(!Ea(c)&&/(?![0-9])[\\w]/.test(d)&&\"(\"==y(a.a,\n1)){c=a.",
    "a.next();c=Da[c]||null;a.a.next();for(d=[];\")\"!=y(a.a);){Y(a,\"Missin",
    "g function argument list.\");d.push(Ta(a));if(\",\"!=y(a.a))break;a.a.n",
    "ext()}Y(a,\"Unclosed function argument list.\");Wa(a);c=new O(c,d)}else",
    "{c=null;break a}else c=new S(+a.a.next())}\"[\"==y(a.a)&&(d=new V($a(a)",
    "),c=new N(c,d))}if(c)if(Ha(y(a.a)))d=c;else return c;else c=Za(a,\"/\")",
    ",d=new Ga,b.push(c)}for(;Ha(y(a.a));)c=a.a.next(),Y(a,\"Missing next lo",
    "cation step.\"),c=Za(a,c),b.push(c);return new T(d,b)}\nfunction Za(a,b",
    "){if(\"/\"!=b&&\"//\"!=b)throw Error('Step op should be \"/\" or \"//\"",
    "');if(\".\"==y(a.a)){var c=new W(Pa,new D(\"node\"));a.a.next();return ",
    "c}if(\"..\"==y(a.a))return c=new W(Oa,new D(\"node\")),a.a.next(),c;if(",
    "\"@\"==y(a.a)){var d=Fa;a.a.next();Y(a,\"Missing attribute name\")}else",
    " if(\"::\"==y(a.a,1)){if(!/(?![0-9])[\\w]/.test(y(a.a).charAt(0)))throw",
    " Error(\"Bad token: \"+a.a.next());var e=a.a.next();d=Na[e]||null;if(!d",
    ")throw Error(\"No axis with name: \"+e);a.a.next();Y(a,\"Missing node n",
    "ame\")}else d=Ka;e=\ny(a.a);if(/(?![0-9])[\\w\\*]/.test(e.charAt(0)))if",
    "(\"(\"==y(a.a,1)){if(!Ea(e))throw Error(\"Invalid node type: \"+e);e=a.",
    "a.next();if(!Ea(e))throw Error(\"Invalid type name: \"+e);Va(a,\"(\");Y",
    "(a,\"Bad nodetype\");var f=y(a.a).charAt(0),g=null;if('\"'==f||\"'\"==f",
    ")g=Xa(a);Y(a,\"Bad nodetype\");Wa(a);e=new D(e,g)}else if(e=a.a.next(),",
    "f=e.indexOf(\":\"),-1==f)e=new R(e);else{var g=e.substring(0,f);if(\"*",
    "\"==g)var l=\"*\";else if(l=a.ia(g),!l)throw Error(\"Namespace prefix n",
    "ot declared: \"+g);e=e.substr(f+1);e=new R(e,l)}else throw Error(\"Bad ",
    "token: \"+\na.a.next());a=new V($a(a),d.A);return c||new W(d,e,a,\"//\"",
    "==b)}function $a(a){for(var b=[];\"[\"==y(a.a);){a.a.next();Y(a,\"Missi",
    "ng predicate expression.\");var c=Ta(a);b.push(c);Y(a,\"Unclosed predic",
    "ate expression.\");Va(a,\"]\")}return b}function Ua(a){if(\"-\"==y(a.a)",
    ")return a.a.next(),new Qa(Ua(a));var b=Ya(a);if(\"|\"!=y(a.a))a=b;else{",
    "for(b=[b];\"|\"==a.a.next();)Y(a,\"Missing next union location path.\")",
    ",b.push(Ya(a));a.a.back();a=new Ra(b)}return a};function ab(a){switch(a",
    ".nodeType){case 1:return ga(bb,a);case 9:return ab(a.documentElement);c",
    "ase 11:case 10:case 6:case 12:return cb;default:return a.parentNode?ab(",
    "a.parentNode):cb}}function cb(){return null}function bb(a,b){if(a.prefi",
    "x==b)return a.namespaceURI||\"http://www.w3.org/1999/xhtml\";var c=a.ge",
    "tAttributeNode(\"xmlns:\"+b);return c&&c.specified?c.value||null:a.pare",
    "ntNode&&9!=a.parentNode.nodeType?bb(a.parentNode,b):null};function eb(a",
    ",b){if(!a.length)throw Error(\"Empty XPath expression.\");a=na(a);if(a.",
    "empty())throw Error(\"Invalid XPath expression.\");b?\"function\"==ca(b",
    ")||(b=fa(b.lookupNamespaceURI,b)):b=function(){return null};var c=Ta(ne",
    "w Sa(a,b));if(!a.empty())throw Error(\"Bad token: \"+a.next());this.eva",
    "luate=function(a,b){a=c.evaluate(new v(a));return new Z(a,b)}}\nfunctio",
    "n Z(a,b){if(0==b)if(a instanceof C)b=4;else if(\"string\"==typeof a)b=2",
    ";else if(\"number\"==typeof a)b=1;else if(\"boolean\"==typeof a)b=3;els",
    "e throw Error(\"Unexpected evaluation result.\");if(2!=b&&1!=b&&3!=b&&!",
    "(a instanceof C))throw Error(\"value could not be converted to the spec",
    "ified type\");this.resultType=b;switch(b){case 2:this.stringValue=a ins",
    "tanceof C?F(a):\"\"+a;break;case 1:this.numberValue=a instanceof C?+F(a",
    "):+a;break;case 3:this.booleanValue=a instanceof C?0<a.m():!!a;break;ca",
    "se 4:case 5:case 6:case 7:var c=\na.iterator();var d=[];for(var e=c.nex",
    "t();e;e=c.next())d.push(e);this.snapshotLength=a.m();this.invalidIterat",
    "orState=!1;break;case 8:case 9:this.singleNodeValue=E(a);break;default:",
    "throw Error(\"Unknown XPathResult type.\");}var f=0;this.iterateNext=fu",
    "nction(){if(4!=b&&5!=b)throw Error(\"iterateNext called with wrong resu",
    "lt type\");return f>=d.length?null:d[f++]};this.snapshotItem=function(a",
    "){if(6!=b&&7!=b)throw Error(\"snapshotItem called with wrong result typ",
    "e\");return a>=d.length||0>a?null:d[a]}}\nZ.ANY_TYPE=0;Z.NUMBER_TYPE=1;",
    "Z.STRING_TYPE=2;Z.BOOLEAN_TYPE=3;Z.UNORDERED_NODE_ITERATOR_TYPE=4;Z.ORD",
    "ERED_NODE_ITERATOR_TYPE=5;Z.UNORDERED_NODE_SNAPSHOT_TYPE=6;Z.ORDERED_NO",
    "DE_SNAPSHOT_TYPE=7;Z.ANY_UNORDERED_NODE_TYPE=8;Z.FIRST_ORDERED_NODE_TYP",
    "E=9;function fb(a){this.lookupNamespaceURI=ab(a)}\nba(\"wgxpath.install",
    "\",function(a,b){a=a||aa;var c=a.Document&&a.Document.prototype||a.docu",
    "ment;if(!c.evaluate||b)a.XPathResult=Z,c.evaluate=function(a,b,c,g){ret",
    "urn(new eb(a,c)).evaluate(b,g)},c.createExpression=function(a,b){return",
    " new eb(a,b)},c.createNSResolver=function(a){return new fb(a)}});functi",
    "on gb(a,b,c,d){this.left=a;this.top=b;this.width=c;this.height=d}h=gb.p",
    "rototype;h.clone=function(){return new gb(this.left,this.top,this.width",
    ",this.height)};h.toString=function(){return\"(\"+this.left+\", \"+this.",
    "top+\" - \"+this.width+\"w x \"+this.height+\"h)\"};h.contains=function",
    "(a){return a instanceof u?a.x>=this.left&&a.x<=this.left+this.width&&a.",
    "y>=this.top&&a.y<=this.top+this.height:this.left<=a.left&&this.left+thi",
    "s.width>=a.left+a.width&&this.top<=a.top&&this.top+this.height>=a.top+a",
    ".height};\nh.ceil=function(){this.left=Math.ceil(this.left);this.top=Ma",
    "th.ceil(this.top);this.width=Math.ceil(this.width);this.height=Math.cei",
    "l(this.height);return this};h.floor=function(){this.left=Math.floor(thi",
    "s.left);this.top=Math.floor(this.top);this.width=Math.floor(this.width)",
    ";this.height=Math.floor(this.height);return this};h.round=function(){th",
    "is.left=Math.round(this.left);this.top=Math.round(this.top);this.width=",
    "Math.round(this.width);this.height=Math.round(this.height);return this}",
    ";\nh.translate=function(a,b){a instanceof u?(this.left+=a.x,this.top+=a",
    ".y):(this.left+=a,m(b)&&(this.top+=b));return this};h.scale=function(a,",
    "b){b=m(b)?b:a;this.left*=a;this.width*=a;this.top*=b;this.height*=b;ret",
    "urn this};ba(\"_\",function(a){var b=a.getClientRects();if(0==b.length)",
    "throw Error(\"Element does not have any client rects\");b=b[0];if(1==a.",
    "nodeType){b:{try{var c=a.getBoundingClientRect()}catch(d){a={left:0,top",
    ":0,right:0,bottom:0};break b}a=c}a=new u(a.left,a.top)}else a=a.changed",
    "Touches?a.changedTouches[0]:a,a=new u(a.clientX,a.clientY);return new g",
    "b(b.left-a.x,b.top-a.y,b.right-b.left,b.bottom-b.top)});; return this._",
    ".apply(null,arguments);}.apply({navigator:typeof window!='undefined'?wi",
    "ndow.navigator:null,document:typeof window!='undefined'?window.document",
    ":null}, arguments);}",
    NULL
};

const char* const GET_LOCATION_IN_VIEW[] = {
    "function(){return function(){var h,k=this;function m(a){return\"string",
    "\"==typeof a}function n(a){return\"number\"==typeof a}function aa(a,b){",
    "a=a.split(\".\");var c=k;a[0]in c||!c.execScript||c.execScript(\"var \"",
    "+a[0]);for(var d;a.length&&(d=a.shift());)a.length||void 0===b?c=c[d]&&",
    "c[d]!==Object.prototype[d]?c[d]:c[d]={}:c[d]=b}\nfunction ba(a){var b=t",
    "ypeof a;if(\"object\"==b)if(a){if(a instanceof Array)return\"array\";if",
    "(a instanceof Object)return b;var c=Object.prototype.toString.call(a);i",
    "f(\"[object Window]\"==c)return\"object\";if(\"[object Array]\"==c||\"n",
    "umber\"==typeof a.length&&\"undefined\"!=typeof a.splice&&\"undefined\"",
    "!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable(\"splice\"))re",
    "turn\"array\";if(\"[object Function]\"==c||\"undefined\"!=typeof a.call",
    "&&\"undefined\"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable",
    "(\"call\"))return\"function\"}else return\"null\";\nelse if(\"function",
    "\"==b&&\"undefined\"==typeof a.call)return\"object\";return b}function ",
    "ca(a){var b=ba(a);return\"array\"==b||\"object\"==b&&\"number\"==typeof",
    " a.length}function da(a){var b=typeof a;return\"object\"==b&&null!=a||",
    "\"function\"==b}function ea(a,b,c){return a.call.apply(a.bind,arguments",
    ")}\nfunction fa(a,b,c){if(!a)throw Error();if(2<arguments.length){var d",
    "=Array.prototype.slice.call(arguments,2);return function(){var c=Array.",
    "prototype.slice.call(arguments);Array.prototype.unshift.apply(c,d);retu",
    "rn a.apply(b,c)}}return function(){return a.apply(b,arguments)}}functio",
    "n ga(a,b,c){ga=Function.prototype.bind&&-1!=Function.prototype.bind.toS",
    "tring().indexOf(\"native code\")?ea:fa;return ga.apply(null,arguments)}",
    "\nfunction ha(a,b){var c=Array.prototype.slice.call(arguments,1);return",
    " function(){var b=c.slice();b.push.apply(b,arguments);return a.apply(th",
    "is,b)}}function p(a){var b=q;function c(){}c.prototype=b.prototype;a.oa",
    "=b.prototype;a.prototype=new c;a.prototype.constructor=a;a.na=function(",
    "a,c,f){for(var d=Array(arguments.length-2),e=2;e<arguments.length;e++)d",
    "[e-2]=arguments[e];return b.prototype[c].apply(a,d)}};var r;var ia=Stri",
    "ng.prototype.trim?function(a){return a.trim()}:function(a){return a.rep",
    "lace(/^[\\s\\xa0]+|[\\s\\xa0]+$/g,\"\")};function ja(a,b){return a<b?-1",
    ":a>b?1:0};function t(a,b){for(var c=a.length,d=m(a)?a.split(\"\"):a,e=0",
    ";e<c;e++)e in d&&b.call(void 0,d[e],e,a)}function u(a,b,c){var d=c;t(a,",
    "function(c,f){d=b.call(void 0,d,c,f,a)});return d}function v(a,b){for(v",
    "ar c=a.length,d=m(a)?a.split(\"\"):a,e=0;e<c;e++)if(e in d&&b.call(void",
    " 0,d[e],e,a))return!0;return!1}function ka(a){return Array.prototype.co",
    "ncat.apply([],arguments)}function la(a){var b=a.length;if(0<b){for(var ",
    "c=Array(b),d=0;d<b;d++)c[d]=a[d];return c}return[]}\nfunction ma(a,b,c)",
    "{return 2>=arguments.length?Array.prototype.slice.call(a,b):Array.proto",
    "type.slice.call(a,b,c)};var w;a:{var na=k.navigator;if(na){var oa=na.us",
    "erAgent;if(oa){w=oa;break a}}w=\"\"};function pa(a){return(a=a.exec(w))",
    "?a[1]:\"\"}var qa=-1!=w.indexOf(\"iPhone\")&&-1==w.indexOf(\"iPod\")&&-",
    "1==w.indexOf(\"iPad\")||-1!=w.indexOf(\"iPad\")||-1!=w.indexOf(\"iPod\"",
    ")?pa(/CriOS\\/([0-9.]+)/):pa(/Chrome\\/([0-9.]+)/);\nfunction ra(){for(",
    "var a=0,b=ia(String(qa)).split(\".\"),c=ia(\"61\").split(\".\"),d=Math.",
    "max(b.length,c.length),e=0;0==a&&e<d;e++){var f=b[e]||\"\",g=c[e]||\"\"",
    ";do{f=/(\\d*)(\\D*)(.*)/.exec(f)||[\"\",\"\",\"\",\"\"];g=/(\\d*)(\\D*)",
    "(.*)/.exec(g)||[\"\",\"\",\"\",\"\"];if(0==f[0].length&&0==g[0].length)",
    "break;a=ja(0==f[1].length?0:parseInt(f[1],10),0==g[1].length?0:parseInt",
    "(g[1],10))||ja(0==f[2].length,0==g[2].length)||ja(f[2],g[2]);f=f[3];g=g",
    "[3]}while(0==a)}return 0<=a};function x(a,b){this.x=void 0!==a?a:0;this",
    ".y=void 0!==b?b:0}h=x.prototype;h.clone=function(){return new x(this.x,",
    "this.y)};h.toString=function(){return\"(\"+this.x+\", \"+this.y+\")\"};",
    "h.ceil=function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);ret",
    "urn this};h.floor=function(){this.x=Math.floor(this.x);this.y=Math.floo",
    "r(this.y);return this};h.round=function(){this.x=Math.round(this.x);thi",
    "s.y=Math.round(this.y);return this};\nh.translate=function(a,b){a insta",
    "nceof x?(this.x+=a.x,this.y+=a.y):(this.x+=Number(a),n(b)&&(this.y+=b))",
    ";return this};h.scale=function(a,b){b=n(b)?b:a;this.x*=a;this.y*=b;retu",
    "rn this};function z(a,b){this.width=a;this.height=b}h=z.prototype;h.clo",
    "ne=function(){return new z(this.width,this.height)};h.toString=function",
    "(){return\"(\"+this.width+\" x \"+this.height+\")\"};h.ceil=function(){",
    "this.width=Math.ceil(this.width);this.height=Math.ceil(this.height);ret",
    "urn this};h.floor=function(){this.width=Math.floor(this.width);this.hei",
    "ght=Math.floor(this.height);return this};h.round=function(){this.width=",
    "Math.round(this.width);this.height=Math.round(this.height);return this}",
    ";\nh.scale=function(a,b){b=n(b)?b:a;this.width*=a;this.height*=b;return",
    " this};function sa(a,b,c){function d(c){c&&b.appendChild(m(c)?a.createT",
    "extNode(c):c)}for(var e=1;e<c.length;e++){var f=c[e];!ca(f)||da(f)&&0<f",
    ".nodeType?d(f):t(ta(f)?la(f):f,d)}}function ua(a,b){if(!a||!b)return!1;",
    "if(a.contains&&1==b.nodeType)return a==b||a.contains(b);if(\"undefined",
    "\"!=typeof a.compareDocumentPosition)return a==b||!!(a.compareDocumentP",
    "osition(b)&16);for(;b&&a!=b;)b=b.parentNode;return b==a}\nfunction va(a",
    ",b){if(a==b)return 0;if(a.compareDocumentPosition)return a.compareDocum",
    "entPosition(b)&2?1:-1;if(\"sourceIndex\"in a||a.parentNode&&\"sourceInd",
    "ex\"in a.parentNode){var c=1==a.nodeType,d=1==b.nodeType;if(c&&d)return",
    " a.sourceIndex-b.sourceIndex;var e=a.parentNode,f=b.parentNode;return e",
    "==f?wa(a,b):!c&&ua(e,b)?-1*xa(a,b):!d&&ua(f,a)?xa(b,a):(c?a.sourceIndex",
    ":e.sourceIndex)-(d?b.sourceIndex:f.sourceIndex)}d=A(a);c=d.createRange(",
    ");c.selectNode(a);c.collapse(!0);a=d.createRange();a.selectNode(b);\na.",
    "collapse(!0);return c.compareBoundaryPoints(k.Range.START_TO_END,a)}fun",
    "ction xa(a,b){var c=a.parentNode;if(c==b)return-1;for(;b.parentNode!=c;",
    ")b=b.parentNode;return wa(b,a)}function wa(a,b){for(;b=b.previousSiblin",
    "g;)if(b==a)return-1;return 1}function A(a){return 9==a.nodeType?a:a.own",
    "erDocument||a.document}function ta(a){if(a&&\"number\"==typeof a.length",
    "){if(da(a))return\"function\"==typeof a.item||\"string\"==typeof a.item",
    ";if(\"function\"==ba(a))return\"function\"==typeof a.item}return!1}\nfu",
    "nction B(a){this.D=a||k.document||document}h=B.prototype;h.getElementsB",
    "yTagName=function(a,b){return(b||this.D).getElementsByTagName(String(a)",
    ")};function ya(a){a=a.D;a=(a.parentWindow||a.defaultView||window).docum",
    "ent;a=\"CSS1Compat\"==a.compatMode?a.documentElement:a.body;return new ",
    "z(a.clientWidth,a.clientHeight)}h.createElement=function(a){return this",
    ".D.createElement(String(a))};h.createTextNode=function(a){return this.D",
    ".createTextNode(String(a))};h.appendChild=function(a,b){a.appendChild(b",
    ")};\nh.append=function(a,b){sa(A(a),a,arguments)};h.canHaveChildren=fun",
    "ction(a){if(1!=a.nodeType)return!1;switch(a.tagName){case \"APPLET\":ca",
    "se \"AREA\":case \"BASE\":case \"BR\":case \"COL\":case \"COMMAND\":cas",
    "e \"EMBED\":case \"FRAME\":case \"HR\":case \"IMG\":case \"INPUT\":case",
    " \"IFRAME\":case \"ISINDEX\":case \"KEYGEN\":case \"LINK\":case \"NOFRA",
    "MES\":case \"NOSCRIPT\":case \"META\":case \"OBJECT\":case \"PARAM\":ca",
    "se \"SCRIPT\":case \"SOURCE\":case \"STYLE\":case \"TRACK\":case \"WBR",
    "\":return!1}return!0};\nh.removeNode=function(a){return a&&a.parentNode",
    "?a.parentNode.removeChild(a):null};h.contains=ua;/*\n\n The MIT License",
    "\n\n Copyright (c) 2007 Cybozu Labs, Inc.\n Copyright (c) 2012 Google I",
    "nc.\n\n Permission is hereby granted, free of charge, to any person obt",
    "aining a copy\n of this software and associated documentation files (th",
    "e \"Software\"), to\n deal in the Software without restriction, includi",
    "ng without limitation the\n rights to use, copy, modify, merge, publish",
    ", distribute, sublicense, and/or\n sell copies of the Software, and to ",
    "permit persons to whom the Software is\n furnished to do so, subject to",
    " the following conditions:\n\n The above copyright notice and this perm",
    "ission notice shall be included in\n all copies or substantial portions",
    " of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRA",
    "NTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE",
    " WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND ",
    "NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS B",
    "E LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACT",
    "ION OF CONTRACT, TORT OR OTHERWISE, ARISING\n FROM, OUT OF OR IN CONNEC",
    "TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n IN THE SOFTWARE.",
    "\n*/\nfunction C(a,b,c){this.l=a;this.la=b||1;this.j=c||1};function D(a",
    "){this.T=a;this.J=0}function za(a){a=a.match(Ba);for(var b=0;b<a.length",
    ";b++)Ca.test(a[b])&&a.splice(b,1);return new D(a)}var Ba=/\\$?(?:(?![0-",
    "9-\\.])(?:\\*|[\\w-\\.]+):)?(?![0-9-\\.])(?:\\*|[\\w-\\.]+)|\\/\\/|\\.",
    "\\.|::|\\d+(?:\\.\\d*)?|\\.\\d+|\"[^\"]*\"|'[^']*'|[!<>]=|\\s+|./g,Ca=/",
    "^\\s/;function E(a,b){return a.T[a.J+(b||0)]}D.prototype.next=function(",
    "){return this.T[this.J++]};D.prototype.back=function(){this.J--};D.prot",
    "otype.empty=function(){return this.T.length<=this.J};function F(a){var ",
    "b=null,c=a.nodeType;1==c&&(b=a.textContent,b=void 0==b||null==b?a.inner",
    "Text:b,b=void 0==b||null==b?\"\":b);if(\"string\"!=typeof b)if(9==c||1=",
    "=c){a=9==c?a.documentElement:a.firstChild;for(var c=0,d=[],b=\"\";a;){d",
    "o 1!=a.nodeType&&(b+=a.nodeValue),d[c++]=a;while(a=a.firstChild);for(;c",
    "&&!(a=d[--c].nextSibling););}}else b=a.nodeValue;return\"\"+b}\nfunctio",
    "n G(a,b,c){if(null===b)return!0;try{if(!a.getAttribute)return!1}catch(d",
    "){return!1}return null==c?!!a.getAttribute(b):a.getAttribute(b,2)==c}fu",
    "nction H(a,b,c,d,e){return Da.call(null,a,b,m(c)?c:null,m(d)?d:null,e||",
    "new I)}\nfunction Da(a,b,c,d,e){b.getElementsByName&&d&&\"name\"==c?(b=",
    "b.getElementsByName(d),t(b,function(b){a.matches(b)&&e.add(b)})):b.getE",
    "lementsByClassName&&d&&\"class\"==c?(b=b.getElementsByClassName(d),t(b,",
    "function(b){b.className==d&&a.matches(b)&&e.add(b)})):a instanceof J?Ea",
    "(a,b,c,d,e):b.getElementsByTagName&&(b=b.getElementsByTagName(a.getName",
    "()),t(b,function(a){G(a,c,d)&&e.add(a)}));return e}function Ea(a,b,c,d,",
    "e){for(b=b.firstChild;b;b=b.nextSibling)G(b,c,d)&&a.matches(b)&&e.add(b",
    "),Ea(a,b,c,d,e)};function I(){this.j=this.g=null;this.F=0}function Fa(a",
    "){this.node=a;this.next=this.w=null}function Ga(a,b){if(!a.g)return b;i",
    "f(!b.g)return a;var c=a.g;b=b.g;for(var d=null,e,f=0;c&&b;)c.node==b.no",
    "de?(e=c,c=c.next,b=b.next):0<va(c.node,b.node)?(e=b,b=b.next):(e=c,c=c.",
    "next),(e.w=d)?d.next=e:a.g=e,d=e,f++;for(e=c||b;e;)e.w=d,d=d.next=e,f++",
    ",e=e.next;a.j=d;a.F=f;return a}I.prototype.unshift=function(a){a=new Fa",
    "(a);a.next=this.g;this.j?this.g.w=a:this.g=this.j=a;this.g=a;this.F++};",
    "\nI.prototype.add=function(a){a=new Fa(a);a.w=this.j;this.g?this.j.next",
    "=a:this.g=this.j=a;this.j=a;this.F++};function K(a){return(a=a.g)?a.nod",
    "e:null}I.prototype.m=function(){return this.F};function Ha(a){return(a=",
    "K(a))?F(a):\"\"}I.prototype.iterator=function(a){return new Ia(this,!!a",
    ")};function Ia(a,b){this.ha=a;this.U=(this.A=b)?a.j:a.g;this.P=null}Ia.",
    "prototype.next=function(){var a=this.U;if(null==a)return null;var b=thi",
    "s.P=a;this.U=this.A?a.w:a.next;return b.node};\nIa.prototype.remove=fun",
    "ction(){var a=this.ha,b=this.P;if(!b)throw Error(\"Next must be called ",
    "at least once before remove.\");var c=b.w,b=b.next;c?c.next=b:a.g=b;b?b",
    ".w=c:a.j=c;a.F--;this.P=null};function q(a){this.f=a;this.h=this.o=!1;t",
    "his.G=null}function L(a){return\"\\n  \"+a.toString().split(\"\\n\").jo",
    "in(\"\\n  \")}q.prototype.c=function(){return this.o};function Ja(a,b){",
    "a.o=b}function Ka(a,b){a.h=b}q.prototype.u=function(){return this.G};fu",
    "nction M(a,b){a=a.evaluate(b);return a instanceof I?+Ha(a):+a}function ",
    "N(a,b){a=a.evaluate(b);return a instanceof I?Ha(a):\"\"+a}function O(a,",
    "b){a=a.evaluate(b);return a instanceof I?!!a.m():!!a};function P(a,b,c)",
    "{q.call(this,a.f);this.S=a;this.X=b;this.ba=c;this.o=b.c()||c.c();this.",
    "h=b.h||c.h;this.S==La&&(c.h||c.c()||4==c.f||0==c.f||!b.u()?b.h||b.c()||",
    "4==b.f||0==b.f||!c.u()||(this.G={name:c.u().name,C:b}):this.G={name:b.u",
    "().name,C:c})}p(P);\nfunction Q(a,b,c,d,e){b=b.evaluate(d);c=c.evaluate",
    "(d);var f;if(b instanceof I&&c instanceof I){b=b.iterator();for(d=b.nex",
    "t();d;d=b.next())for(e=c.iterator(),f=e.next();f;f=e.next())if(a(F(d),F",
    "(f)))return!0;return!1}if(b instanceof I||c instanceof I){b instanceof ",
    "I?(e=b,d=c):(e=c,d=b);f=e.iterator();for(var g=typeof d,l=f.next();l;l=",
    "f.next()){switch(g){case \"number\":l=+F(l);break;case \"boolean\":l=!!",
    "F(l);break;case \"string\":l=F(l);break;default:throw Error(\"Illegal p",
    "rimitive type for comparison.\");\n}if(e==b&&a(l,d)||e==c&&a(d,l))retur",
    "n!0}return!1}return e?\"boolean\"==typeof b||\"boolean\"==typeof c?a(!!",
    "b,!!c):\"number\"==typeof b||\"number\"==typeof c?a(+b,+c):a(b,c):a(+b,",
    "+c)}P.prototype.evaluate=function(a){return this.S.v(this.X,this.ba,a)}",
    ";P.prototype.toString=function(){var a=\"Binary Expression: \"+this.S,a",
    "=a+L(this.X);return a+=L(this.ba)};function Ma(a,b,c,d){this.ka=a;this.",
    "$=b;this.f=c;this.v=d}Ma.prototype.toString=function(){return this.ka};",
    "var Na={};\nfunction R(a,b,c,d){if(Na.hasOwnProperty(a))throw Error(\"B",
    "inary operator already created: \"+a);a=new Ma(a,b,c,d);return Na[a.toS",
    "tring()]=a}R(\"div\",6,1,function(a,b,c){return M(a,c)/M(b,c)});R(\"mod",
    "\",6,1,function(a,b,c){return M(a,c)%M(b,c)});R(\"*\",6,1,function(a,b,",
    "c){return M(a,c)*M(b,c)});R(\"+\",5,1,function(a,b,c){return M(a,c)+M(b",
    ",c)});R(\"-\",5,1,function(a,b,c){return M(a,c)-M(b,c)});R(\"<\",4,2,fu",
    "nction(a,b,c){return Q(function(a,b){return a<b},a,b,c)});\nR(\">\",4,2",
    ",function(a,b,c){return Q(function(a,b){return a>b},a,b,c)});R(\"<=\",4",
    ",2,function(a,b,c){return Q(function(a,b){return a<=b},a,b,c)});R(\">=",
    "\",4,2,function(a,b,c){return Q(function(a,b){return a>=b},a,b,c)});var",
    " La=R(\"=\",3,2,function(a,b,c){return Q(function(a,b){return a==b},a,b",
    ",c,!0)});R(\"!=\",3,2,function(a,b,c){return Q(function(a,b){return a!=",
    "b},a,b,c,!0)});R(\"and\",2,2,function(a,b,c){return O(a,c)&&O(b,c)});R(",
    "\"or\",1,2,function(a,b,c){return O(a,c)||O(b,c)});function Oa(a,b){if(",
    "b.m()&&4!=a.f)throw Error(\"Primary expression must evaluate to nodeset",
    " if filter has predicate(s).\");q.call(this,a.f);this.aa=a;this.b=b;thi",
    "s.o=a.c();this.h=a.h}p(Oa);Oa.prototype.evaluate=function(a){a=this.aa.",
    "evaluate(a);return Pa(this.b,a)};Oa.prototype.toString=function(){var a",
    "=\"Filter:\"+L(this.aa);return a+=L(this.b)};function Qa(a,b){if(b.leng",
    "th<a.Z)throw Error(\"Function \"+a.i+\" expects at least\"+a.Z+\" argum",
    "ents, \"+b.length+\" given\");if(null!==a.R&&b.length>a.R)throw Error(",
    "\"Function \"+a.i+\" expects at most \"+a.R+\" arguments, \"+b.length+",
    "\" given\");a.ia&&t(b,function(b,d){if(4!=b.f)throw Error(\"Argument \"",
    "+d+\" to function \"+a.i+\" is not of type Nodeset: \"+b);});q.call(thi",
    "s,a.f);this.I=a;this.N=b;Ja(this,a.o||v(b,function(a){return a.c()}));K",
    "a(this,a.ga&&!b.length||a.fa&&!!b.length||v(b,function(a){return a.h}))",
    "}p(Qa);\nQa.prototype.evaluate=function(a){return this.I.v.apply(null,k",
    "a(a,this.N))};Qa.prototype.toString=function(){var a=\"Function: \"+thi",
    "s.I;if(this.N.length)var b=u(this.N,function(a,b){return a+L(b)},\"Argu",
    "ments:\"),a=a+L(b);return a};function Ra(a,b,c,d,e,f,g,l,y){this.i=a;th",
    "is.f=b;this.o=c;this.ga=d;this.fa=e;this.v=f;this.Z=g;this.R=void 0!==l",
    "?l:g;this.ia=!!y}Ra.prototype.toString=function(){return this.i};var Sa",
    "={};\nfunction S(a,b,c,d,e,f,g,l){if(Sa.hasOwnProperty(a))throw Error(",
    "\"Function already created: \"+a+\".\");Sa[a]=new Ra(a,b,c,d,!1,e,f,g,l",
    ")}S(\"boolean\",2,!1,!1,function(a,b){return O(b,a)},1);S(\"ceiling\",1",
    ",!1,!1,function(a,b){return Math.ceil(M(b,a))},1);S(\"concat\",3,!1,!1,",
    "function(a,b){return u(ma(arguments,1),function(b,d){return b+N(d,a)},",
    "\"\")},2,null);S(\"contains\",2,!1,!1,function(a,b,c){b=N(b,a);a=N(c,a)",
    ";return-1!=b.indexOf(a)},2);S(\"count\",1,!1,!1,function(a,b){return b.",
    "evaluate(a).m()},1,1,!0);\nS(\"false\",2,!1,!1,function(){return!1},0);",
    "S(\"floor\",1,!1,!1,function(a,b){return Math.floor(M(b,a))},1);S(\"id",
    "\",4,!1,!1,function(a,b){var c=a.l,d=9==c.nodeType?c:c.ownerDocument;a=",
    "N(b,a).split(/\\s+/);var e=[];t(a,function(a){a=d.getElementById(a);var",
    " b;if(!(b=!a)){a:if(m(e))b=m(a)&&1==a.length?e.indexOf(a,0):-1;else{for",
    "(b=0;b<e.length;b++)if(b in e&&e[b]===a)break a;b=-1}b=0<=b}b||e.push(a",
    ")});e.sort(va);var f=new I;t(e,function(a){f.add(a)});return f},1);S(\"",
    "lang\",2,!1,!1,function(){return!1},1);\nS(\"last\",1,!0,!1,function(a)",
    "{if(1!=arguments.length)throw Error(\"Function last expects ()\");retur",
    "n a.j},0);S(\"local-name\",3,!1,!0,function(a,b){return(a=b?K(b.evaluat",
    "e(a)):a.l)?a.localName||a.nodeName.toLowerCase():\"\"},0,1,!0);S(\"name",
    "\",3,!1,!0,function(a,b){return(a=b?K(b.evaluate(a)):a.l)?a.nodeName.to",
    "LowerCase():\"\"},0,1,!0);S(\"namespace-uri\",3,!0,!1,function(){return",
    "\"\"},0,1,!0);\nS(\"normalize-space\",3,!1,!0,function(a,b){return(b?N(",
    "b,a):F(a.l)).replace(/[\\s\\xa0]+/g,\" \").replace(/^\\s+|\\s+$/g,\"\")",
    "},0,1);S(\"not\",2,!1,!1,function(a,b){return!O(b,a)},1);S(\"number\",1",
    ",!1,!0,function(a,b){return b?M(b,a):+F(a.l)},0,1);S(\"position\",1,!0,",
    "!1,function(a){return a.la},0);S(\"round\",1,!1,!1,function(a,b){return",
    " Math.round(M(b,a))},1);S(\"starts-with\",2,!1,!1,function(a,b,c){b=N(b",
    ",a);a=N(c,a);return 0==b.lastIndexOf(a,0)},2);S(\"string\",3,!1,!0,func",
    "tion(a,b){return b?N(b,a):F(a.l)},0,1);\nS(\"string-length\",1,!1,!0,fu",
    "nction(a,b){return(b?N(b,a):F(a.l)).length},0,1);S(\"substring\",3,!1,!",
    "1,function(a,b,c,d){c=M(c,a);if(isNaN(c)||Infinity==c||-Infinity==c)ret",
    "urn\"\";d=d?M(d,a):Infinity;if(isNaN(d)||-Infinity===d)return\"\";c=Mat",
    "h.round(c)-1;var e=Math.max(c,0);a=N(b,a);return Infinity==d?a.substrin",
    "g(e):a.substring(e,c+Math.round(d))},2,3);S(\"substring-after\",3,!1,!1",
    ",function(a,b,c){b=N(b,a);a=N(c,a);c=b.indexOf(a);return-1==c?\"\":b.su",
    "bstring(c+a.length)},2);\nS(\"substring-before\",3,!1,!1,function(a,b,c",
    "){b=N(b,a);a=N(c,a);a=b.indexOf(a);return-1==a?\"\":b.substring(0,a)},2",
    ");S(\"sum\",1,!1,!1,function(a,b){a=b.evaluate(a).iterator();b=0;for(va",
    "r c=a.next();c;c=a.next())b+=+F(c);return b},1,1,!0);S(\"translate\",3,",
    "!1,!1,function(a,b,c,d){b=N(b,a);c=N(c,a);var e=N(d,a);d={};for(var f=0",
    ";f<c.length;f++)a=c.charAt(f),a in d||(d[a]=e.charAt(f));c=\"\";for(f=0",
    ";f<b.length;f++)a=b.charAt(f),c+=a in d?d[a]:a;return c},3);S(\"true\",",
    "2,!1,!1,function(){return!0},0);function J(a,b){this.da=a;this.Y=void 0",
    "!==b?b:null;this.B=null;switch(a){case \"comment\":this.B=8;break;case ",
    "\"text\":this.B=3;break;case \"processing-instruction\":this.B=7;break;",
    "case \"node\":break;default:throw Error(\"Unexpected argument\");}}func",
    "tion Ta(a){return\"comment\"==a||\"text\"==a||\"processing-instruction",
    "\"==a||\"node\"==a}J.prototype.matches=function(a){return null===this.B",
    "||this.B==a.nodeType};J.prototype.getName=function(){return this.da};\n",
    "J.prototype.toString=function(){var a=\"Kind Test: \"+this.da;null===th",
    "is.Y||(a+=L(this.Y));return a};function Ua(a){q.call(this,3);this.ca=a.",
    "substring(1,a.length-1)}p(Ua);Ua.prototype.evaluate=function(){return t",
    "his.ca};Ua.prototype.toString=function(){return\"Literal: \"+this.ca};f",
    "unction T(a,b){this.i=a.toLowerCase();a=\"*\"==this.i?\"*\":\"http://ww",
    "w.w3.org/1999/xhtml\";this.K=b?b.toLowerCase():a}T.prototype.matches=fu",
    "nction(a){var b=a.nodeType;if(1!=b&&2!=b)return!1;b=void 0!==a.localNam",
    "e?a.localName:a.nodeName;return\"*\"!=this.i&&this.i!=b.toLowerCase()?!",
    "1:\"*\"==this.K?!0:this.K==(a.namespaceURI?a.namespaceURI.toLowerCase()",
    ":\"http://www.w3.org/1999/xhtml\")};T.prototype.getName=function(){retu",
    "rn this.i};\nT.prototype.toString=function(){return\"Name Test: \"+(\"h",
    "ttp://www.w3.org/1999/xhtml\"==this.K?\"\":this.K+\":\")+this.i};functi",
    "on Va(a){q.call(this,1);this.ea=a}p(Va);Va.prototype.evaluate=function(",
    "){return this.ea};Va.prototype.toString=function(){return\"Number: \"+t",
    "his.ea};function Wa(a,b){q.call(this,a.f);this.W=a;this.H=b;this.o=a.c(",
    ");this.h=a.h;1==this.H.length&&(a=this.H[0],a.O||a.s!=Xa||(a=a.M,\"*\"!",
    "=a.getName()&&(this.G={name:a.getName(),C:null})))}p(Wa);function U(){q",
    ".call(this,4)}p(U);U.prototype.evaluate=function(a){var b=new I;a=a.l;9",
    "==a.nodeType?b.add(a):b.add(a.ownerDocument);return b};U.prototype.toSt",
    "ring=function(){return\"Root Helper Expression\"};function Ya(){q.call(",
    "this,4)}p(Ya);Ya.prototype.evaluate=function(a){var b=new I;b.add(a.l);",
    "return b};\nYa.prototype.toString=function(){return\"Context Helper Exp",
    "ression\"};function Za(a){return\"/\"==a||\"//\"==a}\nWa.prototype.eval",
    "uate=function(a){var b=this.W.evaluate(a);if(!(b instanceof I))throw Er",
    "ror(\"Filter expression must evaluate to nodeset.\");a=this.H;for(var c",
    "=0,d=a.length;c<d&&b.m();c++){var e=a[c],f=b.iterator(e.s.A);if(e.c()||",
    "e.s!=$a)if(e.c()||e.s!=ab){var g=f.next();for(b=e.evaluate(new C(g));nu",
    "ll!=(g=f.next());)g=e.evaluate(new C(g)),b=Ga(b,g)}else g=f.next(),b=e.",
    "evaluate(new C(g));else{for(g=f.next();(b=f.next())&&(!g.contains||g.co",
    "ntains(b))&&b.compareDocumentPosition(g)&8;g=b);b=e.evaluate(new C(g))}",
    "}return b};\nWa.prototype.toString=function(){var a=\"Path Expression:",
    "\"+L(this.W);if(this.H.length){var b=u(this.H,function(a,b){return a+L(",
    "b)},\"Steps:\");a+=L(b)}return a};function V(a,b){this.b=a;this.A=!!b}f",
    "unction Pa(a,b,c){for(c=c||0;c<a.b.length;c++)for(var d=a.b[c],e=b.iter",
    "ator(),f=b.m(),g,l=0;g=e.next();l++){var y=a.A?f-l:l+1;g=d.evaluate(new",
    " C(g,y,f));if(\"number\"==typeof g)y=y==g;else if(\"string\"==typeof g|",
    "|\"boolean\"==typeof g)y=!!g;else if(g instanceof I)y=0<g.m();else thro",
    "w Error(\"Predicate.evaluate returned an unexpected type.\");y||e.remov",
    "e()}return b}V.prototype.u=function(){return 0<this.b.length?this.b[0].",
    "u():null};\nV.prototype.c=function(){for(var a=0;a<this.b.length;a++){v",
    "ar b=this.b[a];if(b.c()||1==b.f||0==b.f)return!0}return!1};V.prototype.",
    "m=function(){return this.b.length};V.prototype.toString=function(){retu",
    "rn u(this.b,function(a,b){return a+L(b)},\"Predicates:\")};function W(a",
    ",b,c,d){q.call(this,4);this.s=a;this.M=b;this.b=c||new V([]);this.O=!!d",
    ";b=this.b.u();a.ma&&b&&(this.G={name:b.name,C:b.C});this.o=this.b.c()}p",
    "(W);\nW.prototype.evaluate=function(a){var b=a.l,c=this.u(),d=null,e=nu",
    "ll,f=0;c&&(d=c.name,e=c.C?N(c.C,a):null,f=1);if(this.O)if(this.c()||thi",
    "s.s!=bb)if(b=(new W(cb,new J(\"node\"))).evaluate(a).iterator(),c=b.nex",
    "t())for(a=this.v(c,d,e,f);null!=(c=b.next());)a=Ga(a,this.v(c,d,e,f));e",
    "lse a=new I;else a=H(this.M,b,d,e),a=Pa(this.b,a,f);else a=this.v(a.l,d",
    ",e,f);return a};W.prototype.v=function(a,b,c,d){a=this.s.I(this.M,a,b,c",
    ");return a=Pa(this.b,a,d)};\nW.prototype.toString=function(){var a=\"St",
    "ep:\"+L(\"Operator: \"+(this.O?\"//\":\"/\"));this.s.i&&(a+=L(\"Axis: ",
    "\"+this.s));a+=L(this.M);if(this.b.m()){var b=u(this.b.b,function(a,b){",
    "return a+L(b)},\"Predicates:\");a+=L(b)}return a};function db(a,b,c,d){",
    "this.i=a;this.I=b;this.A=c;this.ma=d}db.prototype.toString=function(){r",
    "eturn this.i};var eb={};function X(a,b,c,d){if(eb.hasOwnProperty(a))thr",
    "ow Error(\"Axis already created: \"+a);b=new db(a,b,c,!!d);return eb[a]",
    "=b}\nX(\"ancestor\",function(a,b){for(var c=new I;b=b.parentNode;)a.mat",
    "ches(b)&&c.unshift(b);return c},!0);X(\"ancestor-or-self\",function(a,b",
    "){var c=new I;do a.matches(b)&&c.unshift(b);while(b=b.parentNode);retur",
    "n c},!0);\nvar Xa=X(\"attribute\",function(a,b){var c=new I,d=a.getName",
    "();if(b=b.attributes)if(a instanceof J&&null===a.B||\"*\"==d)for(d=0;a=",
    "b[d];d++)c.add(a);else(a=b.getNamedItem(d))&&c.add(a);return c},!1),bb=",
    "X(\"child\",function(a,b,c,d,e){c=m(c)?c:null;d=m(d)?d:null;e=e||new I;",
    "for(b=b.firstChild;b;b=b.nextSibling)G(b,c,d)&&a.matches(b)&&e.add(b);r",
    "eturn e},!1,!0);X(\"descendant\",H,!1,!0);\nvar cb=X(\"descendant-or-se",
    "lf\",function(a,b,c,d){var e=new I;G(b,c,d)&&a.matches(b)&&e.add(b);ret",
    "urn H(a,b,c,d,e)},!1,!0),$a=X(\"following\",function(a,b,c,d){var e=new",
    " I;do for(var f=b;f=f.nextSibling;)G(f,c,d)&&a.matches(f)&&e.add(f),e=H",
    "(a,f,c,d,e);while(b=b.parentNode);return e},!1,!0);X(\"following-siblin",
    "g\",function(a,b){for(var c=new I;b=b.nextSibling;)a.matches(b)&&c.add(",
    "b);return c},!1);X(\"namespace\",function(){return new I},!1);\nvar fb=",
    "X(\"parent\",function(a,b){var c=new I;if(9==b.nodeType)return c;if(2==",
    "b.nodeType)return c.add(b.ownerElement),c;b=b.parentNode;a.matches(b)&&",
    "c.add(b);return c},!1),ab=X(\"preceding\",function(a,b,c,d){var e=new I",
    ",f=[];do f.unshift(b);while(b=b.parentNode);for(var g=1,l=f.length;g<l;",
    "g++){var y=[];for(b=f[g];b=b.previousSibling;)y.unshift(b);for(var Aa=0",
    ",Ab=y.length;Aa<Ab;Aa++)b=y[Aa],G(b,c,d)&&a.matches(b)&&e.add(b),e=H(a,",
    "b,c,d,e)}return e},!0,!0);\nX(\"preceding-sibling\",function(a,b){for(v",
    "ar c=new I;b=b.previousSibling;)a.matches(b)&&c.unshift(b);return c},!0",
    ");var gb=X(\"self\",function(a,b){var c=new I;a.matches(b)&&c.add(b);re",
    "turn c},!1);function hb(a){q.call(this,1);this.V=a;this.o=a.c();this.h=",
    "a.h}p(hb);hb.prototype.evaluate=function(a){return-M(this.V,a)};hb.prot",
    "otype.toString=function(){return\"Unary Expression: -\"+L(this.V)};func",
    "tion ib(a){q.call(this,4);this.L=a;Ja(this,v(this.L,function(a){return ",
    "a.c()}));Ka(this,v(this.L,function(a){return a.h}))}p(ib);ib.prototype.",
    "evaluate=function(a){var b=new I;t(this.L,function(c){c=c.evaluate(a);i",
    "f(!(c instanceof I))throw Error(\"Path expression must evaluate to Node",
    "Set.\");b=Ga(b,c)});return b};ib.prototype.toString=function(){return u",
    "(this.L,function(a,b){return a+L(b)},\"Union Expression:\")};function j",
    "b(a,b){this.a=a;this.ja=b}function kb(a){for(var b,c=[];;){Y(a,\"Missin",
    "g right hand side of binary expression.\");b=lb(a);var d=a.a.next();if(",
    "!d)break;var e=(d=Na[d]||null)&&d.$;if(!e){a.a.back();break}for(;c.leng",
    "th&&e<=c[c.length-1].$;)b=new P(c.pop(),c.pop(),b);c.push(b,d)}for(;c.l",
    "ength;)b=new P(c.pop(),c.pop(),b);return b}function Y(a,b){if(a.a.empty",
    "())throw Error(b);}function mb(a,b){a=a.a.next();if(a!=b)throw Error(\"",
    "Bad token, expected: \"+b+\" got: \"+a);}\nfunction nb(a){a=a.a.next();",
    "if(\")\"!=a)throw Error(\"Bad token: \"+a);}function ob(a){a=a.a.next()",
    ";if(2>a.length)throw Error(\"Unclosed literal string\");return new Ua(a",
    ")}\nfunction pb(a){var b=[];if(Za(E(a.a))){var c=a.a.next();var d=E(a.a",
    ");if(\"/\"==c&&(a.a.empty()||\".\"!=d&&\"..\"!=d&&\"@\"!=d&&\"*\"!=d&&!",
    "/(?![0-9])[\\w]/.test(d)))return new U;d=new U;Y(a,\"Missing next locat",
    "ion step.\");c=qb(a,c);b.push(c)}else{a:{c=E(a.a);d=c.charAt(0);switch(",
    "d){case \"$\":throw Error(\"Variable reference not allowed in HTML XPat",
    "h\");case \"(\":a.a.next();c=kb(a);Y(a,'unclosed \"(\"');mb(a,\")\");br",
    "eak;case '\"':case \"'\":c=ob(a);break;default:if(isNaN(+c))if(!Ta(c)&&",
    "/(?![0-9])[\\w]/.test(d)&&\"(\"==E(a.a,\n1)){c=a.a.next();c=Sa[c]||null",
    ";a.a.next();for(d=[];\")\"!=E(a.a);){Y(a,\"Missing function argument li",
    "st.\");d.push(kb(a));if(\",\"!=E(a.a))break;a.a.next()}Y(a,\"Unclosed f",
    "unction argument list.\");nb(a);c=new Qa(c,d)}else{c=null;break a}else ",
    "c=new Va(+a.a.next())}\"[\"==E(a.a)&&(d=new V(rb(a)),c=new Oa(c,d))}if(",
    "c)if(Za(E(a.a)))d=c;else return c;else c=qb(a,\"/\"),d=new Ya,b.push(c)",
    "}for(;Za(E(a.a));)c=a.a.next(),Y(a,\"Missing next location step.\"),c=q",
    "b(a,c),b.push(c);return new Wa(d,b)}\nfunction qb(a,b){if(\"/\"!=b&&\"/",
    "/\"!=b)throw Error('Step op should be \"/\" or \"//\"');if(\".\"==E(a.a",
    ")){var c=new W(gb,new J(\"node\"));a.a.next();return c}if(\"..\"==E(a.a",
    "))return c=new W(fb,new J(\"node\")),a.a.next(),c;if(\"@\"==E(a.a)){var",
    " d=Xa;a.a.next();Y(a,\"Missing attribute name\")}else if(\"::\"==E(a.a,",
    "1)){if(!/(?![0-9])[\\w]/.test(E(a.a).charAt(0)))throw Error(\"Bad token",
    ": \"+a.a.next());var e=a.a.next();d=eb[e]||null;if(!d)throw Error(\"No ",
    "axis with name: \"+e);a.a.next();Y(a,\"Missing node name\")}else d=bb;e",
    "=\nE(a.a);if(/(?![0-9])[\\w\\*]/.test(e.charAt(0)))if(\"(\"==E(a.a,1)){",
    "if(!Ta(e))throw Error(\"Invalid node type: \"+e);e=a.a.next();if(!Ta(e)",
    ")throw Error(\"Invalid type name: \"+e);mb(a,\"(\");Y(a,\"Bad nodetype",
    "\");var f=E(a.a).charAt(0),g=null;if('\"'==f||\"'\"==f)g=ob(a);Y(a,\"Ba",
    "d nodetype\");nb(a);e=new J(e,g)}else if(e=a.a.next(),f=e.indexOf(\":\"",
    "),-1==f)e=new T(e);else{var g=e.substring(0,f);if(\"*\"==g)var l=\"*\";",
    "else if(l=a.ja(g),!l)throw Error(\"Namespace prefix not declared: \"+g)",
    ";e=e.substr(f+1);e=new T(e,l)}else throw Error(\"Bad token: \"+\na.a.ne",
    "xt());a=new V(rb(a),d.A);return c||new W(d,e,a,\"//\"==b)}function rb(a",
    "){for(var b=[];\"[\"==E(a.a);){a.a.next();Y(a,\"Missing predicate expre",
    "ssion.\");var c=kb(a);b.push(c);Y(a,\"Unclosed predicate expression.\")",
    ";mb(a,\"]\")}return b}function lb(a){if(\"-\"==E(a.a))return a.a.next()",
    ",new hb(lb(a));var b=pb(a);if(\"|\"!=E(a.a))a=b;else{for(b=[b];\"|\"==a",
    ".a.next();)Y(a,\"Missing next union location path.\"),b.push(pb(a));a.a",
    ".back();a=new ib(b)}return a};function sb(a){switch(a.nodeType){case 1:",
    "return ha(tb,a);case 9:return sb(a.documentElement);case 11:case 10:cas",
    "e 6:case 12:return ub;default:return a.parentNode?sb(a.parentNode):ub}}",
    "function ub(){return null}function tb(a,b){if(a.prefix==b)return a.name",
    "spaceURI||\"http://www.w3.org/1999/xhtml\";var c=a.getAttributeNode(\"x",
    "mlns:\"+b);return c&&c.specified?c.value||null:a.parentNode&&9!=a.paren",
    "tNode.nodeType?tb(a.parentNode,b):null};function vb(a,b){if(!a.length)t",
    "hrow Error(\"Empty XPath expression.\");a=za(a);if(a.empty())throw Erro",
    "r(\"Invalid XPath expression.\");b?\"function\"==ba(b)||(b=ga(b.lookupN",
    "amespaceURI,b)):b=function(){return null};var c=kb(new jb(a,b));if(!a.e",
    "mpty())throw Error(\"Bad token: \"+a.next());this.evaluate=function(a,b",
    "){a=c.evaluate(new C(a));return new Z(a,b)}}\nfunction Z(a,b){if(0==b)i",
    "f(a instanceof I)b=4;else if(\"string\"==typeof a)b=2;else if(\"number",
    "\"==typeof a)b=1;else if(\"boolean\"==typeof a)b=3;else throw Error(\"U",
    "nexpected evaluation result.\");if(2!=b&&1!=b&&3!=b&&!(a instanceof I))",
    "throw Error(\"value could not be converted to the specified type\");thi",
    "s.resultType=b;switch(b){case 2:this.stringValue=a instanceof I?Ha(a):",
    "\"\"+a;break;case 1:this.numberValue=a instanceof I?+Ha(a):+a;break;cas",
    "e 3:this.booleanValue=a instanceof I?0<a.m():!!a;break;case 4:case 5:ca",
    "se 6:case 7:var c=\na.iterator();var d=[];for(var e=c.next();e;e=c.next",
    "())d.push(e);this.snapshotLength=a.m();this.invalidIteratorState=!1;bre",
    "ak;case 8:case 9:this.singleNodeValue=K(a);break;default:throw Error(\"",
    "Unknown XPathResult type.\");}var f=0;this.iterateNext=function(){if(4!",
    "=b&&5!=b)throw Error(\"iterateNext called with wrong result type\");ret",
    "urn f>=d.length?null:d[f++]};this.snapshotItem=function(a){if(6!=b&&7!=",
    "b)throw Error(\"snapshotItem called with wrong result type\");return a>",
    "=d.length||0>a?null:d[a]}}\nZ.ANY_TYPE=0;Z.NUMBER_TYPE=1;Z.STRING_TYPE=",
    "2;Z.BOOLEAN_TYPE=3;Z.UNORDERED_NODE_ITERATOR_TYPE=4;Z.ORDERED_NODE_ITER",
    "ATOR_TYPE=5;Z.UNORDERED_NODE_SNAPSHOT_TYPE=6;Z.ORDERED_NODE_SNAPSHOT_TY",
    "PE=7;Z.ANY_UNORDERED_NODE_TYPE=8;Z.FIRST_ORDERED_NODE_TYPE=9;function w",
    "b(a){this.lookupNamespaceURI=sb(a)}\naa(\"wgxpath.install\",function(a,",
    "b){a=a||k;var c=a.Document&&a.Document.prototype||a.document;if(!c.eval",
    "uate||b)a.XPathResult=Z,c.evaluate=function(a,b,c,g){return(new vb(a,c)",
    ").evaluate(b,g)},c.createExpression=function(a,b){return new vb(a,b)},c",
    ".createNSResolver=function(a){return new wb(a)}});function xb(a,b,c,d){",
    "this.top=a;this.right=b;this.bottom=c;this.left=d}h=xb.prototype;h.clon",
    "e=function(){return new xb(this.top,this.right,this.bottom,this.left)};",
    "h.toString=function(){return\"(\"+this.top+\"t, \"+this.right+\"r, \"+t",
    "his.bottom+\"b, \"+this.left+\"l)\"};h.contains=function(a){return this",
    "&&a?a instanceof xb?a.left>=this.left&&a.right<=this.right&&a.top>=this",
    ".top&&a.bottom<=this.bottom:a.x>=this.left&&a.x<=this.right&&a.y>=this.",
    "top&&a.y<=this.bottom:!1};\nh.expand=function(a,b,c,d){da(a)?(this.top-",
    "=a.top,this.right+=a.right,this.bottom+=a.bottom,this.left-=a.left):(th",
    "is.top-=a,this.right+=Number(b),this.bottom+=Number(c),this.left-=Numbe",
    "r(d));return this};h.ceil=function(){this.top=Math.ceil(this.top);this.",
    "right=Math.ceil(this.right);this.bottom=Math.ceil(this.bottom);this.lef",
    "t=Math.ceil(this.left);return this};\nh.floor=function(){this.top=Math.",
    "floor(this.top);this.right=Math.floor(this.right);this.bottom=Math.floo",
    "r(this.bottom);this.left=Math.floor(this.left);return this};h.round=fun",
    "ction(){this.top=Math.round(this.top);this.right=Math.round(this.right)",
    ";this.bottom=Math.round(this.bottom);this.left=Math.round(this.left);re",
    "turn this};h.translate=function(a,b){a instanceof x?(this.left+=a.x,thi",
    "s.right+=a.x,this.top+=a.y,this.bottom+=a.y):(this.left+=a,this.right+=",
    "a,n(b)&&(this.top+=b,this.bottom+=b));return this};\nh.scale=function(a",
    ",b){b=n(b)?b:a;this.left*=a;this.right*=a;this.top*=b;this.bottom*=b;re",
    "turn this};function yb(a,b,c,d){this.left=a;this.top=b;this.width=c;thi",
    "s.height=d}h=yb.prototype;h.clone=function(){return new yb(this.left,th",
    "is.top,this.width,this.height)};h.toString=function(){return\"(\"+this.",
    "left+\", \"+this.top+\" - \"+this.width+\"w x \"+this.height+\"h)\"};h.",
    "contains=function(a){return a instanceof x?a.x>=this.left&&a.x<=this.le",
    "ft+this.width&&a.y>=this.top&&a.y<=this.top+this.height:this.left<=a.le",
    "ft&&this.left+this.width>=a.left+a.width&&this.top<=a.top&&this.top+thi",
    "s.height>=a.top+a.height};\nh.ceil=function(){this.left=Math.ceil(this.",
    "left);this.top=Math.ceil(this.top);this.width=Math.ceil(this.width);thi",
    "s.height=Math.ceil(this.height);return this};h.floor=function(){this.le",
    "ft=Math.floor(this.left);this.top=Math.floor(this.top);this.width=Math.",
    "floor(this.width);this.height=Math.floor(this.height);return this};h.ro",
    "und=function(){this.left=Math.round(this.left);this.top=Math.round(this",
    ".top);this.width=Math.round(this.width);this.height=Math.round(this.hei",
    "ght);return this};\nh.translate=function(a,b){a instanceof x?(this.left",
    "+=a.x,this.top+=a.y):(this.left+=a,n(b)&&(this.top+=b));return this};h.",
    "scale=function(a,b){b=n(b)?b:a;this.left*=a;this.width*=a;this.top*=b;t",
    "his.height*=b;return this};function zb(a,b){var c=A(a);return c.default",
    "View&&c.defaultView.getComputedStyle&&(a=c.defaultView.getComputedStyle",
    "(a,null))?a[b]||a.getPropertyValue(b)||\"\":\"\"}function Bb(a){try{var",
    " b=a.getBoundingClientRect()}catch(c){return{left:0,top:0,right:0,botto",
    "m:0}}return b}\nfunction Cb(a){var b=A(a),c=new x(0,0);if(a==(b?A(b):do",
    "cument).documentElement)return c;a=Bb(a);var d=(b?new B(A(b)):r||(r=new",
    " B)).D,b=d.scrollingElement?d.scrollingElement:d.body||d.documentElemen",
    "t,d=d.parentWindow||d.defaultView,b=new x(d.pageXOffset||b.scrollLeft,d",
    ".pageYOffset||b.scrollTop);c.x=a.left+b.x;c.y=a.top+b.y;return c}functi",
    "on Db(a){if(1==a.nodeType)return a=Bb(a),new x(a.left,a.top);a=a.change",
    "dTouches?a.changedTouches[0]:a;return new x(a.clientX,a.clientY)};var E",
    "b=\"function\"===typeof ShadowRoot;function Fb(a,b){b=Cb(b);var c=Cb(a)",
    ";b=new x(b.x-c.x,b.y-c.y);var d=zb(a,\"borderLeftWidth\");var e=zb(a,\"",
    "borderRightWidth\");c=zb(a,\"borderTopWidth\");a=zb(a,\"borderBottomWid",
    "th\");a=new xb(parseFloat(c),parseFloat(e),parseFloat(a),parseFloat(d))",
    ";b.x-=a.left;b.y-=a.top;return b}\nfunction Gb(a,b,c){function d(a,b,c,",
    "d,e){d=new yb(c.x+d.left,c.y+d.top,d.width,d.height);c=[0,0];b=[b.width",
    ",b.height];var f=[d.left,d.top];d=[d.width,d.height];for(var g=0;2>g;g+",
    "+)if(d[g]>b[g])c[g]=e?f[g]+d[g]/2-b[g]/2:f[g];else{var l=f[g]-b[g]+d[g]",
    ";0<l?c[g]=l:0>f[g]&&(c[g]=f[g])}e=new x(c[0],c[1]);a.scrollLeft+=e.x;a.",
    "scrollTop+=e.y}function e(a){var b=a.parentNode;Eb&&b instanceof Shadow",
    "Root&&(b=a.host);return b}for(var f=A(a),g=e(a),l;g&&g!=f.documentEleme",
    "nt&&g!=f.body;)l=Fb(g,a),d(g,new z(g.clientWidth,\ng.clientHeight),l,b,",
    "c),g=e(g);l=Db(a);a=ya(a?new B(A(a)):r||(r=new B));f=ra()&&\"BackCompat",
    "\"!=f.compatMode?f.documentElement:f.body;d(f,a,l,b,c)};aa(\"_\",functi",
    "on(a,b,c){c||(c=new yb(0,0,a.offsetWidth,a.offsetHeight));Gb(a,c,b);a=D",
    "b(a);return new x(a.x+c.left,a.y+c.top)});; return this._.apply(null,ar",
    "guments);}.apply({navigator:typeof window!='undefined'?window.navigator",
    ":null,document:typeof window!='undefined'?window.document:null}, argume",
    "nts);}",
    NULL
};

const char* const GET_PAGE_ZOOM[] = {
    "function(){return function(){var aa=this;function h(a){return\"string\"",
    "==typeof a}function ba(a,b){a=a.split(\".\");var c=aa;a[0]in c||!c.exec",
    "Script||c.execScript(\"var \"+a[0]);for(var d;a.length&&(d=a.shift());)",
    "a.length||void 0===b?c=c[d]&&c[d]!==Object.prototype[d]?c[d]:c[d]={}:c[",
    "d]=b}\nfunction ca(a){var b=typeof a;if(\"object\"==b)if(a){if(a instan",
    "ceof Array)return\"array\";if(a instanceof Object)return b;var c=Object",
    ".prototype.toString.call(a);if(\"[object Window]\"==c)return\"object\";",
    "if(\"[object Array]\"==c||\"number\"==typeof a.length&&\"undefined\"!=t",
    "ypeof a.splice&&\"undefined\"!=typeof a.propertyIsEnumerable&&!a.proper",
    "tyIsEnumerable(\"splice\"))return\"array\";if(\"[object Function]\"==c|",
    "|\"undefined\"!=typeof a.call&&\"undefined\"!=typeof a.propertyIsEnumer",
    "able&&!a.propertyIsEnumerable(\"call\"))return\"function\"}else return",
    "\"null\";\nelse if(\"function\"==b&&\"undefined\"==typeof a.call)return",
    "\"object\";return b}function da(a,b,c){return a.call.apply(a.bind,argum",
    "ents)}function ea(a,b,c){if(!a)throw Error();if(2<arguments.length){var",
    " d=Array.prototype.slice.call(arguments,2);return function(){var c=Arra",
    "y.prototype.slice.call(arguments);Array.prototype.unshift.apply(c,d);re",
    "turn a.apply(b,c)}}return function(){return a.apply(b,arguments)}}\nfun",
    "ction fa(a,b,c){fa=Function.prototype.bind&&-1!=Function.prototype.bind",
    ".toString().indexOf(\"native code\")?da:ea;return fa.apply(null,argumen",
    "ts)}function ga(a,b){var c=Array.prototype.slice.call(arguments,1);retu",
    "rn function(){var b=c.slice();b.push.apply(b,arguments);return a.apply(",
    "this,b)}}\nfunction k(a){var b=m;function c(){}c.prototype=b.prototype;",
    "a.na=b.prototype;a.prototype=new c;a.prototype.constructor=a;a.ma=funct",
    "ion(a,c,f){for(var d=Array(arguments.length-2),e=2;e<arguments.length;e",
    "++)d[e-2]=arguments[e];return b.prototype[c].apply(a,d)}};function n(a,",
    "b){for(var c=a.length,d=h(a)?a.split(\"\"):a,e=0;e<c;e++)e in d&&b.call",
    "(void 0,d[e],e,a)}function p(a,b,c){var d=c;n(a,function(c,f){d=b.call(",
    "void 0,d,c,f,a)});return d}function q(a,b){for(var c=a.length,d=h(a)?a.",
    "split(\"\"):a,e=0;e<c;e++)if(e in d&&b.call(void 0,d[e],e,a))return!0;r",
    "eturn!1}function ha(a){return Array.prototype.concat.apply([],arguments",
    ")}function ia(a,b,c){return 2>=arguments.length?Array.prototype.slice.c",
    "all(a,b):Array.prototype.slice.call(a,b,c)};function ja(a,b){if(!a||!b)",
    "return!1;if(a.contains&&1==b.nodeType)return a==b||a.contains(b);if(\"u",
    "ndefined\"!=typeof a.compareDocumentPosition)return a==b||!!(a.compareD",
    "ocumentPosition(b)&16);for(;b&&a!=b;)b=b.parentNode;return b==a}\nfunct",
    "ion ka(a,b){if(a==b)return 0;if(a.compareDocumentPosition)return a.comp",
    "areDocumentPosition(b)&2?1:-1;if(\"sourceIndex\"in a||a.parentNode&&\"s",
    "ourceIndex\"in a.parentNode){var c=1==a.nodeType,d=1==b.nodeType;if(c&&",
    "d)return a.sourceIndex-b.sourceIndex;var e=a.parentNode,f=b.parentNode;",
    "return e==f?ma(a,b):!c&&ja(e,b)?-1*na(a,b):!d&&ja(f,a)?na(b,a):(c?a.sou",
    "rceIndex:e.sourceIndex)-(d?b.sourceIndex:f.sourceIndex)}d=9==a.nodeType",
    "?a:a.ownerDocument||a.document;c=d.createRange();c.selectNode(a);c.coll",
    "apse(!0);\na=d.createRange();a.selectNode(b);a.collapse(!0);return c.co",
    "mpareBoundaryPoints(aa.Range.START_TO_END,a)}function na(a,b){var c=a.p",
    "arentNode;if(c==b)return-1;for(;b.parentNode!=c;)b=b.parentNode;return ",
    "ma(b,a)}function ma(a,b){for(;b=b.previousSibling;)if(b==a)return-1;ret",
    "urn 1};/*\n\n The MIT License\n\n Copyright (c) 2007 Cybozu Labs, Inc.",
    "\n Copyright (c) 2012 Google Inc.\n\n Permission is hereby granted, fre",
    "e of charge, to any person obtaining a copy\n of this software and asso",
    "ciated documentation files (the \"Software\"), to\n deal in the Softwar",
    "e without restriction, including without limitation the\n rights to use",
    ", copy, modify, merge, publish, distribute, sublicense, and/or\n sell c",
    "opies of the Software, and to permit persons to whom the Software is\n ",
    "furnished to do so, subject to the following conditions:\n\n The above ",
    "copyright notice and this permission notice shall be included in\n all ",
    "copies or substantial portions of the Software.\n\n THE SOFTWARE IS PRO",
    "VIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, IN",
    "CLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS",
    " FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n ",
    "AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER",
    "\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARIS",
    "ING\n FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTH",
    "ER DEALINGS\n IN THE SOFTWARE.\n*/\nfunction r(a,b,c){this.l=a;this.ka=",
    "b||1;this.j=c||1};function t(a){this.S=a;this.I=0}function oa(a){a=a.ma",
    "tch(pa);for(var b=0;b<a.length;b++)qa.test(a[b])&&a.splice(b,1);return ",
    "new t(a)}var pa=/\\$?(?:(?![0-9-\\.])(?:\\*|[\\w-\\.]+):)?(?![0-9-\\.])",
    "(?:\\*|[\\w-\\.]+)|\\/\\/|\\.\\.|::|\\d+(?:\\.\\d*)?|\\.\\d+|\"[^\"]*\"",
    "|'[^']*'|[!<>]=|\\s+|./g,qa=/^\\s/;function u(a,b){return a.S[a.I+(b||0",
    ")]}t.prototype.next=function(){return this.S[this.I++]};t.prototype.bac",
    "k=function(){this.I--};t.prototype.empty=function(){return this.S.lengt",
    "h<=this.I};function v(a){var b=null,c=a.nodeType;1==c&&(b=a.textContent",
    ",b=void 0==b||null==b?a.innerText:b,b=void 0==b||null==b?\"\":b);if(\"s",
    "tring\"!=typeof b)if(9==c||1==c){a=9==c?a.documentElement:a.firstChild;",
    "for(var c=0,d=[],b=\"\";a;){do 1!=a.nodeType&&(b+=a.nodeValue),d[c++]=a",
    ";while(a=a.firstChild);for(;c&&!(a=d[--c].nextSibling););}}else b=a.nod",
    "eValue;return\"\"+b}\nfunction x(a,b,c){if(null===b)return!0;try{if(!a.",
    "getAttribute)return!1}catch(d){return!1}return null==c?!!a.getAttribute",
    "(b):a.getAttribute(b,2)==c}function y(a,b,c,d,e){return ra.call(null,a,",
    "b,h(c)?c:null,h(d)?d:null,e||new z)}\nfunction ra(a,b,c,d,e){b.getEleme",
    "ntsByName&&d&&\"name\"==c?(b=b.getElementsByName(d),n(b,function(b){a.m",
    "atches(b)&&e.add(b)})):b.getElementsByClassName&&d&&\"class\"==c?(b=b.g",
    "etElementsByClassName(d),n(b,function(b){b.className==d&&a.matches(b)&&",
    "e.add(b)})):a instanceof A?sa(a,b,c,d,e):b.getElementsByTagName&&(b=b.g",
    "etElementsByTagName(a.getName()),n(b,function(a){x(a,c,d)&&e.add(a)}));",
    "return e}function sa(a,b,c,d,e){for(b=b.firstChild;b;b=b.nextSibling)x(",
    "b,c,d)&&a.matches(b)&&e.add(b),sa(a,b,c,d,e)};function z(){this.j=this.",
    "g=null;this.D=0}function ta(a){this.node=a;this.next=this.w=null}functi",
    "on ua(a,b){if(!a.g)return b;if(!b.g)return a;var c=a.g;b=b.g;for(var d=",
    "null,e,f=0;c&&b;)c.node==b.node?(e=c,c=c.next,b=b.next):0<ka(c.node,b.n",
    "ode)?(e=b,b=b.next):(e=c,c=c.next),(e.w=d)?d.next=e:a.g=e,d=e,f++;for(e",
    "=c||b;e;)e.w=d,d=d.next=e,f++,e=e.next;a.j=d;a.D=f;return a}z.prototype",
    ".unshift=function(a){a=new ta(a);a.next=this.g;this.j?this.g.w=a:this.g",
    "=this.j=a;this.g=a;this.D++};\nz.prototype.add=function(a){a=new ta(a);",
    "a.w=this.j;this.g?this.j.next=a:this.g=this.j=a;this.j=a;this.D++};func",
    "tion B(a){return(a=a.g)?a.node:null}z.prototype.m=function(){return thi",
    "s.D};function C(a){return(a=B(a))?v(a):\"\"}z.prototype.iterator=functi",
    "on(a){return new va(this,!!a)};function va(a,b){this.ga=a;this.T=(this.",
    "A=b)?a.j:a.g;this.O=null}va.prototype.next=function(){var a=this.T;if(n",
    "ull==a)return null;var b=this.O=a;this.T=this.A?a.w:a.next;return b.nod",
    "e};\nva.prototype.remove=function(){var a=this.ga,b=this.O;if(!b)throw ",
    "Error(\"Next must be called at least once before remove.\");var c=b.w,b",
    "=b.next;c?c.next=b:a.g=b;b?b.w=c:a.j=c;a.D--;this.O=null};function m(a)",
    "{this.f=a;this.h=this.o=!1;this.F=null}function D(a){return\"\\n  \"+a.",
    "toString().split(\"\\n\").join(\"\\n  \")}m.prototype.c=function(){retu",
    "rn this.o};function wa(a,b){a.o=b}function xa(a,b){a.h=b}m.prototype.u=",
    "function(){return this.F};function E(a,b){a=a.evaluate(b);return a inst",
    "anceof z?+C(a):+a}function F(a,b){a=a.evaluate(b);return a instanceof z",
    "?C(a):\"\"+a}function G(a,b){a=a.evaluate(b);return a instanceof z?!!a.",
    "m():!!a};function H(a,b,c){m.call(this,a.f);this.R=a;this.W=b;this.aa=c",
    ";this.o=b.c()||c.c();this.h=b.h||c.h;this.R==ya&&(c.h||c.c()||4==c.f||0",
    "==c.f||!b.u()?b.h||b.c()||4==b.f||0==b.f||!c.u()||(this.F={name:c.u().n",
    "ame,C:b}):this.F={name:b.u().name,C:c})}k(H);\nfunction I(a,b,c,d,e){b=",
    "b.evaluate(d);c=c.evaluate(d);var f;if(b instanceof z&&c instanceof z){",
    "b=b.iterator();for(d=b.next();d;d=b.next())for(e=c.iterator(),f=e.next(",
    ");f;f=e.next())if(a(v(d),v(f)))return!0;return!1}if(b instanceof z||c i",
    "nstanceof z){b instanceof z?(e=b,d=c):(e=c,d=b);f=e.iterator();for(var ",
    "g=typeof d,l=f.next();l;l=f.next()){switch(g){case \"number\":l=+v(l);b",
    "reak;case \"boolean\":l=!!v(l);break;case \"string\":l=v(l);break;defau",
    "lt:throw Error(\"Illegal primitive type for comparison.\");\n}if(e==b&&",
    "a(l,d)||e==c&&a(d,l))return!0}return!1}return e?\"boolean\"==typeof b||",
    "\"boolean\"==typeof c?a(!!b,!!c):\"number\"==typeof b||\"number\"==type",
    "of c?a(+b,+c):a(b,c):a(+b,+c)}H.prototype.evaluate=function(a){return t",
    "his.R.v(this.W,this.aa,a)};H.prototype.toString=function(){var a=\"Bina",
    "ry Expression: \"+this.R,a=a+D(this.W);return a+=D(this.aa)};function z",
    "a(a,b,c,d){this.ja=a;this.Z=b;this.f=c;this.v=d}za.prototype.toString=f",
    "unction(){return this.ja};var Aa={};\nfunction J(a,b,c,d){if(Aa.hasOwnP",
    "roperty(a))throw Error(\"Binary operator already created: \"+a);a=new z",
    "a(a,b,c,d);return Aa[a.toString()]=a}J(\"div\",6,1,function(a,b,c){retu",
    "rn E(a,c)/E(b,c)});J(\"mod\",6,1,function(a,b,c){return E(a,c)%E(b,c)})",
    ";J(\"*\",6,1,function(a,b,c){return E(a,c)*E(b,c)});J(\"+\",5,1,functio",
    "n(a,b,c){return E(a,c)+E(b,c)});J(\"-\",5,1,function(a,b,c){return E(a,",
    "c)-E(b,c)});J(\"<\",4,2,function(a,b,c){return I(function(a,b){return a",
    "<b},a,b,c)});\nJ(\">\",4,2,function(a,b,c){return I(function(a,b){retur",
    "n a>b},a,b,c)});J(\"<=\",4,2,function(a,b,c){return I(function(a,b){ret",
    "urn a<=b},a,b,c)});J(\">=\",4,2,function(a,b,c){return I(function(a,b){",
    "return a>=b},a,b,c)});var ya=J(\"=\",3,2,function(a,b,c){return I(funct",
    "ion(a,b){return a==b},a,b,c,!0)});J(\"!=\",3,2,function(a,b,c){return I",
    "(function(a,b){return a!=b},a,b,c,!0)});J(\"and\",2,2,function(a,b,c){r",
    "eturn G(a,c)&&G(b,c)});J(\"or\",1,2,function(a,b,c){return G(a,c)||G(b,",
    "c)});function K(a,b){if(b.m()&&4!=a.f)throw Error(\"Primary expression ",
    "must evaluate to nodeset if filter has predicate(s).\");m.call(this,a.f",
    ");this.$=a;this.b=b;this.o=a.c();this.h=a.h}k(K);K.prototype.evaluate=f",
    "unction(a){a=this.$.evaluate(a);return Ba(this.b,a)};K.prototype.toStri",
    "ng=function(){var a=\"Filter:\"+D(this.$);return a+=D(this.b)};function",
    " L(a,b){if(b.length<a.Y)throw Error(\"Function \"+a.i+\" expects at lea",
    "st\"+a.Y+\" arguments, \"+b.length+\" given\");if(null!==a.P&&b.length>",
    "a.P)throw Error(\"Function \"+a.i+\" expects at most \"+a.P+\" argument",
    "s, \"+b.length+\" given\");a.ha&&n(b,function(b,d){if(4!=b.f)throw Erro",
    "r(\"Argument \"+d+\" to function \"+a.i+\" is not of type Nodeset: \"+b",
    ");});m.call(this,a.f);this.H=a;this.M=b;wa(this,a.o||q(b,function(a){re",
    "turn a.c()}));xa(this,a.fa&&!b.length||a.ea&&!!b.length||q(b,function(a",
    "){return a.h}))}k(L);\nL.prototype.evaluate=function(a){return this.H.v",
    ".apply(null,ha(a,this.M))};L.prototype.toString=function(){var a=\"Func",
    "tion: \"+this.H;if(this.M.length)var b=p(this.M,function(a,b){return a+",
    "D(b)},\"Arguments:\"),a=a+D(b);return a};function Ca(a,b,c,d,e,f,g,l,w)",
    "{this.i=a;this.f=b;this.o=c;this.fa=d;this.ea=e;this.v=f;this.Y=g;this.",
    "P=void 0!==l?l:g;this.ha=!!w}Ca.prototype.toString=function(){return th",
    "is.i};var Da={};\nfunction M(a,b,c,d,e,f,g,l){if(Da.hasOwnProperty(a))t",
    "hrow Error(\"Function already created: \"+a+\".\");Da[a]=new Ca(a,b,c,d",
    ",!1,e,f,g,l)}M(\"boolean\",2,!1,!1,function(a,b){return G(b,a)},1);M(\"",
    "ceiling\",1,!1,!1,function(a,b){return Math.ceil(E(b,a))},1);M(\"concat",
    "\",3,!1,!1,function(a,b){return p(ia(arguments,1),function(b,d){return ",
    "b+F(d,a)},\"\")},2,null);M(\"contains\",2,!1,!1,function(a,b,c){b=F(b,a",
    ");a=F(c,a);return-1!=b.indexOf(a)},2);M(\"count\",1,!1,!1,function(a,b)",
    "{return b.evaluate(a).m()},1,1,!0);\nM(\"false\",2,!1,!1,function(){ret",
    "urn!1},0);M(\"floor\",1,!1,!1,function(a,b){return Math.floor(E(b,a))},",
    "1);M(\"id\",4,!1,!1,function(a,b){var c=a.l,d=9==c.nodeType?c:c.ownerDo",
    "cument;a=F(b,a).split(/\\s+/);var e=[];n(a,function(a){a=d.getElementBy",
    "Id(a);var b;if(!(b=!a)){a:if(h(e))b=h(a)&&1==a.length?e.indexOf(a,0):-1",
    ";else{for(b=0;b<e.length;b++)if(b in e&&e[b]===a)break a;b=-1}b=0<=b}b|",
    "|e.push(a)});e.sort(ka);var f=new z;n(e,function(a){f.add(a)});return f",
    "},1);M(\"lang\",2,!1,!1,function(){return!1},1);\nM(\"last\",1,!0,!1,fu",
    "nction(a){if(1!=arguments.length)throw Error(\"Function last expects ()",
    "\");return a.j},0);M(\"local-name\",3,!1,!0,function(a,b){return(a=b?B(",
    "b.evaluate(a)):a.l)?a.localName||a.nodeName.toLowerCase():\"\"},0,1,!0)",
    ";M(\"name\",3,!1,!0,function(a,b){return(a=b?B(b.evaluate(a)):a.l)?a.no",
    "deName.toLowerCase():\"\"},0,1,!0);M(\"namespace-uri\",3,!0,!1,function",
    "(){return\"\"},0,1,!0);\nM(\"normalize-space\",3,!1,!0,function(a,b){re",
    "turn(b?F(b,a):v(a.l)).replace(/[\\s\\xa0]+/g,\" \").replace(/^\\s+|\\s+",
    "$/g,\"\")},0,1);M(\"not\",2,!1,!1,function(a,b){return!G(b,a)},1);M(\"n",
    "umber\",1,!1,!0,function(a,b){return b?E(b,a):+v(a.l)},0,1);M(\"positio",
    "n\",1,!0,!1,function(a){return a.ka},0);M(\"round\",1,!1,!1,function(a,",
    "b){return Math.round(E(b,a))},1);M(\"starts-with\",2,!1,!1,function(a,b",
    ",c){b=F(b,a);a=F(c,a);return 0==b.lastIndexOf(a,0)},2);M(\"string\",3,!",
    "1,!0,function(a,b){return b?F(b,a):v(a.l)},0,1);\nM(\"string-length\",1",
    ",!1,!0,function(a,b){return(b?F(b,a):v(a.l)).length},0,1);M(\"substring",
    "\",3,!1,!1,function(a,b,c,d){c=E(c,a);if(isNaN(c)||Infinity==c||-Infini",
    "ty==c)return\"\";d=d?E(d,a):Infinity;if(isNaN(d)||-Infinity===d)return",
    "\"\";c=Math.round(c)-1;var e=Math.max(c,0);a=F(b,a);return Infinity==d?",
    "a.substring(e):a.substring(e,c+Math.round(d))},2,3);M(\"substring-after",
    "\",3,!1,!1,function(a,b,c){b=F(b,a);a=F(c,a);c=b.indexOf(a);return-1==c",
    "?\"\":b.substring(c+a.length)},2);\nM(\"substring-before\",3,!1,!1,func",
    "tion(a,b,c){b=F(b,a);a=F(c,a);a=b.indexOf(a);return-1==a?\"\":b.substri",
    "ng(0,a)},2);M(\"sum\",1,!1,!1,function(a,b){a=b.evaluate(a).iterator();",
    "b=0;for(var c=a.next();c;c=a.next())b+=+v(c);return b},1,1,!0);M(\"tran",
    "slate\",3,!1,!1,function(a,b,c,d){b=F(b,a);c=F(c,a);var e=F(d,a);d={};f",
    "or(var f=0;f<c.length;f++)a=c.charAt(f),a in d||(d[a]=e.charAt(f));c=\"",
    "\";for(f=0;f<b.length;f++)a=b.charAt(f),c+=a in d?d[a]:a;return c},3);M",
    "(\"true\",2,!1,!1,function(){return!0},0);function A(a,b){this.ca=a;thi",
    "s.X=void 0!==b?b:null;this.B=null;switch(a){case \"comment\":this.B=8;b",
    "reak;case \"text\":this.B=3;break;case \"processing-instruction\":this.",
    "B=7;break;case \"node\":break;default:throw Error(\"Unexpected argument",
    "\");}}function Ea(a){return\"comment\"==a||\"text\"==a||\"processing-in",
    "struction\"==a||\"node\"==a}A.prototype.matches=function(a){return null",
    "===this.B||this.B==a.nodeType};A.prototype.getName=function(){return th",
    "is.ca};\nA.prototype.toString=function(){var a=\"Kind Test: \"+this.ca;",
    "null===this.X||(a+=D(this.X));return a};function N(a){m.call(this,3);th",
    "is.ba=a.substring(1,a.length-1)}k(N);N.prototype.evaluate=function(){re",
    "turn this.ba};N.prototype.toString=function(){return\"Literal: \"+this.",
    "ba};function O(a,b){this.i=a.toLowerCase();a=\"*\"==this.i?\"*\":\"http",
    "://www.w3.org/1999/xhtml\";this.J=b?b.toLowerCase():a}O.prototype.match",
    "es=function(a){var b=a.nodeType;if(1!=b&&2!=b)return!1;b=void 0!==a.loc",
    "alName?a.localName:a.nodeName;return\"*\"!=this.i&&this.i!=b.toLowerCas",
    "e()?!1:\"*\"==this.J?!0:this.J==(a.namespaceURI?a.namespaceURI.toLowerC",
    "ase():\"http://www.w3.org/1999/xhtml\")};O.prototype.getName=function()",
    "{return this.i};\nO.prototype.toString=function(){return\"Name Test: \"",
    "+(\"http://www.w3.org/1999/xhtml\"==this.J?\"\":this.J+\":\")+this.i};f",
    "unction P(a){m.call(this,1);this.da=a}k(P);P.prototype.evaluate=functio",
    "n(){return this.da};P.prototype.toString=function(){return\"Number: \"+",
    "this.da};function Q(a,b){m.call(this,a.f);this.V=a;this.G=b;this.o=a.c(",
    ");this.h=a.h;1==this.G.length&&(a=this.G[0],a.N||a.s!=Fa||(a=a.L,\"*\"!",
    "=a.getName()&&(this.F={name:a.getName(),C:null})))}k(Q);function R(){m.",
    "call(this,4)}k(R);R.prototype.evaluate=function(a){var b=new z;a=a.l;9=",
    "=a.nodeType?b.add(a):b.add(a.ownerDocument);return b};R.prototype.toStr",
    "ing=function(){return\"Root Helper Expression\"};function S(){m.call(th",
    "is,4)}k(S);S.prototype.evaluate=function(a){var b=new z;b.add(a.l);retu",
    "rn b};\nS.prototype.toString=function(){return\"Context Helper Expressi",
    "on\"};function Ga(a){return\"/\"==a||\"//\"==a}\nQ.prototype.evaluate=f",
    "unction(a){var b=this.V.evaluate(a);if(!(b instanceof z))throw Error(\"",
    "Filter expression must evaluate to nodeset.\");a=this.G;for(var c=0,d=a",
    ".length;c<d&&b.m();c++){var e=a[c],f=b.iterator(e.s.A);if(e.c()||e.s!=H",
    "a)if(e.c()||e.s!=Ia){var g=f.next();for(b=e.evaluate(new r(g));null!=(g",
    "=f.next());)g=e.evaluate(new r(g)),b=ua(b,g)}else g=f.next(),b=e.evalua",
    "te(new r(g));else{for(g=f.next();(b=f.next())&&(!g.contains||g.contains",
    "(b))&&b.compareDocumentPosition(g)&8;g=b);b=e.evaluate(new r(g))}}retur",
    "n b};\nQ.prototype.toString=function(){var a=\"Path Expression:\"+D(thi",
    "s.V);if(this.G.length){var b=p(this.G,function(a,b){return a+D(b)},\"St",
    "eps:\");a+=D(b)}return a};function T(a,b){this.b=a;this.A=!!b}function ",
    "Ba(a,b,c){for(c=c||0;c<a.b.length;c++)for(var d=a.b[c],e=b.iterator(),f",
    "=b.m(),g,l=0;g=e.next();l++){var w=a.A?f-l:l+1;g=d.evaluate(new r(g,w,f",
    "));if(\"number\"==typeof g)w=w==g;else if(\"string\"==typeof g||\"boole",
    "an\"==typeof g)w=!!g;else if(g instanceof z)w=0<g.m();else throw Error(",
    "\"Predicate.evaluate returned an unexpected type.\");w||e.remove()}retu",
    "rn b}T.prototype.u=function(){return 0<this.b.length?this.b[0].u():null",
    "};\nT.prototype.c=function(){for(var a=0;a<this.b.length;a++){var b=thi",
    "s.b[a];if(b.c()||1==b.f||0==b.f)return!0}return!1};T.prototype.m=functi",
    "on(){return this.b.length};T.prototype.toString=function(){return p(thi",
    "s.b,function(a,b){return a+D(b)},\"Predicates:\")};function U(a,b,c,d){",
    "m.call(this,4);this.s=a;this.L=b;this.b=c||new T([]);this.N=!!d;b=this.",
    "b.u();a.la&&b&&(this.F={name:b.name,C:b.C});this.o=this.b.c()}k(U);\nU.",
    "prototype.evaluate=function(a){var b=a.l,c=this.u(),d=null,e=null,f=0;c",
    "&&(d=c.name,e=c.C?F(c.C,a):null,f=1);if(this.N)if(this.c()||this.s!=Ja)",
    "if(b=(new U(Ka,new A(\"node\"))).evaluate(a).iterator(),c=b.next())for(",
    "a=this.v(c,d,e,f);null!=(c=b.next());)a=ua(a,this.v(c,d,e,f));else a=ne",
    "w z;else a=y(this.L,b,d,e),a=Ba(this.b,a,f);else a=this.v(a.l,d,e,f);re",
    "turn a};U.prototype.v=function(a,b,c,d){a=this.s.H(this.L,a,b,c);return",
    " a=Ba(this.b,a,d)};\nU.prototype.toString=function(){var a=\"Step:\"+D(",
    "\"Operator: \"+(this.N?\"//\":\"/\"));this.s.i&&(a+=D(\"Axis: \"+this.s",
    "));a+=D(this.L);if(this.b.m()){var b=p(this.b.b,function(a,b){return a+",
    "D(b)},\"Predicates:\");a+=D(b)}return a};function La(a,b,c,d){this.i=a;",
    "this.H=b;this.A=c;this.la=d}La.prototype.toString=function(){return thi",
    "s.i};var Ma={};function V(a,b,c,d){if(Ma.hasOwnProperty(a))throw Error(",
    "\"Axis already created: \"+a);b=new La(a,b,c,!!d);return Ma[a]=b}\nV(\"",
    "ancestor\",function(a,b){for(var c=new z;b=b.parentNode;)a.matches(b)&&",
    "c.unshift(b);return c},!0);V(\"ancestor-or-self\",function(a,b){var c=n",
    "ew z;do a.matches(b)&&c.unshift(b);while(b=b.parentNode);return c},!0);",
    "\nvar Fa=V(\"attribute\",function(a,b){var c=new z,d=a.getName();if(b=b",
    ".attributes)if(a instanceof A&&null===a.B||\"*\"==d)for(d=0;a=b[d];d++)",
    "c.add(a);else(a=b.getNamedItem(d))&&c.add(a);return c},!1),Ja=V(\"child",
    "\",function(a,b,c,d,e){c=h(c)?c:null;d=h(d)?d:null;e=e||new z;for(b=b.f",
    "irstChild;b;b=b.nextSibling)x(b,c,d)&&a.matches(b)&&e.add(b);return e},",
    "!1,!0);V(\"descendant\",y,!1,!0);\nvar Ka=V(\"descendant-or-self\",func",
    "tion(a,b,c,d){var e=new z;x(b,c,d)&&a.matches(b)&&e.add(b);return y(a,b",
    ",c,d,e)},!1,!0),Ha=V(\"following\",function(a,b,c,d){var e=new z;do for",
    "(var f=b;f=f.nextSibling;)x(f,c,d)&&a.matches(f)&&e.add(f),e=y(a,f,c,d,",
    "e);while(b=b.parentNode);return e},!1,!0);V(\"following-sibling\",funct",
    "ion(a,b){for(var c=new z;b=b.nextSibling;)a.matches(b)&&c.add(b);return",
    " c},!1);V(\"namespace\",function(){return new z},!1);\nvar Na=V(\"paren",
    "t\",function(a,b){var c=new z;if(9==b.nodeType)return c;if(2==b.nodeTyp",
    "e)return c.add(b.ownerElement),c;b=b.parentNode;a.matches(b)&&c.add(b);",
    "return c},!1),Ia=V(\"preceding\",function(a,b,c,d){var e=new z,f=[];do ",
    "f.unshift(b);while(b=b.parentNode);for(var g=1,l=f.length;g<l;g++){var ",
    "w=[];for(b=f[g];b=b.previousSibling;)w.unshift(b);for(var la=0,$a=w.len",
    "gth;la<$a;la++)b=w[la],x(b,c,d)&&a.matches(b)&&e.add(b),e=y(a,b,c,d,e)}",
    "return e},!0,!0);\nV(\"preceding-sibling\",function(a,b){for(var c=new ",
    "z;b=b.previousSibling;)a.matches(b)&&c.unshift(b);return c},!0);var Oa=",
    "V(\"self\",function(a,b){var c=new z;a.matches(b)&&c.add(b);return c},!",
    "1);function W(a){m.call(this,1);this.U=a;this.o=a.c();this.h=a.h}k(W);W",
    ".prototype.evaluate=function(a){return-E(this.U,a)};W.prototype.toStrin",
    "g=function(){return\"Unary Expression: -\"+D(this.U)};function X(a){m.c",
    "all(this,4);this.K=a;wa(this,q(this.K,function(a){return a.c()}));xa(th",
    "is,q(this.K,function(a){return a.h}))}k(X);X.prototype.evaluate=functio",
    "n(a){var b=new z;n(this.K,function(c){c=c.evaluate(a);if(!(c instanceof",
    " z))throw Error(\"Path expression must evaluate to NodeSet.\");b=ua(b,c",
    ")});return b};X.prototype.toString=function(){return p(this.K,function(",
    "a,b){return a+D(b)},\"Union Expression:\")};function Pa(a,b){this.a=a;t",
    "his.ia=b}function Qa(a){for(var b,c=[];;){Y(a,\"Missing right hand side",
    " of binary expression.\");b=Ra(a);var d=a.a.next();if(!d)break;var e=(d",
    "=Aa[d]||null)&&d.Z;if(!e){a.a.back();break}for(;c.length&&e<=c[c.length",
    "-1].Z;)b=new H(c.pop(),c.pop(),b);c.push(b,d)}for(;c.length;)b=new H(c.",
    "pop(),c.pop(),b);return b}function Y(a,b){if(a.a.empty())throw Error(b)",
    ";}function Sa(a,b){a=a.a.next();if(a!=b)throw Error(\"Bad token, expect",
    "ed: \"+b+\" got: \"+a);}\nfunction Ta(a){a=a.a.next();if(\")\"!=a)throw",
    " Error(\"Bad token: \"+a);}function Ua(a){a=a.a.next();if(2>a.length)th",
    "row Error(\"Unclosed literal string\");return new N(a)}\nfunction Va(a)",
    "{var b=[];if(Ga(u(a.a))){var c=a.a.next();var d=u(a.a);if(\"/\"==c&&(a.",
    "a.empty()||\".\"!=d&&\"..\"!=d&&\"@\"!=d&&\"*\"!=d&&!/(?![0-9])[\\w]/.t",
    "est(d)))return new R;d=new R;Y(a,\"Missing next location step.\");c=Wa(",
    "a,c);b.push(c)}else{a:{c=u(a.a);d=c.charAt(0);switch(d){case \"$\":thro",
    "w Error(\"Variable reference not allowed in HTML XPath\");case \"(\":a.",
    "a.next();c=Qa(a);Y(a,'unclosed \"(\"');Sa(a,\")\");break;case '\"':case",
    " \"'\":c=Ua(a);break;default:if(isNaN(+c))if(!Ea(c)&&/(?![0-9])[\\w]/.t",
    "est(d)&&\"(\"==u(a.a,\n1)){c=a.a.next();c=Da[c]||null;a.a.next();for(d=",
    "[];\")\"!=u(a.a);){Y(a,\"Missing function argument list.\");d.push(Qa(a",
    "));if(\",\"!=u(a.a))break;a.a.next()}Y(a,\"Unclosed function argument l",
    "ist.\");Ta(a);c=new L(c,d)}else{c=null;break a}else c=new P(+a.a.next()",
    ")}\"[\"==u(a.a)&&(d=new T(Xa(a)),c=new K(c,d))}if(c)if(Ga(u(a.a)))d=c;e",
    "lse return c;else c=Wa(a,\"/\"),d=new S,b.push(c)}for(;Ga(u(a.a));)c=a.",
    "a.next(),Y(a,\"Missing next location step.\"),c=Wa(a,c),b.push(c);retur",
    "n new Q(d,b)}\nfunction Wa(a,b){if(\"/\"!=b&&\"//\"!=b)throw Error('Ste",
    "p op should be \"/\" or \"//\"');if(\".\"==u(a.a)){var c=new U(Oa,new A",
    "(\"node\"));a.a.next();return c}if(\"..\"==u(a.a))return c=new U(Na,new",
    " A(\"node\")),a.a.next(),c;if(\"@\"==u(a.a)){var d=Fa;a.a.next();Y(a,\"",
    "Missing attribute name\")}else if(\"::\"==u(a.a,1)){if(!/(?![0-9])[\\w]",
    "/.test(u(a.a).charAt(0)))throw Error(\"Bad token: \"+a.a.next());var e=",
    "a.a.next();d=Ma[e]||null;if(!d)throw Error(\"No axis with name: \"+e);a",
    ".a.next();Y(a,\"Missing node name\")}else d=Ja;e=\nu(a.a);if(/(?![0-9])",
    "[\\w\\*]/.test(e.charAt(0)))if(\"(\"==u(a.a,1)){if(!Ea(e))throw Error(",
    "\"Invalid node type: \"+e);e=a.a.next();if(!Ea(e))throw Error(\"Invalid",
    " type name: \"+e);Sa(a,\"(\");Y(a,\"Bad nodetype\");var f=u(a.a).charAt",
    "(0),g=null;if('\"'==f||\"'\"==f)g=Ua(a);Y(a,\"Bad nodetype\");Ta(a);e=n",
    "ew A(e,g)}else if(e=a.a.next(),f=e.indexOf(\":\"),-1==f)e=new O(e);else",
    "{var g=e.substring(0,f);if(\"*\"==g)var l=\"*\";else if(l=a.ia(g),!l)th",
    "row Error(\"Namespace prefix not declared: \"+g);e=e.substr(f+1);e=new ",
    "O(e,l)}else throw Error(\"Bad token: \"+\na.a.next());a=new T(Xa(a),d.A",
    ");return c||new U(d,e,a,\"//\"==b)}function Xa(a){for(var b=[];\"[\"==u",
    "(a.a);){a.a.next();Y(a,\"Missing predicate expression.\");var c=Qa(a);b",
    ".push(c);Y(a,\"Unclosed predicate expression.\");Sa(a,\"]\")}return b}f",
    "unction Ra(a){if(\"-\"==u(a.a))return a.a.next(),new W(Ra(a));var b=Va(",
    "a);if(\"|\"!=u(a.a))a=b;else{for(b=[b];\"|\"==a.a.next();)Y(a,\"Missing",
    " next union location path.\"),b.push(Va(a));a.a.back();a=new X(b)}retur",
    "n a};function Ya(a){switch(a.nodeType){case 1:return ga(Za,a);case 9:re",
    "turn Ya(a.documentElement);case 11:case 10:case 6:case 12:return ab;def",
    "ault:return a.parentNode?Ya(a.parentNode):ab}}function ab(){return null",
    "}function Za(a,b){if(a.prefix==b)return a.namespaceURI||\"http://www.w3",
    ".org/1999/xhtml\";var c=a.getAttributeNode(\"xmlns:\"+b);return c&&c.sp",
    "ecified?c.value||null:a.parentNode&&9!=a.parentNode.nodeType?Za(a.paren",
    "tNode,b):null};function bb(a,b){if(!a.length)throw Error(\"Empty XPath ",
    "expression.\");a=oa(a);if(a.empty())throw Error(\"Invalid XPath express",
    "ion.\");b?\"function\"==ca(b)||(b=fa(b.lookupNamespaceURI,b)):b=functio",
    "n(){return null};var c=Qa(new Pa(a,b));if(!a.empty())throw Error(\"Bad ",
    "token: \"+a.next());this.evaluate=function(a,b){a=c.evaluate(new r(a));",
    "return new Z(a,b)}}\nfunction Z(a,b){if(0==b)if(a instanceof z)b=4;else",
    " if(\"string\"==typeof a)b=2;else if(\"number\"==typeof a)b=1;else if(",
    "\"boolean\"==typeof a)b=3;else throw Error(\"Unexpected evaluation resu",
    "lt.\");if(2!=b&&1!=b&&3!=b&&!(a instanceof z))throw Error(\"value could",
    " not be converted to the specified type\");this.resultType=b;switch(b){",
    "case 2:this.stringValue=a instanceof z?C(a):\"\"+a;break;case 1:this.nu",
    "mberValue=a instanceof z?+C(a):+a;break;case 3:this.booleanValue=a inst",
    "anceof z?0<a.m():!!a;break;case 4:case 5:case 6:case 7:var c=\na.iterat",
    "or();var d=[];for(var e=c.next();e;e=c.next())d.push(e);this.snapshotLe",
    "ngth=a.m();this.invalidIteratorState=!1;break;case 8:case 9:this.single",
    "NodeValue=B(a);break;default:throw Error(\"Unknown XPathResult type.\")",
    ";}var f=0;this.iterateNext=function(){if(4!=b&&5!=b)throw Error(\"itera",
    "teNext called with wrong result type\");return f>=d.length?null:d[f++]}",
    ";this.snapshotItem=function(a){if(6!=b&&7!=b)throw Error(\"snapshotItem",
    " called with wrong result type\");return a>=d.length||0>a?null:d[a]}}\n",
    "Z.ANY_TYPE=0;Z.NUMBER_TYPE=1;Z.STRING_TYPE=2;Z.BOOLEAN_TYPE=3;Z.UNORDER",
    "ED_NODE_ITERATOR_TYPE=4;Z.ORDERED_NODE_ITERATOR_TYPE=5;Z.UNORDERED_NODE",
    "_SNAPSHOT_TYPE=6;Z.ORDERED_NODE_SNAPSHOT_TYPE=7;Z.ANY_UNORDERED_NODE_TY",
    "PE=8;Z.FIRST_ORDERED_NODE_TYPE=9;function cb(a){this.lookupNamespaceURI",
    "=Ya(a)}\nba(\"wgxpath.install\",function(a,b){a=a||aa;var c=a.Document&",
    "&a.Document.prototype||a.document;if(!c.evaluate||b)a.XPathResult=Z,c.e",
    "valuate=function(a,b,c,g){return(new bb(a,c)).evaluate(b,g)},c.createEx",
    "pression=function(a,b){return new bb(a,b)},c.createNSResolver=function(",
    "a){return new cb(a)}});ba(\"_\",function(a){a=9==a.nodeType?a:a.ownerDo",
    "cument||a.document;var b=a.documentElement;return a.width/Math.max(b.cl",
    "ientWidth,b.offsetWidth,b.scrollWidth)});; return this._.apply(null,arg",
    "uments);}.apply({navigator:typeof window!='undefined'?window.navigator:",
    "null,document:typeof window!='undefined'?window.document:null}, argumen",
    "ts);}",
    NULL
};

const char* const IS_ELEMENT_CLICKABLE[] = {
    "function(){return function(){var aa=this;function h(a){return\"string\"",
    "==typeof a}function ba(a,b){a=a.split(\".\");var c=aa;a[0]in c||!c.exec",
    "Script||c.execScript(\"var \"+a[0]);for(var d;a.length&&(d=a.shift());)",
    "a.length||void 0===b?c=c[d]&&c[d]!==Object.prototype[d]?c[d]:c[d]={}:c[",
    "d]=b}\nfunction ca(a){var b=typeof a;if(\"object\"==b)if(a){if(a instan",
    "ceof Array)return\"array\";if(a instanceof Object)return b;var c=Object",
    ".prototype.toString.call(a);if(\"[object Window]\"==c)return\"object\";",
    "if(\"[object Array]\"==c||\"number\"==typeof a.length&&\"undefined\"!=t",
    "ypeof a.splice&&\"undefined\"!=typeof a.propertyIsEnumerable&&!a.proper",
    "tyIsEnumerable(\"splice\"))return\"array\";if(\"[object Function]\"==c|",
    "|\"undefined\"!=typeof a.call&&\"undefined\"!=typeof a.propertyIsEnumer",
    "able&&!a.propertyIsEnumerable(\"call\"))return\"function\"}else return",
    "\"null\";\nelse if(\"function\"==b&&\"undefined\"==typeof a.call)return",
    "\"object\";return b}function da(a,b,c){return a.call.apply(a.bind,argum",
    "ents)}function ea(a,b,c){if(!a)throw Error();if(2<arguments.length){var",
    " d=Array.prototype.slice.call(arguments,2);return function(){var c=Arra",
    "y.prototype.slice.call(arguments);Array.prototype.unshift.apply(c,d);re",
    "turn a.apply(b,c)}}return function(){return a.apply(b,arguments)}}\nfun",
    "ction fa(a,b,c){fa=Function.prototype.bind&&-1!=Function.prototype.bind",
    ".toString().indexOf(\"native code\")?da:ea;return fa.apply(null,argumen",
    "ts)}function ga(a,b){var c=Array.prototype.slice.call(arguments,1);retu",
    "rn function(){var b=c.slice();b.push.apply(b,arguments);return a.apply(",
    "this,b)}}\nfunction k(a){var b=m;function c(){}c.prototype=b.prototype;",
    "a.na=b.prototype;a.prototype=new c;a.prototype.constructor=a;a.ma=funct",
    "ion(a,c,f){for(var d=Array(arguments.length-2),e=2;e<arguments.length;e",
    "++)d[e-2]=arguments[e];return b.prototype[c].apply(a,d)}};function n(a,",
    "b){for(var c=a.length,d=h(a)?a.split(\"\"):a,e=0;e<c;e++)e in d&&b.call",
    "(void 0,d[e],e,a)}function p(a,b,c){var d=c;n(a,function(c,f){d=b.call(",
    "void 0,d,c,f,a)});return d}function q(a,b){for(var c=a.length,d=h(a)?a.",
    "split(\"\"):a,e=0;e<c;e++)if(e in d&&b.call(void 0,d[e],e,a))return!0;r",
    "eturn!1}function ha(a){return Array.prototype.concat.apply([],arguments",
    ")}function ia(a,b,c){return 2>=arguments.length?Array.prototype.slice.c",
    "all(a,b):Array.prototype.slice.call(a,b,c)};function ja(a,b){if(!a||!b)",
    "return!1;if(a.contains&&1==b.nodeType)return a==b||a.contains(b);if(\"u",
    "ndefined\"!=typeof a.compareDocumentPosition)return a==b||!!(a.compareD",
    "ocumentPosition(b)&16);for(;b&&a!=b;)b=b.parentNode;return b==a}\nfunct",
    "ion ka(a,b){if(a==b)return 0;if(a.compareDocumentPosition)return a.comp",
    "areDocumentPosition(b)&2?1:-1;if(\"sourceIndex\"in a||a.parentNode&&\"s",
    "ourceIndex\"in a.parentNode){var c=1==a.nodeType,d=1==b.nodeType;if(c&&",
    "d)return a.sourceIndex-b.sourceIndex;var e=a.parentNode,f=b.parentNode;",
    "return e==f?ma(a,b):!c&&ja(e,b)?-1*na(a,b):!d&&ja(f,a)?na(b,a):(c?a.sou",
    "rceIndex:e.sourceIndex)-(d?b.sourceIndex:f.sourceIndex)}d=9==a.nodeType",
    "?a:a.ownerDocument||a.document;c=d.createRange();c.selectNode(a);c.coll",
    "apse(!0);\na=d.createRange();a.selectNode(b);a.collapse(!0);return c.co",
    "mpareBoundaryPoints(aa.Range.START_TO_END,a)}function na(a,b){var c=a.p",
    "arentNode;if(c==b)return-1;for(;b.parentNode!=c;)b=b.parentNode;return ",
    "ma(b,a)}function ma(a,b){for(;b=b.previousSibling;)if(b==a)return-1;ret",
    "urn 1};/*\n\n The MIT License\n\n Copyright (c) 2007 Cybozu Labs, Inc.",
    "\n Copyright (c) 2012 Google Inc.\n\n Permission is hereby granted, fre",
    "e of charge, to any person obtaining a copy\n of this software and asso",
    "ciated documentation files (the \"Software\"), to\n deal in the Softwar",
    "e without restriction, including without limitation the\n rights to use",
    ", copy, modify, merge, publish, distribute, sublicense, and/or\n sell c",
    "opies of the Software, and to permit persons to whom the Software is\n ",
    "furnished to do so, subject to the following conditions:\n\n The above ",
    "copyright notice and this permission notice shall be included in\n all ",
    "copies or substantial portions of the Software.\n\n THE SOFTWARE IS PRO",
    "VIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, IN",
    "CLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS",
    " FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n ",
    "AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER",
    "\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARIS",
    "ING\n FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTH",
    "ER DEALINGS\n IN THE SOFTWARE.\n*/\nfunction r(a,b,c){this.l=a;this.ka=",
    "b||1;this.j=c||1};function t(a){this.S=a;this.I=0}function oa(a){a=a.ma",
    "tch(pa);for(var b=0;b<a.length;b++)qa.test(a[b])&&a.splice(b,1);return ",
    "new t(a)}var pa=/\\$?(?:(?![0-9-\\.])(?:\\*|[\\w-\\.]+):)?(?![0-9-\\.])",
    "(?:\\*|[\\w-\\.]+)|\\/\\/|\\.\\.|::|\\d+(?:\\.\\d*)?|\\.\\d+|\"[^\"]*\"",
    "|'[^']*'|[!<>]=|\\s+|./g,qa=/^\\s/;function u(a,b){return a.S[a.I+(b||0",
    ")]}t.prototype.next=function(){return this.S[this.I++]};t.prototype.bac",
    "k=function(){this.I--};t.prototype.empty=function(){return this.S.lengt",
    "h<=this.I};function v(a){var b=null,c=a.nodeType;1==c&&(b=a.textContent",
    ",b=void 0==b||null==b?a.innerText:b,b=void 0==b||null==b?\"\":b);if(\"s",
    "tring\"!=typeof b)if(9==c||1==c){a=9==c?a.documentElement:a.firstChild;",
    "for(var c=0,d=[],b=\"\";a;){do 1!=a.nodeType&&(b+=a.nodeValue),d[c++]=a",
    ";while(a=a.firstChild);for(;c&&!(a=d[--c].nextSibling););}}else b=a.nod",
    "eValue;return\"\"+b}\nfunction x(a,b,c){if(null===b)return!0;try{if(!a.",
    "getAttribute)return!1}catch(d){return!1}return null==c?!!a.getAttribute",
    "(b):a.getAttribute(b,2)==c}function y(a,b,c,d,e){return ra.call(null,a,",
    "b,h(c)?c:null,h(d)?d:null,e||new z)}\nfunction ra(a,b,c,d,e){b.getEleme",
    "ntsByName&&d&&\"name\"==c?(b=b.getElementsByName(d),n(b,function(b){a.m",
    "atches(b)&&e.add(b)})):b.getElementsByClassName&&d&&\"class\"==c?(b=b.g",
    "etElementsByClassName(d),n(b,function(b){b.className==d&&a.matches(b)&&",
    "e.add(b)})):a instanceof A?sa(a,b,c,d,e):b.getElementsByTagName&&(b=b.g",
    "etElementsByTagName(a.getName()),n(b,function(a){x(a,c,d)&&e.add(a)}));",
    "return e}function sa(a,b,c,d,e){for(b=b.firstChild;b;b=b.nextSibling)x(",
    "b,c,d)&&a.matches(b)&&e.add(b),sa(a,b,c,d,e)};function z(){this.j=this.",
    "g=null;this.D=0}function ta(a){this.node=a;this.next=this.w=null}functi",
    "on ua(a,b){if(!a.g)return b;if(!b.g)return a;var c=a.g;b=b.g;for(var d=",
    "null,e,f=0;c&&b;)c.node==b.node?(e=c,c=c.next,b=b.next):0<ka(c.node,b.n",
    "ode)?(e=b,b=b.next):(e=c,c=c.next),(e.w=d)?d.next=e:a.g=e,d=e,f++;for(e",
    "=c||b;e;)e.w=d,d=d.next=e,f++,e=e.next;a.j=d;a.D=f;return a}z.prototype",
    ".unshift=function(a){a=new ta(a);a.next=this.g;this.j?this.g.w=a:this.g",
    "=this.j=a;this.g=a;this.D++};\nz.prototype.add=function(a){a=new ta(a);",
    "a.w=this.j;this.g?this.j.next=a:this.g=this.j=a;this.j=a;this.D++};func",
    "tion B(a){return(a=a.g)?a.node:null}z.prototype.m=function(){return thi",
    "s.D};function C(a){return(a=B(a))?v(a):\"\"}z.prototype.iterator=functi",
    "on(a){return new va(this,!!a)};function va(a,b){this.ga=a;this.T=(this.",
    "A=b)?a.j:a.g;this.O=null}va.prototype.next=function(){var a=this.T;if(n",
    "ull==a)return null;var b=this.O=a;this.T=this.A?a.w:a.next;return b.nod",
    "e};\nva.prototype.remove=function(){var a=this.ga,b=this.O;if(!b)throw ",
    "Error(\"Next must be called at least once before remove.\");var c=b.w,b",
    "=b.next;c?c.next=b:a.g=b;b?b.w=c:a.j=c;a.D--;this.O=null};function m(a)",
    "{this.f=a;this.h=this.o=!1;this.F=null}function D(a){return\"\\n  \"+a.",
    "toString().split(\"\\n\").join(\"\\n  \")}m.prototype.c=function(){retu",
    "rn this.o};function wa(a,b){a.o=b}function xa(a,b){a.h=b}m.prototype.u=",
    "function(){return this.F};function E(a,b){a=a.evaluate(b);return a inst",
    "anceof z?+C(a):+a}function F(a,b){a=a.evaluate(b);return a instanceof z",
    "?C(a):\"\"+a}function G(a,b){a=a.evaluate(b);return a instanceof z?!!a.",
    "m():!!a};function H(a,b,c){m.call(this,a.f);this.R=a;this.W=b;this.aa=c",
    ";this.o=b.c()||c.c();this.h=b.h||c.h;this.R==ya&&(c.h||c.c()||4==c.f||0",
    "==c.f||!b.u()?b.h||b.c()||4==b.f||0==b.f||!c.u()||(this.F={name:c.u().n",
    "ame,C:b}):this.F={name:b.u().name,C:c})}k(H);\nfunction I(a,b,c,d,e){b=",
    "b.evaluate(d);c=c.evaluate(d);var f;if(b instanceof z&&c instanceof z){",
    "b=b.iterator();for(d=b.next();d;d=b.next())for(e=c.iterator(),f=e.next(",
    ");f;f=e.next())if(a(v(d),v(f)))return!0;return!1}if(b instanceof z||c i",
    "nstanceof z){b instanceof z?(e=b,d=c):(e=c,d=b);f=e.iterator();for(var ",
    "g=typeof d,l=f.next();l;l=f.next()){switch(g){case \"number\":l=+v(l);b",
    "reak;case \"boolean\":l=!!v(l);break;case \"string\":l=v(l);break;defau",
    "lt:throw Error(\"Illegal primitive type for comparison.\");\n}if(e==b&&",
    "a(l,d)||e==c&&a(d,l))return!0}return!1}return e?\"boolean\"==typeof b||",
    "\"boolean\"==typeof c?a(!!b,!!c):\"number\"==typeof b||\"number\"==type",
    "of c?a(+b,+c):a(b,c):a(+b,+c)}H.prototype.evaluate=function(a){return t",
    "his.R.v(this.W,this.aa,a)};H.prototype.toString=function(){var a=\"Bina",
    "ry Expression: \"+this.R,a=a+D(this.W);return a+=D(this.aa)};function z",
    "a(a,b,c,d){this.ja=a;this.Z=b;this.f=c;this.v=d}za.prototype.toString=f",
    "unction(){return this.ja};var Aa={};\nfunction J(a,b,c,d){if(Aa.hasOwnP",
    "roperty(a))throw Error(\"Binary operator already created: \"+a);a=new z",
    "a(a,b,c,d);return Aa[a.toString()]=a}J(\"div\",6,1,function(a,b,c){retu",
    "rn E(a,c)/E(b,c)});J(\"mod\",6,1,function(a,b,c){return E(a,c)%E(b,c)})",
    ";J(\"*\",6,1,function(a,b,c){return E(a,c)*E(b,c)});J(\"+\",5,1,functio",
    "n(a,b,c){return E(a,c)+E(b,c)});J(\"-\",5,1,function(a,b,c){return E(a,",
    "c)-E(b,c)});J(\"<\",4,2,function(a,b,c){return I(function(a,b){return a",
    "<b},a,b,c)});\nJ(\">\",4,2,function(a,b,c){return I(function(a,b){retur",
    "n a>b},a,b,c)});J(\"<=\",4,2,function(a,b,c){return I(function(a,b){ret",
    "urn a<=b},a,b,c)});J(\">=\",4,2,function(a,b,c){return I(function(a,b){",
    "return a>=b},a,b,c)});var ya=J(\"=\",3,2,function(a,b,c){return I(funct",
    "ion(a,b){return a==b},a,b,c,!0)});J(\"!=\",3,2,function(a,b,c){return I",
    "(function(a,b){return a!=b},a,b,c,!0)});J(\"and\",2,2,function(a,b,c){r",
    "eturn G(a,c)&&G(b,c)});J(\"or\",1,2,function(a,b,c){return G(a,c)||G(b,",
    "c)});function K(a,b){if(b.m()&&4!=a.f)throw Error(\"Primary expression ",
    "must evaluate to nodeset if filter has predicate(s).\");m.call(this,a.f",
    ");this.$=a;this.b=b;this.o=a.c();this.h=a.h}k(K);K.prototype.evaluate=f",
    "unction(a){a=this.$.evaluate(a);return Ba(this.b,a)};K.prototype.toStri",
    "ng=function(){var a=\"Filter:\"+D(this.$);return a+=D(this.b)};function",
    " L(a,b){if(b.length<a.Y)throw Error(\"Function \"+a.i+\" expects at lea",
    "st\"+a.Y+\" arguments, \"+b.length+\" given\");if(null!==a.P&&b.length>",
    "a.P)throw Error(\"Function \"+a.i+\" expects at most \"+a.P+\" argument",
    "s, \"+b.length+\" given\");a.ha&&n(b,function(b,d){if(4!=b.f)throw Erro",
    "r(\"Argument \"+d+\" to function \"+a.i+\" is not of type Nodeset: \"+b",
    ");});m.call(this,a.f);this.H=a;this.M=b;wa(this,a.o||q(b,function(a){re",
    "turn a.c()}));xa(this,a.fa&&!b.length||a.ea&&!!b.length||q(b,function(a",
    "){return a.h}))}k(L);\nL.prototype.evaluate=function(a){return this.H.v",
    ".apply(null,ha(a,this.M))};L.prototype.toString=function(){var a=\"Func",
    "tion: \"+this.H;if(this.M.length)var b=p(this.M,function(a,b){return a+",
    "D(b)},\"Arguments:\"),a=a+D(b);return a};function Ca(a,b,c,d,e,f,g,l,w)",
    "{this.i=a;this.f=b;this.o=c;this.fa=d;this.ea=e;this.v=f;this.Y=g;this.",
    "P=void 0!==l?l:g;this.ha=!!w}Ca.prototype.toString=function(){return th",
    "is.i};var Da={};\nfunction M(a,b,c,d,e,f,g,l){if(Da.hasOwnProperty(a))t",
    "hrow Error(\"Function already created: \"+a+\".\");Da[a]=new Ca(a,b,c,d",
    ",!1,e,f,g,l)}M(\"boolean\",2,!1,!1,function(a,b){return G(b,a)},1);M(\"",
    "ceiling\",1,!1,!1,function(a,b){return Math.ceil(E(b,a))},1);M(\"concat",
    "\",3,!1,!1,function(a,b){return p(ia(arguments,1),function(b,d){return ",
    "b+F(d,a)},\"\")},2,null);M(\"contains\",2,!1,!1,function(a,b,c){b=F(b,a",
    ");a=F(c,a);return-1!=b.indexOf(a)},2);M(\"count\",1,!1,!1,function(a,b)",
    "{return b.evaluate(a).m()},1,1,!0);\nM(\"false\",2,!1,!1,function(){ret",
    "urn!1},0);M(\"floor\",1,!1,!1,function(a,b){return Math.floor(E(b,a))},",
    "1);M(\"id\",4,!1,!1,function(a,b){var c=a.l,d=9==c.nodeType?c:c.ownerDo",
    "cument;a=F(b,a).split(/\\s+/);var e=[];n(a,function(a){a=d.getElementBy",
    "Id(a);var b;if(!(b=!a)){a:if(h(e))b=h(a)&&1==a.length?e.indexOf(a,0):-1",
    ";else{for(b=0;b<e.length;b++)if(b in e&&e[b]===a)break a;b=-1}b=0<=b}b|",
    "|e.push(a)});e.sort(ka);var f=new z;n(e,function(a){f.add(a)});return f",
    "},1);M(\"lang\",2,!1,!1,function(){return!1},1);\nM(\"last\",1,!0,!1,fu",
    "nction(a){if(1!=arguments.length)throw Error(\"Function last expects ()",
    "\");return a.j},0);M(\"local-name\",3,!1,!0,function(a,b){return(a=b?B(",
    "b.evaluate(a)):a.l)?a.localName||a.nodeName.toLowerCase():\"\"},0,1,!0)",
    ";M(\"name\",3,!1,!0,function(a,b){return(a=b?B(b.evaluate(a)):a.l)?a.no",
    "deName.toLowerCase():\"\"},0,1,!0);M(\"namespace-uri\",3,!0,!1,function",
    "(){return\"\"},0,1,!0);\nM(\"normalize-space\",3,!1,!0,function(a,b){re",
    "turn(b?F(b,a):v(a.l)).replace(/[\\s\\xa0]+/g,\" \").replace(/^\\s+|\\s+",
    "$/g,\"\")},0,1);M(\"not\",2,!1,!1,function(a,b){return!G(b,a)},1);M(\"n",
    "umber\",1,!1,!0,function(a,b){return b?E(b,a):+v(a.l)},0,1);M(\"positio",
    "n\",1,!0,!1,function(a){return a.ka},0);M(\"round\",1,!1,!1,function(a,",
    "b){return Math.round(E(b,a))},1);M(\"starts-with\",2,!1,!1,function(a,b",
    ",c){b=F(b,a);a=F(c,a);return 0==b.lastIndexOf(a,0)},2);M(\"string\",3,!",
    "1,!0,function(a,b){return b?F(b,a):v(a.l)},0,1);\nM(\"string-length\",1",
    ",!1,!0,function(a,b){return(b?F(b,a):v(a.l)).length},0,1);M(\"substring",
    "\",3,!1,!1,function(a,b,c,d){c=E(c,a);if(isNaN(c)||Infinity==c||-Infini",
    "ty==c)return\"\";d=d?E(d,a):Infinity;if(isNaN(d)||-Infinity===d)return",
    "\"\";c=Math.round(c)-1;var e=Math.max(c,0);a=F(b,a);return Infinity==d?",
    "a.substring(e):a.substring(e,c+Math.round(d))},2,3);M(\"substring-after",
    "\",3,!1,!1,function(a,b,c){b=F(b,a);a=F(c,a);c=b.indexOf(a);return-1==c",
    "?\"\":b.substring(c+a.length)},2);\nM(\"substring-before\",3,!1,!1,func",
    "tion(a,b,c){b=F(b,a);a=F(c,a);a=b.indexOf(a);return-1==a?\"\":b.substri",
    "ng(0,a)},2);M(\"sum\",1,!1,!1,function(a,b){a=b.evaluate(a).iterator();",
    "b=0;for(var c=a.next();c;c=a.next())b+=+v(c);return b},1,1,!0);M(\"tran",
    "slate\",3,!1,!1,function(a,b,c,d){b=F(b,a);c=F(c,a);var e=F(d,a);d={};f",
    "or(var f=0;f<c.length;f++)a=c.charAt(f),a in d||(d[a]=e.charAt(f));c=\"",
    "\";for(f=0;f<b.length;f++)a=b.charAt(f),c+=a in d?d[a]:a;return c},3);M",
    "(\"true\",2,!1,!1,function(){return!0},0);function A(a,b){this.ca=a;thi",
    "s.X=void 0!==b?b:null;this.B=null;switch(a){case \"comment\":this.B=8;b",
    "reak;case \"text\":this.B=3;break;case \"processing-instruction\":this.",
    "B=7;break;case \"node\":break;default:throw Error(\"Unexpected argument",
    "\");}}function Ea(a){return\"comment\"==a||\"text\"==a||\"processing-in",
    "struction\"==a||\"node\"==a}A.prototype.matches=function(a){return null",
    "===this.B||this.B==a.nodeType};A.prototype.getName=function(){return th",
    "is.ca};\nA.prototype.toString=function(){var a=\"Kind Test: \"+this.ca;",
    "null===this.X||(a+=D(this.X));return a};function N(a){m.call(this,3);th",
    "is.ba=a.substring(1,a.length-1)}k(N);N.prototype.evaluate=function(){re",
    "turn this.ba};N.prototype.toString=function(){return\"Literal: \"+this.",
    "ba};function O(a,b){this.i=a.toLowerCase();a=\"*\"==this.i?\"*\":\"http",
    "://www.w3.org/1999/xhtml\";this.J=b?b.toLowerCase():a}O.prototype.match",
    "es=function(a){var b=a.nodeType;if(1!=b&&2!=b)return!1;b=void 0!==a.loc",
    "alName?a.localName:a.nodeName;return\"*\"!=this.i&&this.i!=b.toLowerCas",
    "e()?!1:\"*\"==this.J?!0:this.J==(a.namespaceURI?a.namespaceURI.toLowerC",
    "ase():\"http://www.w3.org/1999/xhtml\")};O.prototype.getName=function()",
    "{return this.i};\nO.prototype.toString=function(){return\"Name Test: \"",
    "+(\"http://www.w3.org/1999/xhtml\"==this.J?\"\":this.J+\":\")+this.i};f",
    "unction P(a){m.call(this,1);this.da=a}k(P);P.prototype.evaluate=functio",
    "n(){return this.da};P.prototype.toString=function(){return\"Number: \"+",
    "this.da};function Q(a,b){m.call(this,a.f);this.V=a;this.G=b;this.o=a.c(",
    ");this.h=a.h;1==this.G.length&&(a=this.G[0],a.N||a.s!=Fa||(a=a.L,\"*\"!",
    "=a.getName()&&(this.F={name:a.getName(),C:null})))}k(Q);function R(){m.",
    "call(this,4)}k(R);R.prototype.evaluate=function(a){var b=new z;a=a.l;9=",
    "=a.nodeType?b.add(a):b.add(a.ownerDocument);return b};R.prototype.toStr",
    "ing=function(){return\"Root Helper Expression\"};function S(){m.call(th",
    "is,4)}k(S);S.prototype.evaluate=function(a){var b=new z;b.add(a.l);retu",
    "rn b};\nS.prototype.toString=function(){return\"Context Helper Expressi",
    "on\"};function Ga(a){return\"/\"==a||\"//\"==a}\nQ.prototype.evaluate=f",
    "unction(a){var b=this.V.evaluate(a);if(!(b instanceof z))throw Error(\"",
    "Filter expression must evaluate to nodeset.\");a=this.G;for(var c=0,d=a",
    ".length;c<d&&b.m();c++){var e=a[c],f=b.iterator(e.s.A);if(e.c()||e.s!=H",
    "a)if(e.c()||e.s!=Ia){var g=f.next();for(b=e.evaluate(new r(g));null!=(g",
    "=f.next());)g=e.evaluate(new r(g)),b=ua(b,g)}else g=f.next(),b=e.evalua",
    "te(new r(g));else{for(g=f.next();(b=f.next())&&(!g.contains||g.contains",
    "(b))&&b.compareDocumentPosition(g)&8;g=b);b=e.evaluate(new r(g))}}retur",
    "n b};\nQ.prototype.toString=function(){var a=\"Path Expression:\"+D(thi",
    "s.V);if(this.G.length){var b=p(this.G,function(a,b){return a+D(b)},\"St",
    "eps:\");a+=D(b)}return a};function T(a,b){this.b=a;this.A=!!b}function ",
    "Ba(a,b,c){for(c=c||0;c<a.b.length;c++)for(var d=a.b[c],e=b.iterator(),f",
    "=b.m(),g,l=0;g=e.next();l++){var w=a.A?f-l:l+1;g=d.evaluate(new r(g,w,f",
    "));if(\"number\"==typeof g)w=w==g;else if(\"string\"==typeof g||\"boole",
    "an\"==typeof g)w=!!g;else if(g instanceof z)w=0<g.m();else throw Error(",
    "\"Predicate.evaluate returned an unexpected type.\");w||e.remove()}retu",
    "rn b}T.prototype.u=function(){return 0<this.b.length?this.b[0].u():null",
    "};\nT.prototype.c=function(){for(var a=0;a<this.b.length;a++){var b=thi",
    "s.b[a];if(b.c()||1==b.f||0==b.f)return!0}return!1};T.prototype.m=functi",
    "on(){return this.b.length};T.prototype.toString=function(){return p(thi",
    "s.b,function(a,b){return a+D(b)},\"Predicates:\")};function U(a,b,c,d){",
    "m.call(this,4);this.s=a;this.L=b;this.b=c||new T([]);this.N=!!d;b=this.",
    "b.u();a.la&&b&&(this.F={name:b.name,C:b.C});this.o=this.b.c()}k(U);\nU.",
    "prototype.evaluate=function(a){var b=a.l,c=this.u(),d=null,e=null,f=0;c",
    "&&(d=c.name,e=c.C?F(c.C,a):null,f=1);if(this.N)if(this.c()||this.s!=Ja)",
    "if(b=(new U(Ka,new A(\"node\"))).evaluate(a).iterator(),c=b.next())for(",
    "a=this.v(c,d,e,f);null!=(c=b.next());)a=ua(a,this.v(c,d,e,f));else a=ne",
    "w z;else a=y(this.L,b,d,e),a=Ba(this.b,a,f);else a=this.v(a.l,d,e,f);re",
    "turn a};U.prototype.v=function(a,b,c,d){a=this.s.H(this.L,a,b,c);return",
    " a=Ba(this.b,a,d)};\nU.prototype.toString=function(){var a=\"Step:\"+D(",
    "\"Operator: \"+(this.N?\"//\":\"/\"));this.s.i&&(a+=D(\"Axis: \"+this.s",
    "));a+=D(this.L);if(this.b.m()){var b=p(this.b.b,function(a,b){return a+",
    "D(b)},\"Predicates:\");a+=D(b)}return a};function La(a,b,c,d){this.i=a;",
    "this.H=b;this.A=c;this.la=d}La.prototype.toString=function(){return thi",
    "s.i};var Ma={};function V(a,b,c,d){if(Ma.hasOwnProperty(a))throw Error(",
    "\"Axis already created: \"+a);b=new La(a,b,c,!!d);return Ma[a]=b}\nV(\"",
    "ancestor\",function(a,b){for(var c=new z;b=b.parentNode;)a.matches(b)&&",
    "c.unshift(b);return c},!0);V(\"ancestor-or-self\",function(a,b){var c=n",
    "ew z;do a.matches(b)&&c.unshift(b);while(b=b.parentNode);return c},!0);",
    "\nvar Fa=V(\"attribute\",function(a,b){var c=new z,d=a.getName();if(b=b",
    ".attributes)if(a instanceof A&&null===a.B||\"*\"==d)for(d=0;a=b[d];d++)",
    "c.add(a);else(a=b.getNamedItem(d))&&c.add(a);return c},!1),Ja=V(\"child",
    "\",function(a,b,c,d,e){c=h(c)?c:null;d=h(d)?d:null;e=e||new z;for(b=b.f",
    "irstChild;b;b=b.nextSibling)x(b,c,d)&&a.matches(b)&&e.add(b);return e},",
    "!1,!0);V(\"descendant\",y,!1,!0);\nvar Ka=V(\"descendant-or-self\",func",
    "tion(a,b,c,d){var e=new z;x(b,c,d)&&a.matches(b)&&e.add(b);return y(a,b",
    ",c,d,e)},!1,!0),Ha=V(\"following\",function(a,b,c,d){var e=new z;do for",
    "(var f=b;f=f.nextSibling;)x(f,c,d)&&a.matches(f)&&e.add(f),e=y(a,f,c,d,",
    "e);while(b=b.parentNode);return e},!1,!0);V(\"following-sibling\",funct",
    "ion(a,b){for(var c=new z;b=b.nextSibling;)a.matches(b)&&c.add(b);return",
    " c},!1);V(\"namespace\",function(){return new z},!1);\nvar Na=V(\"paren",
    "t\",function(a,b){var c=new z;if(9==b.nodeType)return c;if(2==b.nodeTyp",
    "e)return c.add(b.ownerElement),c;b=b.parentNode;a.matches(b)&&c.add(b);",
    "return c},!1),Ia=V(\"preceding\",function(a,b,c,d){var e=new z,f=[];do ",
    "f.unshift(b);while(b=b.parentNode);for(var g=1,l=f.length;g<l;g++){var ",
    "w=[];for(b=f[g];b=b.previousSibling;)w.unshift(b);for(var la=0,$a=w.len",
    "gth;la<$a;la++)b=w[la],x(b,c,d)&&a.matches(b)&&e.add(b),e=y(a,b,c,d,e)}",
    "return e},!0,!0);\nV(\"preceding-sibling\",function(a,b){for(var c=new ",
    "z;b=b.previousSibling;)a.matches(b)&&c.unshift(b);return c},!0);var Oa=",
    "V(\"self\",function(a,b){var c=new z;a.matches(b)&&c.add(b);return c},!",
    "1);function W(a){m.call(this,1);this.U=a;this.o=a.c();this.h=a.h}k(W);W",
    ".prototype.evaluate=function(a){return-E(this.U,a)};W.prototype.toStrin",
    "g=function(){return\"Unary Expression: -\"+D(this.U)};function X(a){m.c",
    "all(this,4);this.K=a;wa(this,q(this.K,function(a){return a.c()}));xa(th",
    "is,q(this.K,function(a){return a.h}))}k(X);X.prototype.evaluate=functio",
    "n(a){var b=new z;n(this.K,function(c){c=c.evaluate(a);if(!(c instanceof",
    " z))throw Error(\"Path expression must evaluate to NodeSet.\");b=ua(b,c",
    ")});return b};X.prototype.toString=function(){return p(this.K,function(",
    "a,b){return a+D(b)},\"Union Expression:\")};function Pa(a,b){this.a=a;t",
    "his.ia=b}function Qa(a){for(var b,c=[];;){Y(a,\"Missing right hand side",
    " of binary expression.\");b=Ra(a);var d=a.a.next();if(!d)break;var e=(d",
    "=Aa[d]||null)&&d.Z;if(!e){a.a.back();break}for(;c.length&&e<=c[c.length",
    "-1].Z;)b=new H(c.pop(),c.pop(),b);c.push(b,d)}for(;c.length;)b=new H(c.",
    "pop(),c.pop(),b);return b}function Y(a,b){if(a.a.empty())throw Error(b)",
    ";}function Sa(a,b){a=a.a.next();if(a!=b)throw Error(\"Bad token, expect",
    "ed: \"+b+\" got: \"+a);}\nfunction Ta(a){a=a.a.next();if(\")\"!=a)throw",
    " Error(\"Bad token: \"+a);}function Ua(a){a=a.a.next();if(2>a.length)th",
    "row Error(\"Unclosed literal string\");return new N(a)}\nfunction Va(a)",
    "{var b=[];if(Ga(u(a.a))){var c=a.a.next();var d=u(a.a);if(\"/\"==c&&(a.",
    "a.empty()||\".\"!=d&&\"..\"!=d&&\"@\"!=d&&\"*\"!=d&&!/(?![0-9])[\\w]/.t",
    "est(d)))return new R;d=new R;Y(a,\"Missing next location step.\");c=Wa(",
    "a,c);b.push(c)}else{a:{c=u(a.a);d=c.charAt(0);switch(d){case \"$\":thro",
    "w Error(\"Variable reference not allowed in HTML XPath\");case \"(\":a.",
    "a.next();c=Qa(a);Y(a,'unclosed \"(\"');Sa(a,\")\");break;case '\"':case",
    " \"'\":c=Ua(a);break;default:if(isNaN(+c))if(!Ea(c)&&/(?![0-9])[\\w]/.t",
    "est(d)&&\"(\"==u(a.a,\n1)){c=a.a.next();c=Da[c]||null;a.a.next();for(d=",
    "[];\")\"!=u(a.a);){Y(a,\"Missing function argument list.\");d.push(Qa(a",
    "));if(\",\"!=u(a.a))break;a.a.next()}Y(a,\"Unclosed function argument l",
    "ist.\");Ta(a);c=new L(c,d)}else{c=null;break a}else c=new P(+a.a.next()",
    ")}\"[\"==u(a.a)&&(d=new T(Xa(a)),c=new K(c,d))}if(c)if(Ga(u(a.a)))d=c;e",
    "lse return c;else c=Wa(a,\"/\"),d=new S,b.push(c)}for(;Ga(u(a.a));)c=a.",
    "a.next(),Y(a,\"Missing next location step.\"),c=Wa(a,c),b.push(c);retur",
    "n new Q(d,b)}\nfunction Wa(a,b){if(\"/\"!=b&&\"//\"!=b)throw Error('Ste",
    "p op should be \"/\" or \"//\"');if(\".\"==u(a.a)){var c=new U(Oa,new A",
    "(\"node\"));a.a.next();return c}if(\"..\"==u(a.a))return c=new U(Na,new",
    " A(\"node\")),a.a.next(),c;if(\"@\"==u(a.a)){var d=Fa;a.a.next();Y(a,\"",
    "Missing attribute name\")}else if(\"::\"==u(a.a,1)){if(!/(?![0-9])[\\w]",
    "/.test(u(a.a).charAt(0)))throw Error(\"Bad token: \"+a.a.next());var e=",
    "a.a.next();d=Ma[e]||null;if(!d)throw Error(\"No axis with name: \"+e);a",
    ".a.next();Y(a,\"Missing node name\")}else d=Ja;e=\nu(a.a);if(/(?![0-9])",
    "[\\w\\*]/.test(e.charAt(0)))if(\"(\"==u(a.a,1)){if(!Ea(e))throw Error(",
    "\"Invalid node type: \"+e);e=a.a.next();if(!Ea(e))throw Error(\"Invalid",
    " type name: \"+e);Sa(a,\"(\");Y(a,\"Bad nodetype\");var f=u(a.a).charAt",
    "(0),g=null;if('\"'==f||\"'\"==f)g=Ua(a);Y(a,\"Bad nodetype\");Ta(a);e=n",
    "ew A(e,g)}else if(e=a.a.next(),f=e.indexOf(\":\"),-1==f)e=new O(e);else",
    "{var g=e.substring(0,f);if(\"*\"==g)var l=\"*\";else if(l=a.ia(g),!l)th",
    "row Error(\"Namespace prefix not declared: \"+g);e=e.substr(f+1);e=new ",
    "O(e,l)}else throw Error(\"Bad token: \"+\na.a.next());a=new T(Xa(a),d.A",
    ");return c||new U(d,e,a,\"//\"==b)}function Xa(a){for(var b=[];\"[\"==u",
    "(a.a);){a.a.next();Y(a,\"Missing predicate expression.\");var c=Qa(a);b",
    ".push(c);Y(a,\"Unclosed predicate expression.\");Sa(a,\"]\")}return b}f",
    "unction Ra(a){if(\"-\"==u(a.a))return a.a.next(),new W(Ra(a));var b=Va(",
    "a);if(\"|\"!=u(a.a))a=b;else{for(b=[b];\"|\"==a.a.next();)Y(a,\"Missing",
    " next union location path.\"),b.push(Va(a));a.a.back();a=new X(b)}retur",
    "n a};function Ya(a){switch(a.nodeType){case 1:return ga(Za,a);case 9:re",
    "turn Ya(a.documentElement);case 11:case 10:case 6:case 12:return ab;def",
    "ault:return a.parentNode?Ya(a.parentNode):ab}}function ab(){return null",
    "}function Za(a,b){if(a.prefix==b)return a.namespaceURI||\"http://www.w3",
    ".org/1999/xhtml\";var c=a.getAttributeNode(\"xmlns:\"+b);return c&&c.sp",
    "ecified?c.value||null:a.parentNode&&9!=a.parentNode.nodeType?Za(a.paren",
    "tNode,b):null};function bb(a,b){if(!a.length)throw Error(\"Empty XPath ",
    "expression.\");a=oa(a);if(a.empty())throw Error(\"Invalid XPath express",
    "ion.\");b?\"function\"==ca(b)||(b=fa(b.lookupNamespaceURI,b)):b=functio",
    "n(){return null};var c=Qa(new Pa(a,b));if(!a.empty())throw Error(\"Bad ",
    "token: \"+a.next());this.evaluate=function(a,b){a=c.evaluate(new r(a));",
    "return new Z(a,b)}}\nfunction Z(a,b){if(0==b)if(a instanceof z)b=4;else",
    " if(\"string\"==typeof a)b=2;else if(\"number\"==typeof a)b=1;else if(",
    "\"boolean\"==typeof a)b=3;else throw Error(\"Unexpected evaluation resu",
    "lt.\");if(2!=b&&1!=b&&3!=b&&!(a instanceof z))throw Error(\"value could",
    " not be converted to the specified type\");this.resultType=b;switch(b){",
    "case 2:this.stringValue=a instanceof z?C(a):\"\"+a;break;case 1:this.nu",
    "mberValue=a instanceof z?+C(a):+a;break;case 3:this.booleanValue=a inst",
    "anceof z?0<a.m():!!a;break;case 4:case 5:case 6:case 7:var c=\na.iterat",
    "or();var d=[];for(var e=c.next();e;e=c.next())d.push(e);this.snapshotLe",
    "ngth=a.m();this.invalidIteratorState=!1;break;case 8:case 9:this.single",
    "NodeValue=B(a);break;default:throw Error(\"Unknown XPathResult type.\")",
    ";}var f=0;this.iterateNext=function(){if(4!=b&&5!=b)throw Error(\"itera",
    "teNext called with wrong result type\");return f>=d.length?null:d[f++]}",
    ";this.snapshotItem=function(a){if(6!=b&&7!=b)throw Error(\"snapshotItem",
    " called with wrong result type\");return a>=d.length||0>a?null:d[a]}}\n",
    "Z.ANY_TYPE=0;Z.NUMBER_TYPE=1;Z.STRING_TYPE=2;Z.BOOLEAN_TYPE=3;Z.UNORDER",
    "ED_NODE_ITERATOR_TYPE=4;Z.ORDERED_NODE_ITERATOR_TYPE=5;Z.UNORDERED_NODE",
    "_SNAPSHOT_TYPE=6;Z.ORDERED_NODE_SNAPSHOT_TYPE=7;Z.ANY_UNORDERED_NODE_TY",
    "PE=8;Z.FIRST_ORDERED_NODE_TYPE=9;function cb(a){this.lookupNamespaceURI",
    "=Ya(a)}\nba(\"wgxpath.install\",function(a,b){a=a||aa;var c=a.Document&",
    "&a.Document.prototype||a.document;if(!c.evaluate||b)a.XPathResult=Z,c.e",
    "valuate=function(a,b,c,g){return(new bb(a,c)).evaluate(b,g)},c.createEx",
    "pression=function(a,b){return new bb(a,b)},c.createNSResolver=function(",
    "a){return new cb(a)}});ba(\"_\",function(a,b){function c(a,b){a={clicka",
    "ble:a};b&&(a.message=b);return a}for(var d=a;d.parentNode;)d=d.parentNo",
    "de;var e=d.elementFromPoint(b.x,b.y);if(e==a)return c(!0);b=\"(\"+b.x+",
    "\", \"+b.y+\")\";if(null==e)return c(!1,\"Element is not clickable at p",
    "oint \"+b);d=e.outerHTML.replace(e.innerHTML,e.hasChildNodes()?\"...\":",
    "\"\");for(e=e.parentNode;e;){if(e==a)return c(!0,\"Element's descendant",
    " would receive the click. Consider clicking the descendant instead. Des",
    "cendant: \"+d);e=e.parentNode}a=a.outerHTML.replace(a.innerHTML,\na.has",
    "ChildNodes()?\"...\":\"\");return c(!1,\"Element \"+a+\" is not clickab",
    "le at point \"+b+\". Other element would receive the click: \"+d)});; r",
    "eturn this._.apply(null,arguments);}.apply({navigator:typeof window!='u",
    "ndefined'?window.navigator:null,document:typeof window!='undefined'?win",
    "dow.document:null}, arguments);}",
    NULL
};

const char* const IS_ELEMENT_DISPLAYED[] = {
    "function(){return function(){var h,aa=this;function k(a){return void 0!",
    "==a}function m(a){return\"string\"==typeof a}function n(a){return\"numb",
    "er\"==typeof a}function ba(a,b){a=a.split(\".\");var c=aa;a[0]in c||!c.",
    "execScript||c.execScript(\"var \"+a[0]);for(var d;a.length&&(d=a.shift(",
    "));)!a.length&&k(b)?c[d]=b:c=c[d]&&c[d]!==Object.prototype[d]?c[d]:c[d]",
    "={}}\nfunction ca(a){var b=typeof a;if(\"object\"==b)if(a){if(a instanc",
    "eof Array)return\"array\";if(a instanceof Object)return b;var c=Object.",
    "prototype.toString.call(a);if(\"[object Window]\"==c)return\"object\";i",
    "f(\"[object Array]\"==c||\"number\"==typeof a.length&&\"undefined\"!=ty",
    "peof a.splice&&\"undefined\"!=typeof a.propertyIsEnumerable&&!a.propert",
    "yIsEnumerable(\"splice\"))return\"array\";if(\"[object Function]\"==c||",
    "\"undefined\"!=typeof a.call&&\"undefined\"!=typeof a.propertyIsEnumera",
    "ble&&!a.propertyIsEnumerable(\"call\"))return\"function\"}else return\"",
    "null\";\nelse if(\"function\"==b&&\"undefined\"==typeof a.call)return\"",
    "object\";return b}function da(a){var b=ca(a);return\"array\"==b||\"obje",
    "ct\"==b&&\"number\"==typeof a.length}function ea(a){var b=typeof a;retu",
    "rn\"object\"==b&&null!=a||\"function\"==b}function fa(a,b,c){return a.c",
    "all.apply(a.bind,arguments)}\nfunction ga(a,b,c){if(!a)throw Error();if",
    "(2<arguments.length){var d=Array.prototype.slice.call(arguments,2);retu",
    "rn function(){var c=Array.prototype.slice.call(arguments);Array.prototy",
    "pe.unshift.apply(c,d);return a.apply(b,c)}}return function(){return a.a",
    "pply(b,arguments)}}function ha(a,b,c){ha=Function.prototype.bind&&-1!=F",
    "unction.prototype.bind.toString().indexOf(\"native code\")?fa:ga;return",
    " ha.apply(null,arguments)}\nfunction ia(a,b){var c=Array.prototype.slic",
    "e.call(arguments,1);return function(){var b=c.slice();b.push.apply(b,ar",
    "guments);return a.apply(this,b)}}function p(a,b){function c(){}c.protot",
    "ype=b.prototype;a.ta=b.prototype;a.prototype=new c;a.prototype.construc",
    "tor=a;a.ra=function(a,c,f){for(var d=Array(arguments.length-2),e=2;e<ar",
    "guments.length;e++)d[e-2]=arguments[e];return b.prototype[c].apply(a,d)",
    "}};function ja(a){return String(a).replace(/\\-([a-z])/g,function(a,c){",
    "return c.toUpperCase()})};function ka(a,b){if(m(a))return m(b)&&1==b.le",
    "ngth?a.indexOf(b,0):-1;for(var c=0;c<a.length;c++)if(c in a&&a[c]===b)r",
    "eturn c;return-1}function r(a,b){for(var c=a.length,d=m(a)?a.split(\"\"",
    "):a,e=0;e<c;e++)e in d&&b.call(void 0,d[e],e,a)}function t(a,b,c){var d",
    "=c;r(a,function(c,f){d=b.call(void 0,d,c,f,a)});return d}function la(a,",
    "b){for(var c=a.length,d=m(a)?a.split(\"\"):a,e=0;e<c;e++)if(e in d&&b.c",
    "all(void 0,d[e],e,a))return!0;return!1}\nfunction ma(a,b){for(var c=a.l",
    "ength,d=m(a)?a.split(\"\"):a,e=0;e<c;e++)if(e in d&&!b.call(void 0,d[e]",
    ",e,a))return!1;return!0}function na(a){return Array.prototype.concat.ap",
    "ply([],arguments)}function oa(a){var b=a.length;if(0<b){for(var c=Array",
    "(b),d=0;d<b;d++)c[d]=a[d];return c}return[]}function pa(a,b,c){return 2",
    ">=arguments.length?Array.prototype.slice.call(a,b):Array.prototype.slic",
    "e.call(a,b,c)};var qa={aliceblue:\"#f0f8ff\",antiquewhite:\"#faebd7\",a",
    "qua:\"#00ffff\",aquamarine:\"#7fffd4\",azure:\"#f0ffff\",beige:\"#f5f5d",
    "c\",bisque:\"#ffe4c4\",black:\"#000000\",blanchedalmond:\"#ffebcd\",blu",
    "e:\"#0000ff\",blueviolet:\"#8a2be2\",brown:\"#a52a2a\",burlywood:\"#deb",
    "887\",cadetblue:\"#5f9ea0\",chartreuse:\"#7fff00\",chocolate:\"#d2691e",
    "\",coral:\"#ff7f50\",cornflowerblue:\"#6495ed\",cornsilk:\"#fff8dc\",cr",
    "imson:\"#dc143c\",cyan:\"#00ffff\",darkblue:\"#00008b\",darkcyan:\"#008",
    "b8b\",darkgoldenrod:\"#b8860b\",darkgray:\"#a9a9a9\",darkgreen:\"#00640",
    "0\",\ndarkgrey:\"#a9a9a9\",darkkhaki:\"#bdb76b\",darkmagenta:\"#8b008b",
    "\",darkolivegreen:\"#556b2f\",darkorange:\"#ff8c00\",darkorchid:\"#9932",
    "cc\",darkred:\"#8b0000\",darksalmon:\"#e9967a\",darkseagreen:\"#8fbc8f",
    "\",darkslateblue:\"#483d8b\",darkslategray:\"#2f4f4f\",darkslategrey:\"",
    "#2f4f4f\",darkturquoise:\"#00ced1\",darkviolet:\"#9400d3\",deeppink:\"#",
    "ff1493\",deepskyblue:\"#00bfff\",dimgray:\"#696969\",dimgrey:\"#696969",
    "\",dodgerblue:\"#1e90ff\",firebrick:\"#b22222\",floralwhite:\"#fffaf0\"",
    ",forestgreen:\"#228b22\",fuchsia:\"#ff00ff\",gainsboro:\"#dcdcdc\",\ngh",
    "ostwhite:\"#f8f8ff\",gold:\"#ffd700\",goldenrod:\"#daa520\",gray:\"#808",
    "080\",green:\"#008000\",greenyellow:\"#adff2f\",grey:\"#808080\",honeyd",
    "ew:\"#f0fff0\",hotpink:\"#ff69b4\",indianred:\"#cd5c5c\",indigo:\"#4b00",
    "82\",ivory:\"#fffff0\",khaki:\"#f0e68c\",lavender:\"#e6e6fa\",lavenderb",
    "lush:\"#fff0f5\",lawngreen:\"#7cfc00\",lemonchiffon:\"#fffacd\",lightbl",
    "ue:\"#add8e6\",lightcoral:\"#f08080\",lightcyan:\"#e0ffff\",lightgolden",
    "rodyellow:\"#fafad2\",lightgray:\"#d3d3d3\",lightgreen:\"#90ee90\",ligh",
    "tgrey:\"#d3d3d3\",lightpink:\"#ffb6c1\",lightsalmon:\"#ffa07a\",\nlight",
    "seagreen:\"#20b2aa\",lightskyblue:\"#87cefa\",lightslategray:\"#778899",
    "\",lightslategrey:\"#778899\",lightsteelblue:\"#b0c4de\",lightyellow:\"",
    "#ffffe0\",lime:\"#00ff00\",limegreen:\"#32cd32\",linen:\"#faf0e6\",mage",
    "nta:\"#ff00ff\",maroon:\"#800000\",mediumaquamarine:\"#66cdaa\",mediumb",
    "lue:\"#0000cd\",mediumorchid:\"#ba55d3\",mediumpurple:\"#9370db\",mediu",
    "mseagreen:\"#3cb371\",mediumslateblue:\"#7b68ee\",mediumspringgreen:\"#",
    "00fa9a\",mediumturquoise:\"#48d1cc\",mediumvioletred:\"#c71585\",midnig",
    "htblue:\"#191970\",mintcream:\"#f5fffa\",mistyrose:\"#ffe4e1\",\nmoccas",
    "in:\"#ffe4b5\",navajowhite:\"#ffdead\",navy:\"#000080\",oldlace:\"#fdf5",
    "e6\",olive:\"#808000\",olivedrab:\"#6b8e23\",orange:\"#ffa500\",oranger",
    "ed:\"#ff4500\",orchid:\"#da70d6\",palegoldenrod:\"#eee8aa\",palegreen:",
    "\"#98fb98\",paleturquoise:\"#afeeee\",palevioletred:\"#db7093\",papayaw",
    "hip:\"#ffefd5\",peachpuff:\"#ffdab9\",peru:\"#cd853f\",pink:\"#ffc0cb\"",
    ",plum:\"#dda0dd\",powderblue:\"#b0e0e6\",purple:\"#800080\",red:\"#ff00",
    "00\",rosybrown:\"#bc8f8f\",royalblue:\"#4169e1\",saddlebrown:\"#8b4513",
    "\",salmon:\"#fa8072\",sandybrown:\"#f4a460\",seagreen:\"#2e8b57\",\nsea",
    "shell:\"#fff5ee\",sienna:\"#a0522d\",silver:\"#c0c0c0\",skyblue:\"#87ce",
    "eb\",slateblue:\"#6a5acd\",slategray:\"#708090\",slategrey:\"#708090\",",
    "snow:\"#fffafa\",springgreen:\"#00ff7f\",steelblue:\"#4682b4\",tan:\"#d",
    "2b48c\",teal:\"#008080\",thistle:\"#d8bfd8\",tomato:\"#ff6347\",turquoi",
    "se:\"#40e0d0\",violet:\"#ee82ee\",wheat:\"#f5deb3\",white:\"#ffffff\",w",
    "hitesmoke:\"#f5f5f5\",yellow:\"#ffff00\",yellowgreen:\"#9acd32\"};var r",
    "a=\"backgroundColor borderTopColor borderRightColor borderBottomColor b",
    "orderLeftColor color outlineColor\".split(\" \"),sa=/#([0-9a-fA-F])([0-",
    "9a-fA-F])([0-9a-fA-F])/,ta=/^#(?:[0-9a-f]{3}){1,2}$/i,ua=/^(?:rgba)?\\(",
    "(\\d{1,3}),\\s?(\\d{1,3}),\\s?(\\d{1,3}),\\s?(0|1|0\\.\\d*)\\)$/i,va=/^",
    "(?:rgb)?\\((0|[1-9]\\d{0,2}),\\s?(0|[1-9]\\d{0,2}),\\s?(0|[1-9]\\d{0,2}",
    ")\\)$/i;function xa(a,b){this.code=a;this.state=u[a]||ya;this.message=b",
    "||\"\";a=this.state.replace(/((?:^|\\s+)[a-z])/g,function(a){return a.t",
    "oUpperCase().replace(/^[\\s\\xa0]+/g,\"\")});b=a.length-5;if(0>b||a.ind",
    "exOf(\"Error\",b)!=b)a+=\"Error\";this.name=a;a=Error(this.message);a.n",
    "ame=this.name;this.stack=a.stack||\"\"}p(xa,Error);var ya=\"unknown err",
    "or\",u={15:\"element not selectable\",11:\"element not visible\"};u[31]",
    "=ya;u[30]=ya;u[24]=\"invalid cookie domain\";u[29]=\"invalid element co",
    "ordinates\";u[12]=\"invalid element state\";\nu[32]=\"invalid selector",
    "\";u[51]=\"invalid selector\";u[52]=\"invalid selector\";u[17]=\"javasc",
    "ript error\";u[405]=\"unsupported operation\";u[34]=\"move target out o",
    "f bounds\";u[27]=\"no such alert\";u[7]=\"no such element\";u[8]=\"no s",
    "uch frame\";u[23]=\"no such window\";u[28]=\"script timeout\";u[33]=\"s",
    "ession not created\";u[10]=\"stale element reference\";u[21]=\"timeout",
    "\";u[25]=\"unable to set cookie\";u[26]=\"unexpected alert open\";u[13]",
    "=ya;u[9]=\"unknown command\";xa.prototype.toString=function(){return th",
    "is.name+\": \"+this.message};function v(a,b){this.x=k(a)?a:0;this.y=k(b",
    ")?b:0}h=v.prototype;h.clone=function(){return new v(this.x,this.y)};h.t",
    "oString=function(){return\"(\"+this.x+\", \"+this.y+\")\"};h.ceil=funct",
    "ion(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);return this};h.",
    "floor=function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);re",
    "turn this};h.round=function(){this.x=Math.round(this.x);this.y=Math.rou",
    "nd(this.y);return this};\nh.translate=function(a,b){a instanceof v?(thi",
    "s.x+=a.x,this.y+=a.y):(this.x+=Number(a),n(b)&&(this.y+=b));return this",
    "};h.scale=function(a,b){b=n(b)?b:a;this.x*=a;this.y*=b;return this};fun",
    "ction za(a,b){this.width=a;this.height=b}h=za.prototype;h.clone=functio",
    "n(){return new za(this.width,this.height)};h.toString=function(){return",
    "\"(\"+this.width+\" x \"+this.height+\")\"};h.ceil=function(){this.widt",
    "h=Math.ceil(this.width);this.height=Math.ceil(this.height);return this}",
    ";h.floor=function(){this.width=Math.floor(this.width);this.height=Math.",
    "floor(this.height);return this};h.round=function(){this.width=Math.roun",
    "d(this.width);this.height=Math.round(this.height);return this};\nh.scal",
    "e=function(a,b){b=n(b)?b:a;this.width*=a;this.height*=b;return this};fu",
    "nction Aa(a,b,c){function d(c){c&&b.appendChild(m(c)?a.createTextNode(c",
    "):c)}for(var e=1;e<c.length;e++){var f=c[e];!da(f)||ea(f)&&0<f.nodeType",
    "?d(f):r(Ba(f)?oa(f):f,d)}}function Ca(a,b){if(!a||!b)return!1;if(a.cont",
    "ains&&1==b.nodeType)return a==b||a.contains(b);if(\"undefined\"!=typeof",
    " a.compareDocumentPosition)return a==b||!!(a.compareDocumentPosition(b)",
    "&16);for(;b&&a!=b;)b=b.parentNode;return b==a}\nfunction Da(a,b){if(a==",
    "b)return 0;if(a.compareDocumentPosition)return a.compareDocumentPositio",
    "n(b)&2?1:-1;if(\"sourceIndex\"in a||a.parentNode&&\"sourceIndex\"in a.p",
    "arentNode){var c=1==a.nodeType,d=1==b.nodeType;if(c&&d)return a.sourceI",
    "ndex-b.sourceIndex;var e=a.parentNode,f=b.parentNode;return e==f?Ea(a,b",
    "):!c&&Ca(e,b)?-1*Fa(a,b):!d&&Ca(f,a)?Fa(b,a):(c?a.sourceIndex:e.sourceI",
    "ndex)-(d?b.sourceIndex:f.sourceIndex)}d=y(a);c=d.createRange();c.select",
    "Node(a);c.collapse(!0);a=d.createRange();a.selectNode(b);\na.collapse(!",
    "0);return c.compareBoundaryPoints(aa.Range.START_TO_END,a)}function Fa(",
    "a,b){var c=a.parentNode;if(c==b)return-1;for(;b.parentNode!=c;)b=b.pare",
    "ntNode;return Ea(b,a)}function Ea(a,b){for(;b=b.previousSibling;)if(b==",
    "a)return-1;return 1}function y(a){return 9==a.nodeType?a:a.ownerDocumen",
    "t||a.document}function Ba(a){if(a&&\"number\"==typeof a.length){if(ea(a",
    "))return\"function\"==typeof a.item||\"string\"==typeof a.item;if(\"fun",
    "ction\"==ca(a))return\"function\"==typeof a.item}return!1}\nfunction Ga",
    "(a,b){a&&(a=a.parentNode);for(var c=0;a;){if(b(a))return a;a=a.parentNo",
    "de;c++}return null}function Ha(a){this.H=a||aa.document||document}h=Ha.",
    "prototype;h.getElementsByTagName=function(a,b){return(b||this.H).getEle",
    "mentsByTagName(String(a))};h.createElement=function(a){return this.H.cr",
    "eateElement(String(a))};h.createTextNode=function(a){return this.H.crea",
    "teTextNode(String(a))};h.appendChild=function(a,b){a.appendChild(b)};h.",
    "append=function(a,b){Aa(y(a),a,arguments)};\nh.canHaveChildren=function",
    "(a){if(1!=a.nodeType)return!1;switch(a.tagName){case \"APPLET\":case \"",
    "AREA\":case \"BASE\":case \"BR\":case \"COL\":case \"COMMAND\":case \"E",
    "MBED\":case \"FRAME\":case \"HR\":case \"IMG\":case \"INPUT\":case \"IF",
    "RAME\":case \"ISINDEX\":case \"KEYGEN\":case \"LINK\":case \"NOFRAMES\"",
    ":case \"NOSCRIPT\":case \"META\":case \"OBJECT\":case \"PARAM\":case \"",
    "SCRIPT\":case \"SOURCE\":case \"STYLE\":case \"TRACK\":case \"WBR\":ret",
    "urn!1}return!0};h.removeNode=function(a){return a&&a.parentNode?a.paren",
    "tNode.removeChild(a):null};\nh.contains=Ca;function z(a,b){b&&\"string",
    "\"!==typeof b&&(b=b.toString());return!!a&&1==a.nodeType&&(!b||a.tagNam",
    "e.toUpperCase()==b)};/*\n\n The MIT License\n\n Copyright (c) 2007 Cybo",
    "zu Labs, Inc.\n Copyright (c) 2012 Google Inc.\n\n Permission is hereby",
    " granted, free of charge, to any person obtaining a copy\n of this soft",
    "ware and associated documentation files (the \"Software\"), to\n deal i",
    "n the Software without restriction, including without limitation the\n ",
    "rights to use, copy, modify, merge, publish, distribute, sublicense, an",
    "d/or\n sell copies of the Software, and to permit persons to whom the S",
    "oftware is\n furnished to do so, subject to the following conditions:\n",
    "\n The above copyright notice and this permission notice shall be inclu",
    "ded in\n all copies or substantial portions of the Software.\n\n THE SO",
    "FTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR",
    "\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL",
    "ITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVEN",
    "T SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAM",
    "AGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OT",
    "HERWISE, ARISING\n FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR T",
    "HE USE OR OTHER DEALINGS\n IN THE SOFTWARE.\n*/\nfunction A(a,b,c){this",
    ".l=a;this.oa=b||1;this.j=c||1};function Ia(a){this.T=a;this.J=0}functio",
    "n Ja(a){a=a.match(Ka);for(var b=0;b<a.length;b++)La.test(a[b])&&a.splic",
    "e(b,1);return new Ia(a)}var Ka=/\\$?(?:(?![0-9-\\.])(?:\\*|[\\w-\\.]+):",
    ")?(?![0-9-\\.])(?:\\*|[\\w-\\.]+)|\\/\\/|\\.\\.|::|\\d+(?:\\.\\d*)?|\\.",
    "\\d+|\"[^\"]*\"|'[^']*'|[!<>]=|\\s+|./g,La=/^\\s/;function B(a,b){retur",
    "n a.T[a.J+(b||0)]}Ia.prototype.next=function(){return this.T[this.J++]}",
    ";Ia.prototype.back=function(){this.J--};Ia.prototype.empty=function(){r",
    "eturn this.T.length<=this.J};function C(a){var b=null,c=a.nodeType;1==c",
    "&&(b=a.textContent,b=void 0==b||null==b?a.innerText:b,b=void 0==b||null",
    "==b?\"\":b);if(\"string\"!=typeof b)if(9==c||1==c){a=9==c?a.documentEle",
    "ment:a.firstChild;for(var c=0,d=[],b=\"\";a;){do 1!=a.nodeType&&(b+=a.n",
    "odeValue),d[c++]=a;while(a=a.firstChild);for(;c&&!(a=d[--c].nextSibling",
    "););}}else b=a.nodeValue;return\"\"+b}\nfunction E(a,b,c){if(null===b)r",
    "eturn!0;try{if(!a.getAttribute)return!1}catch(d){return!1}return null==",
    "c?!!a.getAttribute(b):a.getAttribute(b,2)==c}function Ma(a,b,c,d,e){ret",
    "urn Na.call(null,a,b,m(c)?c:null,m(d)?d:null,e||new F)}\nfunction Na(a,",
    "b,c,d,e){b.getElementsByName&&d&&\"name\"==c?(b=b.getElementsByName(d),",
    "r(b,function(b){a.matches(b)&&e.add(b)})):b.getElementsByClassName&&d&&",
    "\"class\"==c?(b=b.getElementsByClassName(d),r(b,function(b){b.className",
    "==d&&a.matches(b)&&e.add(b)})):a instanceof G?Oa(a,b,c,d,e):b.getElemen",
    "tsByTagName&&(b=b.getElementsByTagName(a.getName()),r(b,function(a){E(a",
    ",c,d)&&e.add(a)}));return e}function Oa(a,b,c,d,e){for(b=b.firstChild;b",
    ";b=b.nextSibling)E(b,c,d)&&a.matches(b)&&e.add(b),Oa(a,b,c,d,e)};functi",
    "on F(){this.j=this.g=null;this.D=0}function Pa(a){this.node=a;this.next",
    "=this.w=null}function Qa(a,b){if(!a.g)return b;if(!b.g)return a;var c=a",
    ".g;b=b.g;for(var d=null,e,f=0;c&&b;)c.node==b.node?(e=c,c=c.next,b=b.ne",
    "xt):0<Da(c.node,b.node)?(e=b,b=b.next):(e=c,c=c.next),(e.w=d)?d.next=e:",
    "a.g=e,d=e,f++;for(e=c||b;e;)e.w=d,d=d.next=e,f++,e=e.next;a.j=d;a.D=f;r",
    "eturn a}F.prototype.unshift=function(a){a=new Pa(a);a.next=this.g;this.",
    "j?this.g.w=a:this.g=this.j=a;this.g=a;this.D++};\nF.prototype.add=funct",
    "ion(a){a=new Pa(a);a.w=this.j;this.g?this.j.next=a:this.g=this.j=a;this",
    ".j=a;this.D++};function Ra(a){return(a=a.g)?a.node:null}F.prototype.o=f",
    "unction(){return this.D};function Sa(a){return(a=Ra(a))?C(a):\"\"}F.pro",
    "totype.iterator=function(a){return new Ta(this,!!a)};function Ta(a,b){t",
    "his.ka=a;this.W=(this.A=b)?a.j:a.g;this.P=null}Ta.prototype.next=functi",
    "on(){var a=this.W;if(null==a)return null;var b=this.P=a;this.W=this.A?a",
    ".w:a.next;return b.node};\nTa.prototype.remove=function(){var a=this.ka",
    ",b=this.P;if(!b)throw Error(\"Next must be called at least once before ",
    "remove.\");var c=b.w,b=b.next;c?c.next=b:a.g=b;b?b.w=c:a.j=c;a.D--;this",
    ".P=null};function H(a){this.f=a;this.h=this.s=!1;this.F=null}function J",
    "(a){return\"\\n  \"+a.toString().split(\"\\n\").join(\"\\n  \")}H.proto",
    "type.c=function(){return this.s};function Ua(a,b){a.s=b}function Va(a,b",
    "){a.h=b}H.prototype.v=function(){return this.F};function K(a,b){a=a.eva",
    "luate(b);return a instanceof F?+Sa(a):+a}function L(a,b){a=a.evaluate(b",
    ");return a instanceof F?Sa(a):\"\"+a}function M(a,b){a=a.evaluate(b);re",
    "turn a instanceof F?!!a.o():!!a};function Wa(a,b,c){H.call(this,a.f);th",
    "is.S=a;this.$=b;this.ea=c;this.s=b.c()||c.c();this.h=b.h||c.h;this.S==X",
    "a&&(c.h||c.c()||4==c.f||0==c.f||!b.v()?b.h||b.c()||4==b.f||0==b.f||!c.v",
    "()||(this.F={name:c.v().name,C:b}):this.F={name:b.v().name,C:c})}p(Wa,H",
    ");\nfunction N(a,b,c,d,e){b=b.evaluate(d);c=c.evaluate(d);var f;if(b in",
    "stanceof F&&c instanceof F){b=b.iterator();for(d=b.next();d;d=b.next())",
    "for(e=c.iterator(),f=e.next();f;f=e.next())if(a(C(d),C(f)))return!0;ret",
    "urn!1}if(b instanceof F||c instanceof F){b instanceof F?(e=b,d=c):(e=c,",
    "d=b);f=e.iterator();for(var g=typeof d,l=f.next();l;l=f.next()){switch(",
    "g){case \"number\":l=+C(l);break;case \"boolean\":l=!!C(l);break;case ",
    "\"string\":l=C(l);break;default:throw Error(\"Illegal primitive type fo",
    "r comparison.\");\n}if(e==b&&a(l,d)||e==c&&a(d,l))return!0}return!1}ret",
    "urn e?\"boolean\"==typeof b||\"boolean\"==typeof c?a(!!b,!!c):\"number",
    "\"==typeof b||\"number\"==typeof c?a(+b,+c):a(b,c):a(+b,+c)}Wa.prototyp",
    "e.evaluate=function(a){return this.S.m(this.$,this.ea,a)};Wa.prototype.",
    "toString=function(){var a=\"Binary Expression: \"+this.S,a=a+J(this.$);",
    "return a+=J(this.ea)};function Ya(a,b,c,d){this.na=a;this.ca=b;this.f=c",
    ";this.m=d}Ya.prototype.toString=function(){return this.na};var Za={};\n",
    "function O(a,b,c,d){if(Za.hasOwnProperty(a))throw Error(\"Binary operat",
    "or already created: \"+a);a=new Ya(a,b,c,d);return Za[a.toString()]=a}O",
    "(\"div\",6,1,function(a,b,c){return K(a,c)/K(b,c)});O(\"mod\",6,1,funct",
    "ion(a,b,c){return K(a,c)%K(b,c)});O(\"*\",6,1,function(a,b,c){return K(",
    "a,c)*K(b,c)});O(\"+\",5,1,function(a,b,c){return K(a,c)+K(b,c)});O(\"-",
    "\",5,1,function(a,b,c){return K(a,c)-K(b,c)});O(\"<\",4,2,function(a,b,",
    "c){return N(function(a,b){return a<b},a,b,c)});\nO(\">\",4,2,function(a",
    ",b,c){return N(function(a,b){return a>b},a,b,c)});O(\"<=\",4,2,function",
    "(a,b,c){return N(function(a,b){return a<=b},a,b,c)});O(\">=\",4,2,funct",
    "ion(a,b,c){return N(function(a,b){return a>=b},a,b,c)});var Xa=O(\"=\",",
    "3,2,function(a,b,c){return N(function(a,b){return a==b},a,b,c,!0)});O(",
    "\"!=\",3,2,function(a,b,c){return N(function(a,b){return a!=b},a,b,c,!0",
    ")});O(\"and\",2,2,function(a,b,c){return M(a,c)&&M(b,c)});O(\"or\",1,2,",
    "function(a,b,c){return M(a,c)||M(b,c)});function $a(a,b){if(b.o()&&4!=a",
    ".f)throw Error(\"Primary expression must evaluate to nodeset if filter ",
    "has predicate(s).\");H.call(this,a.f);this.da=a;this.b=b;this.s=a.c();t",
    "his.h=a.h}p($a,H);$a.prototype.evaluate=function(a){a=this.da.evaluate(",
    "a);return ab(this.b,a)};$a.prototype.toString=function(){var a=\"Filter",
    ":\"+J(this.da);return a+=J(this.b)};function bb(a,b){if(b.length<a.ba)t",
    "hrow Error(\"Function \"+a.i+\" expects at least\"+a.ba+\" arguments, ",
    "\"+b.length+\" given\");if(null!==a.R&&b.length>a.R)throw Error(\"Funct",
    "ion \"+a.i+\" expects at most \"+a.R+\" arguments, \"+b.length+\" given",
    "\");a.la&&r(b,function(b,d){if(4!=b.f)throw Error(\"Argument \"+d+\" to",
    " function \"+a.i+\" is not of type Nodeset: \"+b);});H.call(this,a.f);t",
    "his.I=a;this.N=b;Ua(this,a.s||la(b,function(a){return a.c()}));Va(this,",
    "a.ja&&!b.length||a.ia&&!!b.length||la(b,function(a){return a.h}))}\np(b",
    "b,H);bb.prototype.evaluate=function(a){return this.I.m.apply(null,na(a,",
    "this.N))};bb.prototype.toString=function(){var a=\"Function: \"+this.I;",
    "if(this.N.length)var b=t(this.N,function(a,b){return a+J(b)},\"Argument",
    "s:\"),a=a+J(b);return a};function cb(a,b,c,d,e,f,g,l,w){this.i=a;this.f",
    "=b;this.s=c;this.ja=d;this.ia=e;this.m=f;this.ba=g;this.R=k(l)?l:g;this",
    ".la=!!w}cb.prototype.toString=function(){return this.i};var db={};\nfun",
    "ction P(a,b,c,d,e,f,g,l){if(db.hasOwnProperty(a))throw Error(\"Function",
    " already created: \"+a+\".\");db[a]=new cb(a,b,c,d,!1,e,f,g,l)}P(\"bool",
    "ean\",2,!1,!1,function(a,b){return M(b,a)},1);P(\"ceiling\",1,!1,!1,fun",
    "ction(a,b){return Math.ceil(K(b,a))},1);P(\"concat\",3,!1,!1,function(a",
    ",b){return t(pa(arguments,1),function(b,d){return b+L(d,a)},\"\")},2,nu",
    "ll);P(\"contains\",2,!1,!1,function(a,b,c){b=L(b,a);a=L(c,a);return-1!=",
    "b.indexOf(a)},2);P(\"count\",1,!1,!1,function(a,b){return b.evaluate(a)",
    ".o()},1,1,!0);\nP(\"false\",2,!1,!1,function(){return!1},0);P(\"floor\"",
    ",1,!1,!1,function(a,b){return Math.floor(K(b,a))},1);P(\"id\",4,!1,!1,f",
    "unction(a,b){var c=a.l,d=9==c.nodeType?c:c.ownerDocument;a=L(b,a).split",
    "(/\\s+/);var e=[];r(a,function(a){a=d.getElementById(a);!a||0<=ka(e,a)|",
    "|e.push(a)});e.sort(Da);var f=new F;r(e,function(a){f.add(a)});return f",
    "},1);P(\"lang\",2,!1,!1,function(){return!1},1);P(\"last\",1,!0,!1,func",
    "tion(a){if(1!=arguments.length)throw Error(\"Function last expects ()\"",
    ");return a.j},0);\nP(\"local-name\",3,!1,!0,function(a,b){return(a=b?Ra",
    "(b.evaluate(a)):a.l)?a.localName||a.nodeName.toLowerCase():\"\"},0,1,!0",
    ");P(\"name\",3,!1,!0,function(a,b){return(a=b?Ra(b.evaluate(a)):a.l)?a.",
    "nodeName.toLowerCase():\"\"},0,1,!0);P(\"namespace-uri\",3,!0,!1,functi",
    "on(){return\"\"},0,1,!0);P(\"normalize-space\",3,!1,!0,function(a,b){re",
    "turn(b?L(b,a):C(a.l)).replace(/[\\s\\xa0]+/g,\" \").replace(/^\\s+|\\s+",
    "$/g,\"\")},0,1);P(\"not\",2,!1,!1,function(a,b){return!M(b,a)},1);\nP(",
    "\"number\",1,!1,!0,function(a,b){return b?K(b,a):+C(a.l)},0,1);P(\"posi",
    "tion\",1,!0,!1,function(a){return a.oa},0);P(\"round\",1,!1,!1,function",
    "(a,b){return Math.round(K(b,a))},1);P(\"starts-with\",2,!1,!1,function(",
    "a,b,c){b=L(b,a);a=L(c,a);return 0==b.lastIndexOf(a,0)},2);P(\"string\",",
    "3,!1,!0,function(a,b){return b?L(b,a):C(a.l)},0,1);P(\"string-length\",",
    "1,!1,!0,function(a,b){return(b?L(b,a):C(a.l)).length},0,1);\nP(\"substr",
    "ing\",3,!1,!1,function(a,b,c,d){c=K(c,a);if(isNaN(c)||Infinity==c||-Inf",
    "inity==c)return\"\";d=d?K(d,a):Infinity;if(isNaN(d)||-Infinity===d)retu",
    "rn\"\";c=Math.round(c)-1;var e=Math.max(c,0);a=L(b,a);return Infinity==",
    "d?a.substring(e):a.substring(e,c+Math.round(d))},2,3);P(\"substring-aft",
    "er\",3,!1,!1,function(a,b,c){b=L(b,a);a=L(c,a);c=b.indexOf(a);return-1=",
    "=c?\"\":b.substring(c+a.length)},2);\nP(\"substring-before\",3,!1,!1,fu",
    "nction(a,b,c){b=L(b,a);a=L(c,a);a=b.indexOf(a);return-1==a?\"\":b.subst",
    "ring(0,a)},2);P(\"sum\",1,!1,!1,function(a,b){a=b.evaluate(a).iterator(",
    ");b=0;for(var c=a.next();c;c=a.next())b+=+C(c);return b},1,1,!0);P(\"tr",
    "anslate\",3,!1,!1,function(a,b,c,d){b=L(b,a);c=L(c,a);var e=L(d,a);d={}",
    ";for(var f=0;f<c.length;f++)a=c.charAt(f),a in d||(d[a]=e.charAt(f));c=",
    "\"\";for(f=0;f<b.length;f++)a=b.charAt(f),c+=a in d?d[a]:a;return c},3)",
    ";P(\"true\",2,!1,!1,function(){return!0},0);function G(a,b){this.ga=a;t",
    "his.aa=k(b)?b:null;this.B=null;switch(a){case \"comment\":this.B=8;brea",
    "k;case \"text\":this.B=3;break;case \"processing-instruction\":this.B=7",
    ";break;case \"node\":break;default:throw Error(\"Unexpected argument\")",
    ";}}function eb(a){return\"comment\"==a||\"text\"==a||\"processing-instr",
    "uction\"==a||\"node\"==a}G.prototype.matches=function(a){return null===",
    "this.B||this.B==a.nodeType};G.prototype.getName=function(){return this.",
    "ga};\nG.prototype.toString=function(){var a=\"Kind Test: \"+this.ga;nul",
    "l===this.aa||(a+=J(this.aa));return a};function fb(a){H.call(this,3);th",
    "is.fa=a.substring(1,a.length-1)}p(fb,H);fb.prototype.evaluate=function(",
    "){return this.fa};fb.prototype.toString=function(){return\"Literal: \"+",
    "this.fa};function gb(a,b){this.i=a.toLowerCase();a=\"*\"==this.i?\"*\":",
    "\"http://www.w3.org/1999/xhtml\";this.K=b?b.toLowerCase():a}gb.prototyp",
    "e.matches=function(a){var b=a.nodeType;if(1!=b&&2!=b)return!1;b=k(a.loc",
    "alName)?a.localName:a.nodeName;return\"*\"!=this.i&&this.i!=b.toLowerCa",
    "se()?!1:\"*\"==this.K?!0:this.K==(a.namespaceURI?a.namespaceURI.toLower",
    "Case():\"http://www.w3.org/1999/xhtml\")};gb.prototype.getName=function",
    "(){return this.i};\ngb.prototype.toString=function(){return\"Name Test:",
    " \"+(\"http://www.w3.org/1999/xhtml\"==this.K?\"\":this.K+\":\")+this.i",
    "};function hb(a){H.call(this,1);this.ha=a}p(hb,H);hb.prototype.evaluate",
    "=function(){return this.ha};hb.prototype.toString=function(){return\"Nu",
    "mber: \"+this.ha};function ib(a,b){H.call(this,a.f);this.Y=a;this.G=b;t",
    "his.s=a.c();this.h=a.h;1==this.G.length&&(a=this.G[0],a.O||a.u!=jb||(a=",
    "a.M,\"*\"!=a.getName()&&(this.F={name:a.getName(),C:null})))}p(ib,H);fu",
    "nction kb(){H.call(this,4)}p(kb,H);kb.prototype.evaluate=function(a){va",
    "r b=new F;a=a.l;9==a.nodeType?b.add(a):b.add(a.ownerDocument);return b}",
    ";kb.prototype.toString=function(){return\"Root Helper Expression\"};fun",
    "ction lb(){H.call(this,4)}p(lb,H);lb.prototype.evaluate=function(a){var",
    " b=new F;b.add(a.l);return b};\nlb.prototype.toString=function(){return",
    "\"Context Helper Expression\"};function mb(a){return\"/\"==a||\"//\"==a",
    "}\nib.prototype.evaluate=function(a){var b=this.Y.evaluate(a);if(!(b in",
    "stanceof F))throw Error(\"Filter expression must evaluate to nodeset.\"",
    ");a=this.G;for(var c=0,d=a.length;c<d&&b.o();c++){var e=a[c],f=b.iterat",
    "or(e.u.A);if(e.c()||e.u!=nb)if(e.c()||e.u!=ob){var g=f.next();for(b=e.e",
    "valuate(new A(g));null!=(g=f.next());)g=e.evaluate(new A(g)),b=Qa(b,g)}",
    "else g=f.next(),b=e.evaluate(new A(g));else{for(g=f.next();(b=f.next())",
    "&&(!g.contains||g.contains(b))&&b.compareDocumentPosition(g)&8;g=b);b=e",
    ".evaluate(new A(g))}}return b};\nib.prototype.toString=function(){var a",
    "=\"Path Expression:\"+J(this.Y);if(this.G.length){var b=t(this.G,functi",
    "on(a,b){return a+J(b)},\"Steps:\");a+=J(b)}return a};function Q(a,b){th",
    "is.b=a;this.A=!!b}function ab(a,b,c){for(c=c||0;c<a.b.length;c++)for(va",
    "r d=a.b[c],e=b.iterator(),f=b.o(),g,l=0;g=e.next();l++){var w=a.A?f-l:l",
    "+1;g=d.evaluate(new A(g,w,f));if(\"number\"==typeof g)w=w==g;else if(\"",
    "string\"==typeof g||\"boolean\"==typeof g)w=!!g;else if(g instanceof F)",
    "w=0<g.o();else throw Error(\"Predicate.evaluate returned an unexpected ",
    "type.\");w||e.remove()}return b}Q.prototype.v=function(){return 0<this.",
    "b.length?this.b[0].v():null};\nQ.prototype.c=function(){for(var a=0;a<t",
    "his.b.length;a++){var b=this.b[a];if(b.c()||1==b.f||0==b.f)return!0}ret",
    "urn!1};Q.prototype.o=function(){return this.b.length};Q.prototype.toStr",
    "ing=function(){return t(this.b,function(a,b){return a+J(b)},\"Predicate",
    "s:\")};function R(a,b,c,d){H.call(this,4);this.u=a;this.M=b;this.b=c||n",
    "ew Q([]);this.O=!!d;b=this.b.v();a.qa&&b&&(this.F={name:b.name,C:b.C});",
    "this.s=this.b.c()}p(R,H);\nR.prototype.evaluate=function(a){var b=a.l,c",
    "=this.v(),d=null,e=null,f=0;c&&(d=c.name,e=c.C?L(c.C,a):null,f=1);if(th",
    "is.O)if(this.c()||this.u!=pb)if(b=(new R(qb,new G(\"node\"))).evaluate(",
    "a).iterator(),c=b.next())for(a=this.m(c,d,e,f);null!=(c=b.next());)a=Qa",
    "(a,this.m(c,d,e,f));else a=new F;else a=Ma(this.M,b,d,e),a=ab(this.b,a,",
    "f);else a=this.m(a.l,d,e,f);return a};R.prototype.m=function(a,b,c,d){a",
    "=this.u.I(this.M,a,b,c);return a=ab(this.b,a,d)};\nR.prototype.toString",
    "=function(){var a=\"Step:\"+J(\"Operator: \"+(this.O?\"//\":\"/\"));thi",
    "s.u.i&&(a+=J(\"Axis: \"+this.u));a+=J(this.M);if(this.b.o()){var b=t(th",
    "is.b.b,function(a,b){return a+J(b)},\"Predicates:\");a+=J(b)}return a};",
    "function rb(a,b,c,d){this.i=a;this.I=b;this.A=c;this.qa=d}rb.prototype.",
    "toString=function(){return this.i};var sb={};function T(a,b,c,d){if(sb.",
    "hasOwnProperty(a))throw Error(\"Axis already created: \"+a);b=new rb(a,",
    "b,c,!!d);return sb[a]=b}\nT(\"ancestor\",function(a,b){for(var c=new F;",
    "b=b.parentNode;)a.matches(b)&&c.unshift(b);return c},!0);T(\"ancestor-o",
    "r-self\",function(a,b){var c=new F;do a.matches(b)&&c.unshift(b);while(",
    "b=b.parentNode);return c},!0);\nvar jb=T(\"attribute\",function(a,b){va",
    "r c=new F,d=a.getName();if(b=b.attributes)if(a instanceof G&&null===a.B",
    "||\"*\"==d)for(d=0;a=b[d];d++)c.add(a);else(a=b.getNamedItem(d))&&c.add",
    "(a);return c},!1),pb=T(\"child\",function(a,b,c,d,e){c=m(c)?c:null;d=m(",
    "d)?d:null;e=e||new F;for(b=b.firstChild;b;b=b.nextSibling)E(b,c,d)&&a.m",
    "atches(b)&&e.add(b);return e},!1,!0);T(\"descendant\",Ma,!1,!0);\nvar q",
    "b=T(\"descendant-or-self\",function(a,b,c,d){var e=new F;E(b,c,d)&&a.ma",
    "tches(b)&&e.add(b);return Ma(a,b,c,d,e)},!1,!0),nb=T(\"following\",func",
    "tion(a,b,c,d){var e=new F;do for(var f=b;f=f.nextSibling;)E(f,c,d)&&a.m",
    "atches(f)&&e.add(f),e=Ma(a,f,c,d,e);while(b=b.parentNode);return e},!1,",
    "!0);T(\"following-sibling\",function(a,b){for(var c=new F;b=b.nextSibli",
    "ng;)a.matches(b)&&c.add(b);return c},!1);T(\"namespace\",function(){ret",
    "urn new F},!1);\nvar tb=T(\"parent\",function(a,b){var c=new F;if(9==b.",
    "nodeType)return c;if(2==b.nodeType)return c.add(b.ownerElement),c;b=b.p",
    "arentNode;a.matches(b)&&c.add(b);return c},!1),ob=T(\"preceding\",funct",
    "ion(a,b,c,d){var e=new F,f=[];do f.unshift(b);while(b=b.parentNode);for",
    "(var g=1,l=f.length;g<l;g++){var w=[];for(b=f[g];b=b.previousSibling;)w",
    ".unshift(b);for(var D=0,q=w.length;D<q;D++)b=w[D],E(b,c,d)&&a.matches(b",
    ")&&e.add(b),e=Ma(a,b,c,d,e)}return e},!0,!0);\nT(\"preceding-sibling\",",
    "function(a,b){for(var c=new F;b=b.previousSibling;)a.matches(b)&&c.unsh",
    "ift(b);return c},!0);var ub=T(\"self\",function(a,b){var c=new F;a.matc",
    "hes(b)&&c.add(b);return c},!1);function vb(a){H.call(this,1);this.X=a;t",
    "his.s=a.c();this.h=a.h}p(vb,H);vb.prototype.evaluate=function(a){return",
    "-K(this.X,a)};vb.prototype.toString=function(){return\"Unary Expression",
    ": -\"+J(this.X)};function wb(a){H.call(this,4);this.L=a;Ua(this,la(this",
    ".L,function(a){return a.c()}));Va(this,la(this.L,function(a){return a.h",
    "}))}p(wb,H);wb.prototype.evaluate=function(a){var b=new F;r(this.L,func",
    "tion(c){c=c.evaluate(a);if(!(c instanceof F))throw Error(\"Path express",
    "ion must evaluate to NodeSet.\");b=Qa(b,c)});return b};wb.prototype.toS",
    "tring=function(){return t(this.L,function(a,b){return a+J(b)},\"Union E",
    "xpression:\")};function xb(a,b){this.a=a;this.ma=b}function yb(a){for(v",
    "ar b,c=[];;){U(a,\"Missing right hand side of binary expression.\");b=z",
    "b(a);var d=a.a.next();if(!d)break;var e=(d=Za[d]||null)&&d.ca;if(!e){a.",
    "a.back();break}for(;c.length&&e<=c[c.length-1].ca;)b=new Wa(c.pop(),c.p",
    "op(),b);c.push(b,d)}for(;c.length;)b=new Wa(c.pop(),c.pop(),b);return b",
    "}function U(a,b){if(a.a.empty())throw Error(b);}function Ab(a,b){a=a.a.",
    "next();if(a!=b)throw Error(\"Bad token, expected: \"+b+\" got: \"+a);}",
    "\nfunction Bb(a){a=a.a.next();if(\")\"!=a)throw Error(\"Bad token: \"+a",
    ");}function Cb(a){a=a.a.next();if(2>a.length)throw Error(\"Unclosed lit",
    "eral string\");return new fb(a)}\nfunction Db(a){var b=[];if(mb(B(a.a))",
    "){var c=a.a.next();var d=B(a.a);if(\"/\"==c&&(a.a.empty()||\".\"!=d&&\"",
    "..\"!=d&&\"@\"!=d&&\"*\"!=d&&!/(?![0-9])[\\w]/.test(d)))return new kb;d",
    "=new kb;U(a,\"Missing next location step.\");c=Eb(a,c);b.push(c)}else{a",
    ":{c=B(a.a);d=c.charAt(0);switch(d){case \"$\":throw Error(\"Variable re",
    "ference not allowed in HTML XPath\");case \"(\":a.a.next();c=yb(a);U(a,",
    "'unclosed \"(\"');Ab(a,\")\");break;case '\"':case \"'\":c=Cb(a);break;",
    "default:if(isNaN(+c))if(!eb(c)&&/(?![0-9])[\\w]/.test(d)&&\"(\"==B(a.a,",
    "\n1)){c=a.a.next();c=db[c]||null;a.a.next();for(d=[];\")\"!=B(a.a);){U(",
    "a,\"Missing function argument list.\");d.push(yb(a));if(\",\"!=B(a.a))b",
    "reak;a.a.next()}U(a,\"Unclosed function argument list.\");Bb(a);c=new b",
    "b(c,d)}else{c=null;break a}else c=new hb(+a.a.next())}\"[\"==B(a.a)&&(d",
    "=new Q(Fb(a)),c=new $a(c,d))}if(c)if(mb(B(a.a)))d=c;else return c;else ",
    "c=Eb(a,\"/\"),d=new lb,b.push(c)}for(;mb(B(a.a));)c=a.a.next(),U(a,\"Mi",
    "ssing next location step.\"),c=Eb(a,c),b.push(c);return new ib(d,b)}\nf",
    "unction Eb(a,b){if(\"/\"!=b&&\"//\"!=b)throw Error('Step op should be ",
    "\"/\" or \"//\"');if(\".\"==B(a.a)){var c=new R(ub,new G(\"node\"));a.a",
    ".next();return c}if(\"..\"==B(a.a))return c=new R(tb,new G(\"node\")),a",
    ".a.next(),c;if(\"@\"==B(a.a)){var d=jb;a.a.next();U(a,\"Missing attribu",
    "te name\")}else if(\"::\"==B(a.a,1)){if(!/(?![0-9])[\\w]/.test(B(a.a).c",
    "harAt(0)))throw Error(\"Bad token: \"+a.a.next());var e=a.a.next();d=sb",
    "[e]||null;if(!d)throw Error(\"No axis with name: \"+e);a.a.next();U(a,",
    "\"Missing node name\")}else d=pb;e=\nB(a.a);if(/(?![0-9])[\\w\\*]/.test",
    "(e.charAt(0)))if(\"(\"==B(a.a,1)){if(!eb(e))throw Error(\"Invalid node ",
    "type: \"+e);e=a.a.next();if(!eb(e))throw Error(\"Invalid type name: \"+",
    "e);Ab(a,\"(\");U(a,\"Bad nodetype\");var f=B(a.a).charAt(0),g=null;if('",
    "\"'==f||\"'\"==f)g=Cb(a);U(a,\"Bad nodetype\");Bb(a);e=new G(e,g)}else ",
    "if(e=a.a.next(),f=e.indexOf(\":\"),-1==f)e=new gb(e);else{var g=e.subst",
    "ring(0,f);if(\"*\"==g)var l=\"*\";else if(l=a.ma(g),!l)throw Error(\"Na",
    "mespace prefix not declared: \"+g);e=e.substr(f+1);e=new gb(e,l)}else t",
    "hrow Error(\"Bad token: \"+\na.a.next());a=new Q(Fb(a),d.A);return c||n",
    "ew R(d,e,a,\"//\"==b)}function Fb(a){for(var b=[];\"[\"==B(a.a);){a.a.n",
    "ext();U(a,\"Missing predicate expression.\");var c=yb(a);b.push(c);U(a,",
    "\"Unclosed predicate expression.\");Ab(a,\"]\")}return b}function zb(a)",
    "{if(\"-\"==B(a.a))return a.a.next(),new vb(zb(a));var b=Db(a);if(\"|\"!",
    "=B(a.a))a=b;else{for(b=[b];\"|\"==a.a.next();)U(a,\"Missing next union ",
    "location path.\"),b.push(Db(a));a.a.back();a=new wb(b)}return a};functi",
    "on Gb(a){switch(a.nodeType){case 1:return ia(Hb,a);case 9:return Gb(a.d",
    "ocumentElement);case 11:case 10:case 6:case 12:return Ib;default:return",
    " a.parentNode?Gb(a.parentNode):Ib}}function Ib(){return null}function H",
    "b(a,b){if(a.prefix==b)return a.namespaceURI||\"http://www.w3.org/1999/x",
    "html\";var c=a.getAttributeNode(\"xmlns:\"+b);return c&&c.specified?c.v",
    "alue||null:a.parentNode&&9!=a.parentNode.nodeType?Hb(a.parentNode,b):nu",
    "ll};function Jb(a,b){if(!a.length)throw Error(\"Empty XPath expression.",
    "\");a=Ja(a);if(a.empty())throw Error(\"Invalid XPath expression.\");b?",
    "\"function\"==ca(b)||(b=ha(b.lookupNamespaceURI,b)):b=function(){return",
    " null};var c=yb(new xb(a,b));if(!a.empty())throw Error(\"Bad token: \"+",
    "a.next());this.evaluate=function(a,b){a=c.evaluate(new A(a));return new",
    " V(a,b)}}\nfunction V(a,b){if(0==b)if(a instanceof F)b=4;else if(\"stri",
    "ng\"==typeof a)b=2;else if(\"number\"==typeof a)b=1;else if(\"boolean\"",
    "==typeof a)b=3;else throw Error(\"Unexpected evaluation result.\");if(2",
    "!=b&&1!=b&&3!=b&&!(a instanceof F))throw Error(\"value could not be con",
    "verted to the specified type\");this.resultType=b;switch(b){case 2:this",
    ".stringValue=a instanceof F?Sa(a):\"\"+a;break;case 1:this.numberValue=",
    "a instanceof F?+Sa(a):+a;break;case 3:this.booleanValue=a instanceof F?",
    "0<a.o():!!a;break;case 4:case 5:case 6:case 7:var c=\na.iterator();var ",
    "d=[];for(var e=c.next();e;e=c.next())d.push(e);this.snapshotLength=a.o(",
    ");this.invalidIteratorState=!1;break;case 8:case 9:this.singleNodeValue",
    "=Ra(a);break;default:throw Error(\"Unknown XPathResult type.\");}var f=",
    "0;this.iterateNext=function(){if(4!=b&&5!=b)throw Error(\"iterateNext c",
    "alled with wrong result type\");return f>=d.length?null:d[f++]};this.sn",
    "apshotItem=function(a){if(6!=b&&7!=b)throw Error(\"snapshotItem called ",
    "with wrong result type\");return a>=d.length||0>a?null:d[a]}}\nV.ANY_TY",
    "PE=0;V.NUMBER_TYPE=1;V.STRING_TYPE=2;V.BOOLEAN_TYPE=3;V.UNORDERED_NODE_",
    "ITERATOR_TYPE=4;V.ORDERED_NODE_ITERATOR_TYPE=5;V.UNORDERED_NODE_SNAPSHO",
    "T_TYPE=6;V.ORDERED_NODE_SNAPSHOT_TYPE=7;V.ANY_UNORDERED_NODE_TYPE=8;V.F",
    "IRST_ORDERED_NODE_TYPE=9;function Kb(a){this.lookupNamespaceURI=Gb(a)}",
    "\nba(\"wgxpath.install\",function(a,b){a=a||aa;var c=a.Document&&a.Docu",
    "ment.prototype||a.document;if(!c.evaluate||b)a.XPathResult=V,c.evaluate",
    "=function(a,b,c,g){return(new Jb(a,c)).evaluate(b,g)},c.createExpressio",
    "n=function(a,b){return new Jb(a,b)},c.createNSResolver=function(a){retu",
    "rn new Kb(a)}});var W={};W.U=function(){var a={ua:\"http://www.w3.org/2",
    "000/svg\"};return function(b){return a[b]||null}}();\nW.m=function(a,b,",
    "c){var d=y(a);if(!d.documentElement)return null;try{for(var e=d.createN",
    "SResolver?d.createNSResolver(d.documentElement):W.U,f={},g=d.getElement",
    "sByTagName(\"*\"),l=0;l<g.length;++l){var w=g[l],D=w.namespaceURI;if(D&",
    "&!f[D]){var q=w.lookupPrefix(D);if(!q)var x=D.match(\".*/(\\\\w+)/?$\")",
    ",q=x?x[1]:\"xhtml\";f[D]=q}}var I={},S;for(S in f)I[f[S]]=S;e=function(",
    "a){return I[a]||null};try{return d.evaluate(b,a,e,c,null)}catch(wa){if(",
    "\"TypeError\"===wa.name)return e=d.createNSResolver?d.createNSResolver(",
    "d.documentElement):\nW.U,d.evaluate(b,a,e,c,null);throw wa;}}catch(wa){",
    "throw new xa(32,\"Unable to locate an element with the xpath expression",
    " \"+b+\" because of the following error:\\n\"+wa);}};W.V=function(a,b){",
    "if(!a||1!=a.nodeType)throw new xa(32,'The result of the xpath expressio",
    "n \"'+b+'\" is: '+a+\". It should be an element.\");};\nW.pa=function(a",
    ",b){var c=function(){var c=W.m(b,a,9);return c?c.singleNodeValue||null:",
    "b.selectSingleNode?(c=y(b),c.setProperty&&c.setProperty(\"SelectionLang",
    "uage\",\"XPath\"),b.selectSingleNode(a)):null}();null===c||W.V(c,a);ret",
    "urn c};\nW.sa=function(a,b){var c=function(){var c=W.m(b,a,7);if(c){for",
    "(var e=c.snapshotLength,f=[],g=0;g<e;++g)f.push(c.snapshotItem(g));retu",
    "rn f}return b.selectNodes?(c=y(b),c.setProperty&&c.setProperty(\"Select",
    "ionLanguage\",\"XPath\"),b.selectNodes(a)):[]}();r(c,function(b){W.V(b,",
    "a)});return c};function Lb(a,b,c,d){this.top=a;this.right=b;this.bottom",
    "=c;this.left=d}h=Lb.prototype;h.clone=function(){return new Lb(this.top",
    ",this.right,this.bottom,this.left)};h.toString=function(){return\"(\"+t",
    "his.top+\"t, \"+this.right+\"r, \"+this.bottom+\"b, \"+this.left+\"l)\"",
    "};h.contains=function(a){return this&&a?a instanceof Lb?a.left>=this.le",
    "ft&&a.right<=this.right&&a.top>=this.top&&a.bottom<=this.bottom:a.x>=th",
    "is.left&&a.x<=this.right&&a.y>=this.top&&a.y<=this.bottom:!1};\nh.expan",
    "d=function(a,b,c,d){ea(a)?(this.top-=a.top,this.right+=a.right,this.bot",
    "tom+=a.bottom,this.left-=a.left):(this.top-=a,this.right+=Number(b),thi",
    "s.bottom+=Number(c),this.left-=Number(d));return this};h.ceil=function(",
    "){this.top=Math.ceil(this.top);this.right=Math.ceil(this.right);this.bo",
    "ttom=Math.ceil(this.bottom);this.left=Math.ceil(this.left);return this}",
    ";\nh.floor=function(){this.top=Math.floor(this.top);this.right=Math.flo",
    "or(this.right);this.bottom=Math.floor(this.bottom);this.left=Math.floor",
    "(this.left);return this};h.round=function(){this.top=Math.round(this.to",
    "p);this.right=Math.round(this.right);this.bottom=Math.round(this.bottom",
    ");this.left=Math.round(this.left);return this};h.translate=function(a,b",
    "){a instanceof v?(this.left+=a.x,this.right+=a.x,this.top+=a.y,this.bot",
    "tom+=a.y):(this.left+=a,this.right+=a,n(b)&&(this.top+=b,this.bottom+=b",
    "));return this};\nh.scale=function(a,b){b=n(b)?b:a;this.left*=a;this.ri",
    "ght*=a;this.top*=b;this.bottom*=b;return this};function X(a,b,c,d){this",
    ".left=a;this.top=b;this.width=c;this.height=d}h=X.prototype;h.clone=fun",
    "ction(){return new X(this.left,this.top,this.width,this.height)};h.toSt",
    "ring=function(){return\"(\"+this.left+\", \"+this.top+\" - \"+this.widt",
    "h+\"w x \"+this.height+\"h)\"};h.contains=function(a){return a instance",
    "of v?a.x>=this.left&&a.x<=this.left+this.width&&a.y>=this.top&&a.y<=thi",
    "s.top+this.height:this.left<=a.left&&this.left+this.width>=a.left+a.wid",
    "th&&this.top<=a.top&&this.top+this.height>=a.top+a.height};\nh.ceil=fun",
    "ction(){this.left=Math.ceil(this.left);this.top=Math.ceil(this.top);thi",
    "s.width=Math.ceil(this.width);this.height=Math.ceil(this.height);return",
    " this};h.floor=function(){this.left=Math.floor(this.left);this.top=Math",
    ".floor(this.top);this.width=Math.floor(this.width);this.height=Math.flo",
    "or(this.height);return this};h.round=function(){this.left=Math.round(th",
    "is.left);this.top=Math.round(this.top);this.width=Math.round(this.width",
    ");this.height=Math.round(this.height);return this};\nh.translate=functi",
    "on(a,b){a instanceof v?(this.left+=a.x,this.top+=a.y):(this.left+=a,n(b",
    ")&&(this.top+=b));return this};h.scale=function(a,b){b=n(b)?b:a;this.le",
    "ft*=a;this.width*=a;this.top*=b;this.height*=b;return this};var Mb=\"fu",
    "nction\"===typeof ShadowRoot;function Nb(a){for(a=a.parentNode;a&&1!=a.",
    "nodeType&&9!=a.nodeType&&11!=a.nodeType;)a=a.parentNode;return z(a)?a:n",
    "ull}\nfunction Y(a,b){b=ja(b);if(\"float\"==b||\"cssFloat\"==b||\"style",
    "Float\"==b)b=\"cssFloat\";a:{var c=b;var d=y(a);if(d.defaultView&&d.def",
    "aultView.getComputedStyle&&(d=d.defaultView.getComputedStyle(a,null))){",
    "c=d[c]||d.getPropertyValue(c)||\"\";break a}c=\"\"}a=c||Ob(a,b);if(null",
    "===a)a=null;else if(0<=ka(ra,b)){b:{var e=a.match(ua);if(e&&(b=Number(e",
    "[1]),c=Number(e[2]),d=Number(e[3]),e=Number(e[4]),0<=b&&255>=b&&0<=c&&2",
    "55>=c&&0<=d&&255>=d&&0<=e&&1>=e)){b=[b,c,d,e];break b}b=null}if(!b)b:{i",
    "f(d=a.match(va))if(b=Number(d[1]),\nc=Number(d[2]),d=Number(d[3]),0<=b&",
    "&255>=b&&0<=c&&255>=c&&0<=d&&255>=d){b=[b,c,d,1];break b}b=null}if(!b)b",
    ":{b=a.toLowerCase();c=qa[b.toLowerCase()];if(!c&&(c=\"#\"==b.charAt(0)?",
    "b:\"#\"+b,4==c.length&&(c=c.replace(sa,\"#$1$1$2$2$3$3\")),!ta.test(c))",
    "){b=null;break b}b=[parseInt(c.substr(1,2),16),parseInt(c.substr(3,2),1",
    "6),parseInt(c.substr(5,2),16),1]}a=b?\"rgba(\"+b.join(\", \")+\")\":a}r",
    "eturn a}\nfunction Ob(a,b){var c=a.currentStyle||a.style,d=c[b];!k(d)&&",
    "\"function\"==ca(c.getPropertyValue)&&(d=c.getPropertyValue(b));return",
    "\"inherit\"!=d?k(d)?d:null:(a=Nb(a))?Ob(a,b):null}\nfunction Pb(a,b,c){",
    "function d(a){var b=Qb(a);return 0<b.height&&0<b.width?!0:z(a,\"PATH\")",
    "&&(0<b.height||0<b.width)?(a=Y(a,\"stroke-width\"),!!a&&0<parseInt(a,10",
    ")):\"hidden\"!=Y(a,\"overflow\")&&la(a.childNodes,function(a){return 3=",
    "=a.nodeType||z(a)&&d(a)})}function e(a){return Rb(a)==Z&&ma(a.childNode",
    "s,function(a){return!z(a)||e(a)||!d(a)})}if(!z(a))throw Error(\"Argumen",
    "t to isShown must be of type Element\");if(z(a,\"BODY\"))return!0;if(z(",
    "a,\"OPTION\")||z(a,\"OPTGROUP\"))return a=Ga(a,function(a){return z(a,",
    "\"SELECT\")}),\n!!a&&Pb(a,!0,c);var f=Sb(a);if(f)return!!f.Z&&0<f.rect.",
    "width&&0<f.rect.height&&Pb(f.Z,b,c);if(z(a,\"INPUT\")&&\"hidden\"==a.ty",
    "pe.toLowerCase()||z(a,\"NOSCRIPT\"))return!1;f=Y(a,\"visibility\");retu",
    "rn\"collapse\"!=f&&\"hidden\"!=f&&c(a)&&(b||0!=Tb(a))&&d(a)?!e(a):!1}\n",
    "function Ub(a,b){var c=Mb?function(b){if(\"none\"==Y(b,\"display\"))ret",
    "urn!1;do{var d=b.parentNode;if(b.getDestinationInsertionPoints){var f=b",
    ".getDestinationInsertionPoints();0<f.length&&(d=f[f.length-1])}if(d ins",
    "tanceof ShadowRoot)return!0;!d||9!=d.nodeType&&11!=d.nodeType||(d=null)",
    "}while(a&&1!=a.nodeType);return!d||c(d)}:function(a){if(\"none\"==Y(a,",
    "\"display\"))return!1;a=Nb(a);return!a||c(a)};return Pb(a,!!b,c)}var Z=",
    "\"hidden\";\nfunction Rb(a){function b(a){function b(a){return a==g?!0:",
    "0==Y(a,\"display\").lastIndexOf(\"inline\",0)||\"absolute\"==c&&\"stati",
    "c\"==Y(a,\"position\")?!1:!0}var c=Y(a,\"position\");if(\"fixed\"==c)re",
    "turn D=!0,a==g?null:g;for(a=Nb(a);a&&!b(a);)a=Nb(a);return a}function c",
    "(a){var b=a;if(\"visible\"==w)if(a==g&&l)b=l;else if(a==l)return{x:\"vi",
    "sible\",y:\"visible\"};b={x:Y(b,\"overflow-x\"),y:Y(b,\"overflow-y\")};",
    "a==g&&(b.x=\"visible\"==b.x?\"auto\":b.x,b.y=\"visible\"==b.y?\"auto\":",
    "b.y);return b}function d(a){if(a==g){var b=(new Ha(f)).H;\na=b.scrollin",
    "gElement?b.scrollingElement:b.body||b.documentElement;b=b.parentWindow|",
    "|b.defaultView;a=new v(b.pageXOffset||a.scrollLeft,b.pageYOffset||a.scr",
    "ollTop)}else a=new v(a.scrollLeft,a.scrollTop);return a}var e=Vb(a);var",
    " f=y(a),g=f.documentElement,l=f.body,w=Y(g,\"overflow\"),D;for(a=b(a);a",
    ";a=b(a)){var q=c(a);if(\"visible\"!=q.x||\"visible\"!=q.y){var x=Qb(a);",
    "if(0==x.width||0==x.height)return Z;var I=e.right<x.left,S=e.bottom<x.t",
    "op;if(I&&\"hidden\"==q.x||S&&\"hidden\"==q.y)return Z;if(I&&\"visible\"",
    "!=q.x||\nS&&\"visible\"!=q.y){I=d(a);S=e.bottom<x.top-I.y;if(e.right<x.",
    "left-I.x&&\"visible\"!=q.x||S&&\"visible\"!=q.x)return Z;e=Rb(a);return",
    " e==Z?Z:\"scroll\"}I=e.left>=x.left+x.width;x=e.top>=x.top+x.height;if(",
    "I&&\"hidden\"==q.x||x&&\"hidden\"==q.y)return Z;if(I&&\"visible\"!=q.x|",
    "|x&&\"visible\"!=q.y){if(D&&(q=d(a),e.left>=g.scrollWidth-q.x||e.right>",
    "=g.scrollHeight-q.y))return Z;e=Rb(a);return e==Z?Z:\"scroll\"}}}return",
    "\"none\"}\nfunction Qb(a){var b=Sb(a);if(b)return b.rect;if(z(a,\"HTML",
    "\"))return a=y(a),a=((a?a.parentWindow||a.defaultView:window)||window).",
    "document,a=\"CSS1Compat\"==a.compatMode?a.documentElement:a.body,a=new ",
    "za(a.clientWidth,a.clientHeight),new X(0,0,a.width,a.height);try{var c=",
    "a.getBoundingClientRect()}catch(d){return new X(0,0,0,0)}return new X(c",
    ".left,c.top,c.right-c.left,c.bottom-c.top)}\nfunction Sb(a){var b=z(a,",
    "\"MAP\");if(!b&&!z(a,\"AREA\"))return null;var c=b?a:z(a.parentNode,\"M",
    "AP\")?a.parentNode:null,d=null,e=null;c&&c.name&&(d=W.pa('/descendant::",
    "*[@usemap = \"#'+c.name+'\"]',y(c)))&&(e=Qb(d),b||\"default\"==a.shape.",
    "toLowerCase()||(a=Wb(a),b=Math.min(Math.max(a.left,0),e.width),c=Math.m",
    "in(Math.max(a.top,0),e.height),e=new X(b+e.left,c+e.top,Math.min(a.widt",
    "h,e.width-b),Math.min(a.height,e.height-c))));return{Z:d,rect:e||new X(",
    "0,0,0,0)}}\nfunction Wb(a){var b=a.shape.toLowerCase();a=a.coords.split",
    "(\",\");if(\"rect\"==b&&4==a.length){var b=a[0],c=a[1];return new X(b,c",
    ",a[2]-b,a[3]-c)}if(\"circle\"==b&&3==a.length)return b=a[2],new X(a[0]-",
    "b,a[1]-b,2*b,2*b);if(\"poly\"==b&&2<a.length){for(var b=a[0],c=a[1],d=b",
    ",e=c,f=2;f+1<a.length;f+=2)b=Math.min(b,a[f]),d=Math.max(d,a[f]),c=Math",
    ".min(c,a[f+1]),e=Math.max(e,a[f+1]);return new X(b,c,d-b,e-c)}return ne",
    "w X(0,0,0,0)}function Vb(a){a=Qb(a);return new Lb(a.top,a.left+a.width,",
    "a.top+a.height,a.left)}\nfunction Tb(a){var b=1,c=Y(a,\"opacity\");c&&(",
    "b=Number(c));(a=Nb(a))&&(b*=Tb(a));return b};var Xb=\"function\"===type",
    "of ShadowRoot;function Yb(a,b,c){if(!Ub(a,c))return!1;if(Xb){for(;a.par",
    "entNode;)a=a.parentNode;if(a instanceof ShadowRoot)return Yb(a.host,b)}",
    "return!0};ba(\"_\",Yb);; return this._.apply(null,arguments);}.apply({n",
    "avigator:typeof window!='undefined'?window.navigator:null,document:type",
    "of window!='undefined'?window.document:null}, arguments);}",
    NULL
};

const char* const CLEAR_LOCAL_STORAGE[] = {
    "function(){return function(){var b=window;function d(a,c){this.code=a;t",
    "his.state=e[a]||f;this.message=c||\"\";a=this.state.replace(/((?:^|\\s+",
    ")[a-z])/g,function(a){return a.toUpperCase().replace(/^[\\s\\xa0]+/g,\"",
    "\")});c=a.length-5;if(0>c||a.indexOf(\"Error\",c)!=c)a+=\"Error\";this.",
    "name=a;a=Error(this.message);a.name=this.name;this.stack=a.stack||\"\"}",
    "\n(function(){var a=Error;function c(){}c.prototype=a.prototype;d.c=a.p",
    "rototype;d.prototype=new c;d.prototype.constructor=d;d.b=function(c,t,u",
    "){for(var p=Array(arguments.length-2),l=2;l<arguments.length;l++)p[l-2]",
    "=arguments[l];return a.prototype[t].apply(c,p)}})();var f=\"unknown err",
    "or\",e={15:\"element not selectable\",11:\"element not visible\"};e[31]",
    "=f;e[30]=f;e[24]=\"invalid cookie domain\";e[29]=\"invalid element coor",
    "dinates\";e[12]=\"invalid element state\";e[32]=\"invalid selector\";e[",
    "51]=\"invalid selector\";\ne[52]=\"invalid selector\";e[17]=\"javascrip",
    "t error\";e[405]=\"unsupported operation\";e[34]=\"move target out of b",
    "ounds\";e[27]=\"no such alert\";e[7]=\"no such element\";e[8]=\"no such",
    " frame\";e[23]=\"no such window\";e[28]=\"script timeout\";e[33]=\"sess",
    "ion not created\";e[10]=\"stale element reference\";e[21]=\"timeout\";e",
    "[25]=\"unable to set cookie\";e[26]=\"unexpected alert open\";e[13]=f;e",
    "[9]=\"unknown command\";d.prototype.toString=function(){return this.nam",
    "e+\": \"+this.message};function g(a){this.a=a}g.prototype.setItem=funct",
    "ion(a,c){try{this.a.setItem(a,c+\"\")}catch(r){throw new d(13,r.message",
    ");}};g.prototype.getItem=function(a){return this.a.getItem(a)};g.protot",
    "ype.removeItem=function(a){var c=this.getItem(a);this.a.removeItem(a);r",
    "eturn c};g.prototype.clear=function(){this.a.clear()};g.prototype.size=",
    "function(){return this.a.length};g.prototype.key=function(a){return thi",
    "s.a.key(a)};function h(){if(null==(b||b).localStorage)throw new d(13,\"",
    "Local storage undefined\");(new g(b.localStorage)).clear()}var k=[\"_\"",
    "],m=this;k[0]in m||!m.execScript||m.execScript(\"var \"+k[0]);for(var n",
    ";k.length&&(n=k.shift());){var q;if(q=!k.length)q=void 0!==h;q?m[n]=h:m",
    "=m[n]&&m[n]!==Object.prototype[n]?m[n]:m[n]={}};; return this._.apply(n",
    "ull,arguments);}.apply({navigator:typeof window!='undefined'?window.nav",
    "igator:null,document:typeof window!='undefined'?window.document:null}, ",
    "arguments);}",
    NULL
};

const char* const CLEAR_SESSION_STORAGE[] = {
    "function(){return function(){var b=window;function d(a,c){this.code=a;t",
    "his.state=e[a]||f;this.message=c||\"\";a=this.state.replace(/((?:^|\\s+",
    ")[a-z])/g,function(a){return a.toUpperCase().replace(/^[\\s\\xa0]+/g,\"",
    "\")});c=a.length-5;if(0>c||a.indexOf(\"Error\",c)!=c)a+=\"Error\";this.",
    "name=a;a=Error(this.message);a.name=this.name;this.stack=a.stack||\"\"}",
    "\n(function(){var a=Error;function c(){}c.prototype=a.prototype;d.c=a.p",
    "rototype;d.prototype=new c;d.prototype.constructor=d;d.b=function(c,t,u",
    "){for(var p=Array(arguments.length-2),l=2;l<arguments.length;l++)p[l-2]",
    "=arguments[l];return a.prototype[t].apply(c,p)}})();var f=\"unknown err",
    "or\",e={15:\"element not selectable\",11:\"element not visible\"};e[31]",
    "=f;e[30]=f;e[24]=\"invalid cookie domain\";e[29]=\"invalid element coor",
    "dinates\";e[12]=\"invalid element state\";e[32]=\"invalid selector\";e[",
    "51]=\"invalid selector\";\ne[52]=\"invalid selector\";e[17]=\"javascrip",
    "t error\";e[405]=\"unsupported operation\";e[34]=\"move target out of b",
    "ounds\";e[27]=\"no such alert\";e[7]=\"no such element\";e[8]=\"no such",
    " frame\";e[23]=\"no such window\";e[28]=\"script timeout\";e[33]=\"sess",
    "ion not created\";e[10]=\"stale element reference\";e[21]=\"timeout\";e",
    "[25]=\"unable to set cookie\";e[26]=\"unexpected alert open\";e[13]=f;e",
    "[9]=\"unknown command\";d.prototype.toString=function(){return this.nam",
    "e+\": \"+this.message};function g(a){this.a=a}g.prototype.setItem=funct",
    "ion(a,c){try{this.a.setItem(a,c+\"\")}catch(r){throw new d(13,r.message",
    ");}};g.prototype.getItem=function(a){return this.a.getItem(a)};g.protot",
    "ype.removeItem=function(a){var c=this.getItem(a);this.a.removeItem(a);r",
    "eturn c};g.prototype.clear=function(){this.a.clear()};g.prototype.size=",
    "function(){return this.a.length};g.prototype.key=function(a){return thi",
    "s.a.key(a)};function h(){var a=b||b;if(null!=a.sessionStorage&&null!=a.",
    "sessionStorage.clear)a=new g(b.sessionStorage);else throw new d(13,\"Se",
    "ssion storage undefined\");a.clear()}var k=[\"_\"],m=this;k[0]in m||!m.",
    "execScript||m.execScript(\"var \"+k[0]);for(var n;k.length&&(n=k.shift(",
    "));){var q;if(q=!k.length)q=void 0!==h;q?m[n]=h:m=m[n]&&m[n]!==Object.p",
    "rototype[n]?m[n]:m[n]={}};; return this._.apply(null,arguments);}.apply",
    "({navigator:typeof window!='undefined'?window.navigator:null,document:t",
    "ypeof window!='undefined'?window.document:null}, arguments);}",
    NULL
};

const char* const GET_APPCACHE_STATUS[] = {
    "function(){return function(){var a=window;function d(b,c){this.code=b;t",
    "his.state=e[b]||f;this.message=c||\"\";b=this.state.replace(/((?:^|\\s+",
    ")[a-z])/g,function(b){return b.toUpperCase().replace(/^[\\s\\xa0]+/g,\"",
    "\")});c=b.length-5;if(0>c||b.indexOf(\"Error\",c)!=c)b+=\"Error\";this.",
    "name=b;b=Error(this.message);b.name=this.name;this.stack=b.stack||\"\"}",
    "\n(function(){var b=Error;function c(){}c.prototype=b.prototype;d.b=b.p",
    "rototype;d.prototype=new c;d.prototype.constructor=d;d.a=function(c,q,r",
    "){for(var n=Array(arguments.length-2),k=2;k<arguments.length;k++)n[k-2]",
    "=arguments[k];return b.prototype[q].apply(c,n)}})();var f=\"unknown err",
    "or\",e={15:\"element not selectable\",11:\"element not visible\"};e[31]",
    "=f;e[30]=f;e[24]=\"invalid cookie domain\";e[29]=\"invalid element coor",
    "dinates\";e[12]=\"invalid element state\";e[32]=\"invalid selector\";e[",
    "51]=\"invalid selector\";\ne[52]=\"invalid selector\";e[17]=\"javascrip",
    "t error\";e[405]=\"unsupported operation\";e[34]=\"move target out of b",
    "ounds\";e[27]=\"no such alert\";e[7]=\"no such element\";e[8]=\"no such",
    " frame\";e[23]=\"no such window\";e[28]=\"script timeout\";e[33]=\"sess",
    "ion not created\";e[10]=\"stale element reference\";e[21]=\"timeout\";e",
    "[25]=\"unable to set cookie\";e[26]=\"unexpected alert open\";e[13]=f;e",
    "[9]=\"unknown command\";d.prototype.toString=function(){return this.nam",
    "e+\": \"+this.message};function g(){if(null!=(a||a).applicationCache)va",
    "r b=a.applicationCache.status;else throw new d(13,\"Undefined applicati",
    "on cache\");return b}var h=[\"_\"],l=this;h[0]in l||!l.execScript||l.ex",
    "ecScript(\"var \"+h[0]);for(var m;h.length&&(m=h.shift());){var p;if(p=",
    "!h.length)p=void 0!==g;p?l[m]=g:l=l[m]&&l[m]!==Object.prototype[m]?l[m]",
    ":l[m]={}};; return this._.apply(null,arguments);}.apply({navigator:type",
    "of window!='undefined'?window.navigator:null,document:typeof window!='u",
    "ndefined'?window.document:null}, arguments);}",
    NULL
};

const char* const GET_ATTRIBUTE[] = {
    "function(){return function(){function d(a){return\"string\"==typeof a};",
    "function g(a,b){this.code=a;this.state=h[a]||k;this.message=b||\"\";a=t",
    "his.state.replace(/((?:^|\\s+)[a-z])/g,function(a){return a.toUpperCase",
    "().replace(/^[\\s\\xa0]+/g,\"\")});b=a.length-5;if(0>b||a.indexOf(\"Err",
    "or\",b)!=b)a+=\"Error\";this.name=a;a=Error(this.message);a.name=this.n",
    "ame;this.stack=a.stack||\"\"}\n(function(){var a=Error;function b(){}b.",
    "prototype=a.prototype;g.b=a.prototype;g.prototype=new b;g.prototype.con",
    "structor=g;g.a=function(b,e,f){for(var c=Array(arguments.length-2),m=2;",
    "m<arguments.length;m++)c[m-2]=arguments[m];return a.prototype[e].apply(",
    "b,c)}})();var k=\"unknown error\",h={15:\"element not selectable\",11:",
    "\"element not visible\"};h[31]=k;h[30]=k;h[24]=\"invalid cookie domain",
    "\";h[29]=\"invalid element coordinates\";h[12]=\"invalid element state",
    "\";h[32]=\"invalid selector\";h[51]=\"invalid selector\";\nh[52]=\"inva",
    "lid selector\";h[17]=\"javascript error\";h[405]=\"unsupported operatio",
    "n\";h[34]=\"move target out of bounds\";h[27]=\"no such alert\";h[7]=\"",
    "no such element\";h[8]=\"no such frame\";h[23]=\"no such window\";h[28]",
    "=\"script timeout\";h[33]=\"session not created\";h[10]=\"stale element",
    " reference\";h[21]=\"timeout\";h[25]=\"unable to set cookie\";h[26]=\"u",
    "nexpected alert open\";h[13]=k;h[9]=\"unknown command\";g.prototype.toS",
    "tring=function(){return this.name+\": \"+this.message};function n(a,b){",
    "for(var c=a.length,e=d(a)?a.split(\"\"):a,f=0;f<c;f++)f in e&&b.call(vo",
    "id 0,e[f],f,a)};function p(a,b){b=b.toLowerCase();return\"style\"==b?q(",
    "a.style.cssText):(a=a.getAttributeNode(b))&&a.specified?a.value:null}va",
    "r r=/[;]+(?=(?:(?:[^\"]*\"){2})*[^\"]*$)(?=(?:(?:[^']*'){2})*[^']*$)(?=",
    "(?:[^()]*\\([^()]*\\))*[^()]*$)/;function q(a){var b=[];n(a.split(r),fu",
    "nction(a){var c=a.indexOf(\":\");0<c&&(a=[a.slice(0,c),a.slice(c+1)],2=",
    "=a.length&&b.push(a[0].toLowerCase(),\":\",a[1],\";\"))});b=b.join(\"\"",
    ");return b=\";\"==b.charAt(b.length-1)?b:b+\";\"}\nfunction t(a,b){b&&",
    "\"string\"!==typeof b&&(b=b.toString());return!!a&&1==a.nodeType&&(!b||",
    "a.tagName.toUpperCase()==b)}function u(a){return t(a,\"OPTION\")?!0:t(a",
    ",\"INPUT\")?(a=a.type.toLowerCase(),\"checkbox\"==a||\"radio\"==a):!1};",
    "var v={\"class\":\"className\",readonly:\"readOnly\"},w=\"async autofoc",
    "us autoplay checked compact complete controls declare defaultchecked de",
    "faultselected defer disabled draggable ended formnovalidate hidden inde",
    "terminate iscontenteditable ismap itemscope loop multiple muted nohref ",
    "noresize noshade novalidate nowrap open paused pubdate readonly require",
    "d reversed scoped seamless seeking selected spellcheck truespeed willva",
    "lidate\".split(\" \");function x(a,b){var c=b.toLowerCase();if(\"style",
    "\"==c)return(b=a.style)&&!d(b)&&(b=b.cssText),b;if((\"selected\"==c||\"",
    "checked\"==c)&&u(a)){if(!u(a))throw new g(15,\"Element is not selectabl",
    "e\");b=\"selected\";var e=a.type&&a.type.toLowerCase();if(\"checkbox\"=",
    "=e||\"radio\"==e)b=\"checked\";return a[b]?\"true\":null}var f=t(a,\"A",
    "\");if(t(a,\"IMG\")&&\"src\"==c||f&&\"href\"==c)return(b=p(a,c))&&(b=a[",
    "c]),b;if(\"spellcheck\"==c){b=p(a,c);if(null!==b){if(\"false\"==b.toLow",
    "erCase())return\"false\";if(\"true\"==b.toLowerCase())return\"true\"}re",
    "turn a[c]+\n\"\"}f=v[b]||b;a:if(d(w))c=d(c)&&1==c.length?w.indexOf(c,0)",
    ":-1;else{for(var l=0;l<w.length;l++)if(l in w&&w[l]===c){c=l;break a}c=",
    "-1}if(0<=c)return(b=null!==p(a,b)||a[f])?\"true\":null;try{e=a[f]}catch",
    "(m){}(c=null==e)||(c=typeof e,c=\"object\"==c&&null!=e||\"function\"==c",
    ");b=c?p(a,b):e;return null!=b?b.toString():null}var y=[\"_\"],z=this;y[",
    "0]in z||!z.execScript||z.execScript(\"var \"+y[0]);\nfor(var A;y.length",
    "&&(A=y.shift());){var B;if(B=!y.length)B=void 0!==x;B?z[A]=x:z=z[A]&&z[",
    "A]!==Object.prototype[A]?z[A]:z[A]={}};; return this._.apply(null,argum",
    "ents);}.apply({navigator:typeof window!='undefined'?window.navigator:nu",
    "ll,document:typeof window!='undefined'?window.document:null}, arguments",
    ");}",
    NULL
};

const char* const GET_LOCAL_STORAGE_ITEM[] = {
    "function(){return function(){var b=window;function d(a,c){this.code=a;t",
    "his.state=e[a]||f;this.message=c||\"\";a=this.state.replace(/((?:^|\\s+",
    ")[a-z])/g,function(a){return a.toUpperCase().replace(/^[\\s\\xa0]+/g,\"",
    "\")});c=a.length-5;if(0>c||a.indexOf(\"Error\",c)!=c)a+=\"Error\";this.",
    "name=a;a=Error(this.message);a.name=this.name;this.stack=a.stack||\"\"}",
    "\n(function(){var a=Error;function c(){}c.prototype=a.prototype;d.c=a.p",
    "rototype;d.prototype=new c;d.prototype.constructor=d;d.b=function(c,t,u",
    "){for(var p=Array(arguments.length-2),l=2;l<arguments.length;l++)p[l-2]",
    "=arguments[l];return a.prototype[t].apply(c,p)}})();var f=\"unknown err",
    "or\",e={15:\"element not selectable\",11:\"element not visible\"};e[31]",
    "=f;e[30]=f;e[24]=\"invalid cookie domain\";e[29]=\"invalid element coor",
    "dinates\";e[12]=\"invalid element state\";e[32]=\"invalid selector\";e[",
    "51]=\"invalid selector\";\ne[52]=\"invalid selector\";e[17]=\"javascrip",
    "t error\";e[405]=\"unsupported operation\";e[34]=\"move target out of b",
    "ounds\";e[27]=\"no such alert\";e[7]=\"no such element\";e[8]=\"no such",
    " frame\";e[23]=\"no such window\";e[28]=\"script timeout\";e[33]=\"sess",
    "ion not created\";e[10]=\"stale element reference\";e[21]=\"timeout\";e",
    "[25]=\"unable to set cookie\";e[26]=\"unexpected alert open\";e[13]=f;e",
    "[9]=\"unknown command\";d.prototype.toString=function(){return this.nam",
    "e+\": \"+this.message};function g(a){this.a=a}g.prototype.setItem=funct",
    "ion(a,c){try{this.a.setItem(a,c+\"\")}catch(r){throw new d(13,r.message",
    ");}};g.prototype.getItem=function(a){return this.a.getItem(a)};g.protot",
    "ype.removeItem=function(a){var c=this.getItem(a);this.a.removeItem(a);r",
    "eturn c};g.prototype.clear=function(){this.a.clear()};g.prototype.size=",
    "function(){return this.a.length};g.prototype.key=function(a){return thi",
    "s.a.key(a)};function h(a){if(null==(b||b).localStorage)throw new d(13,",
    "\"Local storage undefined\");return(new g(b.localStorage)).getItem(a)}v",
    "ar k=[\"_\"],m=this;k[0]in m||!m.execScript||m.execScript(\"var \"+k[0]",
    ");for(var n;k.length&&(n=k.shift());){var q;if(q=!k.length)q=void 0!==h",
    ";q?m[n]=h:m=m[n]&&m[n]!==Object.prototype[n]?m[n]:m[n]={}};; return thi",
    "s._.apply(null,arguments);}.apply({navigator:typeof window!='undefined'",
    "?window.navigator:null,document:typeof window!='undefined'?window.docum",
    "ent:null}, arguments);}",
    NULL
};

const char* const GET_LOCAL_STORAGE_KEY[] = {
    "function(){return function(){var b=window;function d(a,c){this.code=a;t",
    "his.state=e[a]||f;this.message=c||\"\";a=this.state.replace(/((?:^|\\s+",
    ")[a-z])/g,function(a){return a.toUpperCase().replace(/^[\\s\\xa0]+/g,\"",
    "\")});c=a.length-5;if(0>c||a.indexOf(\"Error\",c)!=c)a+=\"Error\";this.",
    "name=a;a=Error(this.message);a.name=this.name;this.stack=a.stack||\"\"}",
    "\n(function(){var a=Error;function c(){}c.prototype=a.prototype;d.c=a.p",
    "rototype;d.prototype=new c;d.prototype.constructor=d;d.b=function(c,t,u",
    "){for(var p=Array(arguments.length-2),l=2;l<arguments.length;l++)p[l-2]",
    "=arguments[l];return a.prototype[t].apply(c,p)}})();var f=\"unknown err",
    "or\",e={15:\"element not selectable\",11:\"element not visible\"};e[31]",
    "=f;e[30]=f;e[24]=\"invalid cookie domain\";e[29]=\"invalid element coor",
    "dinates\";e[12]=\"invalid element state\";e[32]=\"invalid selector\";e[",
    "51]=\"invalid selector\";\ne[52]=\"invalid selector\";e[17]=\"javascrip",
    "t error\";e[405]=\"unsupported operation\";e[34]=\"move target out of b",
    "ounds\";e[27]=\"no such alert\";e[7]=\"no such element\";e[8]=\"no such",
    " frame\";e[23]=\"no such window\";e[28]=\"script timeout\";e[33]=\"sess",
    "ion not created\";e[10]=\"stale element reference\";e[21]=\"timeout\";e",
    "[25]=\"unable to set cookie\";e[26]=\"unexpected alert open\";e[13]=f;e",
    "[9]=\"unknown command\";d.prototype.toString=function(){return this.nam",
    "e+\": \"+this.message};function g(a){this.a=a}g.prototype.setItem=funct",
    "ion(a,c){try{this.a.setItem(a,c+\"\")}catch(r){throw new d(13,r.message",
    ");}};g.prototype.getItem=function(a){return this.a.getItem(a)};g.protot",
    "ype.removeItem=function(a){var c=this.getItem(a);this.a.removeItem(a);r",
    "eturn c};g.prototype.clear=function(){this.a.clear()};g.prototype.size=",
    "function(){return this.a.length};g.prototype.key=function(a){return thi",
    "s.a.key(a)};function h(a){if(null==(b||b).localStorage)throw new d(13,",
    "\"Local storage undefined\");return(new g(b.localStorage)).key(a)}var k",
    "=[\"_\"],m=this;k[0]in m||!m.execScript||m.execScript(\"var \"+k[0]);fo",
    "r(var n;k.length&&(n=k.shift());){var q;if(q=!k.length)q=void 0!==h;q?m",
    "[n]=h:m=m[n]&&m[n]!==Object.prototype[n]?m[n]:m[n]={}};; return this._.",
    "apply(null,arguments);}.apply({navigator:typeof window!='undefined'?win",
    "dow.navigator:null,document:typeof window!='undefined'?window.document:",
    "null}, arguments);}",
    NULL
};

const char* const GET_LOCAL_STORAGE_KEYS[] = {
    "function(){return function(){var b=window;function d(a,c){this.code=a;t",
    "his.state=e[a]||f;this.message=c||\"\";a=this.state.replace(/((?:^|\\s+",
    ")[a-z])/g,function(a){return a.toUpperCase().replace(/^[\\s\\xa0]+/g,\"",
    "\")});c=a.length-5;if(0>c||a.indexOf(\"Error\",c)!=c)a+=\"Error\";this.",
    "name=a;a=Error(this.message);a.name=this.name;this.stack=a.stack||\"\"}",
    "\n(function(){var a=Error;function c(){}c.prototype=a.prototype;d.c=a.p",
    "rototype;d.prototype=new c;d.prototype.constructor=d;d.b=function(c,k,t",
    "){for(var h=Array(arguments.length-2),n=2;n<arguments.length;n++)h[n-2]",
    "=arguments[n];return a.prototype[k].apply(c,h)}})();var f=\"unknown err",
    "or\",e={15:\"element not selectable\",11:\"element not visible\"};e[31]",
    "=f;e[30]=f;e[24]=\"invalid cookie domain\";e[29]=\"invalid element coor",
    "dinates\";e[12]=\"invalid element state\";e[32]=\"invalid selector\";e[",
    "51]=\"invalid selector\";\ne[52]=\"invalid selector\";e[17]=\"javascrip",
    "t error\";e[405]=\"unsupported operation\";e[34]=\"move target out of b",
    "ounds\";e[27]=\"no such alert\";e[7]=\"no such element\";e[8]=\"no such",
    " frame\";e[23]=\"no such window\";e[28]=\"script timeout\";e[33]=\"sess",
    "ion not created\";e[10]=\"stale element reference\";e[21]=\"timeout\";e",
    "[25]=\"unable to set cookie\";e[26]=\"unexpected alert open\";e[13]=f;e",
    "[9]=\"unknown command\";d.prototype.toString=function(){return this.nam",
    "e+\": \"+this.message};function g(a){this.a=a}g.prototype.setItem=funct",
    "ion(a,c){try{this.a.setItem(a,c+\"\")}catch(h){throw new d(13,h.message",
    ");}};g.prototype.getItem=function(a){return this.a.getItem(a)};g.protot",
    "ype.removeItem=function(a){var c=this.getItem(a);this.a.removeItem(a);r",
    "eturn c};g.prototype.clear=function(){this.a.clear()};g.prototype.size=",
    "function(){return this.a.length};g.prototype.key=function(a){return thi",
    "s.a.key(a)};function l(){if(null==(b||b).localStorage)throw new d(13,\"",
    "Local storage undefined\");var a=new g(b.localStorage);for(var c=[],h=a",
    ".size(),k=0;k<h;k++)c[k]=a.a.key(k);return c}var m=[\"_\"],p=this;m[0]i",
    "n p||!p.execScript||p.execScript(\"var \"+m[0]);for(var q;m.length&&(q=",
    "m.shift());){var r;if(r=!m.length)r=void 0!==l;r?p[q]=l:p=p[q]&&p[q]!==",
    "Object.prototype[q]?p[q]:p[q]={}};; return this._.apply(null,arguments)",
    ";}.apply({navigator:typeof window!='undefined'?window.navigator:null,do",
    "cument:typeof window!='undefined'?window.document:null}, arguments);}",
    NULL
};

const char* const GET_LOCAL_STORAGE_SIZE[] = {
    "function(){return function(){var b=window;function d(a,c){this.code=a;t",
    "his.state=e[a]||f;this.message=c||\"\";a=this.state.replace(/((?:^|\\s+",
    ")[a-z])/g,function(a){return a.toUpperCase().replace(/^[\\s\\xa0]+/g,\"",
    "\")});c=a.length-5;if(0>c||a.indexOf(\"Error\",c)!=c)a+=\"Error\";this.",
    "name=a;a=Error(this.message);a.name=this.name;this.stack=a.stack||\"\"}",
    "\n(function(){var a=Error;function c(){}c.prototype=a.prototype;d.c=a.p",
    "rototype;d.prototype=new c;d.prototype.constructor=d;d.b=function(c,t,u",
    "){for(var p=Array(arguments.length-2),l=2;l<arguments.length;l++)p[l-2]",
    "=arguments[l];return a.prototype[t].apply(c,p)}})();var f=\"unknown err",
    "or\",e={15:\"element not selectable\",11:\"element not visible\"};e[31]",
    "=f;e[30]=f;e[24]=\"invalid cookie domain\";e[29]=\"invalid element coor",
    "dinates\";e[12]=\"invalid element state\";e[32]=\"invalid selector\";e[",
    "51]=\"invalid selector\";\ne[52]=\"invalid selector\";e[17]=\"javascrip",
    "t error\";e[405]=\"unsupported operation\";e[34]=\"move target out of b",
    "ounds\";e[27]=\"no such alert\";e[7]=\"no such element\";e[8]=\"no such",
    " frame\";e[23]=\"no such window\";e[28]=\"script timeout\";e[33]=\"sess",
    "ion not created\";e[10]=\"stale element reference\";e[21]=\"timeout\";e",
    "[25]=\"unable to set cookie\";e[26]=\"unexpected alert open\";e[13]=f;e",
    "[9]=\"unknown command\";d.prototype.toString=function(){return this.nam",
    "e+\": \"+this.message};function g(a){this.a=a}g.prototype.setItem=funct",
    "ion(a,c){try{this.a.setItem(a,c+\"\")}catch(r){throw new d(13,r.message",
    ");}};g.prototype.getItem=function(a){return this.a.getItem(a)};g.protot",
    "ype.removeItem=function(a){var c=this.getItem(a);this.a.removeItem(a);r",
    "eturn c};g.prototype.clear=function(){this.a.clear()};g.prototype.size=",
    "function(){return this.a.length};g.prototype.key=function(a){return thi",
    "s.a.key(a)};function h(){if(null==(b||b).localStorage)throw new d(13,\"",
    "Local storage undefined\");return(new g(b.localStorage)).size()}var k=[",
    "\"_\"],m=this;k[0]in m||!m.execScript||m.execScript(\"var \"+k[0]);for(",
    "var n;k.length&&(n=k.shift());){var q;if(q=!k.length)q=void 0!==h;q?m[n",
    "]=h:m=m[n]&&m[n]!==Object.prototype[n]?m[n]:m[n]={}};; return this._.ap",
    "ply(null,arguments);}.apply({navigator:typeof window!='undefined'?windo",
    "w.navigator:null,document:typeof window!='undefined'?window.document:nu",
    "ll}, arguments);}",
    NULL
};

const char* const GET_SESSION_STORAGE_ITEM[] = {
    "function(){return function(){var b=window;function d(a,c){this.code=a;t",
    "his.state=e[a]||f;this.message=c||\"\";a=this.state.replace(/((?:^|\\s+",
    ")[a-z])/g,function(a){return a.toUpperCase().replace(/^[\\s\\xa0]+/g,\"",
    "\")});c=a.length-5;if(0>c||a.indexOf(\"Error\",c)!=c)a+=\"Error\";this.",
    "name=a;a=Error(this.message);a.name=this.name;this.stack=a.stack||\"\"}",
    "\n(function(){var a=Error;function c(){}c.prototype=a.prototype;d.c=a.p",
    "rototype;d.prototype=new c;d.prototype.constructor=d;d.b=function(c,t,u",
    "){for(var p=Array(arguments.length-2),l=2;l<arguments.length;l++)p[l-2]",
    "=arguments[l];return a.prototype[t].apply(c,p)}})();var f=\"unknown err",
    "or\",e={15:\"element not selectable\",11:\"element not visible\"};e[31]",
    "=f;e[30]=f;e[24]=\"invalid cookie domain\";e[29]=\"invalid element coor",
    "dinates\";e[12]=\"invalid element state\";e[32]=\"invalid selector\";e[",
    "51]=\"invalid selector\";\ne[52]=\"invalid selector\";e[17]=\"javascrip",
    "t error\";e[405]=\"unsupported operation\";e[34]=\"move target out of b",
    "ounds\";e[27]=\"no such alert\";e[7]=\"no such element\";e[8]=\"no such",
    " frame\";e[23]=\"no such window\";e[28]=\"script timeout\";e[33]=\"sess",
    "ion not created\";e[10]=\"stale element reference\";e[21]=\"timeout\";e",
    "[25]=\"unable to set cookie\";e[26]=\"unexpected alert open\";e[13]=f;e",
    "[9]=\"unknown command\";d.prototype.toString=function(){return this.nam",
    "e+\": \"+this.message};function g(a){this.a=a}g.prototype.setItem=funct",
    "ion(a,c){try{this.a.setItem(a,c+\"\")}catch(r){throw new d(13,r.message",
    ");}};g.prototype.getItem=function(a){return this.a.getItem(a)};g.protot",
    "ype.removeItem=function(a){var c=this.getItem(a);this.a.removeItem(a);r",
    "eturn c};g.prototype.clear=function(){this.a.clear()};g.prototype.size=",
    "function(){return this.a.length};g.prototype.key=function(a){return thi",
    "s.a.key(a)};function h(a){var c=b||b;if(null!=c.sessionStorage&&null!=c",
    ".sessionStorage.clear)c=new g(b.sessionStorage);else throw new d(13,\"S",
    "ession storage undefined\");return c.getItem(a)}var k=[\"_\"],m=this;k[",
    "0]in m||!m.execScript||m.execScript(\"var \"+k[0]);for(var n;k.length&&",
    "(n=k.shift());){var q;if(q=!k.length)q=void 0!==h;q?m[n]=h:m=m[n]&&m[n]",
    "!==Object.prototype[n]?m[n]:m[n]={}};; return this._.apply(null,argumen",
    "ts);}.apply({navigator:typeof window!='undefined'?window.navigator:null",
    ",document:typeof window!='undefined'?window.document:null}, arguments);",
    "}",
    NULL
};

const char* const GET_SESSION_STORAGE_KEY[] = {
    "function(){return function(){var b=window;function d(a,c){this.code=a;t",
    "his.state=e[a]||f;this.message=c||\"\";a=this.state.replace(/((?:^|\\s+",
    ")[a-z])/g,function(a){return a.toUpperCase().replace(/^[\\s\\xa0]+/g,\"",
    "\")});c=a.length-5;if(0>c||a.indexOf(\"Error\",c)!=c)a+=\"Error\";this.",
    "name=a;a=Error(this.message);a.name=this.name;this.stack=a.stack||\"\"}",
    "\n(function(){var a=Error;function c(){}c.prototype=a.prototype;d.c=a.p",
    "rototype;d.prototype=new c;d.prototype.constructor=d;d.b=function(c,t,u",
    "){for(var p=Array(arguments.length-2),l=2;l<arguments.length;l++)p[l-2]",
    "=arguments[l];return a.prototype[t].apply(c,p)}})();var f=\"unknown err",
    "or\",e={15:\"element not selectable\",11:\"element not visible\"};e[31]",
    "=f;e[30]=f;e[24]=\"invalid cookie domain\";e[29]=\"invalid element coor",
    "dinates\";e[12]=\"invalid element state\";e[32]=\"invalid selector\";e[",
    "51]=\"invalid selector\";\ne[52]=\"invalid selector\";e[17]=\"javascrip",
    "t error\";e[405]=\"unsupported operation\";e[34]=\"move target out of b",
    "ounds\";e[27]=\"no such alert\";e[7]=\"no such element\";e[8]=\"no such",
    " frame\";e[23]=\"no such window\";e[28]=\"script timeout\";e[33]=\"sess",
    "ion not created\";e[10]=\"stale element reference\";e[21]=\"timeout\";e",
    "[25]=\"unable to set cookie\";e[26]=\"unexpected alert open\";e[13]=f;e",
    "[9]=\"unknown command\";d.prototype.toString=function(){return this.nam",
    "e+\": \"+this.message};function g(a){this.a=a}g.prototype.setItem=funct",
    "ion(a,c){try{this.a.setItem(a,c+\"\")}catch(r){throw new d(13,r.message",
    ");}};g.prototype.getItem=function(a){return this.a.getItem(a)};g.protot",
    "ype.removeItem=function(a){var c=this.getItem(a);this.a.removeItem(a);r",
    "eturn c};g.prototype.clear=function(){this.a.clear()};g.prototype.size=",
    "function(){return this.a.length};g.prototype.key=function(a){return thi",
    "s.a.key(a)};function h(a){var c=b||b;if(null!=c.sessionStorage&&null!=c",
    ".sessionStorage.clear)c=new g(b.sessionStorage);else throw new d(13,\"S",
    "ession storage undefined\");return c.key(a)}var k=[\"_\"],m=this;k[0]in",
    " m||!m.execScript||m.execScript(\"var \"+k[0]);for(var n;k.length&&(n=k",
    ".shift());){var q;if(q=!k.length)q=void 0!==h;q?m[n]=h:m=m[n]&&m[n]!==O",
    "bject.prototype[n]?m[n]:m[n]={}};; return this._.apply(null,arguments);",
    "}.apply({navigator:typeof window!='undefined'?window.navigator:null,doc",
    "ument:typeof window!='undefined'?window.document:null}, arguments);}",
    NULL
};

const char* const GET_SESSION_STORAGE_KEYS[] = {
    "function(){return function(){var b=window;function d(a,c){this.code=a;t",
    "his.state=e[a]||f;this.message=c||\"\";a=this.state.replace(/((?:^|\\s+",
    ")[a-z])/g,function(a){return a.toUpperCase().replace(/^[\\s\\xa0]+/g,\"",
    "\")});c=a.length-5;if(0>c||a.indexOf(\"Error\",c)!=c)a+=\"Error\";this.",
    "name=a;a=Error(this.message);a.name=this.name;this.stack=a.stack||\"\"}",
    "\n(function(){var a=Error;function c(){}c.prototype=a.prototype;d.c=a.p",
    "rototype;d.prototype=new c;d.prototype.constructor=d;d.b=function(c,k,t",
    "){for(var h=Array(arguments.length-2),n=2;n<arguments.length;n++)h[n-2]",
    "=arguments[n];return a.prototype[k].apply(c,h)}})();var f=\"unknown err",
    "or\",e={15:\"element not selectable\",11:\"element not visible\"};e[31]",
    "=f;e[30]=f;e[24]=\"invalid cookie domain\";e[29]=\"invalid element coor",
    "dinates\";e[12]=\"invalid element state\";e[32]=\"invalid selector\";e[",
    "51]=\"invalid selector\";\ne[52]=\"invalid selector\";e[17]=\"javascrip",
    "t error\";e[405]=\"unsupported operation\";e[34]=\"move target out of b",
    "ounds\";e[27]=\"no such alert\";e[7]=\"no such element\";e[8]=\"no such",
    " frame\";e[23]=\"no such window\";e[28]=\"script timeout\";e[33]=\"sess",
    "ion not created\";e[10]=\"stale element reference\";e[21]=\"timeout\";e",
    "[25]=\"unable to set cookie\";e[26]=\"unexpected alert open\";e[13]=f;e",
    "[9]=\"unknown command\";d.prototype.toString=function(){return this.nam",
    "e+\": \"+this.message};function g(a){this.a=a}g.prototype.setItem=funct",
    "ion(a,c){try{this.a.setItem(a,c+\"\")}catch(h){throw new d(13,h.message",
    ");}};g.prototype.getItem=function(a){return this.a.getItem(a)};g.protot",
    "ype.removeItem=function(a){var c=this.getItem(a);this.a.removeItem(a);r",
    "eturn c};g.prototype.clear=function(){this.a.clear()};g.prototype.size=",
    "function(){return this.a.length};g.prototype.key=function(a){return thi",
    "s.a.key(a)};function l(){var a=b||b;if(null!=a.sessionStorage&&null!=a.",
    "sessionStorage.clear)a=new g(b.sessionStorage);else throw new d(13,\"Se",
    "ssion storage undefined\");for(var c=[],h=a.size(),k=0;k<h;k++)c[k]=a.a",
    ".key(k);return c}var m=[\"_\"],p=this;m[0]in p||!p.execScript||p.execSc",
    "ript(\"var \"+m[0]);for(var q;m.length&&(q=m.shift());){var r;if(r=!m.l",
    "ength)r=void 0!==l;r?p[q]=l:p=p[q]&&p[q]!==Object.prototype[q]?p[q]:p[q",
    "]={}};; return this._.apply(null,arguments);}.apply({navigator:typeof w",
    "indow!='undefined'?window.navigator:null,document:typeof window!='undef",
    "ined'?window.document:null}, arguments);}",
    NULL
};

const char* const GET_SESSION_STORAGE_SIZE[] = {
    "function(){return function(){var b=window;function d(a,c){this.code=a;t",
    "his.state=e[a]||f;this.message=c||\"\";a=this.state.replace(/((?:^|\\s+",
    ")[a-z])/g,function(a){return a.toUpperCase().replace(/^[\\s\\xa0]+/g,\"",
    "\")});c=a.length-5;if(0>c||a.indexOf(\"Error\",c)!=c)a+=\"Error\";this.",
    "name=a;a=Error(this.message);a.name=this.name;this.stack=a.stack||\"\"}",
    "\n(function(){var a=Error;function c(){}c.prototype=a.prototype;d.c=a.p",
    "rototype;d.prototype=new c;d.prototype.constructor=d;d.b=function(c,t,u",
    "){for(var p=Array(arguments.length-2),l=2;l<arguments.length;l++)p[l-2]",
    "=arguments[l];return a.prototype[t].apply(c,p)}})();var f=\"unknown err",
    "or\",e={15:\"element not selectable\",11:\"element not visible\"};e[31]",
    "=f;e[30]=f;e[24]=\"invalid cookie domain\";e[29]=\"invalid element coor",
    "dinates\";e[12]=\"invalid element state\";e[32]=\"invalid selector\";e[",
    "51]=\"invalid selector\";\ne[52]=\"invalid selector\";e[17]=\"javascrip",
    "t error\";e[405]=\"unsupported operation\";e[34]=\"move target out of b",
    "ounds\";e[27]=\"no such alert\";e[7]=\"no such element\";e[8]=\"no such",
    " frame\";e[23]=\"no such window\";e[28]=\"script timeout\";e[33]=\"sess",
    "ion not created\";e[10]=\"stale element reference\";e[21]=\"timeout\";e",
    "[25]=\"unable to set cookie\";e[26]=\"unexpected alert open\";e[13]=f;e",
    "[9]=\"unknown command\";d.prototype.toString=function(){return this.nam",
    "e+\": \"+this.message};function g(a){this.a=a}g.prototype.setItem=funct",
    "ion(a,c){try{this.a.setItem(a,c+\"\")}catch(r){throw new d(13,r.message",
    ");}};g.prototype.getItem=function(a){return this.a.getItem(a)};g.protot",
    "ype.removeItem=function(a){var c=this.getItem(a);this.a.removeItem(a);r",
    "eturn c};g.prototype.clear=function(){this.a.clear()};g.prototype.size=",
    "function(){return this.a.length};g.prototype.key=function(a){return thi",
    "s.a.key(a)};function h(){var a=b||b;if(null!=a.sessionStorage&&null!=a.",
    "sessionStorage.clear)a=new g(b.sessionStorage);else throw new d(13,\"Se",
    "ssion storage undefined\");return a.size()}var k=[\"_\"],m=this;k[0]in ",
    "m||!m.execScript||m.execScript(\"var \"+k[0]);for(var n;k.length&&(n=k.",
    "shift());){var q;if(q=!k.length)q=void 0!==h;q?m[n]=h:m=m[n]&&m[n]!==Ob",
    "ject.prototype[n]?m[n]:m[n]={}};; return this._.apply(null,arguments);}",
    ".apply({navigator:typeof window!='undefined'?window.navigator:null,docu",
    "ment:typeof window!='undefined'?window.document:null}, arguments);}",
    NULL
};

const char* const GET_TEXT[] = {
    "function(){return function(){var g,aa=this;function k(a){return void 0!",
    "==a}function l(a){return\"string\"==typeof a}function n(a){return\"numb",
    "er\"==typeof a}function ba(a,b){a=a.split(\".\");var c=aa;a[0]in c||!c.",
    "execScript||c.execScript(\"var \"+a[0]);for(var d;a.length&&(d=a.shift(",
    "));)!a.length&&k(b)?c[d]=b:c=c[d]&&c[d]!==Object.prototype[d]?c[d]:c[d]",
    "={}}\nfunction ca(a){var b=typeof a;if(\"object\"==b)if(a){if(a instanc",
    "eof Array)return\"array\";if(a instanceof Object)return b;var c=Object.",
    "prototype.toString.call(a);if(\"[object Window]\"==c)return\"object\";i",
    "f(\"[object Array]\"==c||\"number\"==typeof a.length&&\"undefined\"!=ty",
    "peof a.splice&&\"undefined\"!=typeof a.propertyIsEnumerable&&!a.propert",
    "yIsEnumerable(\"splice\"))return\"array\";if(\"[object Function]\"==c||",
    "\"undefined\"!=typeof a.call&&\"undefined\"!=typeof a.propertyIsEnumera",
    "ble&&!a.propertyIsEnumerable(\"call\"))return\"function\"}else return\"",
    "null\";\nelse if(\"function\"==b&&\"undefined\"==typeof a.call)return\"",
    "object\";return b}function da(a){var b=ca(a);return\"array\"==b||\"obje",
    "ct\"==b&&\"number\"==typeof a.length}function ea(a){var b=typeof a;retu",
    "rn\"object\"==b&&null!=a||\"function\"==b}function fa(a,b,c){return a.c",
    "all.apply(a.bind,arguments)}\nfunction ga(a,b,c){if(!a)throw Error();if",
    "(2<arguments.length){var d=Array.prototype.slice.call(arguments,2);retu",
    "rn function(){var c=Array.prototype.slice.call(arguments);Array.prototy",
    "pe.unshift.apply(c,d);return a.apply(b,c)}}return function(){return a.a",
    "pply(b,arguments)}}function ha(a,b,c){ha=Function.prototype.bind&&-1!=F",
    "unction.prototype.bind.toString().indexOf(\"native code\")?fa:ga;return",
    " ha.apply(null,arguments)}\nfunction ia(a,b){var c=Array.prototype.slic",
    "e.call(arguments,1);return function(){var b=c.slice();b.push.apply(b,ar",
    "guments);return a.apply(this,b)}}function p(a,b){function c(){}c.protot",
    "ype=b.prototype;a.ya=b.prototype;a.prototype=new c;a.prototype.construc",
    "tor=a;a.wa=function(a,c,f){for(var d=Array(arguments.length-2),e=2;e<ar",
    "guments.length;e++)d[e-2]=arguments[e];return b.prototype[c].apply(a,d)",
    "}};function ja(a){var b=a.length-1;return 0<=b&&a.indexOf(\" \",b)==b}v",
    "ar ka=String.prototype.trim?function(a){return a.trim()}:function(a){re",
    "turn a.replace(/^[\\s\\xa0]+|[\\s\\xa0]+$/g,\"\")};function la(a,b){ret",
    "urn a<b?-1:a>b?1:0}function ma(a){return String(a).replace(/\\-([a-z])/",
    "g,function(a,c){return c.toUpperCase()})};function na(a,b){if(l(a))retu",
    "rn l(b)&&1==b.length?a.indexOf(b,0):-1;for(var c=0;c<a.length;c++)if(c ",
    "in a&&a[c]===b)return c;return-1}function q(a,b){for(var c=a.length,d=l",
    "(a)?a.split(\"\"):a,e=0;e<c;e++)e in d&&b.call(void 0,d[e],e,a)}functio",
    "n t(a,b,c){var d=c;q(a,function(c,f){d=b.call(void 0,d,c,f,a)});return ",
    "d}function oa(a,b){for(var c=a.length,d=l(a)?a.split(\"\"):a,e=0;e<c;e+",
    "+)if(e in d&&b.call(void 0,d[e],e,a))return!0;return!1}\nfunction pa(a,",
    "b){for(var c=a.length,d=l(a)?a.split(\"\"):a,e=0;e<c;e++)if(e in d&&!b.",
    "call(void 0,d[e],e,a))return!1;return!0}function qa(a){return Array.pro",
    "totype.concat.apply([],arguments)}function ra(a){var b=a.length;if(0<b)",
    "{for(var c=Array(b),d=0;d<b;d++)c[d]=a[d];return c}return[]}function sa",
    "(a,b,c){return 2>=arguments.length?Array.prototype.slice.call(a,b):Arra",
    "y.prototype.slice.call(a,b,c)};var ta={aliceblue:\"#f0f8ff\",antiquewhi",
    "te:\"#faebd7\",aqua:\"#00ffff\",aquamarine:\"#7fffd4\",azure:\"#f0ffff",
    "\",beige:\"#f5f5dc\",bisque:\"#ffe4c4\",black:\"#000000\",blanchedalmon",
    "d:\"#ffebcd\",blue:\"#0000ff\",blueviolet:\"#8a2be2\",brown:\"#a52a2a\"",
    ",burlywood:\"#deb887\",cadetblue:\"#5f9ea0\",chartreuse:\"#7fff00\",cho",
    "colate:\"#d2691e\",coral:\"#ff7f50\",cornflowerblue:\"#6495ed\",cornsil",
    "k:\"#fff8dc\",crimson:\"#dc143c\",cyan:\"#00ffff\",darkblue:\"#00008b\"",
    ",darkcyan:\"#008b8b\",darkgoldenrod:\"#b8860b\",darkgray:\"#a9a9a9\",da",
    "rkgreen:\"#006400\",\ndarkgrey:\"#a9a9a9\",darkkhaki:\"#bdb76b\",darkma",
    "genta:\"#8b008b\",darkolivegreen:\"#556b2f\",darkorange:\"#ff8c00\",dar",
    "korchid:\"#9932cc\",darkred:\"#8b0000\",darksalmon:\"#e9967a\",darkseag",
    "reen:\"#8fbc8f\",darkslateblue:\"#483d8b\",darkslategray:\"#2f4f4f\",da",
    "rkslategrey:\"#2f4f4f\",darkturquoise:\"#00ced1\",darkviolet:\"#9400d3",
    "\",deeppink:\"#ff1493\",deepskyblue:\"#00bfff\",dimgray:\"#696969\",dim",
    "grey:\"#696969\",dodgerblue:\"#1e90ff\",firebrick:\"#b22222\",floralwhi",
    "te:\"#fffaf0\",forestgreen:\"#228b22\",fuchsia:\"#ff00ff\",gainsboro:\"",
    "#dcdcdc\",\nghostwhite:\"#f8f8ff\",gold:\"#ffd700\",goldenrod:\"#daa520",
    "\",gray:\"#808080\",green:\"#008000\",greenyellow:\"#adff2f\",grey:\"#8",
    "08080\",honeydew:\"#f0fff0\",hotpink:\"#ff69b4\",indianred:\"#cd5c5c\",",
    "indigo:\"#4b0082\",ivory:\"#fffff0\",khaki:\"#f0e68c\",lavender:\"#e6e6",
    "fa\",lavenderblush:\"#fff0f5\",lawngreen:\"#7cfc00\",lemonchiffon:\"#ff",
    "facd\",lightblue:\"#add8e6\",lightcoral:\"#f08080\",lightcyan:\"#e0ffff",
    "\",lightgoldenrodyellow:\"#fafad2\",lightgray:\"#d3d3d3\",lightgreen:\"",
    "#90ee90\",lightgrey:\"#d3d3d3\",lightpink:\"#ffb6c1\",lightsalmon:\"#ff",
    "a07a\",\nlightseagreen:\"#20b2aa\",lightskyblue:\"#87cefa\",lightslateg",
    "ray:\"#778899\",lightslategrey:\"#778899\",lightsteelblue:\"#b0c4de\",l",
    "ightyellow:\"#ffffe0\",lime:\"#00ff00\",limegreen:\"#32cd32\",linen:\"#",
    "faf0e6\",magenta:\"#ff00ff\",maroon:\"#800000\",mediumaquamarine:\"#66c",
    "daa\",mediumblue:\"#0000cd\",mediumorchid:\"#ba55d3\",mediumpurple:\"#9",
    "370db\",mediumseagreen:\"#3cb371\",mediumslateblue:\"#7b68ee\",mediumsp",
    "ringgreen:\"#00fa9a\",mediumturquoise:\"#48d1cc\",mediumvioletred:\"#c7",
    "1585\",midnightblue:\"#191970\",mintcream:\"#f5fffa\",mistyrose:\"#ffe4",
    "e1\",\nmoccasin:\"#ffe4b5\",navajowhite:\"#ffdead\",navy:\"#000080\",ol",
    "dlace:\"#fdf5e6\",olive:\"#808000\",olivedrab:\"#6b8e23\",orange:\"#ffa",
    "500\",orangered:\"#ff4500\",orchid:\"#da70d6\",palegoldenrod:\"#eee8aa",
    "\",palegreen:\"#98fb98\",paleturquoise:\"#afeeee\",palevioletred:\"#db7",
    "093\",papayawhip:\"#ffefd5\",peachpuff:\"#ffdab9\",peru:\"#cd853f\",pin",
    "k:\"#ffc0cb\",plum:\"#dda0dd\",powderblue:\"#b0e0e6\",purple:\"#800080",
    "\",red:\"#ff0000\",rosybrown:\"#bc8f8f\",royalblue:\"#4169e1\",saddlebr",
    "own:\"#8b4513\",salmon:\"#fa8072\",sandybrown:\"#f4a460\",seagreen:\"#2",
    "e8b57\",\nseashell:\"#fff5ee\",sienna:\"#a0522d\",silver:\"#c0c0c0\",sk",
    "yblue:\"#87ceeb\",slateblue:\"#6a5acd\",slategray:\"#708090\",slategrey",
    ":\"#708090\",snow:\"#fffafa\",springgreen:\"#00ff7f\",steelblue:\"#4682",
    "b4\",tan:\"#d2b48c\",teal:\"#008080\",thistle:\"#d8bfd8\",tomato:\"#ff6",
    "347\",turquoise:\"#40e0d0\",violet:\"#ee82ee\",wheat:\"#f5deb3\",white:",
    "\"#ffffff\",whitesmoke:\"#f5f5f5\",yellow:\"#ffff00\",yellowgreen:\"#9a",
    "cd32\"};var ua=\"backgroundColor borderTopColor borderRightColor border",
    "BottomColor borderLeftColor color outlineColor\".split(\" \"),va=/#([0-",
    "9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])/,wa=/^#(?:[0-9a-f]{3}){1,2}$/i,xa=/",
    "^(?:rgba)?\\((\\d{1,3}),\\s?(\\d{1,3}),\\s?(\\d{1,3}),\\s?(0|1|0\\.\\d*",
    ")\\)$/i,ya=/^(?:rgb)?\\((0|[1-9]\\d{0,2}),\\s?(0|[1-9]\\d{0,2}),\\s?(0|",
    "[1-9]\\d{0,2})\\)$/i;function za(a,b){this.code=a;this.state=u[a]||Aa;t",
    "his.message=b||\"\";a=this.state.replace(/((?:^|\\s+)[a-z])/g,function(",
    "a){return a.toUpperCase().replace(/^[\\s\\xa0]+/g,\"\")});b=a.length-5;",
    "if(0>b||a.indexOf(\"Error\",b)!=b)a+=\"Error\";this.name=a;a=Error(this",
    ".message);a.name=this.name;this.stack=a.stack||\"\"}p(za,Error);var Aa=",
    "\"unknown error\",u={15:\"element not selectable\",11:\"element not vis",
    "ible\"};u[31]=Aa;u[30]=Aa;u[24]=\"invalid cookie domain\";u[29]=\"inval",
    "id element coordinates\";u[12]=\"invalid element state\";\nu[32]=\"inva",
    "lid selector\";u[51]=\"invalid selector\";u[52]=\"invalid selector\";u[",
    "17]=\"javascript error\";u[405]=\"unsupported operation\";u[34]=\"move ",
    "target out of bounds\";u[27]=\"no such alert\";u[7]=\"no such element\"",
    ";u[8]=\"no such frame\";u[23]=\"no such window\";u[28]=\"script timeout",
    "\";u[33]=\"session not created\";u[10]=\"stale element reference\";u[21",
    "]=\"timeout\";u[25]=\"unable to set cookie\";u[26]=\"unexpected alert o",
    "pen\";u[13]=Aa;u[9]=\"unknown command\";za.prototype.toString=function(",
    "){return this.name+\": \"+this.message};var Ca;a:{var Da=aa.navigator;i",
    "f(Da){var Ea=Da.userAgent;if(Ea){Ca=Ea;break a}}Ca=\"\"};function Fa(a)",
    "{var b=Ga;Object.prototype.hasOwnProperty.call(b,\"528\")||(b[\"528\"]=",
    "a(\"528\"))};var Ha=-1!=Ca.indexOf(\"Macintosh\"),Ia=-1!=Ca.indexOf(\"W",
    "indows\"),Ja,Ka=\"\",La=/WebKit\\/(\\S+)/.exec(Ca);La&&(Ka=La?La[1]:\"",
    "\");Ja=Ka;var Ga={};\nfunction Ma(){Fa(function(){for(var a=0,b=ka(Stri",
    "ng(Ja)).split(\".\"),c=ka(\"528\").split(\".\"),d=Math.max(b.length,c.l",
    "ength),e=0;0==a&&e<d;e++){var f=b[e]||\"\",h=c[e]||\"\";do{f=/(\\d*)(",
    "\\D*)(.*)/.exec(f)||[\"\",\"\",\"\",\"\"];h=/(\\d*)(\\D*)(.*)/.exec(h)|",
    "|[\"\",\"\",\"\",\"\"];if(0==f[0].length&&0==h[0].length)break;a=la(0==",
    "f[1].length?0:parseInt(f[1],10),0==h[1].length?0:parseInt(h[1],10))||la",
    "(0==f[2].length,0==h[2].length)||la(f[2],h[2]);f=f[3];h=h[3]}while(0==a",
    ")}return 0<=a})};function w(a,b){this.x=k(a)?a:0;this.y=k(b)?b:0}g=w.pr",
    "ototype;g.clone=function(){return new w(this.x,this.y)};g.toString=func",
    "tion(){return\"(\"+this.x+\", \"+this.y+\")\"};g.ceil=function(){this.x",
    "=Math.ceil(this.x);this.y=Math.ceil(this.y);return this};g.floor=functi",
    "on(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);return this};g",
    ".round=function(){this.x=Math.round(this.x);this.y=Math.round(this.y);r",
    "eturn this};\ng.translate=function(a,b){a instanceof w?(this.x+=a.x,thi",
    "s.y+=a.y):(this.x+=Number(a),n(b)&&(this.y+=b));return this};g.scale=fu",
    "nction(a,b){b=n(b)?b:a;this.x*=a;this.y*=b;return this};function Na(a,b",
    "){this.width=a;this.height=b}g=Na.prototype;g.clone=function(){return n",
    "ew Na(this.width,this.height)};g.toString=function(){return\"(\"+this.w",
    "idth+\" x \"+this.height+\")\"};g.ceil=function(){this.width=Math.ceil(",
    "this.width);this.height=Math.ceil(this.height);return this};g.floor=fun",
    "ction(){this.width=Math.floor(this.width);this.height=Math.floor(this.h",
    "eight);return this};g.round=function(){this.width=Math.round(this.width",
    ");this.height=Math.round(this.height);return this};\ng.scale=function(a",
    ",b){b=n(b)?b:a;this.width*=a;this.height*=b;return this};function Oa(a,",
    "b,c){function d(c){c&&b.appendChild(l(c)?a.createTextNode(c):c)}for(var",
    " e=1;e<c.length;e++){var f=c[e];!da(f)||ea(f)&&0<f.nodeType?d(f):q(Pa(f",
    ")?ra(f):f,d)}}function Qa(a){for(;a&&1!=a.nodeType;)a=a.previousSibling",
    ";return a}function Ra(a,b){if(!a||!b)return!1;if(a.contains&&1==b.nodeT",
    "ype)return a==b||a.contains(b);if(\"undefined\"!=typeof a.compareDocume",
    "ntPosition)return a==b||!!(a.compareDocumentPosition(b)&16);for(;b&&a!=",
    "b;)b=b.parentNode;return b==a}\nfunction Sa(a,b){if(a==b)return 0;if(a.",
    "compareDocumentPosition)return a.compareDocumentPosition(b)&2?1:-1;if(",
    "\"sourceIndex\"in a||a.parentNode&&\"sourceIndex\"in a.parentNode){var ",
    "c=1==a.nodeType,d=1==b.nodeType;if(c&&d)return a.sourceIndex-b.sourceIn",
    "dex;var e=a.parentNode,f=b.parentNode;return e==f?Ta(a,b):!c&&Ra(e,b)?-",
    "1*Ua(a,b):!d&&Ra(f,a)?Ua(b,a):(c?a.sourceIndex:e.sourceIndex)-(d?b.sour",
    "ceIndex:f.sourceIndex)}d=x(a);c=d.createRange();c.selectNode(a);c.colla",
    "pse(!0);a=d.createRange();a.selectNode(b);\na.collapse(!0);return c.com",
    "pareBoundaryPoints(aa.Range.START_TO_END,a)}function Ua(a,b){var c=a.pa",
    "rentNode;if(c==b)return-1;for(;b.parentNode!=c;)b=b.parentNode;return T",
    "a(b,a)}function Ta(a,b){for(;b=b.previousSibling;)if(b==a)return-1;retu",
    "rn 1}function x(a){return 9==a.nodeType?a:a.ownerDocument||a.document}f",
    "unction Pa(a){if(a&&\"number\"==typeof a.length){if(ea(a))return\"funct",
    "ion\"==typeof a.item||\"string\"==typeof a.item;if(\"function\"==ca(a))",
    "return\"function\"==typeof a.item}return!1}\nfunction Va(a,b){a&&(a=a.p",
    "arentNode);for(var c=0;a;){if(b(a))return a;a=a.parentNode;c++}return n",
    "ull}function Wa(a){this.M=a||aa.document||document}g=Wa.prototype;g.get",
    "ElementsByTagName=function(a,b){return(b||this.M).getElementsByTagName(",
    "String(a))};g.createElement=function(a){return this.M.createElement(Str",
    "ing(a))};g.createTextNode=function(a){return this.M.createTextNode(Stri",
    "ng(a))};g.appendChild=function(a,b){a.appendChild(b)};g.append=function",
    "(a,b){Oa(x(a),a,arguments)};\ng.canHaveChildren=function(a){if(1!=a.nod",
    "eType)return!1;switch(a.tagName){case \"APPLET\":case \"AREA\":case \"B",
    "ASE\":case \"BR\":case \"COL\":case \"COMMAND\":case \"EMBED\":case \"F",
    "RAME\":case \"HR\":case \"IMG\":case \"INPUT\":case \"IFRAME\":case \"I",
    "SINDEX\":case \"KEYGEN\":case \"LINK\":case \"NOFRAMES\":case \"NOSCRIP",
    "T\":case \"META\":case \"OBJECT\":case \"PARAM\":case \"SCRIPT\":case ",
    "\"SOURCE\":case \"STYLE\":case \"TRACK\":case \"WBR\":return!1}return!0",
    "};g.removeNode=function(a){return a&&a.parentNode?a.parentNode.removeCh",
    "ild(a):null};\ng.contains=Ra;function y(a,b){b&&\"string\"!==typeof b&&",
    "(b=b.toString());return!!a&&1==a.nodeType&&(!b||a.tagName.toUpperCase()",
    "==b)};/*\n\n The MIT License\n\n Copyright (c) 2007 Cybozu Labs, Inc.\n",
    " Copyright (c) 2012 Google Inc.\n\n Permission is hereby granted, free ",
    "of charge, to any person obtaining a copy\n of this software and associ",
    "ated documentation files (the \"Software\"), to\n deal in the Software ",
    "without restriction, including without limitation the\n rights to use, ",
    "copy, modify, merge, publish, distribute, sublicense, and/or\n sell cop",
    "ies of the Software, and to permit persons to whom the Software is\n fu",
    "rnished to do so, subject to the following conditions:\n\n The above co",
    "pyright notice and this permission notice shall be included in\n all co",
    "pies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVI",
    "DED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCL",
    "UDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS F",
    "OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AU",
    "THORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n ",
    "LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING",
    "\n FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ",
    "DEALINGS\n IN THE SOFTWARE.\n*/\nfunction z(a,b,c){this.s=a;this.ta=b||",
    "1;this.o=c||1};function Xa(a){this.Y=a;this.O=0}function Ya(a){a=a.matc",
    "h(Za);for(var b=0;b<a.length;b++)$a.test(a[b])&&a.splice(b,1);return ne",
    "w Xa(a)}var Za=/\\$?(?:(?![0-9-\\.])(?:\\*|[\\w-\\.]+):)?(?![0-9-\\.])(",
    "?:\\*|[\\w-\\.]+)|\\/\\/|\\.\\.|::|\\d+(?:\\.\\d*)?|\\.\\d+|\"[^\"]*\"|",
    "'[^']*'|[!<>]=|\\s+|./g,$a=/^\\s/;function B(a,b){return a.Y[a.O+(b||0)",
    "]}Xa.prototype.next=function(){return this.Y[this.O++]};Xa.prototype.ba",
    "ck=function(){this.O--};Xa.prototype.empty=function(){return this.Y.len",
    "gth<=this.O};function D(a){var b=null,c=a.nodeType;1==c&&(b=a.textConte",
    "nt,b=void 0==b||null==b?a.innerText:b,b=void 0==b||null==b?\"\":b);if(",
    "\"string\"!=typeof b)if(9==c||1==c){a=9==c?a.documentElement:a.firstChi",
    "ld;for(var c=0,d=[],b=\"\";a;){do 1!=a.nodeType&&(b+=a.nodeValue),d[c++",
    "]=a;while(a=a.firstChild);for(;c&&!(a=d[--c].nextSibling););}}else b=a.",
    "nodeValue;return\"\"+b}\nfunction E(a,b,c){if(null===b)return!0;try{if(",
    "!a.getAttribute)return!1}catch(d){return!1}return null==c?!!a.getAttrib",
    "ute(b):a.getAttribute(b,2)==c}function ab(a,b,c,d,e){return bb.call(nul",
    "l,a,b,l(c)?c:null,l(d)?d:null,e||new F)}\nfunction bb(a,b,c,d,e){b.getE",
    "lementsByName&&d&&\"name\"==c?(b=b.getElementsByName(d),q(b,function(b)",
    "{a.matches(b)&&e.add(b)})):b.getElementsByClassName&&d&&\"class\"==c?(b",
    "=b.getElementsByClassName(d),q(b,function(b){b.className==d&&a.matches(",
    "b)&&e.add(b)})):a instanceof G?cb(a,b,c,d,e):b.getElementsByTagName&&(b",
    "=b.getElementsByTagName(a.getName()),q(b,function(a){E(a,c,d)&&e.add(a)",
    "}));return e}function cb(a,b,c,d,e){for(b=b.firstChild;b;b=b.nextSiblin",
    "g)E(b,c,d)&&a.matches(b)&&e.add(b),cb(a,b,c,d,e)};function F(){this.o=t",
    "his.j=null;this.J=0}function db(a){this.node=a;this.next=this.D=null}fu",
    "nction eb(a,b){if(!a.j)return b;if(!b.j)return a;var c=a.j;b=b.j;for(va",
    "r d=null,e,f=0;c&&b;)c.node==b.node?(e=c,c=c.next,b=b.next):0<Sa(c.node",
    ",b.node)?(e=b,b=b.next):(e=c,c=c.next),(e.D=d)?d.next=e:a.j=e,d=e,f++;f",
    "or(e=c||b;e;)e.D=d,d=d.next=e,f++,e=e.next;a.o=d;a.J=f;return a}F.proto",
    "type.unshift=function(a){a=new db(a);a.next=this.j;this.o?this.j.D=a:th",
    "is.j=this.o=a;this.j=a;this.J++};\nF.prototype.add=function(a){a=new db",
    "(a);a.D=this.o;this.j?this.o.next=a:this.j=this.o=a;this.o=a;this.J++};",
    "function fb(a){return(a=a.j)?a.node:null}F.prototype.v=function(){retur",
    "n this.J};function gb(a){return(a=fb(a))?D(a):\"\"}F.prototype.iterator",
    "=function(a){return new hb(this,!!a)};function hb(a,b){this.pa=a;this.a",
    "a=(this.G=b)?a.o:a.j;this.V=null}hb.prototype.next=function(){var a=thi",
    "s.aa;if(null==a)return null;var b=this.V=a;this.aa=this.G?a.D:a.next;re",
    "turn b.node};\nhb.prototype.remove=function(){var a=this.pa,b=this.V;if",
    "(!b)throw Error(\"Next must be called at least once before remove.\");v",
    "ar c=b.D,b=b.next;c?c.next=b:a.j=b;b?b.D=c:a.o=c;a.J--;this.V=null};fun",
    "ction H(a){this.i=a;this.l=this.A=!1;this.K=null}function I(a){return\"",
    "\\n  \"+a.toString().split(\"\\n\").join(\"\\n  \")}H.prototype.h=funct",
    "ion(){return this.A};function ib(a,b){a.A=b}function jb(a,b){a.l=b}H.pr",
    "ototype.C=function(){return this.K};function J(a,b){a=a.evaluate(b);ret",
    "urn a instanceof F?+gb(a):+a}function K(a,b){a=a.evaluate(b);return a i",
    "nstanceof F?gb(a):\"\"+a}function M(a,b){a=a.evaluate(b);return a insta",
    "nceof F?!!a.v():!!a};function kb(a,b,c){H.call(this,a.i);this.X=a;this.",
    "ea=b;this.ja=c;this.A=b.h()||c.h();this.l=b.l||c.l;this.X==lb&&(c.l||c.",
    "h()||4==c.i||0==c.i||!b.C()?b.l||b.h()||4==b.i||0==b.i||!c.C()||(this.K",
    "={name:c.C().name,I:b}):this.K={name:b.C().name,I:c})}p(kb,H);\nfunctio",
    "n mb(a,b,c,d,e){b=b.evaluate(d);c=c.evaluate(d);var f;if(b instanceof F",
    "&&c instanceof F){b=b.iterator();for(d=b.next();d;d=b.next())for(e=c.it",
    "erator(),f=e.next();f;f=e.next())if(a(D(d),D(f)))return!0;return!1}if(b",
    " instanceof F||c instanceof F){b instanceof F?(e=b,d=c):(e=c,d=b);f=e.i",
    "terator();for(var h=typeof d,m=f.next();m;m=f.next()){switch(h){case \"",
    "number\":m=+D(m);break;case \"boolean\":m=!!D(m);break;case \"string\":",
    "m=D(m);break;default:throw Error(\"Illegal primitive type for compariso",
    "n.\");\n}if(e==b&&a(m,d)||e==c&&a(d,m))return!0}return!1}return e?\"boo",
    "lean\"==typeof b||\"boolean\"==typeof c?a(!!b,!!c):\"number\"==typeof b",
    "||\"number\"==typeof c?a(+b,+c):a(b,c):a(+b,+c)}kb.prototype.evaluate=f",
    "unction(a){return this.X.u(this.ea,this.ja,a)};kb.prototype.toString=fu",
    "nction(){var a=\"Binary Expression: \"+this.X,a=a+I(this.ea);return a+=",
    "I(this.ja)};function nb(a,b,c,d){this.sa=a;this.ha=b;this.i=c;this.u=d}",
    "nb.prototype.toString=function(){return this.sa};var ob={};\nfunction N",
    "(a,b,c,d){if(ob.hasOwnProperty(a))throw Error(\"Binary operator already",
    " created: \"+a);a=new nb(a,b,c,d);return ob[a.toString()]=a}N(\"div\",6",
    ",1,function(a,b,c){return J(a,c)/J(b,c)});N(\"mod\",6,1,function(a,b,c)",
    "{return J(a,c)%J(b,c)});N(\"*\",6,1,function(a,b,c){return J(a,c)*J(b,c",
    ")});N(\"+\",5,1,function(a,b,c){return J(a,c)+J(b,c)});N(\"-\",5,1,func",
    "tion(a,b,c){return J(a,c)-J(b,c)});N(\"<\",4,2,function(a,b,c){return m",
    "b(function(a,b){return a<b},a,b,c)});\nN(\">\",4,2,function(a,b,c){retu",
    "rn mb(function(a,b){return a>b},a,b,c)});N(\"<=\",4,2,function(a,b,c){r",
    "eturn mb(function(a,b){return a<=b},a,b,c)});N(\">=\",4,2,function(a,b,",
    "c){return mb(function(a,b){return a>=b},a,b,c)});var lb=N(\"=\",3,2,fun",
    "ction(a,b,c){return mb(function(a,b){return a==b},a,b,c,!0)});N(\"!=\",",
    "3,2,function(a,b,c){return mb(function(a,b){return a!=b},a,b,c,!0)});N(",
    "\"and\",2,2,function(a,b,c){return M(a,c)&&M(b,c)});N(\"or\",1,2,functi",
    "on(a,b,c){return M(a,c)||M(b,c)});function pb(a,b){if(b.v()&&4!=a.i)thr",
    "ow Error(\"Primary expression must evaluate to nodeset if filter has pr",
    "edicate(s).\");H.call(this,a.i);this.ia=a;this.f=b;this.A=a.h();this.l=",
    "a.l}p(pb,H);pb.prototype.evaluate=function(a){a=this.ia.evaluate(a);ret",
    "urn qb(this.f,a)};pb.prototype.toString=function(){var a=\"Filter:\"+I(",
    "this.ia);return a+=I(this.f)};function rb(a,b){if(b.length<a.ga)throw E",
    "rror(\"Function \"+a.m+\" expects at least\"+a.ga+\" arguments, \"+b.le",
    "ngth+\" given\");if(null!==a.W&&b.length>a.W)throw Error(\"Function \"+",
    "a.m+\" expects at most \"+a.W+\" arguments, \"+b.length+\" given\");a.q",
    "a&&q(b,function(b,d){if(4!=b.i)throw Error(\"Argument \"+d+\" to functi",
    "on \"+a.m+\" is not of type Nodeset: \"+b);});H.call(this,a.i);this.N=a",
    ";this.T=b;ib(this,a.A||oa(b,function(a){return a.h()}));jb(this,a.oa&&!",
    "b.length||a.na&&!!b.length||oa(b,function(a){return a.l}))}\np(rb,H);rb",
    ".prototype.evaluate=function(a){return this.N.u.apply(null,qa(a,this.T)",
    ")};rb.prototype.toString=function(){var a=\"Function: \"+this.N;if(this",
    ".T.length)var b=t(this.T,function(a,b){return a+I(b)},\"Arguments:\"),a",
    "=a+I(b);return a};function sb(a,b,c,d,e,f,h,m,v){this.m=a;this.i=b;this",
    ".A=c;this.oa=d;this.na=e;this.u=f;this.ga=h;this.W=k(m)?m:h;this.qa=!!v",
    "}sb.prototype.toString=function(){return this.m};var tb={};\nfunction O",
    "(a,b,c,d,e,f,h,m){if(tb.hasOwnProperty(a))throw Error(\"Function alread",
    "y created: \"+a+\".\");tb[a]=new sb(a,b,c,d,!1,e,f,h,m)}O(\"boolean\",2",
    ",!1,!1,function(a,b){return M(b,a)},1);O(\"ceiling\",1,!1,!1,function(a",
    ",b){return Math.ceil(J(b,a))},1);O(\"concat\",3,!1,!1,function(a,b){ret",
    "urn t(sa(arguments,1),function(b,d){return b+K(d,a)},\"\")},2,null);O(",
    "\"contains\",2,!1,!1,function(a,b,c){b=K(b,a);a=K(c,a);return-1!=b.inde",
    "xOf(a)},2);O(\"count\",1,!1,!1,function(a,b){return b.evaluate(a).v()},",
    "1,1,!0);\nO(\"false\",2,!1,!1,function(){return!1},0);O(\"floor\",1,!1,",
    "!1,function(a,b){return Math.floor(J(b,a))},1);O(\"id\",4,!1,!1,functio",
    "n(a,b){var c=a.s,d=9==c.nodeType?c:c.ownerDocument;a=K(b,a).split(/\\s+",
    "/);var e=[];q(a,function(a){a=d.getElementById(a);!a||0<=na(e,a)||e.pus",
    "h(a)});e.sort(Sa);var f=new F;q(e,function(a){f.add(a)});return f},1);O",
    "(\"lang\",2,!1,!1,function(){return!1},1);O(\"last\",1,!0,!1,function(a",
    "){if(1!=arguments.length)throw Error(\"Function last expects ()\");retu",
    "rn a.o},0);\nO(\"local-name\",3,!1,!0,function(a,b){return(a=b?fb(b.eva",
    "luate(a)):a.s)?a.localName||a.nodeName.toLowerCase():\"\"},0,1,!0);O(\"",
    "name\",3,!1,!0,function(a,b){return(a=b?fb(b.evaluate(a)):a.s)?a.nodeNa",
    "me.toLowerCase():\"\"},0,1,!0);O(\"namespace-uri\",3,!0,!1,function(){r",
    "eturn\"\"},0,1,!0);O(\"normalize-space\",3,!1,!0,function(a,b){return(b",
    "?K(b,a):D(a.s)).replace(/[\\s\\xa0]+/g,\" \").replace(/^\\s+|\\s+$/g,\"",
    "\")},0,1);O(\"not\",2,!1,!1,function(a,b){return!M(b,a)},1);\nO(\"numbe",
    "r\",1,!1,!0,function(a,b){return b?J(b,a):+D(a.s)},0,1);O(\"position\",",
    "1,!0,!1,function(a){return a.ta},0);O(\"round\",1,!1,!1,function(a,b){r",
    "eturn Math.round(J(b,a))},1);O(\"starts-with\",2,!1,!1,function(a,b,c){",
    "b=K(b,a);a=K(c,a);return 0==b.lastIndexOf(a,0)},2);O(\"string\",3,!1,!0",
    ",function(a,b){return b?K(b,a):D(a.s)},0,1);O(\"string-length\",1,!1,!0",
    ",function(a,b){return(b?K(b,a):D(a.s)).length},0,1);\nO(\"substring\",3",
    ",!1,!1,function(a,b,c,d){c=J(c,a);if(isNaN(c)||Infinity==c||-Infinity==",
    "c)return\"\";d=d?J(d,a):Infinity;if(isNaN(d)||-Infinity===d)return\"\";",
    "c=Math.round(c)-1;var e=Math.max(c,0);a=K(b,a);return Infinity==d?a.sub",
    "string(e):a.substring(e,c+Math.round(d))},2,3);O(\"substring-after\",3,",
    "!1,!1,function(a,b,c){b=K(b,a);a=K(c,a);c=b.indexOf(a);return-1==c?\"\"",
    ":b.substring(c+a.length)},2);\nO(\"substring-before\",3,!1,!1,function(",
    "a,b,c){b=K(b,a);a=K(c,a);a=b.indexOf(a);return-1==a?\"\":b.substring(0,",
    "a)},2);O(\"sum\",1,!1,!1,function(a,b){a=b.evaluate(a).iterator();b=0;f",
    "or(var c=a.next();c;c=a.next())b+=+D(c);return b},1,1,!0);O(\"translate",
    "\",3,!1,!1,function(a,b,c,d){b=K(b,a);c=K(c,a);var e=K(d,a);d={};for(va",
    "r f=0;f<c.length;f++)a=c.charAt(f),a in d||(d[a]=e.charAt(f));c=\"\";fo",
    "r(f=0;f<b.length;f++)a=b.charAt(f),c+=a in d?d[a]:a;return c},3);O(\"tr",
    "ue\",2,!1,!1,function(){return!0},0);function G(a,b){this.la=a;this.fa=",
    "k(b)?b:null;this.H=null;switch(a){case \"comment\":this.H=8;break;case ",
    "\"text\":this.H=3;break;case \"processing-instruction\":this.H=7;break;",
    "case \"node\":break;default:throw Error(\"Unexpected argument\");}}func",
    "tion ub(a){return\"comment\"==a||\"text\"==a||\"processing-instruction",
    "\"==a||\"node\"==a}G.prototype.matches=function(a){return null===this.H",
    "||this.H==a.nodeType};G.prototype.getName=function(){return this.la};\n",
    "G.prototype.toString=function(){var a=\"Kind Test: \"+this.la;null===th",
    "is.fa||(a+=I(this.fa));return a};function vb(a){H.call(this,3);this.ka=",
    "a.substring(1,a.length-1)}p(vb,H);vb.prototype.evaluate=function(){retu",
    "rn this.ka};vb.prototype.toString=function(){return\"Literal: \"+this.k",
    "a};function wb(a,b){this.m=a.toLowerCase();a=\"*\"==this.m?\"*\":\"http",
    "://www.w3.org/1999/xhtml\";this.P=b?b.toLowerCase():a}wb.prototype.matc",
    "hes=function(a){var b=a.nodeType;if(1!=b&&2!=b)return!1;b=k(a.localName",
    ")?a.localName:a.nodeName;return\"*\"!=this.m&&this.m!=b.toLowerCase()?!",
    "1:\"*\"==this.P?!0:this.P==(a.namespaceURI?a.namespaceURI.toLowerCase()",
    ":\"http://www.w3.org/1999/xhtml\")};wb.prototype.getName=function(){ret",
    "urn this.m};\nwb.prototype.toString=function(){return\"Name Test: \"+(",
    "\"http://www.w3.org/1999/xhtml\"==this.P?\"\":this.P+\":\")+this.m};fun",
    "ction xb(a){H.call(this,1);this.ma=a}p(xb,H);xb.prototype.evaluate=func",
    "tion(){return this.ma};xb.prototype.toString=function(){return\"Number:",
    " \"+this.ma};function yb(a,b){H.call(this,a.i);this.ca=a;this.L=b;this.",
    "A=a.h();this.l=a.l;1==this.L.length&&(a=this.L[0],a.U||a.B!=zb||(a=a.S,",
    "\"*\"!=a.getName()&&(this.K={name:a.getName(),I:null})))}p(yb,H);functi",
    "on Ab(){H.call(this,4)}p(Ab,H);Ab.prototype.evaluate=function(a){var b=",
    "new F;a=a.s;9==a.nodeType?b.add(a):b.add(a.ownerDocument);return b};Ab.",
    "prototype.toString=function(){return\"Root Helper Expression\"};functio",
    "n Bb(){H.call(this,4)}p(Bb,H);Bb.prototype.evaluate=function(a){var b=n",
    "ew F;b.add(a.s);return b};\nBb.prototype.toString=function(){return\"Co",
    "ntext Helper Expression\"};function Cb(a){return\"/\"==a||\"//\"==a}\ny",
    "b.prototype.evaluate=function(a){var b=this.ca.evaluate(a);if(!(b insta",
    "nceof F))throw Error(\"Filter expression must evaluate to nodeset.\");a",
    "=this.L;for(var c=0,d=a.length;c<d&&b.v();c++){var e=a[c],f=b.iterator(",
    "e.B.G);if(e.h()||e.B!=Db)if(e.h()||e.B!=Eb){var h=f.next();for(b=e.eval",
    "uate(new z(h));null!=(h=f.next());)h=e.evaluate(new z(h)),b=eb(b,h)}els",
    "e h=f.next(),b=e.evaluate(new z(h));else{for(h=f.next();(b=f.next())&&(",
    "!h.contains||h.contains(b))&&b.compareDocumentPosition(h)&8;h=b);b=e.ev",
    "aluate(new z(h))}}return b};\nyb.prototype.toString=function(){var a=\"",
    "Path Expression:\"+I(this.ca);if(this.L.length){var b=t(this.L,function",
    "(a,b){return a+I(b)},\"Steps:\");a+=I(b)}return a};function P(a,b){this",
    ".f=a;this.G=!!b}function qb(a,b,c){for(c=c||0;c<a.f.length;c++)for(var ",
    "d=a.f[c],e=b.iterator(),f=b.v(),h,m=0;h=e.next();m++){var v=a.G?f-m:m+1",
    ";h=d.evaluate(new z(h,v,f));if(\"number\"==typeof h)v=v==h;else if(\"st",
    "ring\"==typeof h||\"boolean\"==typeof h)v=!!h;else if(h instanceof F)v=",
    "0<h.v();else throw Error(\"Predicate.evaluate returned an unexpected ty",
    "pe.\");v||e.remove()}return b}P.prototype.C=function(){return 0<this.f.",
    "length?this.f[0].C():null};\nP.prototype.h=function(){for(var a=0;a<thi",
    "s.f.length;a++){var b=this.f[a];if(b.h()||1==b.i||0==b.i)return!0}retur",
    "n!1};P.prototype.v=function(){return this.f.length};P.prototype.toStrin",
    "g=function(){return t(this.f,function(a,b){return a+I(b)},\"Predicates:",
    "\")};function Q(a,b,c,d){H.call(this,4);this.B=a;this.S=b;this.f=c||new",
    " P([]);this.U=!!d;b=this.f.C();a.va&&b&&(this.K={name:b.name,I:b.I});th",
    "is.A=this.f.h()}p(Q,H);\nQ.prototype.evaluate=function(a){var b=a.s,c=t",
    "his.C(),d=null,e=null,f=0;c&&(d=c.name,e=c.I?K(c.I,a):null,f=1);if(this",
    ".U)if(this.h()||this.B!=Fb)if(b=(new Q(Gb,new G(\"node\"))).evaluate(a)",
    ".iterator(),c=b.next())for(a=this.u(c,d,e,f);null!=(c=b.next());)a=eb(a",
    ",this.u(c,d,e,f));else a=new F;else a=ab(this.S,b,d,e),a=qb(this.f,a,f)",
    ";else a=this.u(a.s,d,e,f);return a};Q.prototype.u=function(a,b,c,d){a=t",
    "his.B.N(this.S,a,b,c);return a=qb(this.f,a,d)};\nQ.prototype.toString=f",
    "unction(){var a=\"Step:\"+I(\"Operator: \"+(this.U?\"//\":\"/\"));this.",
    "B.m&&(a+=I(\"Axis: \"+this.B));a+=I(this.S);if(this.f.v()){var b=t(this",
    ".f.f,function(a,b){return a+I(b)},\"Predicates:\");a+=I(b)}return a};fu",
    "nction Hb(a,b,c,d){this.m=a;this.N=b;this.G=c;this.va=d}Hb.prototype.to",
    "String=function(){return this.m};var Ib={};function R(a,b,c,d){if(Ib.ha",
    "sOwnProperty(a))throw Error(\"Axis already created: \"+a);b=new Hb(a,b,",
    "c,!!d);return Ib[a]=b}\nR(\"ancestor\",function(a,b){for(var c=new F;b=",
    "b.parentNode;)a.matches(b)&&c.unshift(b);return c},!0);R(\"ancestor-or-",
    "self\",function(a,b){var c=new F;do a.matches(b)&&c.unshift(b);while(b=",
    "b.parentNode);return c},!0);\nvar zb=R(\"attribute\",function(a,b){var ",
    "c=new F,d=a.getName();if(b=b.attributes)if(a instanceof G&&null===a.H||",
    "\"*\"==d)for(d=0;a=b[d];d++)c.add(a);else(a=b.getNamedItem(d))&&c.add(a",
    ");return c},!1),Fb=R(\"child\",function(a,b,c,d,e){c=l(c)?c:null;d=l(d)",
    "?d:null;e=e||new F;for(b=b.firstChild;b;b=b.nextSibling)E(b,c,d)&&a.mat",
    "ches(b)&&e.add(b);return e},!1,!0);R(\"descendant\",ab,!1,!0);\nvar Gb=",
    "R(\"descendant-or-self\",function(a,b,c,d){var e=new F;E(b,c,d)&&a.matc",
    "hes(b)&&e.add(b);return ab(a,b,c,d,e)},!1,!0),Db=R(\"following\",functi",
    "on(a,b,c,d){var e=new F;do for(var f=b;f=f.nextSibling;)E(f,c,d)&&a.mat",
    "ches(f)&&e.add(f),e=ab(a,f,c,d,e);while(b=b.parentNode);return e},!1,!0",
    ");R(\"following-sibling\",function(a,b){for(var c=new F;b=b.nextSibling",
    ";)a.matches(b)&&c.add(b);return c},!1);R(\"namespace\",function(){retur",
    "n new F},!1);\nvar Jb=R(\"parent\",function(a,b){var c=new F;if(9==b.no",
    "deType)return c;if(2==b.nodeType)return c.add(b.ownerElement),c;b=b.par",
    "entNode;a.matches(b)&&c.add(b);return c},!1),Eb=R(\"preceding\",functio",
    "n(a,b,c,d){var e=new F,f=[];do f.unshift(b);while(b=b.parentNode);for(v",
    "ar h=1,m=f.length;h<m;h++){var v=[];for(b=f[h];b=b.previousSibling;)v.u",
    "nshift(b);for(var C=0,r=v.length;C<r;C++)b=v[C],E(b,c,d)&&a.matches(b)&",
    "&e.add(b),e=ab(a,b,c,d,e)}return e},!0,!0);\nR(\"preceding-sibling\",fu",
    "nction(a,b){for(var c=new F;b=b.previousSibling;)a.matches(b)&&c.unshif",
    "t(b);return c},!0);var Kb=R(\"self\",function(a,b){var c=new F;a.matche",
    "s(b)&&c.add(b);return c},!1);function Lb(a){H.call(this,1);this.ba=a;th",
    "is.A=a.h();this.l=a.l}p(Lb,H);Lb.prototype.evaluate=function(a){return-",
    "J(this.ba,a)};Lb.prototype.toString=function(){return\"Unary Expression",
    ": -\"+I(this.ba)};function Mb(a){H.call(this,4);this.R=a;ib(this,oa(thi",
    "s.R,function(a){return a.h()}));jb(this,oa(this.R,function(a){return a.",
    "l}))}p(Mb,H);Mb.prototype.evaluate=function(a){var b=new F;q(this.R,fun",
    "ction(c){c=c.evaluate(a);if(!(c instanceof F))throw Error(\"Path expres",
    "sion must evaluate to NodeSet.\");b=eb(b,c)});return b};Mb.prototype.to",
    "String=function(){return t(this.R,function(a,b){return a+I(b)},\"Union ",
    "Expression:\")};function Nb(a,b){this.a=a;this.ra=b}function Ob(a){for(",
    "var b,c=[];;){S(a,\"Missing right hand side of binary expression.\");b=",
    "Pb(a);var d=a.a.next();if(!d)break;var e=(d=ob[d]||null)&&d.ha;if(!e){a",
    ".a.back();break}for(;c.length&&e<=c[c.length-1].ha;)b=new kb(c.pop(),c.",
    "pop(),b);c.push(b,d)}for(;c.length;)b=new kb(c.pop(),c.pop(),b);return ",
    "b}function S(a,b){if(a.a.empty())throw Error(b);}function Qb(a,b){a=a.a",
    ".next();if(a!=b)throw Error(\"Bad token, expected: \"+b+\" got: \"+a);}",
    "\nfunction Rb(a){a=a.a.next();if(\")\"!=a)throw Error(\"Bad token: \"+a",
    ");}function Sb(a){a=a.a.next();if(2>a.length)throw Error(\"Unclosed lit",
    "eral string\");return new vb(a)}\nfunction Tb(a){var b=[];if(Cb(B(a.a))",
    "){var c=a.a.next();var d=B(a.a);if(\"/\"==c&&(a.a.empty()||\".\"!=d&&\"",
    "..\"!=d&&\"@\"!=d&&\"*\"!=d&&!/(?![0-9])[\\w]/.test(d)))return new Ab;d",
    "=new Ab;S(a,\"Missing next location step.\");c=Ub(a,c);b.push(c)}else{a",
    ":{c=B(a.a);d=c.charAt(0);switch(d){case \"$\":throw Error(\"Variable re",
    "ference not allowed in HTML XPath\");case \"(\":a.a.next();c=Ob(a);S(a,",
    "'unclosed \"(\"');Qb(a,\")\");break;case '\"':case \"'\":c=Sb(a);break;",
    "default:if(isNaN(+c))if(!ub(c)&&/(?![0-9])[\\w]/.test(d)&&\"(\"==B(a.a,",
    "\n1)){c=a.a.next();c=tb[c]||null;a.a.next();for(d=[];\")\"!=B(a.a);){S(",
    "a,\"Missing function argument list.\");d.push(Ob(a));if(\",\"!=B(a.a))b",
    "reak;a.a.next()}S(a,\"Unclosed function argument list.\");Rb(a);c=new r",
    "b(c,d)}else{c=null;break a}else c=new xb(+a.a.next())}\"[\"==B(a.a)&&(d",
    "=new P(Vb(a)),c=new pb(c,d))}if(c)if(Cb(B(a.a)))d=c;else return c;else ",
    "c=Ub(a,\"/\"),d=new Bb,b.push(c)}for(;Cb(B(a.a));)c=a.a.next(),S(a,\"Mi",
    "ssing next location step.\"),c=Ub(a,c),b.push(c);return new yb(d,b)}\nf",
    "unction Ub(a,b){if(\"/\"!=b&&\"//\"!=b)throw Error('Step op should be ",
    "\"/\" or \"//\"');if(\".\"==B(a.a)){var c=new Q(Kb,new G(\"node\"));a.a",
    ".next();return c}if(\"..\"==B(a.a))return c=new Q(Jb,new G(\"node\")),a",
    ".a.next(),c;if(\"@\"==B(a.a)){var d=zb;a.a.next();S(a,\"Missing attribu",
    "te name\")}else if(\"::\"==B(a.a,1)){if(!/(?![0-9])[\\w]/.test(B(a.a).c",
    "harAt(0)))throw Error(\"Bad token: \"+a.a.next());var e=a.a.next();d=Ib",
    "[e]||null;if(!d)throw Error(\"No axis with name: \"+e);a.a.next();S(a,",
    "\"Missing node name\")}else d=Fb;e=\nB(a.a);if(/(?![0-9])[\\w\\*]/.test",
    "(e.charAt(0)))if(\"(\"==B(a.a,1)){if(!ub(e))throw Error(\"Invalid node ",
    "type: \"+e);e=a.a.next();if(!ub(e))throw Error(\"Invalid type name: \"+",
    "e);Qb(a,\"(\");S(a,\"Bad nodetype\");var f=B(a.a).charAt(0),h=null;if('",
    "\"'==f||\"'\"==f)h=Sb(a);S(a,\"Bad nodetype\");Rb(a);e=new G(e,h)}else ",
    "if(e=a.a.next(),f=e.indexOf(\":\"),-1==f)e=new wb(e);else{var h=e.subst",
    "ring(0,f);if(\"*\"==h)var m=\"*\";else if(m=a.ra(h),!m)throw Error(\"Na",
    "mespace prefix not declared: \"+h);e=e.substr(f+1);e=new wb(e,m)}else t",
    "hrow Error(\"Bad token: \"+\na.a.next());a=new P(Vb(a),d.G);return c||n",
    "ew Q(d,e,a,\"//\"==b)}function Vb(a){for(var b=[];\"[\"==B(a.a);){a.a.n",
    "ext();S(a,\"Missing predicate expression.\");var c=Ob(a);b.push(c);S(a,",
    "\"Unclosed predicate expression.\");Qb(a,\"]\")}return b}function Pb(a)",
    "{if(\"-\"==B(a.a))return a.a.next(),new Lb(Pb(a));var b=Tb(a);if(\"|\"!",
    "=B(a.a))a=b;else{for(b=[b];\"|\"==a.a.next();)S(a,\"Missing next union ",
    "location path.\"),b.push(Tb(a));a.a.back();a=new Mb(b)}return a};functi",
    "on Wb(a){switch(a.nodeType){case 1:return ia(Xb,a);case 9:return Wb(a.d",
    "ocumentElement);case 11:case 10:case 6:case 12:return Yb;default:return",
    " a.parentNode?Wb(a.parentNode):Yb}}function Yb(){return null}function X",
    "b(a,b){if(a.prefix==b)return a.namespaceURI||\"http://www.w3.org/1999/x",
    "html\";var c=a.getAttributeNode(\"xmlns:\"+b);return c&&c.specified?c.v",
    "alue||null:a.parentNode&&9!=a.parentNode.nodeType?Xb(a.parentNode,b):nu",
    "ll};function Zb(a,b){if(!a.length)throw Error(\"Empty XPath expression.",
    "\");a=Ya(a);if(a.empty())throw Error(\"Invalid XPath expression.\");b?",
    "\"function\"==ca(b)||(b=ha(b.lookupNamespaceURI,b)):b=function(){return",
    " null};var c=Ob(new Nb(a,b));if(!a.empty())throw Error(\"Bad token: \"+",
    "a.next());this.evaluate=function(a,b){a=c.evaluate(new z(a));return new",
    " U(a,b)}}\nfunction U(a,b){if(0==b)if(a instanceof F)b=4;else if(\"stri",
    "ng\"==typeof a)b=2;else if(\"number\"==typeof a)b=1;else if(\"boolean\"",
    "==typeof a)b=3;else throw Error(\"Unexpected evaluation result.\");if(2",
    "!=b&&1!=b&&3!=b&&!(a instanceof F))throw Error(\"value could not be con",
    "verted to the specified type\");this.resultType=b;switch(b){case 2:this",
    ".stringValue=a instanceof F?gb(a):\"\"+a;break;case 1:this.numberValue=",
    "a instanceof F?+gb(a):+a;break;case 3:this.booleanValue=a instanceof F?",
    "0<a.v():!!a;break;case 4:case 5:case 6:case 7:var c=\na.iterator();var ",
    "d=[];for(var e=c.next();e;e=c.next())d.push(e);this.snapshotLength=a.v(",
    ");this.invalidIteratorState=!1;break;case 8:case 9:this.singleNodeValue",
    "=fb(a);break;default:throw Error(\"Unknown XPathResult type.\");}var f=",
    "0;this.iterateNext=function(){if(4!=b&&5!=b)throw Error(\"iterateNext c",
    "alled with wrong result type\");return f>=d.length?null:d[f++]};this.sn",
    "apshotItem=function(a){if(6!=b&&7!=b)throw Error(\"snapshotItem called ",
    "with wrong result type\");return a>=d.length||0>a?null:d[a]}}\nU.ANY_TY",
    "PE=0;U.NUMBER_TYPE=1;U.STRING_TYPE=2;U.BOOLEAN_TYPE=3;U.UNORDERED_NODE_",
    "ITERATOR_TYPE=4;U.ORDERED_NODE_ITERATOR_TYPE=5;U.UNORDERED_NODE_SNAPSHO",
    "T_TYPE=6;U.ORDERED_NODE_SNAPSHOT_TYPE=7;U.ANY_UNORDERED_NODE_TYPE=8;U.F",
    "IRST_ORDERED_NODE_TYPE=9;function $b(a){this.lookupNamespaceURI=Wb(a)}",
    "\nba(\"wgxpath.install\",function(a,b){a=a||aa;var c=a.Document&&a.Docu",
    "ment.prototype||a.document;if(!c.evaluate||b)a.XPathResult=U,c.evaluate",
    "=function(a,b,c,h){return(new Zb(a,c)).evaluate(b,h)},c.createExpressio",
    "n=function(a,b){return new Zb(a,b)},c.createNSResolver=function(a){retu",
    "rn new $b(a)}});var V={};V.Z=function(){var a={za:\"http://www.w3.org/2",
    "000/svg\"};return function(b){return a[b]||null}}();\nV.u=function(a,b,",
    "c){var d=x(a);if(!d.documentElement)return null;try{for(var e=d.createN",
    "SResolver?d.createNSResolver(d.documentElement):V.Z,f={},h=d.getElement",
    "sByTagName(\"*\"),m=0;m<h.length;++m){var v=h[m],C=v.namespaceURI;if(C&",
    "&!f[C]){var r=v.lookupPrefix(C);if(!r)var A=C.match(\".*/(\\\\w+)/?$\")",
    ",r=A?A[1]:\"xhtml\";f[C]=r}}var L={},T;for(T in f)L[f[T]]=T;e=function(",
    "a){return L[a]||null};try{return d.evaluate(b,a,e,c,null)}catch(Ba){if(",
    "\"TypeError\"===Ba.name)return e=d.createNSResolver?d.createNSResolver(",
    "d.documentElement):\nV.Z,d.evaluate(b,a,e,c,null);throw Ba;}}catch(Ba){",
    "throw new za(32,\"Unable to locate an element with the xpath expression",
    " \"+b+\" because of the following error:\\n\"+Ba);}};V.$=function(a,b){",
    "if(!a||1!=a.nodeType)throw new za(32,'The result of the xpath expressio",
    "n \"'+b+'\" is: '+a+\". It should be an element.\");};\nV.ua=function(a",
    ",b){var c=function(){var c=V.u(b,a,9);return c?c.singleNodeValue||null:",
    "b.selectSingleNode?(c=x(b),c.setProperty&&c.setProperty(\"SelectionLang",
    "uage\",\"XPath\"),b.selectSingleNode(a)):null}();null===c||V.$(c,a);ret",
    "urn c};\nV.xa=function(a,b){var c=function(){var c=V.u(b,a,7);if(c){for",
    "(var e=c.snapshotLength,f=[],h=0;h<e;++h)f.push(c.snapshotItem(h));retu",
    "rn f}return b.selectNodes?(c=x(b),c.setProperty&&c.setProperty(\"Select",
    "ionLanguage\",\"XPath\"),b.selectNodes(a)):[]}();q(c,function(b){V.$(b,",
    "a)});return c};function ac(a,b,c,d){this.top=a;this.right=b;this.bottom",
    "=c;this.left=d}g=ac.prototype;g.clone=function(){return new ac(this.top",
    ",this.right,this.bottom,this.left)};g.toString=function(){return\"(\"+t",
    "his.top+\"t, \"+this.right+\"r, \"+this.bottom+\"b, \"+this.left+\"l)\"",
    "};g.contains=function(a){return this&&a?a instanceof ac?a.left>=this.le",
    "ft&&a.right<=this.right&&a.top>=this.top&&a.bottom<=this.bottom:a.x>=th",
    "is.left&&a.x<=this.right&&a.y>=this.top&&a.y<=this.bottom:!1};\ng.expan",
    "d=function(a,b,c,d){ea(a)?(this.top-=a.top,this.right+=a.right,this.bot",
    "tom+=a.bottom,this.left-=a.left):(this.top-=a,this.right+=Number(b),thi",
    "s.bottom+=Number(c),this.left-=Number(d));return this};g.ceil=function(",
    "){this.top=Math.ceil(this.top);this.right=Math.ceil(this.right);this.bo",
    "ttom=Math.ceil(this.bottom);this.left=Math.ceil(this.left);return this}",
    ";\ng.floor=function(){this.top=Math.floor(this.top);this.right=Math.flo",
    "or(this.right);this.bottom=Math.floor(this.bottom);this.left=Math.floor",
    "(this.left);return this};g.round=function(){this.top=Math.round(this.to",
    "p);this.right=Math.round(this.right);this.bottom=Math.round(this.bottom",
    ");this.left=Math.round(this.left);return this};g.translate=function(a,b",
    "){a instanceof w?(this.left+=a.x,this.right+=a.x,this.top+=a.y,this.bot",
    "tom+=a.y):(this.left+=a,this.right+=a,n(b)&&(this.top+=b,this.bottom+=b",
    "));return this};\ng.scale=function(a,b){b=n(b)?b:a;this.left*=a;this.ri",
    "ght*=a;this.top*=b;this.bottom*=b;return this};function W(a,b,c,d){this",
    ".left=a;this.top=b;this.width=c;this.height=d}g=W.prototype;g.clone=fun",
    "ction(){return new W(this.left,this.top,this.width,this.height)};g.toSt",
    "ring=function(){return\"(\"+this.left+\", \"+this.top+\" - \"+this.widt",
    "h+\"w x \"+this.height+\"h)\"};g.contains=function(a){return a instance",
    "of w?a.x>=this.left&&a.x<=this.left+this.width&&a.y>=this.top&&a.y<=thi",
    "s.top+this.height:this.left<=a.left&&this.left+this.width>=a.left+a.wid",
    "th&&this.top<=a.top&&this.top+this.height>=a.top+a.height};\ng.ceil=fun",
    "ction(){this.left=Math.ceil(this.left);this.top=Math.ceil(this.top);thi",
    "s.width=Math.ceil(this.width);this.height=Math.ceil(this.height);return",
    " this};g.floor=function(){this.left=Math.floor(this.left);this.top=Math",
    ".floor(this.top);this.width=Math.floor(this.width);this.height=Math.flo",
    "or(this.height);return this};g.round=function(){this.left=Math.round(th",
    "is.left);this.top=Math.round(this.top);this.width=Math.round(this.width",
    ");this.height=Math.round(this.height);return this};\ng.translate=functi",
    "on(a,b){a instanceof w?(this.left+=a.x,this.top+=a.y):(this.left+=a,n(b",
    ")&&(this.top+=b));return this};g.scale=function(a,b){b=n(b)?b:a;this.le",
    "ft*=a;this.width*=a;this.top*=b;this.height*=b;return this};var bc=\"fu",
    "nction\"===typeof ShadowRoot;function cc(a){for(a=a.parentNode;a&&1!=a.",
    "nodeType&&9!=a.nodeType&&11!=a.nodeType;)a=a.parentNode;return y(a)?a:n",
    "ull}\nfunction X(a,b){b=ma(b);if(\"float\"==b||\"cssFloat\"==b||\"style",
    "Float\"==b)b=\"cssFloat\";a:{var c=b;var d=x(a);if(d.defaultView&&d.def",
    "aultView.getComputedStyle&&(d=d.defaultView.getComputedStyle(a,null))){",
    "c=d[c]||d.getPropertyValue(c)||\"\";break a}c=\"\"}a=c||dc(a,b);if(null",
    "===a)a=null;else if(0<=na(ua,b)){b:{var e=a.match(xa);if(e&&(b=Number(e",
    "[1]),c=Number(e[2]),d=Number(e[3]),e=Number(e[4]),0<=b&&255>=b&&0<=c&&2",
    "55>=c&&0<=d&&255>=d&&0<=e&&1>=e)){b=[b,c,d,e];break b}b=null}if(!b)b:{i",
    "f(d=a.match(ya))if(b=Number(d[1]),\nc=Number(d[2]),d=Number(d[3]),0<=b&",
    "&255>=b&&0<=c&&255>=c&&0<=d&&255>=d){b=[b,c,d,1];break b}b=null}if(!b)b",
    ":{b=a.toLowerCase();c=ta[b.toLowerCase()];if(!c&&(c=\"#\"==b.charAt(0)?",
    "b:\"#\"+b,4==c.length&&(c=c.replace(va,\"#$1$1$2$2$3$3\")),!wa.test(c))",
    "){b=null;break b}b=[parseInt(c.substr(1,2),16),parseInt(c.substr(3,2),1",
    "6),parseInt(c.substr(5,2),16),1]}a=b?\"rgba(\"+b.join(\", \")+\")\":a}r",
    "eturn a}\nfunction dc(a,b){var c=a.currentStyle||a.style,d=c[b];!k(d)&&",
    "\"function\"==ca(c.getPropertyValue)&&(d=c.getPropertyValue(b));return",
    "\"inherit\"!=d?k(d)?d:null:(a=cc(a))?dc(a,b):null}\nfunction ec(a,b,c){",
    "function d(a){var b=fc(a);return 0<b.height&&0<b.width?!0:y(a,\"PATH\")",
    "&&(0<b.height||0<b.width)?(a=X(a,\"stroke-width\"),!!a&&0<parseInt(a,10",
    ")):\"hidden\"!=X(a,\"overflow\")&&oa(a.childNodes,function(a){return 3=",
    "=a.nodeType||y(a)&&d(a)})}function e(a){return gc(a)==Y&&pa(a.childNode",
    "s,function(a){return!y(a)||e(a)||!d(a)})}if(!y(a))throw Error(\"Argumen",
    "t to isShown must be of type Element\");if(y(a,\"BODY\"))return!0;if(y(",
    "a,\"OPTION\")||y(a,\"OPTGROUP\"))return a=Va(a,function(a){return y(a,",
    "\"SELECT\")}),\n!!a&&ec(a,!0,c);var f=hc(a);if(f)return!!f.da&&0<f.rect",
    ".width&&0<f.rect.height&&ec(f.da,b,c);if(y(a,\"INPUT\")&&\"hidden\"==a.",
    "type.toLowerCase()||y(a,\"NOSCRIPT\"))return!1;f=X(a,\"visibility\");re",
    "turn\"collapse\"!=f&&\"hidden\"!=f&&c(a)&&(b||0!=ic(a))&&d(a)?!e(a):!1}",
    "\nfunction jc(a){var b=bc?function(c){if(\"none\"==X(c,\"display\"))ret",
    "urn!1;do{var d=c.parentNode;if(c.getDestinationInsertionPoints){var e=c",
    ".getDestinationInsertionPoints();0<e.length&&(d=e[e.length-1])}if(d ins",
    "tanceof ShadowRoot)return!0;!d||9!=d.nodeType&&11!=d.nodeType||(d=null)",
    "}while(a&&1!=a.nodeType);return!d||b(d)}:function(a){if(\"none\"==X(a,",
    "\"display\"))return!1;a=cc(a);return!a||b(a)};return ec(a,!1,b)}var Y=",
    "\"hidden\";\nfunction gc(a){function b(a){function b(a){return a==h?!0:",
    "0==X(a,\"display\").lastIndexOf(\"inline\",0)||\"absolute\"==c&&\"stati",
    "c\"==X(a,\"position\")?!1:!0}var c=X(a,\"position\");if(\"fixed\"==c)re",
    "turn C=!0,a==h?null:h;for(a=cc(a);a&&!b(a);)a=cc(a);return a}function c",
    "(a){var b=a;if(\"visible\"==v)if(a==h&&m)b=m;else if(a==m)return{x:\"vi",
    "sible\",y:\"visible\"};b={x:X(b,\"overflow-x\"),y:X(b,\"overflow-y\")};",
    "a==h&&(b.x=\"visible\"==b.x?\"auto\":b.x,b.y=\"visible\"==b.y?\"auto\":",
    "b.y);return b}function d(a){if(a==h){var b=(new Wa(f)).M;\na=b.scrollin",
    "gElement?b.scrollingElement:b.body||b.documentElement;b=b.parentWindow|",
    "|b.defaultView;a=new w(b.pageXOffset||a.scrollLeft,b.pageYOffset||a.scr",
    "ollTop)}else a=new w(a.scrollLeft,a.scrollTop);return a}var e=kc(a);var",
    " f=x(a),h=f.documentElement,m=f.body,v=X(h,\"overflow\"),C;for(a=b(a);a",
    ";a=b(a)){var r=c(a);if(\"visible\"!=r.x||\"visible\"!=r.y){var A=fc(a);",
    "if(0==A.width||0==A.height)return Y;var L=e.right<A.left,T=e.bottom<A.t",
    "op;if(L&&\"hidden\"==r.x||T&&\"hidden\"==r.y)return Y;if(L&&\"visible\"",
    "!=r.x||\nT&&\"visible\"!=r.y){L=d(a);T=e.bottom<A.top-L.y;if(e.right<A.",
    "left-L.x&&\"visible\"!=r.x||T&&\"visible\"!=r.x)return Y;e=gc(a);return",
    " e==Y?Y:\"scroll\"}L=e.left>=A.left+A.width;A=e.top>=A.top+A.height;if(",
    "L&&\"hidden\"==r.x||A&&\"hidden\"==r.y)return Y;if(L&&\"visible\"!=r.x|",
    "|A&&\"visible\"!=r.y){if(C&&(r=d(a),e.left>=h.scrollWidth-r.x||e.right>",
    "=h.scrollHeight-r.y))return Y;e=gc(a);return e==Y?Y:\"scroll\"}}}return",
    "\"none\"}\nfunction fc(a){var b=hc(a);if(b)return b.rect;if(y(a,\"HTML",
    "\"))return a=x(a),a=((a?a.parentWindow||a.defaultView:window)||window).",
    "document,a=\"CSS1Compat\"==a.compatMode?a.documentElement:a.body,a=new ",
    "Na(a.clientWidth,a.clientHeight),new W(0,0,a.width,a.height);try{var c=",
    "a.getBoundingClientRect()}catch(d){return new W(0,0,0,0)}return new W(c",
    ".left,c.top,c.right-c.left,c.bottom-c.top)}\nfunction hc(a){var b=y(a,",
    "\"MAP\");if(!b&&!y(a,\"AREA\"))return null;var c=b?a:y(a.parentNode,\"M",
    "AP\")?a.parentNode:null,d=null,e=null;c&&c.name&&(d=V.ua('/descendant::",
    "*[@usemap = \"#'+c.name+'\"]',x(c)))&&(e=fc(d),b||\"default\"==a.shape.",
    "toLowerCase()||(a=lc(a),b=Math.min(Math.max(a.left,0),e.width),c=Math.m",
    "in(Math.max(a.top,0),e.height),e=new W(b+e.left,c+e.top,Math.min(a.widt",
    "h,e.width-b),Math.min(a.height,e.height-c))));return{da:d,rect:e||new W",
    "(0,0,0,0)}}\nfunction lc(a){var b=a.shape.toLowerCase();a=a.coords.spli",
    "t(\",\");if(\"rect\"==b&&4==a.length){var b=a[0],c=a[1];return new W(b,",
    "c,a[2]-b,a[3]-c)}if(\"circle\"==b&&3==a.length)return b=a[2],new W(a[0]",
    "-b,a[1]-b,2*b,2*b);if(\"poly\"==b&&2<a.length){for(var b=a[0],c=a[1],d=",
    "b,e=c,f=2;f+1<a.length;f+=2)b=Math.min(b,a[f]),d=Math.max(d,a[f]),c=Mat",
    "h.min(c,a[f+1]),e=Math.max(e,a[f+1]);return new W(b,c,d-b,e-c)}return n",
    "ew W(0,0,0,0)}function kc(a){a=fc(a);return new ac(a.top,a.left+a.width",
    ",a.top+a.height,a.left)}\nfunction mc(a){return a.replace(/^[^\\S\\xa0]",
    "+|[^\\S\\xa0]+$/g,\"\")}\nfunction nc(a,b,c){if(y(a,\"BR\"))b.push(\"\"",
    ");else{var d=y(a,\"TD\"),e=X(a,\"display\"),f=!d&&!(0<=na(oc,e)),h=k(a.",
    "previousElementSibling)?a.previousElementSibling:Qa(a.previousSibling),",
    "h=h?X(h,\"display\"):\"\",m=X(a,\"float\")||X(a,\"cssFloat\")||X(a,\"st",
    "yleFloat\");!f||\"run-in\"==h&&\"none\"==m||/^[\\s\\xa0]*$/.test(b[b.le",
    "ngth-1]||\"\")||b.push(\"\");var v=jc(a),C=null,r=null;v&&(C=X(a,\"whit",
    "e-space\"),r=X(a,\"text-transform\"));q(a.childNodes,function(a){c(a,b,",
    "v,C,r)});a=b[b.length-1]||\"\";!d&&\"table-cell\"!=e||!a||ja(a)||(b[b.l",
    "ength-\n1]+=\" \");f&&\"run-in\"!=e&&!/^[\\s\\xa0]*$/.test(a)&&b.push(",
    "\"\")}}function pc(a,b){nc(a,b,function(a,b,e,f,h){3==a.nodeType&&e?qc(",
    "a,b,f,h):y(a)&&pc(a,b)})}var oc=\"inline inline-block inline-table none",
    " table-cell table-column table-column-group\".split(\" \");\nfunction q",
    "c(a,b,c,d){a=a.nodeValue.replace(/[\\u200b\\u200e\\u200f]/g,\"\");a=a.r",
    "eplace(/(\\r\\n|\\r|\\n)/g,\"\\n\");if(\"normal\"==c||\"nowrap\"==c)a=a",
    ".replace(/\\n/g,\" \");a=\"pre\"==c||\"pre-wrap\"==c?a.replace(/[ \\f",
    "\\t\\v\\u2028\\u2029]/g,\"\\u00a0\"):a.replace(/[\\ \\f\\t\\v\\u2028\\u",
    "2029]+/g,\" \");\"capitalize\"==d?a=a.replace(/(^|\\s)(\\S)/g,function(",
    "a,b,c){return b+c.toUpperCase()}):\"uppercase\"==d?a=a.toUpperCase():\"",
    "lowercase\"==d&&(a=a.toLowerCase());c=b.pop()||\"\";ja(c)&&0==a.lastInd",
    "exOf(\" \",0)&&(a=a.substr(1));b.push(c+a)}\nfunction ic(a){var b=1,c=X",
    "(a,\"opacity\");c&&(b=Number(c));(a=cc(a))&&(b*=ic(a));return b}\nfunct",
    "ion rc(a,b,c,d,e){var f;if(3==a.nodeType&&c)qc(a,b,d,e);else if(y(a))if",
    "(y(a,\"CONTENT\")){for(f=a;f.parentNode;)f=f.parentNode;f instanceof Sh",
    "adowRoot?q(a.getDistributedNodes(),function(a){rc(a,b,c,d,e)}):sc(a,b)}",
    "else if(y(a,\"SHADOW\")){for(f=a;f.parentNode;)f=f.parentNode;if(f inst",
    "anceof ShadowRoot&&(a=f))for(a=a.olderShadowRoot;a;)q(a.childNodes,func",
    "tion(a){rc(a,b,c,d,e)}),a=a.olderShadowRoot}else sc(a,b)}\nfunction sc(",
    "a,b){a.shadowRoot&&q(a.shadowRoot.childNodes,function(a){rc(a,b,!0,null",
    ",null)});nc(a,b,function(a,b,e,f,h){var c=null;1==a.nodeType?c=a:3==a.n",
    "odeType&&(c=a);null!=c&&c.getDestinationInsertionPoints&&0<c.getDestina",
    "tionInsertionPoints().length||rc(a,b,e,f,h)})};Ma();Ma();function tc(a,",
    "b){this.w={};this.g=[];this.F=0;var c=arguments.length;if(1<c){if(c%2)t",
    "hrow Error(\"Uneven number of arguments\");for(var d=0;d<c;d+=2)this.se",
    "t(arguments[d],arguments[d+1])}else a&&this.addAll(a)}function uc(a){vc",
    "(a);return a.g.concat()}g=tc.prototype;g.clear=function(){this.w={};thi",
    "s.F=this.g.length=0};g.remove=function(a){return Object.prototype.hasOw",
    "nProperty.call(this.w,a)?(delete this.w[a],this.F--,this.g.length>2*thi",
    "s.F&&vc(this),!0):!1};\nfunction vc(a){var b,c;if(a.F!=a.g.length){for(",
    "b=c=0;c<a.g.length;){var d=a.g[c];Object.prototype.hasOwnProperty.call(",
    "a.w,d)&&(a.g[b++]=d);c++}a.g.length=b}if(a.F!=a.g.length){var e={};for(",
    "b=c=0;c<a.g.length;)d=a.g[c],Object.prototype.hasOwnProperty.call(e,d)|",
    "|(a.g[b++]=d,e[d]=1),c++;a.g.length=b}}g.get=function(a,b){return Objec",
    "t.prototype.hasOwnProperty.call(this.w,a)?this.w[a]:b};g.set=function(a",
    ",b){Object.prototype.hasOwnProperty.call(this.w,a)||(this.F++,this.g.pu",
    "sh(a));this.w[a]=b};\ng.addAll=function(a){if(a instanceof tc){var b=uc",
    "(a);vc(a);for(var c=[],d=0;d<a.g.length;d++)c.push(a.w[a.g[d]]);a=c}els",
    "e{b=[];var d=0;for(e in a)b[d++]=e;d=[];var e=0;for(c in a)d[e++]=a[c];",
    "a=d}for(c=0;c<b.length;c++)this.set(b[c],a[c])};g.forEach=function(a,b)",
    "{for(var c=uc(this),d=0;d<c.length;d++){var e=c[d],f=this.get(e);a.call",
    "(b,f,e,this)}};g.clone=function(){return new tc(this)};var wc={};functi",
    "on Z(a,b,c){ea(a)&&(a=a.b);a=new xc(a);!b||b in wc&&!c||(wc[b]={key:a,s",
    "hift:!1},c&&(wc[c]={key:a,shift:!0}));return a}function xc(a){this.code",
    "=a}Z(8);Z(9);Z(13);var yc=Z(16),zc=Z(17),Ac=Z(18);Z(19);Z(20);Z(27);Z(3",
    "2,\" \");Z(33);Z(34);Z(35);Z(36);Z(37);Z(38);Z(39);Z(40);Z(44);Z(45);Z(",
    "46);Z(48,\"0\",\")\");Z(49,\"1\",\"!\");Z(50,\"2\",\"@\");Z(51,\"3\",\"",
    "#\");Z(52,\"4\",\"$\");Z(53,\"5\",\"%\");Z(54,\"6\",\"^\");Z(55,\"7\",",
    "\"&\");Z(56,\"8\",\"*\");Z(57,\"9\",\"(\");Z(65,\"a\",\"A\");Z(66,\"b\"",
    ",\"B\");Z(67,\"c\",\"C\");Z(68,\"d\",\"D\");\nZ(69,\"e\",\"E\");Z(70,\"",
    "f\",\"F\");Z(71,\"g\",\"G\");Z(72,\"h\",\"H\");Z(73,\"i\",\"I\");Z(74,",
    "\"j\",\"J\");Z(75,\"k\",\"K\");Z(76,\"l\",\"L\");Z(77,\"m\",\"M\");Z(78",
    ",\"n\",\"N\");Z(79,\"o\",\"O\");Z(80,\"p\",\"P\");Z(81,\"q\",\"Q\");Z(8",
    "2,\"r\",\"R\");Z(83,\"s\",\"S\");Z(84,\"t\",\"T\");Z(85,\"u\",\"U\");Z(",
    "86,\"v\",\"V\");Z(87,\"w\",\"W\");Z(88,\"x\",\"X\");Z(89,\"y\",\"Y\");Z",
    "(90,\"z\",\"Z\");var Bc=Z(Ia?{c:91,b:91}:Ha?{c:224,b:91}:{c:0,b:91});Z(",
    "Ia?{c:92,b:92}:Ha?{c:224,b:93}:{c:0,b:92});Z(Ia?{c:93,b:93}:Ha?{c:0,b:0",
    "}:{c:93,b:null});Z({c:96,b:96},\"0\");Z({c:97,b:97},\"1\");\nZ({c:98,b:",
    "98},\"2\");Z({c:99,b:99},\"3\");Z({c:100,b:100},\"4\");Z({c:101,b:101},",
    "\"5\");Z({c:102,b:102},\"6\");Z({c:103,b:103},\"7\");Z({c:104,b:104},\"",
    "8\");Z({c:105,b:105},\"9\");Z({c:106,b:106},\"*\");Z({c:107,b:107},\"+",
    "\");Z({c:109,b:109},\"-\");Z({c:110,b:110},\".\");Z({c:111,b:111},\"/\"",
    ");Z(144);Z(112);Z(113);Z(114);Z(115);Z(116);Z(117);Z(118);Z(119);Z(120)",
    ";Z(121);Z(122);Z(123);Z({c:107,b:187},\"=\",\"+\");Z(108,\",\");Z({c:10",
    "9,b:189},\"-\",\"_\");Z(188,\",\",\"<\");Z(190,\".\",\">\");Z(191,\"/\"",
    ",\"?\");Z(192,\"`\",\"~\");Z(219,\"[\",\"{\");\nZ(220,\"\\\\\",\"|\");Z",
    "(221,\"]\",\"}\");Z({c:59,b:186},\";\",\":\");Z(222,\"'\",'\"');var Cc=",
    "new tc;Cc.set(1,yc);Cc.set(2,zc);Cc.set(4,Ac);Cc.set(8,Bc);(function(a)",
    "{var b=new tc;q(uc(a),function(c){b.set(a.get(c).code,c)});return b})(C",
    "c);ba(\"_\",function(a){var b=[];bc?sc(a,b):pc(a,b);var c=b;a=c.length;",
    "for(var b=Array(a),c=l(c)?c.split(\"\"):c,d=0;d<a;d++)d in c&&(b[d]=mc.",
    "call(void 0,c[d]));return mc(b.join(\"\\n\")).replace(/\\xa0/g,\" \")})",
    ";; return this._.apply(null,arguments);}.apply({navigator:typeof window",
    "!='undefined'?window.navigator:null,document:typeof window!='undefined'",
    "?window.document:null}, arguments);}",
    NULL
};

const char* const IS_SELECTED[] = {
    "function(){return function(){var f,k=this;function l(a){return\"string",
    "\"==typeof a}function aa(a,b){a=a.split(\".\");var c=k;a[0]in c||!c.exe",
    "cScript||c.execScript(\"var \"+a[0]);for(var d;a.length&&(d=a.shift());",
    ")a.length||void 0===b?c=c[d]&&c[d]!==Object.prototype[d]?c[d]:c[d]={}:c",
    "[d]=b}\nfunction ba(a){var b=typeof a;if(\"object\"==b)if(a){if(a insta",
    "nceof Array)return\"array\";if(a instanceof Object)return b;var c=Objec",
    "t.prototype.toString.call(a);if(\"[object Window]\"==c)return\"object\"",
    ";if(\"[object Array]\"==c||\"number\"==typeof a.length&&\"undefined\"!=",
    "typeof a.splice&&\"undefined\"!=typeof a.propertyIsEnumerable&&!a.prope",
    "rtyIsEnumerable(\"splice\"))return\"array\";if(\"[object Function]\"==c",
    "||\"undefined\"!=typeof a.call&&\"undefined\"!=typeof a.propertyIsEnume",
    "rable&&!a.propertyIsEnumerable(\"call\"))return\"function\"}else return",
    "\"null\";\nelse if(\"function\"==b&&\"undefined\"==typeof a.call)return",
    "\"object\";return b}function ca(a,b,c){return a.call.apply(a.bind,argum",
    "ents)}function da(a,b,c){if(!a)throw Error();if(2<arguments.length){var",
    " d=Array.prototype.slice.call(arguments,2);return function(){var c=Arra",
    "y.prototype.slice.call(arguments);Array.prototype.unshift.apply(c,d);re",
    "turn a.apply(b,c)}}return function(){return a.apply(b,arguments)}}\nfun",
    "ction ea(a,b,c){ea=Function.prototype.bind&&-1!=Function.prototype.bind",
    ".toString().indexOf(\"native code\")?ca:da;return ea.apply(null,argumen",
    "ts)}function fa(a,b){var c=Array.prototype.slice.call(arguments,1);retu",
    "rn function(){var b=c.slice();b.push.apply(b,arguments);return a.apply(",
    "this,b)}}\nfunction n(a,b){function c(){}c.prototype=b.prototype;a.sa=b",
    ".prototype;a.prototype=new c;a.prototype.constructor=a;a.ra=function(a,",
    "c,g){for(var d=Array(arguments.length-2),e=2;e<arguments.length;e++)d[e",
    "-2]=arguments[e];return b.prototype[c].apply(a,d)}};var ga=String.proto",
    "type.trim?function(a){return a.trim()}:function(a){return a.replace(/^[",
    "\\s\\xa0]+|[\\s\\xa0]+$/g,\"\")};function ha(a,b){return a<b?-1:a>b?1:0",
    "};function p(a,b){for(var c=a.length,d=l(a)?a.split(\"\"):a,e=0;e<c;e++",
    ")e in d&&b.call(void 0,d[e],e,a)}function q(a,b,c){var d=c;p(a,function",
    "(c,g){d=b.call(void 0,d,c,g,a)});return d}function r(a,b){for(var c=a.l",
    "ength,d=l(a)?a.split(\"\"):a,e=0;e<c;e++)if(e in d&&b.call(void 0,d[e],",
    "e,a))return!0;return!1}function ia(a){return Array.prototype.concat.app",
    "ly([],arguments)}function ja(a,b,c){return 2>=arguments.length?Array.pr",
    "ototype.slice.call(a,b):Array.prototype.slice.call(a,b,c)};function ka(",
    "a,b){this.code=a;this.state=t[a]||u;this.message=b||\"\";a=this.state.r",
    "eplace(/((?:^|\\s+)[a-z])/g,function(a){return a.toUpperCase().replace(",
    "/^[\\s\\xa0]+/g,\"\")});b=a.length-5;if(0>b||a.indexOf(\"Error\",b)!=b)",
    "a+=\"Error\";this.name=a;a=Error(this.message);a.name=this.name;this.st",
    "ack=a.stack||\"\"}n(ka,Error);var u=\"unknown error\",t={15:\"element n",
    "ot selectable\",11:\"element not visible\"};t[31]=u;t[30]=u;t[24]=\"inv",
    "alid cookie domain\";t[29]=\"invalid element coordinates\";t[12]=\"inva",
    "lid element state\";\nt[32]=\"invalid selector\";t[51]=\"invalid select",
    "or\";t[52]=\"invalid selector\";t[17]=\"javascript error\";t[405]=\"uns",
    "upported operation\";t[34]=\"move target out of bounds\";t[27]=\"no suc",
    "h alert\";t[7]=\"no such element\";t[8]=\"no such frame\";t[23]=\"no su",
    "ch window\";t[28]=\"script timeout\";t[33]=\"session not created\";t[10",
    "]=\"stale element reference\";t[21]=\"timeout\";t[25]=\"unable to set c",
    "ookie\";t[26]=\"unexpected alert open\";t[13]=u;t[9]=\"unknown command",
    "\";ka.prototype.toString=function(){return this.name+\": \"+this.messag",
    "e};var v;a:{var la=k.navigator;if(la){var ma=la.userAgent;if(ma){v=ma;b",
    "reak a}}v=\"\"};function na(a){var b=oa;Object.prototype.hasOwnProperty",
    ".call(b,\"528\")||(b[\"528\"]=a(\"528\"))};var pa=-1!=v.indexOf(\"Macin",
    "tosh\"),qa=-1!=v.indexOf(\"Windows\"),ra,sa=\"\",ta=/WebKit\\/(\\S+)/.e",
    "xec(v);ta&&(sa=ta?ta[1]:\"\");ra=sa;var oa={};\nfunction ua(){na(functi",
    "on(){for(var a=0,b=ga(String(ra)).split(\".\"),c=ga(\"528\").split(\".",
    "\"),d=Math.max(b.length,c.length),e=0;0==a&&e<d;e++){var g=b[e]||\"\",h",
    "=c[e]||\"\";do{g=/(\\d*)(\\D*)(.*)/.exec(g)||[\"\",\"\",\"\",\"\"];h=/(",
    "\\d*)(\\D*)(.*)/.exec(h)||[\"\",\"\",\"\",\"\"];if(0==g[0].length&&0==h",
    "[0].length)break;a=ha(0==g[1].length?0:parseInt(g[1],10),0==h[1].length",
    "?0:parseInt(h[1],10))||ha(0==g[2].length,0==h[2].length)||ha(g[2],h[2])",
    ";g=g[3];h=h[3]}while(0==a)}return 0<=a})};function va(a,b){if(!a||!b)re",
    "turn!1;if(a.contains&&1==b.nodeType)return a==b||a.contains(b);if(\"und",
    "efined\"!=typeof a.compareDocumentPosition)return a==b||!!(a.compareDoc",
    "umentPosition(b)&16);for(;b&&a!=b;)b=b.parentNode;return b==a}\nfunctio",
    "n wa(a,b){if(a==b)return 0;if(a.compareDocumentPosition)return a.compar",
    "eDocumentPosition(b)&2?1:-1;if(\"sourceIndex\"in a||a.parentNode&&\"sou",
    "rceIndex\"in a.parentNode){var c=1==a.nodeType,d=1==b.nodeType;if(c&&d)",
    "return a.sourceIndex-b.sourceIndex;var e=a.parentNode,g=b.parentNode;re",
    "turn e==g?ya(a,b):!c&&va(e,b)?-1*za(a,b):!d&&va(g,a)?za(b,a):(c?a.sourc",
    "eIndex:e.sourceIndex)-(d?b.sourceIndex:g.sourceIndex)}d=9==a.nodeType?a",
    ":a.ownerDocument||a.document;c=d.createRange();c.selectNode(a);c.collap",
    "se(!0);\na=d.createRange();a.selectNode(b);a.collapse(!0);return c.comp",
    "areBoundaryPoints(k.Range.START_TO_END,a)}function za(a,b){var c=a.pare",
    "ntNode;if(c==b)return-1;for(;b.parentNode!=c;)b=b.parentNode;return ya(",
    "b,a)}function ya(a,b){for(;b=b.previousSibling;)if(b==a)return-1;return",
    " 1};function Aa(a,b){b&&\"string\"!==typeof b&&(b=b.toString());return!",
    "!a&&1==a.nodeType&&(!b||a.tagName.toUpperCase()==b)}function Ba(a){retu",
    "rn Aa(a,\"OPTION\")?!0:Aa(a,\"INPUT\")?(a=a.type.toLowerCase(),\"checkb",
    "ox\"==a||\"radio\"==a):!1};/*\n\n The MIT License\n\n Copyright (c) 200",
    "7 Cybozu Labs, Inc.\n Copyright (c) 2012 Google Inc.\n\n Permission is ",
    "hereby granted, free of charge, to any person obtaining a copy\n of thi",
    "s software and associated documentation files (the \"Software\"), to\n ",
    "deal in the Software without restriction, including without limitation ",
    "the\n rights to use, copy, modify, merge, publish, distribute, sublicen",
    "se, and/or\n sell copies of the Software, and to permit persons to whom",
    " the Software is\n furnished to do so, subject to the following conditi",
    "ons:\n\n The above copyright notice and this permission notice shall be",
    " included in\n all copies or substantial portions of the Software.\n\n ",
    "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRE",
    "SS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHAN",
    "TABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO",
    " EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM",
    ", DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT ",
    "OR OTHERWISE, ARISING\n FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE",
    " OR THE USE OR OTHER DEALINGS\n IN THE SOFTWARE.\n*/\nfunction w(a,b,c)",
    "{this.s=a;this.pa=b||1;this.o=c||1};function x(a){this.X=a;this.N=0}fun",
    "ction Ca(a){a=a.match(Da);for(var b=0;b<a.length;b++)Ea.test(a[b])&&a.s",
    "plice(b,1);return new x(a)}var Da=/\\$?(?:(?![0-9-\\.])(?:\\*|[\\w-\\.]",
    "+):)?(?![0-9-\\.])(?:\\*|[\\w-\\.]+)|\\/\\/|\\.\\.|::|\\d+(?:\\.\\d*)?|",
    "\\.\\d+|\"[^\"]*\"|'[^']*'|[!<>]=|\\s+|./g,Ea=/^\\s/;function y(a,b){re",
    "turn a.X[a.N+(b||0)]}x.prototype.next=function(){return this.X[this.N++",
    "]};x.prototype.back=function(){this.N--};x.prototype.empty=function(){r",
    "eturn this.X.length<=this.N};function A(a){var b=null,c=a.nodeType;1==c",
    "&&(b=a.textContent,b=void 0==b||null==b?a.innerText:b,b=void 0==b||null",
    "==b?\"\":b);if(\"string\"!=typeof b)if(9==c||1==c){a=9==c?a.documentEle",
    "ment:a.firstChild;for(var c=0,d=[],b=\"\";a;){do 1!=a.nodeType&&(b+=a.n",
    "odeValue),d[c++]=a;while(a=a.firstChild);for(;c&&!(a=d[--c].nextSibling",
    "););}}else b=a.nodeValue;return\"\"+b}\nfunction B(a,b,c){if(null===b)r",
    "eturn!0;try{if(!a.getAttribute)return!1}catch(d){return!1}return null==",
    "c?!!a.getAttribute(b):a.getAttribute(b,2)==c}function C(a,b,c,d,e){retu",
    "rn Fa.call(null,a,b,l(c)?c:null,l(d)?d:null,e||new D)}\nfunction Fa(a,b",
    ",c,d,e){b.getElementsByName&&d&&\"name\"==c?(b=b.getElementsByName(d),p",
    "(b,function(b){a.matches(b)&&e.add(b)})):b.getElementsByClassName&&d&&",
    "\"class\"==c?(b=b.getElementsByClassName(d),p(b,function(b){b.className",
    "==d&&a.matches(b)&&e.add(b)})):a instanceof E?Ga(a,b,c,d,e):b.getElemen",
    "tsByTagName&&(b=b.getElementsByTagName(a.getName()),p(b,function(a){B(a",
    ",c,d)&&e.add(a)}));return e}function Ga(a,b,c,d,e){for(b=b.firstChild;b",
    ";b=b.nextSibling)B(b,c,d)&&a.matches(b)&&e.add(b),Ga(a,b,c,d,e)};functi",
    "on D(){this.o=this.j=null;this.J=0}function Ha(a){this.node=a;this.next",
    "=this.D=null}function Ia(a,b){if(!a.j)return b;if(!b.j)return a;var c=a",
    ".j;b=b.j;for(var d=null,e,g=0;c&&b;)c.node==b.node?(e=c,c=c.next,b=b.ne",
    "xt):0<wa(c.node,b.node)?(e=b,b=b.next):(e=c,c=c.next),(e.D=d)?d.next=e:",
    "a.j=e,d=e,g++;for(e=c||b;e;)e.D=d,d=d.next=e,g++,e=e.next;a.o=d;a.J=g;r",
    "eturn a}D.prototype.unshift=function(a){a=new Ha(a);a.next=this.j;this.",
    "o?this.j.D=a:this.j=this.o=a;this.j=a;this.J++};\nD.prototype.add=funct",
    "ion(a){a=new Ha(a);a.D=this.o;this.j?this.o.next=a:this.j=this.o=a;this",
    ".o=a;this.J++};function F(a){return(a=a.j)?a.node:null}D.prototype.u=fu",
    "nction(){return this.J};function G(a){return(a=F(a))?A(a):\"\"}D.protot",
    "ype.iterator=function(a){return new Ja(this,!!a)};function Ja(a,b){this",
    ".la=a;this.Y=(this.G=b)?a.o:a.j;this.U=null}Ja.prototype.next=function(",
    "){var a=this.Y;if(null==a)return null;var b=this.U=a;this.Y=this.G?a.D:",
    "a.next;return b.node};\nJa.prototype.remove=function(){var a=this.la,b=",
    "this.U;if(!b)throw Error(\"Next must be called at least once before rem",
    "ove.\");var c=b.D,b=b.next;c?c.next=b:a.j=b;b?b.D=c:a.o=c;a.J--;this.U=",
    "null};function H(a){this.i=a;this.l=this.w=!1;this.K=null}function I(a)",
    "{return\"\\n  \"+a.toString().split(\"\\n\").join(\"\\n  \")}H.prototyp",
    "e.h=function(){return this.w};function Ka(a,b){a.w=b}function La(a,b){a",
    ".l=b}H.prototype.B=function(){return this.K};function J(a,b){a=a.evalua",
    "te(b);return a instanceof D?+G(a):+a}function K(a,b){a=a.evaluate(b);re",
    "turn a instanceof D?G(a):\"\"+a}function L(a,b){a=a.evaluate(b);return ",
    "a instanceof D?!!a.u():!!a};function M(a,b,c){H.call(this,a.i);this.W=a",
    ";this.aa=b;this.fa=c;this.w=b.h()||c.h();this.l=b.l||c.l;this.W==Ma&&(c",
    ".l||c.h()||4==c.i||0==c.i||!b.B()?b.l||b.h()||4==b.i||0==b.i||!c.B()||(",
    "this.K={name:c.B().name,I:b}):this.K={name:b.B().name,I:c})}n(M,H);\nfu",
    "nction N(a,b,c,d,e){b=b.evaluate(d);c=c.evaluate(d);var g;if(b instance",
    "of D&&c instanceof D){b=b.iterator();for(d=b.next();d;d=b.next())for(e=",
    "c.iterator(),g=e.next();g;g=e.next())if(a(A(d),A(g)))return!0;return!1}",
    "if(b instanceof D||c instanceof D){b instanceof D?(e=b,d=c):(e=c,d=b);g",
    "=e.iterator();for(var h=typeof d,m=g.next();m;m=g.next()){switch(h){cas",
    "e \"number\":m=+A(m);break;case \"boolean\":m=!!A(m);break;case \"strin",
    "g\":m=A(m);break;default:throw Error(\"Illegal primitive type for compa",
    "rison.\");\n}if(e==b&&a(m,d)||e==c&&a(d,m))return!0}return!1}return e?",
    "\"boolean\"==typeof b||\"boolean\"==typeof c?a(!!b,!!c):\"number\"==typ",
    "eof b||\"number\"==typeof c?a(+b,+c):a(b,c):a(+b,+c)}M.prototype.evalua",
    "te=function(a){return this.W.C(this.aa,this.fa,a)};M.prototype.toString",
    "=function(){var a=\"Binary Expression: \"+this.W,a=a+I(this.aa);return ",
    "a+=I(this.fa)};function Na(a,b,c,d){this.oa=a;this.da=b;this.i=c;this.C",
    "=d}Na.prototype.toString=function(){return this.oa};var Oa={};\nfunctio",
    "n O(a,b,c,d){if(Oa.hasOwnProperty(a))throw Error(\"Binary operator alre",
    "ady created: \"+a);a=new Na(a,b,c,d);return Oa[a.toString()]=a}O(\"div",
    "\",6,1,function(a,b,c){return J(a,c)/J(b,c)});O(\"mod\",6,1,function(a,",
    "b,c){return J(a,c)%J(b,c)});O(\"*\",6,1,function(a,b,c){return J(a,c)*J",
    "(b,c)});O(\"+\",5,1,function(a,b,c){return J(a,c)+J(b,c)});O(\"-\",5,1,",
    "function(a,b,c){return J(a,c)-J(b,c)});O(\"<\",4,2,function(a,b,c){retu",
    "rn N(function(a,b){return a<b},a,b,c)});\nO(\">\",4,2,function(a,b,c){r",
    "eturn N(function(a,b){return a>b},a,b,c)});O(\"<=\",4,2,function(a,b,c)",
    "{return N(function(a,b){return a<=b},a,b,c)});O(\">=\",4,2,function(a,b",
    ",c){return N(function(a,b){return a>=b},a,b,c)});var Ma=O(\"=\",3,2,fun",
    "ction(a,b,c){return N(function(a,b){return a==b},a,b,c,!0)});O(\"!=\",3",
    ",2,function(a,b,c){return N(function(a,b){return a!=b},a,b,c,!0)});O(\"",
    "and\",2,2,function(a,b,c){return L(a,c)&&L(b,c)});O(\"or\",1,2,function",
    "(a,b,c){return L(a,c)||L(b,c)});function Pa(a,b){if(b.u()&&4!=a.i)throw",
    " Error(\"Primary expression must evaluate to nodeset if filter has pred",
    "icate(s).\");H.call(this,a.i);this.ea=a;this.f=b;this.w=a.h();this.l=a.",
    "l}n(Pa,H);Pa.prototype.evaluate=function(a){a=this.ea.evaluate(a);retur",
    "n Qa(this.f,a)};Pa.prototype.toString=function(){var a=\"Filter:\"+I(th",
    "is.ea);return a+=I(this.f)};function Ra(a,b){if(b.length<a.ca)throw Err",
    "or(\"Function \"+a.m+\" expects at least\"+a.ca+\" arguments, \"+b.leng",
    "th+\" given\");if(null!==a.V&&b.length>a.V)throw Error(\"Function \"+a.",
    "m+\" expects at most \"+a.V+\" arguments, \"+b.length+\" given\");a.ma&",
    "&p(b,function(b,d){if(4!=b.i)throw Error(\"Argument \"+d+\" to function",
    " \"+a.m+\" is not of type Nodeset: \"+b);});H.call(this,a.i);this.M=a;t",
    "his.S=b;Ka(this,a.w||r(b,function(a){return a.h()}));La(this,a.ka&&!b.l",
    "ength||a.ja&&!!b.length||r(b,function(a){return a.l}))}\nn(Ra,H);Ra.pro",
    "totype.evaluate=function(a){return this.M.C.apply(null,ia(a,this.S))};R",
    "a.prototype.toString=function(){var a=\"Function: \"+this.M;if(this.S.l",
    "ength)var b=q(this.S,function(a,b){return a+I(b)},\"Arguments:\"),a=a+I",
    "(b);return a};function Sa(a,b,c,d,e,g,h,m,z){this.m=a;this.i=b;this.w=c",
    ";this.ka=d;this.ja=e;this.C=g;this.ca=h;this.V=void 0!==m?m:h;this.ma=!",
    "!z}Sa.prototype.toString=function(){return this.m};var Ta={};\nfunction",
    " P(a,b,c,d,e,g,h,m){if(Ta.hasOwnProperty(a))throw Error(\"Function alre",
    "ady created: \"+a+\".\");Ta[a]=new Sa(a,b,c,d,!1,e,g,h,m)}P(\"boolean\"",
    ",2,!1,!1,function(a,b){return L(b,a)},1);P(\"ceiling\",1,!1,!1,function",
    "(a,b){return Math.ceil(J(b,a))},1);P(\"concat\",3,!1,!1,function(a,b){r",
    "eturn q(ja(arguments,1),function(b,d){return b+K(d,a)},\"\")},2,null);P",
    "(\"contains\",2,!1,!1,function(a,b,c){b=K(b,a);a=K(c,a);return-1!=b.ind",
    "exOf(a)},2);P(\"count\",1,!1,!1,function(a,b){return b.evaluate(a).u()}",
    ",1,1,!0);\nP(\"false\",2,!1,!1,function(){return!1},0);P(\"floor\",1,!1",
    ",!1,function(a,b){return Math.floor(J(b,a))},1);P(\"id\",4,!1,!1,functi",
    "on(a,b){var c=a.s,d=9==c.nodeType?c:c.ownerDocument;a=K(b,a).split(/\\s",
    "+/);var e=[];p(a,function(a){a=d.getElementById(a);var b;if(!(b=!a)){a:",
    "if(l(e))b=l(a)&&1==a.length?e.indexOf(a,0):-1;else{for(b=0;b<e.length;b",
    "++)if(b in e&&e[b]===a)break a;b=-1}b=0<=b}b||e.push(a)});e.sort(wa);va",
    "r g=new D;p(e,function(a){g.add(a)});return g},1);P(\"lang\",2,!1,!1,fu",
    "nction(){return!1},1);\nP(\"last\",1,!0,!1,function(a){if(1!=arguments.",
    "length)throw Error(\"Function last expects ()\");return a.o},0);P(\"loc",
    "al-name\",3,!1,!0,function(a,b){return(a=b?F(b.evaluate(a)):a.s)?a.loca",
    "lName||a.nodeName.toLowerCase():\"\"},0,1,!0);P(\"name\",3,!1,!0,functi",
    "on(a,b){return(a=b?F(b.evaluate(a)):a.s)?a.nodeName.toLowerCase():\"\"}",
    ",0,1,!0);P(\"namespace-uri\",3,!0,!1,function(){return\"\"},0,1,!0);\nP",
    "(\"normalize-space\",3,!1,!0,function(a,b){return(b?K(b,a):A(a.s)).repl",
    "ace(/[\\s\\xa0]+/g,\" \").replace(/^\\s+|\\s+$/g,\"\")},0,1);P(\"not\",",
    "2,!1,!1,function(a,b){return!L(b,a)},1);P(\"number\",1,!1,!0,function(a",
    ",b){return b?J(b,a):+A(a.s)},0,1);P(\"position\",1,!0,!1,function(a){re",
    "turn a.pa},0);P(\"round\",1,!1,!1,function(a,b){return Math.round(J(b,a",
    "))},1);P(\"starts-with\",2,!1,!1,function(a,b,c){b=K(b,a);a=K(c,a);retu",
    "rn 0==b.lastIndexOf(a,0)},2);P(\"string\",3,!1,!0,function(a,b){return ",
    "b?K(b,a):A(a.s)},0,1);\nP(\"string-length\",1,!1,!0,function(a,b){retur",
    "n(b?K(b,a):A(a.s)).length},0,1);P(\"substring\",3,!1,!1,function(a,b,c,",
    "d){c=J(c,a);if(isNaN(c)||Infinity==c||-Infinity==c)return\"\";d=d?J(d,a",
    "):Infinity;if(isNaN(d)||-Infinity===d)return\"\";c=Math.round(c)-1;var ",
    "e=Math.max(c,0);a=K(b,a);return Infinity==d?a.substring(e):a.substring(",
    "e,c+Math.round(d))},2,3);P(\"substring-after\",3,!1,!1,function(a,b,c){",
    "b=K(b,a);a=K(c,a);c=b.indexOf(a);return-1==c?\"\":b.substring(c+a.lengt",
    "h)},2);\nP(\"substring-before\",3,!1,!1,function(a,b,c){b=K(b,a);a=K(c,",
    "a);a=b.indexOf(a);return-1==a?\"\":b.substring(0,a)},2);P(\"sum\",1,!1,",
    "!1,function(a,b){a=b.evaluate(a).iterator();b=0;for(var c=a.next();c;c=",
    "a.next())b+=+A(c);return b},1,1,!0);P(\"translate\",3,!1,!1,function(a,",
    "b,c,d){b=K(b,a);c=K(c,a);var e=K(d,a);d={};for(var g=0;g<c.length;g++)a",
    "=c.charAt(g),a in d||(d[a]=e.charAt(g));c=\"\";for(g=0;g<b.length;g++)a",
    "=b.charAt(g),c+=a in d?d[a]:a;return c},3);P(\"true\",2,!1,!1,function(",
    "){return!0},0);function E(a,b){this.ha=a;this.ba=void 0!==b?b:null;this",
    ".H=null;switch(a){case \"comment\":this.H=8;break;case \"text\":this.H=",
    "3;break;case \"processing-instruction\":this.H=7;break;case \"node\":br",
    "eak;default:throw Error(\"Unexpected argument\");}}function Ua(a){retur",
    "n\"comment\"==a||\"text\"==a||\"processing-instruction\"==a||\"node\"==",
    "a}E.prototype.matches=function(a){return null===this.H||this.H==a.nodeT",
    "ype};E.prototype.getName=function(){return this.ha};\nE.prototype.toStr",
    "ing=function(){var a=\"Kind Test: \"+this.ha;null===this.ba||(a+=I(this",
    ".ba));return a};function Va(a){H.call(this,3);this.ga=a.substring(1,a.l",
    "ength-1)}n(Va,H);Va.prototype.evaluate=function(){return this.ga};Va.pr",
    "ototype.toString=function(){return\"Literal: \"+this.ga};function Q(a,b",
    "){this.m=a.toLowerCase();a=\"*\"==this.m?\"*\":\"http://www.w3.org/1999",
    "/xhtml\";this.O=b?b.toLowerCase():a}Q.prototype.matches=function(a){var",
    " b=a.nodeType;if(1!=b&&2!=b)return!1;b=void 0!==a.localName?a.localName",
    ":a.nodeName;return\"*\"!=this.m&&this.m!=b.toLowerCase()?!1:\"*\"==this",
    ".O?!0:this.O==(a.namespaceURI?a.namespaceURI.toLowerCase():\"http://www",
    ".w3.org/1999/xhtml\")};Q.prototype.getName=function(){return this.m};\n",
    "Q.prototype.toString=function(){return\"Name Test: \"+(\"http://www.w3.",
    "org/1999/xhtml\"==this.O?\"\":this.O+\":\")+this.m};function Wa(a){H.ca",
    "ll(this,1);this.ia=a}n(Wa,H);Wa.prototype.evaluate=function(){return th",
    "is.ia};Wa.prototype.toString=function(){return\"Number: \"+this.ia};fun",
    "ction Xa(a,b){H.call(this,a.i);this.$=a;this.L=b;this.w=a.h();this.l=a.",
    "l;1==this.L.length&&(a=this.L[0],a.T||a.A!=Ya||(a=a.R,\"*\"!=a.getName(",
    ")&&(this.K={name:a.getName(),I:null})))}n(Xa,H);function R(){H.call(thi",
    "s,4)}n(R,H);R.prototype.evaluate=function(a){var b=new D;a=a.s;9==a.nod",
    "eType?b.add(a):b.add(a.ownerDocument);return b};R.prototype.toString=fu",
    "nction(){return\"Root Helper Expression\"};function Za(){H.call(this,4)",
    "}n(Za,H);Za.prototype.evaluate=function(a){var b=new D;b.add(a.s);retur",
    "n b};\nZa.prototype.toString=function(){return\"Context Helper Expressi",
    "on\"};function $a(a){return\"/\"==a||\"//\"==a}\nXa.prototype.evaluate=",
    "function(a){var b=this.$.evaluate(a);if(!(b instanceof D))throw Error(",
    "\"Filter expression must evaluate to nodeset.\");a=this.L;for(var c=0,d",
    "=a.length;c<d&&b.u();c++){var e=a[c],g=b.iterator(e.A.G);if(e.h()||e.A!",
    "=ab)if(e.h()||e.A!=bb){var h=g.next();for(b=e.evaluate(new w(h));null!=",
    "(h=g.next());)h=e.evaluate(new w(h)),b=Ia(b,h)}else h=g.next(),b=e.eval",
    "uate(new w(h));else{for(h=g.next();(b=g.next())&&(!h.contains||h.contai",
    "ns(b))&&b.compareDocumentPosition(h)&8;h=b);b=e.evaluate(new w(h))}}ret",
    "urn b};\nXa.prototype.toString=function(){var a=\"Path Expression:\"+I(",
    "this.$);if(this.L.length){var b=q(this.L,function(a,b){return a+I(b)},",
    "\"Steps:\");a+=I(b)}return a};function S(a,b){this.f=a;this.G=!!b}funct",
    "ion Qa(a,b,c){for(c=c||0;c<a.f.length;c++)for(var d=a.f[c],e=b.iterator",
    "(),g=b.u(),h,m=0;h=e.next();m++){var z=a.G?g-m:m+1;h=d.evaluate(new w(h",
    ",z,g));if(\"number\"==typeof h)z=z==h;else if(\"string\"==typeof h||\"b",
    "oolean\"==typeof h)z=!!h;else if(h instanceof D)z=0<h.u();else throw Er",
    "ror(\"Predicate.evaluate returned an unexpected type.\");z||e.remove()}",
    "return b}S.prototype.B=function(){return 0<this.f.length?this.f[0].B():",
    "null};\nS.prototype.h=function(){for(var a=0;a<this.f.length;a++){var b",
    "=this.f[a];if(b.h()||1==b.i||0==b.i)return!0}return!1};S.prototype.u=fu",
    "nction(){return this.f.length};S.prototype.toString=function(){return q",
    "(this.f,function(a,b){return a+I(b)},\"Predicates:\")};function T(a,b,c",
    ",d){H.call(this,4);this.A=a;this.R=b;this.f=c||new S([]);this.T=!!d;b=t",
    "his.f.B();a.qa&&b&&(this.K={name:b.name,I:b.I});this.w=this.f.h()}n(T,H",
    ");\nT.prototype.evaluate=function(a){var b=a.s,c=this.B(),d=null,e=null",
    ",g=0;c&&(d=c.name,e=c.I?K(c.I,a):null,g=1);if(this.T)if(this.h()||this.",
    "A!=cb)if(b=(new T(db,new E(\"node\"))).evaluate(a).iterator(),c=b.next(",
    "))for(a=this.C(c,d,e,g);null!=(c=b.next());)a=Ia(a,this.C(c,d,e,g));els",
    "e a=new D;else a=C(this.R,b,d,e),a=Qa(this.f,a,g);else a=this.C(a.s,d,e",
    ",g);return a};T.prototype.C=function(a,b,c,d){a=this.A.M(this.R,a,b,c);",
    "return a=Qa(this.f,a,d)};\nT.prototype.toString=function(){var a=\"Step",
    ":\"+I(\"Operator: \"+(this.T?\"//\":\"/\"));this.A.m&&(a+=I(\"Axis: \"+",
    "this.A));a+=I(this.R);if(this.f.u()){var b=q(this.f.f,function(a,b){ret",
    "urn a+I(b)},\"Predicates:\");a+=I(b)}return a};function eb(a,b,c,d){thi",
    "s.m=a;this.M=b;this.G=c;this.qa=d}eb.prototype.toString=function(){retu",
    "rn this.m};var fb={};function U(a,b,c,d){if(fb.hasOwnProperty(a))throw ",
    "Error(\"Axis already created: \"+a);b=new eb(a,b,c,!!d);return fb[a]=b}",
    "\nU(\"ancestor\",function(a,b){for(var c=new D;b=b.parentNode;)a.matche",
    "s(b)&&c.unshift(b);return c},!0);U(\"ancestor-or-self\",function(a,b){v",
    "ar c=new D;do a.matches(b)&&c.unshift(b);while(b=b.parentNode);return c",
    "},!0);\nvar Ya=U(\"attribute\",function(a,b){var c=new D,d=a.getName();",
    "if(b=b.attributes)if(a instanceof E&&null===a.H||\"*\"==d)for(d=0;a=b[d",
    "];d++)c.add(a);else(a=b.getNamedItem(d))&&c.add(a);return c},!1),cb=U(",
    "\"child\",function(a,b,c,d,e){c=l(c)?c:null;d=l(d)?d:null;e=e||new D;fo",
    "r(b=b.firstChild;b;b=b.nextSibling)B(b,c,d)&&a.matches(b)&&e.add(b);ret",
    "urn e},!1,!0);U(\"descendant\",C,!1,!0);\nvar db=U(\"descendant-or-self",
    "\",function(a,b,c,d){var e=new D;B(b,c,d)&&a.matches(b)&&e.add(b);retur",
    "n C(a,b,c,d,e)},!1,!0),ab=U(\"following\",function(a,b,c,d){var e=new D",
    ";do for(var g=b;g=g.nextSibling;)B(g,c,d)&&a.matches(g)&&e.add(g),e=C(a",
    ",g,c,d,e);while(b=b.parentNode);return e},!1,!0);U(\"following-sibling",
    "\",function(a,b){for(var c=new D;b=b.nextSibling;)a.matches(b)&&c.add(b",
    ");return c},!1);U(\"namespace\",function(){return new D},!1);\nvar gb=U",
    "(\"parent\",function(a,b){var c=new D;if(9==b.nodeType)return c;if(2==b",
    ".nodeType)return c.add(b.ownerElement),c;b=b.parentNode;a.matches(b)&&c",
    ".add(b);return c},!1),bb=U(\"preceding\",function(a,b,c,d){var e=new D,",
    "g=[];do g.unshift(b);while(b=b.parentNode);for(var h=1,m=g.length;h<m;h",
    "++){var z=[];for(b=g[h];b=b.previousSibling;)z.unshift(b);for(var xa=0,",
    "yb=z.length;xa<yb;xa++)b=z[xa],B(b,c,d)&&a.matches(b)&&e.add(b),e=C(a,b",
    ",c,d,e)}return e},!0,!0);\nU(\"preceding-sibling\",function(a,b){for(va",
    "r c=new D;b=b.previousSibling;)a.matches(b)&&c.unshift(b);return c},!0)",
    ";var hb=U(\"self\",function(a,b){var c=new D;a.matches(b)&&c.add(b);ret",
    "urn c},!1);function ib(a){H.call(this,1);this.Z=a;this.w=a.h();this.l=a",
    ".l}n(ib,H);ib.prototype.evaluate=function(a){return-J(this.Z,a)};ib.pro",
    "totype.toString=function(){return\"Unary Expression: -\"+I(this.Z)};fun",
    "ction jb(a){H.call(this,4);this.P=a;Ka(this,r(this.P,function(a){return",
    " a.h()}));La(this,r(this.P,function(a){return a.l}))}n(jb,H);jb.prototy",
    "pe.evaluate=function(a){var b=new D;p(this.P,function(c){c=c.evaluate(a",
    ");if(!(c instanceof D))throw Error(\"Path expression must evaluate to N",
    "odeSet.\");b=Ia(b,c)});return b};jb.prototype.toString=function(){retur",
    "n q(this.P,function(a,b){return a+I(b)},\"Union Expression:\")};functio",
    "n kb(a,b){this.a=a;this.na=b}function lb(a){for(var b,c=[];;){V(a,\"Mis",
    "sing right hand side of binary expression.\");b=mb(a);var d=a.a.next();",
    "if(!d)break;var e=(d=Oa[d]||null)&&d.da;if(!e){a.a.back();break}for(;c.",
    "length&&e<=c[c.length-1].da;)b=new M(c.pop(),c.pop(),b);c.push(b,d)}for",
    "(;c.length;)b=new M(c.pop(),c.pop(),b);return b}function V(a,b){if(a.a.",
    "empty())throw Error(b);}function nb(a,b){a=a.a.next();if(a!=b)throw Err",
    "or(\"Bad token, expected: \"+b+\" got: \"+a);}\nfunction ob(a){a=a.a.ne",
    "xt();if(\")\"!=a)throw Error(\"Bad token: \"+a);}function pb(a){a=a.a.n",
    "ext();if(2>a.length)throw Error(\"Unclosed literal string\");return new",
    " Va(a)}\nfunction qb(a){var b=[];if($a(y(a.a))){var c=a.a.next();var d=",
    "y(a.a);if(\"/\"==c&&(a.a.empty()||\".\"!=d&&\"..\"!=d&&\"@\"!=d&&\"*\"!",
    "=d&&!/(?![0-9])[\\w]/.test(d)))return new R;d=new R;V(a,\"Missing next ",
    "location step.\");c=rb(a,c);b.push(c)}else{a:{c=y(a.a);d=c.charAt(0);sw",
    "itch(d){case \"$\":throw Error(\"Variable reference not allowed in HTML",
    " XPath\");case \"(\":a.a.next();c=lb(a);V(a,'unclosed \"(\"');nb(a,\")",
    "\");break;case '\"':case \"'\":c=pb(a);break;default:if(isNaN(+c))if(!U",
    "a(c)&&/(?![0-9])[\\w]/.test(d)&&\"(\"==y(a.a,\n1)){c=a.a.next();c=Ta[c]",
    "||null;a.a.next();for(d=[];\")\"!=y(a.a);){V(a,\"Missing function argum",
    "ent list.\");d.push(lb(a));if(\",\"!=y(a.a))break;a.a.next()}V(a,\"Uncl",
    "osed function argument list.\");ob(a);c=new Ra(c,d)}else{c=null;break a",
    "}else c=new Wa(+a.a.next())}\"[\"==y(a.a)&&(d=new S(sb(a)),c=new Pa(c,d",
    "))}if(c)if($a(y(a.a)))d=c;else return c;else c=rb(a,\"/\"),d=new Za,b.p",
    "ush(c)}for(;$a(y(a.a));)c=a.a.next(),V(a,\"Missing next location step.",
    "\"),c=rb(a,c),b.push(c);return new Xa(d,b)}\nfunction rb(a,b){if(\"/\"!",
    "=b&&\"//\"!=b)throw Error('Step op should be \"/\" or \"//\"');if(\".\"",
    "==y(a.a)){var c=new T(hb,new E(\"node\"));a.a.next();return c}if(\"..\"",
    "==y(a.a))return c=new T(gb,new E(\"node\")),a.a.next(),c;if(\"@\"==y(a.",
    "a)){var d=Ya;a.a.next();V(a,\"Missing attribute name\")}else if(\"::\"=",
    "=y(a.a,1)){if(!/(?![0-9])[\\w]/.test(y(a.a).charAt(0)))throw Error(\"Ba",
    "d token: \"+a.a.next());var e=a.a.next();d=fb[e]||null;if(!d)throw Erro",
    "r(\"No axis with name: \"+e);a.a.next();V(a,\"Missing node name\")}else",
    " d=cb;e=\ny(a.a);if(/(?![0-9])[\\w\\*]/.test(e.charAt(0)))if(\"(\"==y(a",
    ".a,1)){if(!Ua(e))throw Error(\"Invalid node type: \"+e);e=a.a.next();if",
    "(!Ua(e))throw Error(\"Invalid type name: \"+e);nb(a,\"(\");V(a,\"Bad no",
    "detype\");var g=y(a.a).charAt(0),h=null;if('\"'==g||\"'\"==g)h=pb(a);V(",
    "a,\"Bad nodetype\");ob(a);e=new E(e,h)}else if(e=a.a.next(),g=e.indexOf",
    "(\":\"),-1==g)e=new Q(e);else{var h=e.substring(0,g);if(\"*\"==h)var m=",
    "\"*\";else if(m=a.na(h),!m)throw Error(\"Namespace prefix not declared:",
    " \"+h);e=e.substr(g+1);e=new Q(e,m)}else throw Error(\"Bad token: \"+\n",
    "a.a.next());a=new S(sb(a),d.G);return c||new T(d,e,a,\"//\"==b)}functio",
    "n sb(a){for(var b=[];\"[\"==y(a.a);){a.a.next();V(a,\"Missing predicate",
    " expression.\");var c=lb(a);b.push(c);V(a,\"Unclosed predicate expressi",
    "on.\");nb(a,\"]\")}return b}function mb(a){if(\"-\"==y(a.a))return a.a.",
    "next(),new ib(mb(a));var b=qb(a);if(\"|\"!=y(a.a))a=b;else{for(b=[b];\"",
    "|\"==a.a.next();)V(a,\"Missing next union location path.\"),b.push(qb(a",
    "));a.a.back();a=new jb(b)}return a};function tb(a){switch(a.nodeType){c",
    "ase 1:return fa(ub,a);case 9:return tb(a.documentElement);case 11:case ",
    "10:case 6:case 12:return vb;default:return a.parentNode?tb(a.parentNode",
    "):vb}}function vb(){return null}function ub(a,b){if(a.prefix==b)return ",
    "a.namespaceURI||\"http://www.w3.org/1999/xhtml\";var c=a.getAttributeNo",
    "de(\"xmlns:\"+b);return c&&c.specified?c.value||null:a.parentNode&&9!=a",
    ".parentNode.nodeType?ub(a.parentNode,b):null};function wb(a,b){if(!a.le",
    "ngth)throw Error(\"Empty XPath expression.\");a=Ca(a);if(a.empty())thro",
    "w Error(\"Invalid XPath expression.\");b?\"function\"==ba(b)||(b=ea(b.l",
    "ookupNamespaceURI,b)):b=function(){return null};var c=lb(new kb(a,b));i",
    "f(!a.empty())throw Error(\"Bad token: \"+a.next());this.evaluate=functi",
    "on(a,b){a=c.evaluate(new w(a));return new W(a,b)}}\nfunction W(a,b){if(",
    "0==b)if(a instanceof D)b=4;else if(\"string\"==typeof a)b=2;else if(\"n",
    "umber\"==typeof a)b=1;else if(\"boolean\"==typeof a)b=3;else throw Erro",
    "r(\"Unexpected evaluation result.\");if(2!=b&&1!=b&&3!=b&&!(a instanceo",
    "f D))throw Error(\"value could not be converted to the specified type\"",
    ");this.resultType=b;switch(b){case 2:this.stringValue=a instanceof D?G(",
    "a):\"\"+a;break;case 1:this.numberValue=a instanceof D?+G(a):+a;break;c",
    "ase 3:this.booleanValue=a instanceof D?0<a.u():!!a;break;case 4:case 5:",
    "case 6:case 7:var c=\na.iterator();var d=[];for(var e=c.next();e;e=c.ne",
    "xt())d.push(e);this.snapshotLength=a.u();this.invalidIteratorState=!1;b",
    "reak;case 8:case 9:this.singleNodeValue=F(a);break;default:throw Error(",
    "\"Unknown XPathResult type.\");}var g=0;this.iterateNext=function(){if(",
    "4!=b&&5!=b)throw Error(\"iterateNext called with wrong result type\");r",
    "eturn g>=d.length?null:d[g++]};this.snapshotItem=function(a){if(6!=b&&7",
    "!=b)throw Error(\"snapshotItem called with wrong result type\");return ",
    "a>=d.length||0>a?null:d[a]}}\nW.ANY_TYPE=0;W.NUMBER_TYPE=1;W.STRING_TYP",
    "E=2;W.BOOLEAN_TYPE=3;W.UNORDERED_NODE_ITERATOR_TYPE=4;W.ORDERED_NODE_IT",
    "ERATOR_TYPE=5;W.UNORDERED_NODE_SNAPSHOT_TYPE=6;W.ORDERED_NODE_SNAPSHOT_",
    "TYPE=7;W.ANY_UNORDERED_NODE_TYPE=8;W.FIRST_ORDERED_NODE_TYPE=9;function",
    " xb(a){this.lookupNamespaceURI=tb(a)}\naa(\"wgxpath.install\",function(",
    "a,b){a=a||k;var c=a.Document&&a.Document.prototype||a.document;if(!c.ev",
    "aluate||b)a.XPathResult=W,c.evaluate=function(a,b,c,h){return(new wb(a,",
    "c)).evaluate(b,h)},c.createExpression=function(a,b){return new wb(a,b)}",
    ",c.createNSResolver=function(a){return new xb(a)}});ua();ua();function ",
    "X(a,b){this.v={};this.g=[];this.F=0;var c=arguments.length;if(1<c){if(c",
    "%2)throw Error(\"Uneven number of arguments\");for(var d=0;d<c;d+=2)thi",
    "s.set(arguments[d],arguments[d+1])}else a&&this.addAll(a)}function zb(a",
    "){Ab(a);return a.g.concat()}f=X.prototype;f.clear=function(){this.v={};",
    "this.F=this.g.length=0};f.remove=function(a){return Object.prototype.ha",
    "sOwnProperty.call(this.v,a)?(delete this.v[a],this.F--,this.g.length>2*",
    "this.F&&Ab(this),!0):!1};\nfunction Ab(a){var b,c;if(a.F!=a.g.length){f",
    "or(b=c=0;c<a.g.length;){var d=a.g[c];Object.prototype.hasOwnProperty.ca",
    "ll(a.v,d)&&(a.g[b++]=d);c++}a.g.length=b}if(a.F!=a.g.length){var e={};f",
    "or(b=c=0;c<a.g.length;)d=a.g[c],Object.prototype.hasOwnProperty.call(e,",
    "d)||(a.g[b++]=d,e[d]=1),c++;a.g.length=b}}f.get=function(a,b){return Ob",
    "ject.prototype.hasOwnProperty.call(this.v,a)?this.v[a]:b};f.set=functio",
    "n(a,b){Object.prototype.hasOwnProperty.call(this.v,a)||(this.F++,this.g",
    ".push(a));this.v[a]=b};\nf.addAll=function(a){if(a instanceof X){var b=",
    "zb(a);Ab(a);for(var c=[],d=0;d<a.g.length;d++)c.push(a.v[a.g[d]]);a=c}e",
    "lse{b=[];var d=0;for(e in a)b[d++]=e;d=[];var e=0;for(c in a)d[e++]=a[c",
    "];a=d}for(c=0;c<b.length;c++)this.set(b[c],a[c])};f.forEach=function(a,",
    "b){for(var c=zb(this),d=0;d<c.length;d++){var e=c[d],g=this.get(e);a.ca",
    "ll(b,g,e,this)}};f.clone=function(){return new X(this)};var Bb={};funct",
    "ion Y(a,b,c){var d=typeof a;(\"object\"==d&&null!=a||\"function\"==d)&&",
    "(a=a.b);a=new Cb(a);!b||b in Bb&&!c||(Bb[b]={key:a,shift:!1},c&&(Bb[c]=",
    "{key:a,shift:!0}));return a}function Cb(a){this.code=a}Y(8);Y(9);Y(13);",
    "var Db=Y(16),Eb=Y(17),Fb=Y(18);Y(19);Y(20);Y(27);Y(32,\" \");Y(33);Y(34",
    ");Y(35);Y(36);Y(37);Y(38);Y(39);Y(40);Y(44);Y(45);Y(46);Y(48,\"0\",\")",
    "\");Y(49,\"1\",\"!\");Y(50,\"2\",\"@\");Y(51,\"3\",\"#\");Y(52,\"4\",\"",
    "$\");Y(53,\"5\",\"%\");Y(54,\"6\",\"^\");Y(55,\"7\",\"&\");Y(56,\"8\",",
    "\"*\");Y(57,\"9\",\"(\");Y(65,\"a\",\"A\");\nY(66,\"b\",\"B\");Y(67,\"c",
    "\",\"C\");Y(68,\"d\",\"D\");Y(69,\"e\",\"E\");Y(70,\"f\",\"F\");Y(71,\"",
    "g\",\"G\");Y(72,\"h\",\"H\");Y(73,\"i\",\"I\");Y(74,\"j\",\"J\");Y(75,",
    "\"k\",\"K\");Y(76,\"l\",\"L\");Y(77,\"m\",\"M\");Y(78,\"n\",\"N\");Y(79",
    ",\"o\",\"O\");Y(80,\"p\",\"P\");Y(81,\"q\",\"Q\");Y(82,\"r\",\"R\");Y(8",
    "3,\"s\",\"S\");Y(84,\"t\",\"T\");Y(85,\"u\",\"U\");Y(86,\"v\",\"V\");Y(",
    "87,\"w\",\"W\");Y(88,\"x\",\"X\");Y(89,\"y\",\"Y\");Y(90,\"z\",\"Z\");v",
    "ar Gb=Y(qa?{c:91,b:91}:pa?{c:224,b:91}:{c:0,b:91});Y(qa?{c:92,b:92}:pa?",
    "{c:224,b:93}:{c:0,b:92});Y(qa?{c:93,b:93}:pa?{c:0,b:0}:{c:93,b:null});",
    "\nY({c:96,b:96},\"0\");Y({c:97,b:97},\"1\");Y({c:98,b:98},\"2\");Y({c:9",
    "9,b:99},\"3\");Y({c:100,b:100},\"4\");Y({c:101,b:101},\"5\");Y({c:102,b",
    ":102},\"6\");Y({c:103,b:103},\"7\");Y({c:104,b:104},\"8\");Y({c:105,b:1",
    "05},\"9\");Y({c:106,b:106},\"*\");Y({c:107,b:107},\"+\");Y({c:109,b:109",
    "},\"-\");Y({c:110,b:110},\".\");Y({c:111,b:111},\"/\");Y(144);Y(112);Y(",
    "113);Y(114);Y(115);Y(116);Y(117);Y(118);Y(119);Y(120);Y(121);Y(122);Y(1",
    "23);Y({c:107,b:187},\"=\",\"+\");Y(108,\",\");Y({c:109,b:189},\"-\",\"_",
    "\");Y(188,\",\",\"<\");Y(190,\".\",\">\");Y(191,\"/\",\"?\");\nY(192,\"",
    "`\",\"~\");Y(219,\"[\",\"{\");Y(220,\"\\\\\",\"|\");Y(221,\"]\",\"}\");",
    "Y({c:59,b:186},\";\",\":\");Y(222,\"'\",'\"');var Z=new X;Z.set(1,Db);Z",
    ".set(2,Eb);Z.set(4,Fb);Z.set(8,Gb);(function(a){var b=new X;p(zb(a),fun",
    "ction(c){b.set(a.get(c).code,c)});return b})(Z);aa(\"_\",function(a){if",
    "(Ba(a)){if(!Ba(a))throw new ka(15,\"Element is not selectable\");var b=",
    "\"selected\",c=a.type&&a.type.toLowerCase();if(\"checkbox\"==c||\"radio",
    "\"==c)b=\"checked\";a=!!a[b]}else a=!1;return a});; return this._.apply",
    "(null,arguments);}.apply({navigator:typeof window!='undefined'?window.n",
    "avigator:null,document:typeof window!='undefined'?window.document:null}",
    ", arguments);}",
    NULL
};

const char* const REMOVE_LOCAL_STORAGE_ITEM[] = {
    "function(){return function(){var b=window;function d(a,c){this.code=a;t",
    "his.state=e[a]||f;this.message=c||\"\";a=this.state.replace(/((?:^|\\s+",
    ")[a-z])/g,function(a){return a.toUpperCase().replace(/^[\\s\\xa0]+/g,\"",
    "\")});c=a.length-5;if(0>c||a.indexOf(\"Error\",c)!=c)a+=\"Error\";this.",
    "name=a;a=Error(this.message);a.name=this.name;this.stack=a.stack||\"\"}",
    "\n(function(){var a=Error;function c(){}c.prototype=a.prototype;d.c=a.p",
    "rototype;d.prototype=new c;d.prototype.constructor=d;d.b=function(c,t,u",
    "){for(var p=Array(arguments.length-2),l=2;l<arguments.length;l++)p[l-2]",
    "=arguments[l];return a.prototype[t].apply(c,p)}})();var f=\"unknown err",
    "or\",e={15:\"element not selectable\",11:\"element not visible\"};e[31]",
    "=f;e[30]=f;e[24]=\"invalid cookie domain\";e[29]=\"invalid element coor",
    "dinates\";e[12]=\"invalid element state\";e[32]=\"invalid selector\";e[",
    "51]=\"invalid selector\";\ne[52]=\"invalid selector\";e[17]=\"javascrip",
    "t error\";e[405]=\"unsupported operation\";e[34]=\"move target out of b",
    "ounds\";e[27]=\"no such alert\";e[7]=\"no such element\";e[8]=\"no such",
    " frame\";e[23]=\"no such window\";e[28]=\"script timeout\";e[33]=\"sess",
    "ion not created\";e[10]=\"stale element reference\";e[21]=\"timeout\";e",
    "[25]=\"unable to set cookie\";e[26]=\"unexpected alert open\";e[13]=f;e",
    "[9]=\"unknown command\";d.prototype.toString=function(){return this.nam",
    "e+\": \"+this.message};function g(a){this.a=a}g.prototype.setItem=funct",
    "ion(a,c){try{this.a.setItem(a,c+\"\")}catch(r){throw new d(13,r.message",
    ");}};g.prototype.getItem=function(a){return this.a.getItem(a)};g.protot",
    "ype.removeItem=function(a){var c=this.getItem(a);this.a.removeItem(a);r",
    "eturn c};g.prototype.clear=function(){this.a.clear()};g.prototype.size=",
    "function(){return this.a.length};g.prototype.key=function(a){return thi",
    "s.a.key(a)};function h(a){if(null==(b||b).localStorage)throw new d(13,",
    "\"Local storage undefined\");return(new g(b.localStorage)).removeItem(a",
    ")}var k=[\"_\"],m=this;k[0]in m||!m.execScript||m.execScript(\"var \"+k",
    "[0]);for(var n;k.length&&(n=k.shift());){var q;if(q=!k.length)q=void 0!",
    "==h;q?m[n]=h:m=m[n]&&m[n]!==Object.prototype[n]?m[n]:m[n]={}};; return ",
    "this._.apply(null,arguments);}.apply({navigator:typeof window!='undefin",
    "ed'?window.navigator:null,document:typeof window!='undefined'?window.do",
    "cument:null}, arguments);}",
    NULL
};

const char* const REMOVE_SESSION_STORAGE_ITEM[] = {
    "function(){return function(){var b=window;function d(a,c){this.code=a;t",
    "his.state=e[a]||f;this.message=c||\"\";a=this.state.replace(/((?:^|\\s+",
    ")[a-z])/g,function(a){return a.toUpperCase().replace(/^[\\s\\xa0]+/g,\"",
    "\")});c=a.length-5;if(0>c||a.indexOf(\"Error\",c)!=c)a+=\"Error\";this.",
    "name=a;a=Error(this.message);a.name=this.name;this.stack=a.stack||\"\"}",
    "\n(function(){var a=Error;function c(){}c.prototype=a.prototype;d.c=a.p",
    "rototype;d.prototype=new c;d.prototype.constructor=d;d.b=function(c,t,u",
    "){for(var p=Array(arguments.length-2),l=2;l<arguments.length;l++)p[l-2]",
    "=arguments[l];return a.prototype[t].apply(c,p)}})();var f=\"unknown err",
    "or\",e={15:\"element not selectable\",11:\"element not visible\"};e[31]",
    "=f;e[30]=f;e[24]=\"invalid cookie domain\";e[29]=\"invalid element coor",
    "dinates\";e[12]=\"invalid element state\";e[32]=\"invalid selector\";e[",
    "51]=\"invalid selector\";\ne[52]=\"invalid selector\";e[17]=\"javascrip",
    "t error\";e[405]=\"unsupported operation\";e[34]=\"move target out of b",
    "ounds\";e[27]=\"no such alert\";e[7]=\"no such element\";e[8]=\"no such",
    " frame\";e[23]=\"no such window\";e[28]=\"script timeout\";e[33]=\"sess",
    "ion not created\";e[10]=\"stale element reference\";e[21]=\"timeout\";e",
    "[25]=\"unable to set cookie\";e[26]=\"unexpected alert open\";e[13]=f;e",
    "[9]=\"unknown command\";d.prototype.toString=function(){return this.nam",
    "e+\": \"+this.message};function g(a){this.a=a}g.prototype.setItem=funct",
    "ion(a,c){try{this.a.setItem(a,c+\"\")}catch(r){throw new d(13,r.message",
    ");}};g.prototype.getItem=function(a){return this.a.getItem(a)};g.protot",
    "ype.removeItem=function(a){var c=this.getItem(a);this.a.removeItem(a);r",
    "eturn c};g.prototype.clear=function(){this.a.clear()};g.prototype.size=",
    "function(){return this.a.length};g.prototype.key=function(a){return thi",
    "s.a.key(a)};function h(a){var c=b||b;if(null!=c.sessionStorage&&null!=c",
    ".sessionStorage.clear)c=new g(b.sessionStorage);else throw new d(13,\"S",
    "ession storage undefined\");return c.removeItem(a)}var k=[\"_\"],m=this",
    ";k[0]in m||!m.execScript||m.execScript(\"var \"+k[0]);for(var n;k.lengt",
    "h&&(n=k.shift());){var q;if(q=!k.length)q=void 0!==h;q?m[n]=h:m=m[n]&&m",
    "[n]!==Object.prototype[n]?m[n]:m[n]={}};; return this._.apply(null,argu",
    "ments);}.apply({navigator:typeof window!='undefined'?window.navigator:n",
    "ull,document:typeof window!='undefined'?window.document:null}, argument",
    "s);}",
    NULL
};

const char* const SET_LOCAL_STORAGE_ITEM[] = {
    "function(){return function(){var b=window;function d(a,c){this.code=a;t",
    "his.state=e[a]||f;this.message=c||\"\";a=this.state.replace(/((?:^|\\s+",
    ")[a-z])/g,function(a){return a.toUpperCase().replace(/^[\\s\\xa0]+/g,\"",
    "\")});c=a.length-5;if(0>c||a.indexOf(\"Error\",c)!=c)a+=\"Error\";this.",
    "name=a;a=Error(this.message);a.name=this.name;this.stack=a.stack||\"\"}",
    "\n(function(){var a=Error;function c(){}c.prototype=a.prototype;d.c=a.p",
    "rototype;d.prototype=new c;d.prototype.constructor=d;d.b=function(c,t,u",
    "){for(var p=Array(arguments.length-2),l=2;l<arguments.length;l++)p[l-2]",
    "=arguments[l];return a.prototype[t].apply(c,p)}})();var f=\"unknown err",
    "or\",e={15:\"element not selectable\",11:\"element not visible\"};e[31]",
    "=f;e[30]=f;e[24]=\"invalid cookie domain\";e[29]=\"invalid element coor",
    "dinates\";e[12]=\"invalid element state\";e[32]=\"invalid selector\";e[",
    "51]=\"invalid selector\";\ne[52]=\"invalid selector\";e[17]=\"javascrip",
    "t error\";e[405]=\"unsupported operation\";e[34]=\"move target out of b",
    "ounds\";e[27]=\"no such alert\";e[7]=\"no such element\";e[8]=\"no such",
    " frame\";e[23]=\"no such window\";e[28]=\"script timeout\";e[33]=\"sess",
    "ion not created\";e[10]=\"stale element reference\";e[21]=\"timeout\";e",
    "[25]=\"unable to set cookie\";e[26]=\"unexpected alert open\";e[13]=f;e",
    "[9]=\"unknown command\";d.prototype.toString=function(){return this.nam",
    "e+\": \"+this.message};function g(a){this.a=a}g.prototype.setItem=funct",
    "ion(a,c){try{this.a.setItem(a,c+\"\")}catch(r){throw new d(13,r.message",
    ");}};g.prototype.getItem=function(a){return this.a.getItem(a)};g.protot",
    "ype.removeItem=function(a){var c=this.getItem(a);this.a.removeItem(a);r",
    "eturn c};g.prototype.clear=function(){this.a.clear()};g.prototype.size=",
    "function(){return this.a.length};g.prototype.key=function(a){return thi",
    "s.a.key(a)};function h(a,c){if(null==(b||b).localStorage)throw new d(13",
    ",\"Local storage undefined\");(new g(b.localStorage)).setItem(a,c)}var ",
    "k=[\"_\"],m=this;k[0]in m||!m.execScript||m.execScript(\"var \"+k[0]);f",
    "or(var n;k.length&&(n=k.shift());){var q;if(q=!k.length)q=void 0!==h;q?",
    "m[n]=h:m=m[n]&&m[n]!==Object.prototype[n]?m[n]:m[n]={}};; return this._",
    ".apply(null,arguments);}.apply({navigator:typeof window!='undefined'?wi",
    "ndow.navigator:null,document:typeof window!='undefined'?window.document",
    ":null}, arguments);}",
    NULL
};

const char* const SET_SESSION_STORAGE_ITEM[] = {
    "function(){return function(){var b=window;function e(a,c){this.code=a;t",
    "his.state=f[a]||g;this.message=c||\"\";a=this.state.replace(/((?:^|\\s+",
    ")[a-z])/g,function(a){return a.toUpperCase().replace(/^[\\s\\xa0]+/g,\"",
    "\")});c=a.length-5;if(0>c||a.indexOf(\"Error\",c)!=c)a+=\"Error\";this.",
    "name=a;a=Error(this.message);a.name=this.name;this.stack=a.stack||\"\"}",
    "\n(function(){var a=Error;function c(){}c.prototype=a.prototype;e.c=a.p",
    "rototype;e.prototype=new c;e.prototype.constructor=e;e.b=function(c,r,t",
    "){for(var d=Array(arguments.length-2),m=2;m<arguments.length;m++)d[m-2]",
    "=arguments[m];return a.prototype[r].apply(c,d)}})();var g=\"unknown err",
    "or\",f={15:\"element not selectable\",11:\"element not visible\"};f[31]",
    "=g;f[30]=g;f[24]=\"invalid cookie domain\";f[29]=\"invalid element coor",
    "dinates\";f[12]=\"invalid element state\";f[32]=\"invalid selector\";f[",
    "51]=\"invalid selector\";\nf[52]=\"invalid selector\";f[17]=\"javascrip",
    "t error\";f[405]=\"unsupported operation\";f[34]=\"move target out of b",
    "ounds\";f[27]=\"no such alert\";f[7]=\"no such element\";f[8]=\"no such",
    " frame\";f[23]=\"no such window\";f[28]=\"script timeout\";f[33]=\"sess",
    "ion not created\";f[10]=\"stale element reference\";f[21]=\"timeout\";f",
    "[25]=\"unable to set cookie\";f[26]=\"unexpected alert open\";f[13]=g;f",
    "[9]=\"unknown command\";e.prototype.toString=function(){return this.nam",
    "e+\": \"+this.message};function h(a){this.a=a}h.prototype.setItem=funct",
    "ion(a,c){try{this.a.setItem(a,c+\"\")}catch(d){throw new e(13,d.message",
    ");}};h.prototype.getItem=function(a){return this.a.getItem(a)};h.protot",
    "ype.removeItem=function(a){var c=this.getItem(a);this.a.removeItem(a);r",
    "eturn c};h.prototype.clear=function(){this.a.clear()};h.prototype.size=",
    "function(){return this.a.length};h.prototype.key=function(a){return thi",
    "s.a.key(a)};function k(a,c){var d=b||b;if(null!=d.sessionStorage&&null!",
    "=d.sessionStorage.clear)d=new h(b.sessionStorage);else throw new e(13,",
    "\"Session storage undefined\");d.setItem(a,c)}var l=[\"_\"],n=this;l[0]",
    "in n||!n.execScript||n.execScript(\"var \"+l[0]);for(var p;l.length&&(p",
    "=l.shift());){var q;if(q=!l.length)q=void 0!==k;q?n[p]=k:n=n[p]&&n[p]!=",
    "=Object.prototype[p]?n[p]:n[p]={}};; return this._.apply(null,arguments",
    ");}.apply({navigator:typeof window!='undefined'?window.navigator:null,d",
    "ocument:typeof window!='undefined'?window.document:null}, arguments);}",
    NULL
};

}  // namespace atoms
}  // namespace webdriver

