<html id="webtest0">
<head id="webtest1">
<style id="webtest2">
body * {
    -webkit-writing-mode: vertical-lr;
    -webkit-text-combine: horizontal;
}
#test {
    height: 7px;
    white-space: pre-wrap;
}
</style>
<script id="webtest3">
if (window.testRunner)
    testRunner.dumpAsText();

function runTest() {
    document.body.offsetTop;
    var testContainer = document.getElementById('test');
    testContainer.parentNode.removeChild(testContainer);
}
</script>
</head>
<body class="wf_class2" id="webtest4" onload='runTest()'><p id="webtest5">Test passes if there's no crash.</p>
<!-- The empty scripts tags are needed<script>
function webtest_fn_12() {
try {
var head = document.getElementsByTagName("head")[0];
var style = document.createElement("style");
style.innerHTML="@media speech {<script>
function webtest_fn_34() {
document.getElementById("webtest6").appendChild(document.createElementNS("http://www.w3.org/TR/html5/", "u")).name=document.applets[0].lookupNamespacePrefix("nonzero", document.body);
}
webtest_fn_34();
</script>
-webkit-flex-order:1024;max-zoom:9223372036854775808%;}";
head.appendChild(style);
} catch(e) {
  document.write("Errlog webtest_fn_12: " + e.name + ": " + e.message + "<br>");
}
}
webtest_fn_12();
</script>
 to split the RenderCombineText and reproduce the bug. -->
<div id="test"><p id="webtest6">foo   <script id="webtest7"></script>
  <script id="webtest8"></script>
</p>
</div>
</body><script>
function webtest_fn_1() {
try {
document.applets[0].addEventListener("decrypt", decodeURIComponent, true);
} catch(e) {
  document.write("Errlog webtest_fn_1: " + e.name + ": " + e.message + "<br>");
}
}
webtest_fn_1();
</script>
<script>
function webtest_fn_2() {
try {
var range = document.createRange();

range.setStartBefore(document.links[2]);
range.setEndAfter(document.links[2]);
range.deleteContents();
range.surroundContents(document.body);
var frag = range.cloneContents();
range.setStartAfter(document.getElementById("webtest1"));
range.detach();
range.setEndBefore(document.scripts[1]);
range.commonAncestorContainer;} catch(e) {
  document.write("Errlog webtest_fn_2: " + e.name + ": " + e.message + "<br>");
}
}
webtest_fn_2();
</script>
<script>
function webtest_fn_3() {
try {
document.designMode = "off";
document.images[2].contentEditable="true";
document.images[2].contentDocument.execCommand("Italic", true, "&#x02ae;&#x0101;&#x012c;&#x01dd;&#x02ea;&#x01ed;&#x0032;&#x95fe;&#x016b;&#x00b2;&#x00cf;&#x0004;&#x006f;&#x01b0;&#x00a8;&#x00f3;&#x00b4;&#x8571;");
document.getElementById("webtest4").contentEditable="true";
document.getElementById("webtest4").contentDocument.execCommand("DecreaseFontSize", false, "Arial");
document.getElementById("webtest1").appendChild(document.createComment("comment")).contentEditable="true";
document.getElementById("webtest1").appendChild(document.createComment("comment")).contentDocument.execCommand("Redo", false, null);
document.execCommand("Subscript", false, null);
document.execCommand("RemoveFormat", false, null);
document.forms[2].contentEditable="true";
document.forms[2].contentDocument.execCommand("JustifyRight", true, null);
document.execCommand("Cut", false, null);
} catch(e) {
  document.write("Errlog webtest_fn_3: " + e.name + ": " + e.message + "<br><hgroup/>");
}
}
webtest_fn_3();
</script>
<script>
function webtest_fn_4() {
var head = document.getElementsByTagName("head")[0];
var style = document.createElement("style");
style.innerHTML="#test {-webkit-box-reflect:above -1073741824pt url(javascript:function(){location.reload()}()) 2147483519mm 0xffffffffpt 4611686018427387904% -4294967295cm round stretch;-webkit-line-break:loose;z-index:-32768;-webkit-text-justify:&#x0270;&#x02c8;;}";
head.appendChild(style);
}
webtest_fn_4();
</script>
<script>
function webtest_fn_5() {
try {
var elem = document.getElementById("webtest4");
var rnd = [57,98,39,50,83,30,84,18,73,85];
var modified = false;
for (var i = 0; i < elem.attributes.length; i++)  {
  if (elem.attributes[i].specified && elem.attributes[i].name != "id") { 
    if (rnd[i] < 20) {
      elem.removeAttribute(elem.attributes[i].name);
      i--;
      modified = true;
    } else if (rnd[i] < 40) {
      elem.setAttribute(elem.attributes[i].name, '1024');
      modified = true;
    }
  }
} 

if (! modified) {
  elem.setAttribute('onmouseup', 'function() {document.applets[0].compareDocumentPosition(false);}');
}

} catch(e) {
  document.write("Errlog webtest_fn_5: " + e.name + ": " + e.message + "<br>");
}
}
webtest_fn_5();
</script>
<script>
function webtest_fn_6() {
var head = document.getElementsByTagName("head")[0];
style = document.createElement("style");
var rule = document.createTextNode("* {-webkit-flex-wrap:no-wrap;-webkit-mask-repeat-y:left ! important;-webkit-transition-duration:65536;}");
style.appendChild(rule);
head.appendChild(style);
}
webtest_fn_6();
</script>
<script>
function webtest_fn_7() {
delete document.forms[2].__lookupGetter__("frameRate");
}
webtest_fn_7();
</script>
<script>
function webtest_fn_8() {
try {
for (wf_i=0;wf_i<78;wf_i++) {
var lis = document.querySelector(":nth-last-of-type(65536n-1024)");
for (var i = 0; i < lis.length; i++) {
  lis.item(i).parentNode.removeChild(lis.item(i));
}
}
} catch(e) {
  document.write("Errlog webtest_fn_8: " + e.name + ": " + e.message + "<br><cite></cite>");
}
}
webtest_fn_8();
</script>
<script>
function webtest_fn_9() {
try {
document.anchors[4].setAttribute("style", "overflow: scroll");
document.anchors[4].scrollLeft = 32769;
document.anchors[4].scrolltop = 1024;
} catch(e) {
  document.write("Errlog webtest_fn_9: " + e.name + ": " + e.message + "<br>");
}
}
webtest_fn_9();
</script>
<script>
function webtest_fn_10() {
try {
var range = document.createRange();

range.setStartBefore(document.body);
range.setEndAfter(document.body);
range.collapse(false);
range.collapse(false);
range.setStartAfter(document.forms[2]);
} catch(e) {
  document.write("Errlog webtest_fn_10: " + e.name + ": " + e.message + "<br><em></em>");
}
}
webtest_fn_10();
</script>
<script>
function webtest_fn_11() {
try {
document.hasChildNodes();
} catch(e) {
  document.write("Errlog webtest_fn_11: " + e.name + ": " + e.message + "<br><form/>");
}
}
webtest_fn_11();
</script>
<script>
function webtest_fn_13() {
for (wf_i=0;wf_i<43;wf_i++) {
var elem = document.getElementById("webtest6").appendChild(document.createElementNS("http://www.w3.org/TR/html5/", "u"));
var rnd = [72,67,25,48,94,4,25,25,71,47];
var modified = false;
for (var i = 0; i < elem.attributes.length; i++)  {
  if (elem.attributes[i].specified && elem.attributes[i].name != "id") { 
    if (rnd[i] < 20) {
      elem.removeAttribute(elem.attributes[i].name);
      i--;
      modified = true;
    } else if (rnd[i] < 40) {
      elem.setAttribute(elem.attributes[i].name, '\u68b0\ue9ad');
      modified = true;
    }
  }
} 

if (! modified) {
  elem.setAttribute('nohref', 'nohref');
}

}
}
webtest_fn_13();
</script>
<script>
function webtest_fn_14() {
try {
var elem = document.getElementById("webtest7");
for (i in elem.childNodes) {
  if (elem.childNodes[i].nodeType == Node.TEXT_NODE) {
    elem.removeChild(elem.childNodes[i]);
  }
}
elem.appendChild(document.createTextNode('&#x020e;&#xc148;&#x0222;&#x0270;&#x0270;&#x0142;&#x013c;&#x0268;&#x0157;&#x0255;&#x02ef;&#x0091;&#x025f;&#x00e4;&#x0181;&#x01b7;'));
} catch(e) {
  document.write("Errlog webtest_fn_14: " + e.name + ": " + e.message + "<br><main></main>");
}
}
webtest_fn_14();
</script>
<script>
function webtest_fn_15() {
try {
for (wf_i=0;wf_i<71;wf_i++) {
document.designMode = "off";
document.execCommand("SelectAll");
document.execCommand("Delete", true, 0);
var range = document.createRange();
range.setStart(document.applets[0], 4);
range.setEnd(document.getElementById("webtest0"), 2);
range.execCommand("Indent", true, false);
range = document.createRange();
range.setStart(document.appendChild(document.createElement("style")).nextSibling, 8);
range.setEnd(document.getElementById("webtest5"), 8);
range.execCommand("FormatBlock", false, null);
document.execCommand("InsertBrOnReturn", false, null);
document.getElementById("webtest6").appendChild(document.createElementNS("http://www.w3.org/TR/html5/", "u")).contentEditable="true";
document.getElementById("webtest6").appendChild(document.createElementNS("http://www.w3.org/TR/html5/", "u")).contentDocument.execCommand("styleWithCSS", true, "Arial");
document.execCommand("InsertParagraph", true, null);
document.execCommand("InsertOrderedList", true, null);
range = document.createRange();
range.setStart(document.getElementById("webtest1"), 0);
range.setEnd(document.getElementById("webtest1").appendChild(document.createComment("comment")), 7);
range.execCommand("Unlink", false, null);
document.contentEditable="true";
document.contentDocument.execCommand("Undo", false, null);
}
} catch(e) {
  document.write("Errlog webtest_fn_15: " + e.name + ": " + e.message + "<br>");
}
}
webtest_fn_15();
</script>
<script>
function webtest_fn_16() {
try {
var elem = document.links[2];
elem.parentNode.removeChild(elem);
document.styleSheets[2].insertBefore(elem, document.styleSheets[2].childNodes[5]);
} catch(e) {
  document.write("Errlog webtest_fn_16: " + e.name + ": " + e.message + "<br><q/>");
}
}
webtest_fn_16();
</script>
<script>
function webtest_fn_17() {
try {
for (var i = 0; i < 10000; i++) {
  var s = new String("AAAA" + Math.random());
}
var elems = document.querySelectorAll("*");
a=[];
for (i = 0; i < elems.length; i++) {
  elems[i];
}
} catch(e) {
  document.write("Errlog webtest_fn_17: " + e.name + ": " + e.message + "<br>");
}
}
webtest_fn_17();
</script>
<script>
function webtest_fn_18() {
try {
document.designMode = "off";
document.execCommand("SelectAll");
document.applets[0].contentEditable="true";
document.applets[0].contentDocument.execCommand("CreateLink", true, null);
document.getElementById("webtest3").contentEditable="true";
document.getElementById("webtest3").contentDocument.execCommand("Cut", true, null);
document.execCommand("InsertNewlineInQuotedContent", true, true);
document.execCommand("BackColor", false, "Arial");
} catch(e) {
  document.write("Errlog webtest_fn_18: " + e.name + ": " + e.message + "<br>");
}
}
webtest_fn_18();
</script>
<script>
function webtest_fn_19() {
document.getElementById("webtest8").setAttribute("style","-webkit-animation-direction:alternate;-webkit-column-width:auto;");
}
webtest_fn_19();
</script>
<script>
function webtest_fn_20() {
var new_elem = document.createElement("image");
new_elem.setAttribute("id", "webtest12");
new_elem.setAttribute('width', '1073741823');
document.getElementById("webtest7").appendChild(document.createTextNode("data")).parentNode.insertBefore(new_elem, document.getElementById("webtest7").appendChild(document.createTextNode("data")).nextSibling);
}
webtest_fn_20();
</script>
<script>
function webtest_fn_21() {
try {
var scroll_84 = document.createElement("bgsound");
scroll_84.setAttribute("id", "webtest13");
document.anchors[4].appendChild(scroll_84);
scroll_84.setAttribute("style", "overflow: scroll; direction: rtl");
scroll_84.scrollLeft = -2147483519;
scroll_84.scrolltop = 4611686018427387904;
} catch(e) {
  document.write("Errlog webtest_fn_21: " + e.name + ": " + e.message + "<br><br>");
}
}
webtest_fn_21();
</script>
<script>
function webtest_fn_22() {
try {
var new_elem = document.createElement("acronym");
new_elem.setAttribute("id", "webtest14");
new_elem.setAttribute('aria-valuetext', '2x');
new_elem.setAttribute('prompt', 'D3{o2]X');
new_elem.setAttribute('itemid', 'http://&#x02de;&#x0116;');
new_elem.setAttribute('aria-expanded', 'aria-expanded');
document.documentElement.insertBefore(new_elem, document.documentElement.childNodes[6]);
} catch(e) {
  document.write("Errlog webtest_fn_22: " + e.name + ": " + e.message + "<br><noframes>");
}
}
webtest_fn_22();
</script>
<script>
function webtest_fn_23() {
try {
scroll_21 = document.createElement("iframe");
scroll_21.setAttribute("id", "webtest15");
document.getElementById("webtest6").appendChild(document.createElementNS("http://www.w3.org/TR/html5/", "u")).insertBefore(scroll_21, document.getElementById("webtest6").appendChild(document.createElementNS("http://www.w3.org/TR/html5/", "u")).childNodes[6]);
scroll_21.scrollLeft = 128;
scroll_21.scrolltop = 1073741824;
} catch(e) {
  document.write("Errlog webtest_fn_23: " + e.name + ": " + e.message + "<br><nav>");
}
}
webtest_fn_23();
</script>
<script>
function webtest_fn_24() {
try {
node_16 = document.getElementById("webtest5").appendChild(document.createAttribute("wfattr"));
} catch(e) {
  document.write("Errlog webtest_fn_24: " + e.name + ": " + e.message + "<br><fieldset>");
}
}
webtest_fn_24();
</script>
<script>
function webtest_fn_25() {
try {
var range = document.createRange();

range.setStartBefore(document.body);
range.setEndAfter(document.body);
range.insertNode(document.getElementById("webtest5"));
range.setStartAfter(node_16);
range.commonAncestorContainer;range.selectNodeContents(document.appendChild(document.createElement("style")).nextSibling);
range.setEndAfter(document.getElementById("webtest13"));
range.setStartBefore(document.getElementById("webtest6"));
range.detach();
} catch(e) {
  document.write("Errlog webtest_fn_25: " + e.name + ": " + e.message + "<br><applet>");
}
}
webtest_fn_25();
</script>
<script>
function webtest_fn_26() {
try {
var elem = document.getElementById("webtest2");
var rnd = [12,72,16,20,5,39,62,33,54,8];
var modified = false;
for (var i = 0; i < elem.attributes.length; i++)  {
  if (elem.attributes[i].specified && elem.attributes[i].name != "id") { 
    if (rnd[i] < 20) {
      elem.removeAttribute(elem.attributes[i].name);
      i--;
      modified = true;
    } else if (rnd[i] < 40) {
      elem.setAttribute(elem.attributes[i].name, '-11111111111111111111111.1');
      modified = true;
    }
  }
} 

if (! modified) {
  elem.setAttribute('wrap', 'soft');
}

} catch(e) {
  document.write("Errlog webtest_fn_26: " + e.name + ": " + e.message + "<br>");
}
}
webtest_fn_26();
</script>
<script>
function webtest_fn_27() {
try {
document.designMode = "on";
document.body.contentEditable="true";
document.body.contentDocument.execCommand("Underline", true, "Arial");
document.execCommand("FontSize", false, "red");
document.execCommand("FormatBlock", true, null);
} catch(e) {
  document.write("Errlog webtest_fn_27: " + e.name + ": " + e.message + "<br>");
}
}
webtest_fn_27();
</script>
<script>
function webtest_fn_28() {
try {
document.getElementById("webtest12").hasOwnProperty("secureConnectionStart");
} catch(e) {
  document.write("Errlog webtest_fn_28: " + e.name + ": " + e.message + "<br><col/>");
}
}
webtest_fn_28();
</script>
<script>
function webtest_fn_29() {
try {
for (var i = 0; i < 10000; i++) {
  var s = new String("AAAA" + Math.random());
}
var elems = document.querySelectorAll("*|*");
a=[];
for (i = 0; i < elems.length; i++) {
  elems[i].setAttribute("name", "name" + i);
}
} catch(e) {
  document.write("Errlog webtest_fn_29: " + e.name + ": " + e.message + "<br><th></th>");
}
}
webtest_fn_29();
</script>
<script>
function webtest_fn_30() {
try {
document.getElementById("webtest15").setAttribute("style","text-rendering:optimizeSpeed;");
document.getElementById("webtest15").appendChild(document.createTextNode('description'));
} catch(e) {
  document.write("Errlog webtest_fn_30: " + e.name + ": " + e.message + "<br>");
}
}
webtest_fn_30();
</script>
<script>
function webtest_fn_31() {
try {
var evt = document.createEvent("ProgressEvent");
evt.initProgressEvent("loadstart", false, true, true, 0xffffffff, -16384);
document.dispatchEvent(evt);
} catch(e) {
  document.write("Errlog webtest_fn_31: " + e.name + ": " + e.message + "<br><dcol>");
}
}
webtest_fn_31();
</script>
<script>
function webtest_fn_32() {
try {
var lis = window.frames[2].querySelectorAll(":in-range");
for (var i = 0; i < lis.length; i++) {
  lis.item(i).cloneNode(true);
}
} catch(e) {
  document.write("Errlog webtest_fn_32: " + e.name + ": " + e.message + "<br><button>");
}
}
webtest_fn_32();
</script>
<script>
function webtest_fn_33() {
try {
var range = document.createRange();

range.setStartBefore(document.querySelector(":first + :first-of-type > th:horizontal"));
range.setEndAfter(document.getElementById("webtest5").appendChild(document.createAttribute("wfattr")));
range.setEnd(document.getElementById("webtest3"), 4);
var frag = range.cloneContents();
range.insertNode(document.styleSheets[2]);
range.setEndAfter(document.getElementById("webtest14"));
range.detach();
range.toString();
range.toString();
var frag = range.extractContents();
range.toString();
range.setStart(document.anchors[4], 6);
} catch(e) {
  document.write("Errlog webtest_fn_33: " + e.name + ": " + e.message + "<br><textarea>");
}
}
webtest_fn_33();
</script>
<script>
function webtest_fn_35() {
try {
elem = document.appendChild(document.createElement("style")).nextSibling;
for (i in elem.childNodes) {
  if (elem.childNodes[i].nodeType == Node.TEXT_NODE) {
    elem.removeChild(elem.childNodes[i]);
  }
}
elem.appendChild(document.createTextNode('1023'));
} catch(e) {
  document.write("Errlog webtest_fn_35: " + e.name + ": " + e.message + "<br>");
}
}
webtest_fn_35();
</script>
<script>
function webtest_fn_36() {
try {
document.getElementById("webtest14").style.background="-webkit-canvas(webtest17)";
var ctx = document.getCSSCanvasContext("2d", "webtest17", 8192, 6166);
ctx.arcTo(1431655766, -1073741824, -0xffffffff, 65535, 32768);
ctx.isPointInStroke(new DOMPath(), 11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111.1, 11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111.1);
ctx.bezierCurveTo(document.applets[0].appendChild(document.createElement("style")).compareDocumentPosition(document.getElementById("webtest1").appendChild(document.createElement("col")).appendChild(document.createElement("legend")).translate), -65535, 1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, 1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, 32769, 4611686018427387904);
ctx.miterLimit = 128;
ctx.drawFocusRing(document.getElementById("test").appendChild(document.createElement("object")).nextElementSibling, Infinity, window.frames[2].appendChild(document.createElement("fedistantlight")).clientTop, document.querySelector(":first + :first-of-type > th:horizontal").appendChild(document.createElement("path")).ownerDocument.hasOwnProperty("secureConnectionStart"));
ctx.lineTo(-32767, document.getElementById("webtest5").appendChild(document.createElement("textcontent")).scrollLeft);
ctx.setLineJoin(String.fromCharCode(-16384));
} catch(e) {
  document.write("Errlog webtest_fn_36: " + e.name + ": " + e.message + "<br>");
}
}
webtest_fn_36();
</script>
