18ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 28ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen/* 38ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen * Binary Ajax 0.1.5 48ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen * Copyright (c) 2008 Jacob Seidelin, cupboy@gmail.com, http://blog.nihilogic.dk/ 58ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen * MIT License [http://www.opensource.org/licenses/mit-license.php] 68ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen */ 78ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 88ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 98ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenvar BinaryFile = function(strData, iDataOffset, iDataLength) { 108ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var data = strData; 118ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var dataOffset = iDataOffset || 0; 128ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var dataLength = 0; 138ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 148ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen this.getRawData = function() { 158ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen return data; 168ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 178ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 188ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen if (typeof strData == "string") { 198ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen dataLength = iDataLength || data.length; 208ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 218ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen this.getByteAt = function(iOffset) { 228ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen return data.charCodeAt(iOffset + dataOffset) & 0xFF; 238ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 248ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } else if (typeof strData == "unknown") { 258ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen dataLength = iDataLength || IEBinary_getLength(data); 268ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 278ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen this.getByteAt = function(iOffset) { 288ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen return IEBinary_getByteAt(data, iOffset + dataOffset); 298ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 308ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 318ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 328ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen this.getLength = function() { 338ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen return dataLength; 348ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 358ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 368ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen this.getSByteAt = function(iOffset) { 378ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var iByte = this.getByteAt(iOffset); 388ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen if (iByte > 127) 398ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen return iByte - 256; 408ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen else 418ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen return iByte; 428ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 438ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 448ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen this.getShortAt = function(iOffset, bBigEndian) { 458ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var iShort = bBigEndian ? 468ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen (this.getByteAt(iOffset) << 8) + this.getByteAt(iOffset + 1) 478ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen : (this.getByteAt(iOffset + 1) << 8) + this.getByteAt(iOffset) 488ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen if (iShort < 0) iShort += 65536; 498ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen return iShort; 508ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 518ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen this.getSShortAt = function(iOffset, bBigEndian) { 528ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var iUShort = this.getShortAt(iOffset, bBigEndian); 538ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen if (iUShort > 32767) 548ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen return iUShort - 65536; 558ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen else 568ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen return iUShort; 578ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 588ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen this.getLongAt = function(iOffset, bBigEndian) { 598ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var iByte1 = this.getByteAt(iOffset), 608ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen iByte2 = this.getByteAt(iOffset + 1), 618ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen iByte3 = this.getByteAt(iOffset + 2), 628ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen iByte4 = this.getByteAt(iOffset + 3); 638ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 648ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var iLong = bBigEndian ? 658ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen (((((iByte1 << 8) + iByte2) << 8) + iByte3) << 8) + iByte4 668ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen : (((((iByte4 << 8) + iByte3) << 8) + iByte2) << 8) + iByte1; 678ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen if (iLong < 0) iLong += 4294967296; 688ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen return iLong; 698ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 708ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen this.getSLongAt = function(iOffset, bBigEndian) { 718ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var iULong = this.getLongAt(iOffset, bBigEndian); 728ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen if (iULong > 2147483647) 738ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen return iULong - 4294967296; 748ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen else 758ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen return iULong; 768ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 778ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen this.getStringAt = function(iOffset, iLength) { 788ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var aStr = []; 798ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen for (var i=iOffset,j=0;i<iOffset+iLength;i++,j++) { 808ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen aStr[j] = String.fromCharCode(this.getByteAt(i)); 818ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 828ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen return aStr.join(""); 838ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 848ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 858ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen this.getCharAt = function(iOffset) { 868ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen return String.fromCharCode(this.getByteAt(iOffset)); 878ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 888ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen this.toBase64 = function() { 898ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen return window.btoa(data); 908ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 918ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen this.fromBase64 = function(strBase64) { 928ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen data = window.atob(strBase64); 938ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 948ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen} 958ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 968ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 978ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenvar BinaryAjax = (function() { 988ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 998ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen function createRequest() { 1008ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var oHTTP = null; 1018ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen if (window.XMLHttpRequest) { 1028ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen oHTTP = new XMLHttpRequest(); 1038ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } else if (window.ActiveXObject) { 1048ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen oHTTP = new ActiveXObject("Microsoft.XMLHTTP"); 1058ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 1068ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen return oHTTP; 1078ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 1088ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1098ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen function getHead(strURL, fncCallback, fncError) { 1108ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var oHTTP = createRequest(); 1118ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen if (oHTTP) { 1128ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen if (fncCallback) { 1138ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen if (typeof(oHTTP.onload) != "undefined") { 1148ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen oHTTP.onload = function() { 1158ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen if (oHTTP.status == "200") { 1168ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen fncCallback(this); 1178ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } else { 1188ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen if (fncError) fncError(); 1198ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 1208ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen oHTTP = null; 1218ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen }; 1228ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } else { 1238ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen oHTTP.onreadystatechange = function() { 1248ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen if (oHTTP.readyState == 4) { 1258ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen if (oHTTP.status == "200") { 1268ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen fncCallback(this); 1278ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } else { 1288ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen if (fncError) fncError(); 1298ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 1308ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen oHTTP = null; 1318ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 1328ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen }; 1338ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 1348ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 1358ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen oHTTP.open("HEAD", strURL, true); 1368ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen oHTTP.send(null); 1378ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } else { 1388ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen if (fncError) fncError(); 1398ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 1408ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 1418ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1428ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen function sendRequest(strURL, fncCallback, fncError, aRange, bAcceptRanges, iFileSize) { 1438ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var oHTTP = createRequest(); 1448ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen if (oHTTP) { 1458ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1468ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var iDataOffset = 0; 1478ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen if (aRange && !bAcceptRanges) { 1488ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen iDataOffset = aRange[0]; 1498ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 1508ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var iDataLen = 0; 1518ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen if (aRange) { 1528ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen iDataLen = aRange[1]-aRange[0]+1; 1538ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 1548ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1558ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen if (fncCallback) { 1568ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen if (typeof(oHTTP.onload) != "undefined") { 1578ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen oHTTP.onload = function() { 1588ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1598ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen if (oHTTP.status == "200" || oHTTP.status == "206") { 1608ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen this.binaryResponse = new BinaryFile(this.responseText, iDataOffset, iDataLen); 1618ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen this.fileSize = iFileSize || this.getResponseHeader("Content-Length"); 1628ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen fncCallback(this); 1638ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } else { 1648ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen if (fncError) fncError(); 1658ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 1668ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen oHTTP = null; 1678ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen }; 1688ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } else { 1698ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen oHTTP.onreadystatechange = function() { 1708ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen if (oHTTP.readyState == 4) { 1718ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen if (oHTTP.status == "200" || oHTTP.status == "206") { 1728ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen this.binaryResponse = new BinaryFile(oHTTP.responseBody, iDataOffset, iDataLen); 1738ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen this.fileSize = iFileSize || this.getResponseHeader("Content-Length"); 1748ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen fncCallback(this); 1758ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } else { 1768ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen if (fncError) fncError(); 1778ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 1788ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen oHTTP = null; 1798ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 1808ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen }; 1818ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 1828ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 1838ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen oHTTP.open("GET", strURL, true); 1848ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1858ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen if (oHTTP.overrideMimeType) oHTTP.overrideMimeType('text/plain; charset=x-user-defined'); 1868ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1878ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen if (aRange && bAcceptRanges) { 1888ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen oHTTP.setRequestHeader("Range", "bytes=" + aRange[0] + "-" + aRange[1]); 1898ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 1908ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1918ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen oHTTP.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 1970 00:00:00 GMT"); 1928ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1938ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen oHTTP.send(null); 1948ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } else { 1958ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen if (fncError) fncError(); 1968ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 1978ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 1988ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1998ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen return function(strURL, fncCallback, fncError, aRange) { 2008ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2018ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen if (aRange) { 2028ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen getHead( 2038ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen strURL, 2048ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen function(oHTTP) { 2058ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var iLength = parseInt(oHTTP.getResponseHeader("Content-Length"),10); 2068ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var strAcceptRanges = oHTTP.getResponseHeader("Accept-Ranges"); 2078ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2088ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var iStart, iEnd; 2098ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen iStart = aRange[0]; 2108ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen if (aRange[0] < 0) 2118ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen iStart += iLength; 2128ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen iEnd = iStart + aRange[1] - 1; 2138ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2148ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen sendRequest(strURL, fncCallback, fncError, [iStart, iEnd], (strAcceptRanges == "bytes"), iLength); 2158ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 2168ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen ); 2178ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2188ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } else { 2198ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen sendRequest(strURL, fncCallback, fncError); 2208ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 2218ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 2228ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2238ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen}()); 2248ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2258ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2268ae428e0fb7feea16d79853f29447469a93bedffKristian Monsendocument.write( 2278ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen "<script type='text/vbscript'>\r\n" 2288ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen + "Function IEBinary_getByteAt(strBinary, iOffset)\r\n" 2298ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen + " IEBinary_getByteAt = AscB(MidB(strBinary,iOffset+1,1))\r\n" 2308ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen + "End Function\r\n" 2318ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen + "Function IEBinary_getLength(strBinary)\r\n" 2328ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen + " IEBinary_getLength = LenB(strBinary)\r\n" 2338ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen + "End Function\r\n" 2348ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen + "</script>\r\n" 2358ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen); 236