//======================================= //== FIN =============================== (function(){function p(a){this.data="";this.a=0;if("string"===typeof a)this.data=a;else if(b.D(a)||b.L(a)){a=new Uint8Array(a);try{this.data=String.fromCharCode.apply(null,a)}catch(f){for(var v=0;vg;++g)f[g]=b.getInt32();for(;64>g;++g)d=f[g-2],d=(d>>>17|d<<15)^ (d>>>19|d<<13)^d>>>10,c=f[g-15],c=(c>>>7|c<<25)^(c>>>18|c<<14)^c>>>3,f[g]=d+f[g-7]+c+f[g-16]|0;k=a.g;e=a.h;r=a.i;n=a.j;l=a.l;t=a.m;q=a.o;u=a.s;for(g=0;64>g;++g)d=(l>>>6|l<<26)^(l>>>11|l<<21)^(l>>>25|l<<7),h=q^l&(t^q),c=(k>>>2|k<<30)^(k>>>13|k<<19)^(k>>>22|k<<10),m=k&e|r&(k^e),d=u+d+h+x[g]+f[g],c+=m,u=q,q=t,t=l,l=n+d|0,n=r,r=e,e=k,k=d+c|0;a.g=a.g+k|0;a.h=a.h+e|0;a.i=a.i+r|0;a.j=a.j+n|0;a.l=a.l+l|0;a.m=a.m+t|0;a.o=a.o+q|0;a.s=a.s+u|0;p-=64}}var m,y,e,b=m=m||{};b.D=function(a){return"undefined"!==typeof ArrayBuffer&& a instanceof ArrayBuffer};b.L=function(a){return a&&b.D(a.buffer)&&void 0!==a.byteLength};b.G=p;b.b=p;b.b.prototype.H=function(a){this.v+=a;4096>24&255)+String.fromCharCode(a>>16&255)+String.fromCharCode(a>>8&255)+String.fromCharCode(a&255))}; b.b.prototype.getInt16=function(){var a=this.data.charCodeAt(this.a)<<8^this.data.charCodeAt(this.a+1);this.a+=2;return a};b.b.prototype.getInt32=function(){var a=this.data.charCodeAt(this.a)<<24^this.data.charCodeAt(this.a+1)<<16^this.data.charCodeAt(this.a+2)<<8^this.data.charCodeAt(this.a+3);this.a+=4;return a};b.b.prototype.B=function(){return this.data.slice(this.a)};b.b.prototype.compact=function(){0b&&(a+="0");a+=b.toString(16)}return a};b.b.prototype.toString=function(){return b.I(this.B())};b.createBuffer=function(a,f){void 0!==a&&"utf8"===(f||"raw")&&(a=b.C(a));return new b.G(a)};b.J=function(){for(var a=String.fromCharCode(0),b=64,e="";0< b;)b&1&&(e+=a),b>>>=1,0>>8)return!0;return!1};var z=y=y||{};e=e||{};e.A=e.A||{};e.F=e.A.F=z;z.create=function(){A||(n=String.fromCharCode(128),n+=m.J(),x=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103, 3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187, 3204031479,3329325298],A=!0);var a=null,b=m.createBuffer(),e=Array(64),d={algorithm:"sha256",O:64,P:32,w:0,f:[0,0],start:function(){d.w=0;d.f=[0,0];b=m.createBuffer();a={g:1779033703,h:3144134277,i:1013904242,j:2773480762,l:1359893119,m:2600822924,o:528734635,s:1541459225};return d}};d.start();d.update=function(c,h){"utf8"===h&&(c=m.C(c));d.w+=c.length;d.f[0]+=c.length/4294967296>>>0;d.f[1]+=c.length>>>0;b.u(c);w(a,e,b);(2048>>28);c.c(d.f[1]<<3);var h={g:a.g,h:a.h,i:a.i,j:a.j,l:a.l,m:a.m,o:a.o,s:a.s};w(h,e,c);c=m.createBuffer();c.c(h.g);c.c(h.h);c.c(h.i);c.c(h.j);c.c(h.l);c.c(h.m);c.c(h.o);c.c(h.s);return c};return d};var n=null,A=!1,x=null;window.forge_sha256=function(a){var f=e.F.create();f.update(a,b.K(a)?"utf8":void 0);return f.digest().N()}})(); function changeStyle() { styleChanger = document.getElementById('styleChanger'); fpInfoboxTemplate = document.getElementById('fpInfoboxTemplate'); fpShellInfoboxTemplate = document.getElementById('fpShellInfoboxTemplate'); if (fpInfoboxTemplate.style.display === 'none') { styleChanger.innerHTML = "Choose: Terminal Style"; fpInfoboxTemplate.style.display = 'block'; fpShellInfoboxTemplate.style.display = 'none'; window.name = 'simple'; } else { styleChanger.innerHTML = "Choose: Simple Style"; fpInfoboxTemplate.style.display = 'none'; fpShellInfoboxTemplate.style.display = 'block'; window.name = ''; } } function setActiveStyleSheet(title) { var i, a, main; for(i=0; (a = document.getElementsByTagName("link")[i]); i++) { if(a.getAttribute("rel").indexOf("style") != -1 && a.getAttribute("title")) { a.disabled = true; if(a.getAttribute("title") == title) a.disabled = false; } } } function changeMainStyle() { // Clear hash to avoid jumps location.hash = ""; var styleChanger = document.getElementById('styleChanger'); var isFutureStyle = window.location.href.indexOf("?future") != -1; if (isFutureStyle) { location.href = window.location.href.replace('?future',''); styleChanger.innerHTML = 'Choose: Simple Style'; updateLinks(false); } else { if (window.location.href.indexOf("#") != -1) { location.href = window.location.href.replace('#','?future#');; } else { location.href = window.location.href + '?future'; } styleChanger.innerHTML = 'Choose: Future Style'; updateLinks(); } } function updateLinks(isFuture=true) { fpLiList = $('.fpLi a'); $.each(fpLiList, function(index, fpLiA) { if (isFuture){ fpLiA.href += '?future'; } else { fpLiA.href = fpLiA.href.replace('?future',''); } }); footerItemList = $('.footerItemBox a'); $.each(footerItemList, function(index, footerItemA) { if (isFuture){ if (footerItemA.href.indexOf("#") != -1) { footerItemA.href = footerItemA.href.replace('#','?future#'); } else { footerItemA.href += '?future'; } } else { footerItemA.href = footerItemA.href.replace('?future',''); } }); } function setStyle(isMain=true) { var styleChanger = document.getElementById('styleChanger'); var isFutureStyle = window.location.href.indexOf("?future") != -1; if (isFutureStyle) { setActiveStyleSheet('future'); styleChanger.innerHTML = 'Choose: Simple Style'; updateLinks(); } else { setActiveStyleSheet('simple'); if (isMain) { styleChanger.innerHTML = 'Choose: Future Style'; } else { styleChanger.innerHTML = 'Choose: Simple Style'; } updateLinks(false); } } function getFinger() { function getWebGLContext(canvas, webGLVersion = "") { webGLContext = null; try { webGLContext = canvas.getContext("webgl" + webGLVersion) || canvas.getContext("experimental-webgl" + webGLVersion); } catch (e) {} return webGLContext; } function getWebGLFingerprint() { var c = document.createElement('canvas'); //var c = document.getElementById('webGLFingerprint'); c.height = 300; var g = getWebGLContext(c); if (g) { g.clearColor(0, 0, 1, 1); p = g.createProgram(); function l(x, y) { s = g.createShader(35633 - x); g.shaderSource(s, y); g.compileShader(s); g.attachShader(p, s); } l(0, 'attribute vec2 p;uniform float t;void main(){float s=sin(t);float c=cos(t);gl_Position=vec4(p*mat2(c,s,-s,c),1,1);}'); l(1, 'void main(){gl_FragColor=vec4(1,0,0,1);}'); g.linkProgram(p); g.useProgram(p); g.enableVertexAttribArray(0); u = g.getUniformLocation(p, 't'); b = g.createBuffer(); a = 34962; g.bindBuffer(a, b); g.bufferData(a, new Float32Array([0, 1, -1, -1, 1, -1]), 35044); g.vertexAttribPointer(0, 2, 5126, false, 0, 0); g.clear(16384); g.uniform1f(u, 3.65); g.drawArrays(4, 0, 3); return c.toDataURL(); } return null; } var reportString = ""; // WebGL Report function logReport(id, info) { reportString += id + info; } function echoWebGLReport() { var c = document.createElement('canvas'); var gl = getWebGLContext(c); if (gl) { var debugExtension = gl.getExtension('WEBGL_debug_renderer_info'); if (debugExtension) { logReport("glUnmaskedVendor", gl.getParameter(debugExtension.UNMASKED_VENDOR_WEBGL)); logReport("glUnmaskedRenderer", gl.getParameter(debugExtension.UNMASKED_RENDERER_WEBGL)); } logReport("glVersion", gl.getParameter(gl.VERSION)); logReport("shadingLanguageVersion", gl.getParameter(gl.SHADING_LANGUAGE_VERSION)); logReport("glVendor", gl.getParameter(gl.VENDOR)); logReport("glRenderer", gl.getParameter(gl.RENDERER)); function appendToTable(tableID, thText, trID, trText) { $("#" + tableID).find('tbody') .append($('') .append($('') .html(thText + ":") ) ); $("#" + tableID + " tr:last").append('' + trText + ''); } var glContextAttributes = gl.getContextAttributes(); for (var att in glContextAttributes) { if (glContextAttributes.hasOwnProperty(att)) { appendToTable("webGLDumpCATable", att, "gl" + att, glContextAttributes[att]); reportString += att + glContextAttributes[att]; } } // https://developer.mozilla.org/de/docs/Web/API/WebGLRenderingContext/getParameter parameterNames = ["ACTIVE_TEXTURE", "ALIASED_LINE_WIDTH_RANGE", "ALIASED_POINT_SIZE_RANGE", "ALPHA_BITS", "ARRAY_BUFFER_BINDING", "BLEND", "BLEND_COLOR", "BLEND_DST_ALPHA", "BLEND_DST_RGB", "BLEND_EQUATION", "BLEND_EQUATION_ALPHA", "BLEND_EQUATION_RGB", "BLEND_SRC_ALPHA", "BLEND_SRC_RGB", "BLUE_BITS", "COLOR_CLEAR_VALUE", "COLOR_WRITEMASK", "COMPRESSED_TEXTURE_FORMATS", "CULL_FACE", "CULL_FACE_MODE", "CURRENT_PROGRAM", "DEPTH_BITS", "DEPTH_CLEAR_VALUE", "DEPTH_FUNC", "DEPTH_RANGE", "DEPTH_TEST", "DEPTH_WRITEMASK", "DITHER", "ELEMENT_ARRAY_BUFFER_BINDING", "FRAMEBUFFER_BINDING", "FRONT_FACE", "GENERATE_MIPMAP_HINT", "GREEN_BITS", "IMPLEMENTATION_COLOR_READ_FORMAT", "IMPLEMENTATION_COLOR_READ_TYPE", "LINE_WIDTH", "MAX_COMBINED_TEXTURE_IMAGE_UNITS", "MAX_CUBE_MAP_TEXTURE_SIZE", "MAX_FRAGMENT_UNIFORM_VECTORS", "MAX_RENDERBUFFER_SIZE", "MAX_TEXTURE_IMAGE_UNITS", "MAX_TEXTURE_SIZE", "MAX_VARYING_VECTORS", "MAX_VERTEX_ATTRIBS", "MAX_VERTEX_TEXTURE_IMAGE_UNITS", "MAX_VERTEX_UNIFORM_VECTORS", "MAX_VIEWPORT_DIMS", "PACK_ALIGNMENT", "POLYGON_OFFSET_FACTOR", "POLYGON_OFFSET_FILL", "POLYGON_OFFSET_UNITS", "RED_BITS", "RENDERBUFFER_BINDING", "SAMPLE_BUFFERS", "SAMPLE_COVERAGE_INVERT", "SAMPLE_COVERAGE_VALUE", "SAMPLES", "SCISSOR_BOX", "SCISSOR_TEST", "STENCIL_BACK_FAIL", "STENCIL_BACK_FUNC", "STENCIL_BACK_PASS_DEPTH_FAIL", "STENCIL_BACK_PASS_DEPTH_PASS", "STENCIL_BACK_REF", "STENCIL_BACK_VALUE_MASK", "STENCIL_BACK_WRITEMASK", "STENCIL_BITS", "STENCIL_CLEAR_VALUE", "STENCIL_FAIL", "STENCIL_FUNC", "STENCIL_PASS_DEPTH_FAIL", "STENCIL_PASS_DEPTH_PASS", "STENCIL_REF", "STENCIL_TEST", "STENCIL_VALUE_MASK", "STENCIL_WRITEMASK", "SUBPIXEL_BITS", "TEXTURE_BINDING_2D", "TEXTURE_BINDING_CUBE_MAP", "UNPACK_ALIGNMENT", "UNPACK_COLORSPACE_CONVERSION_WEBGL", "UNPACK_FLIP_Y_WEBGL", "UNPACK_PREMULTIPLY_ALPHA_WEBGL", "VIEWPORT" ]; for (var i = 0; i < parameterNames.length; i++) { parameterName = parameterNames[i]; parameterValue = gl.getParameter(gl[parameterName]); appendToTable("webGLDumpTable", parameterName, "gl" + parameterName, parameterValue); reportString += parameterName + parameterValue; } /* https://developer.mozilla.org/en-US/docs/Web/API/WebGLShaderPrecisionFormat https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getShaderPrecisionFormat https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.12 */ function getShaderPrecision(shaderType, precisionType) { var shaderPrecision = gl.getShaderPrecisionFormat(gl[shaderType], gl[precisionType]); return "rangeMin: " + shaderPrecision.rangeMin + " rangeMax: " + shaderPrecision.rangeMax + " precision: " + shaderPrecision.precision; } var shaderTypes = ["FRAGMENT_SHADER", "VERTEX_SHADER"]; var precisionTypes = ["LOW_FLOAT", "MEDIUM_FLOAT", "HIGH_FLOAT", "LOW_INT", "MEDIUM_INT", "HIGH_INT"]; for (var i = 0; i < shaderTypes.length; i++) { var shaderType = shaderTypes[i]; for (var j = 0; j < precisionTypes.length; j++) { var precisionType = precisionTypes[j]; var shaderPrecision = getShaderPrecision(shaderType, precisionType); var precisionInfoText = shaderType.replace("_", " ") + "-" + precisionType.replace("_", " ") + " Precision"; reportString += precisionType + shaderPrecision; $("#webGLShaderPrecisionTable").find('tbody') .append($('') .append($('') .html(precisionInfoText + ":") .prop("title", "The base 2 log of the absolute value of the min/max value that can be represented.") ) ); $("#webGLShaderPrecisionTable tr:last").append('' + shaderPrecision + ''); } } // https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/Using_Extensions // https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getSupportedExtensions // https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getExtension var extensions = gl.getSupportedExtensions(); for (var i = 0; i < extensions.length; i++) { var extension = extensions[i]; reportString += extension; $("#webGL1ExtensionsTable").find('tbody') .append($('') .append($('') .html(extension) ) ); } // https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/Constants var extensionList = { WEBGL_compressed_texture_s3tc: ["COMPRESSED_RGB_S3TC_DXT1_EXT", "COMPRESSED_RGBA_S3TC_DXT1_EXT", "COMPRESSED_RGBA_S3TC_DXT3_EXT", "COMPRESSED_RGBA_S3TC_DXT5_EXT"], WEBGL_compressed_texture_s3tc_srgb: ["COMPRESSED_SRGB_S3TC_DXT1_EXT", "COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT", "COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT", "COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT"], WEBGL_compressed_texture_etc: ["COMPRESSED_R11_EAC", "COMPRESSED_SIGNED_R11_EAC", "COMPRESSED_RG11_EAC", "COMPRESSED_SIGNED_RG11_EAC", "COMPRESSED_RGB8_ETC2", "COMPRESSED_RGBA8_ETC2_EAC", "COMPRESSED_SRGB8_ETC2", "COMPRESSED_SRGB8_ALPHA8_ETC2_EAC", "COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2", "COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2" ], WEBGL_compressed_texture_pvrtc: ["COMPRESSED_RGB_PVRTC_4BPPV1_IMG", "COMPRESSED_RGBA_PVRTC_4BPPV1_IMG", "COMPRESSED_RGB_PVRTC_2BPPV1_IMG", "COMPRESSED_RGBA_PVRTC_2BPPV1_IMG"], WEBGL_compressed_texture_etc1: ["COMPRESSED_RGB_ETC1_WEBGL"], WEBGL_compressed_texture_atc: ["COMPRESSED_RGB_ATC_WEBGL", "COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL", "COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL"], WEBGL_compressed_texture_astc: ["COMPRESSED_RGBA_ASTC_4x4_KHR", "COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR", "COMPRESSED_RGBA_ASTC_5x4_KHR", "COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR", "COMPRESSED_RGBA_ASTC_5x5_KHR", "COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR", "COMPRESSED_RGBA_ASTC_6x5_KHR", "COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR", "COMPRESSED_RGBA_ASTC_6x6_KHR", "COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR", "COMPRESSED_RGBA_ASTC_8x5_KHR", "COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR", "COMPRESSED_RGBA_ASTC_8x6_KHR", "COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR", "COMPRESSED_RGBA_ASTC_8x8_KHR", "COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR", "COMPRESSED_RGBA_ASTC_10x5_KHR", "COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR", "COMPRESSED_RGBA_ASTC_10x6_KHR", "COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR", "COMPRESSED_RGBA_ASTC_10x6_KHR", "COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR", "COMPRESSED_RGBA_ASTC_10x10_KHR", "COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR", "COMPRESSED_RGBA_ASTC_12x10_KHR", "COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR", "COMPRESSED_RGBA_ASTC_12x12_KHR", "COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR" ], ANGLE_instanced_arrays: ["VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE"], EXT_blend_minmax: ["MIN_EXT", "MAX_EXT"], EXT_color_buffer_half_float: ["RGBA16F_EXT", "RGB16F_EXT", "FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT", "UNSIGNED_NORMALIZED_EXT"], EXT_disjoint_timer_query: ["GPU_DISJOINT_EXT"], EXT_sRGB: ["SRGB_EXT", "SRGB_ALPHA_EXT", "SRGB8_ALPHA8_EXT", "FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT"], EXT_texture_filter_anisotropic: ["MAX_TEXTURE_MAX_ANISOTROPY_EXT", "TEXTURE_MAX_ANISOTROPY_EXT"], OES_standard_derivatives: ["FRAGMENT_SHADER_DERIVATIVE_HINT_OES"], OES_texture_half_float: ["HALF_FLOAT_OES"], OES_vertex_array_object: ["VERTEX_ARRAY_BINDING_OES"], WEBGL_color_buffer_float: ["RGBA32F_EXT", "RGB32F_EXT", "FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT", "UNSIGNED_NORMALIZED_EXT"], WEBGL_depth_texture: ["UNSIGNED_INT_24_8_WEBGL"], WEBGL_draw_buffers: ["COLOR_ATTACHMENT0_WEBGL", "COLOR_ATTACHMENT1_WEBGL", "COLOR_ATTACHMENT15_WEBGL", "DRAW_BUFFER0_WEBGL", "DRAW_BUFFER1_WEBGL", "DRAW_BUFFER15_WEBGL", "MAX_COLOR_ATTACHMENTS_WEBGL", "MAX_DRAW_BUFFERS_WEBGL"], WEBGL_depth_texture: ["UNSIGNED_INT_24_8_WEBGL"], }; // The timestamp parameter in EXT_disjoint_timer_query_ext is not using for fingerprinting // EXT_sRGB.SRGB_EXT ("Unsized sRGB format that leaves the precision up to the driver.") vendorPrefixes = ["", "WEBKIT_", "MOZ_", "O_", "MS_"]; // Extract extension paramter values including vendor prefixes for (var i = 0; i < vendorPrefixes.length; i++) { var vendorPrefix = vendorPrefixes[i]; for (var extension in extensionList) { if (extensionList.hasOwnProperty(extension)) { var extensionParameters = extensionList[extension]; var supported = gl.getExtension(vendorPrefix + extension); if (supported) { for (var j = 0; j < extensionParameters.length; j++) { var extensionParameter = extensionParameters[j]; var extensionParameterValue = supported[extensionParameter]; appendToTable("webGL1ExtensionsDumpTable", vendorPrefix + extension + "_" + extensionParameter, "gl" + vendorPrefix + extension + '_' + extensionParameter, extensionParameterValue); reportString += extensionParameter + extensionParameterValue; } } } } } } // Implemented functions // https://developer.mozilla.org/de/docs/Web/API/WebGLRenderingContext functionPropertyNames = ["drawingBufferWidth", "drawingBufferHeight", "getContextAttributes", "isContextLost", "scissor", "viewport", "activeTexture", "blendColor", "blendEquation", "blendEquationSeparate", "blendFunc", "blendFuncSeparate", "clearColor", "clearDepth", "clearStencil", "colorMask", "cullFace", "depthFunc", "depthMask", "depthRange", "disable", "enable", "frontFace", "getParameter", "getError", "hint", "isEnabled", "lineWidth", "pixelStorei", "polygonOffset", "sampleCoverage", "stencilFunc", "stencilFuncSeparate", "stencilMask", "stencilMaskSeparate", "stencilOp", "stencilOpSeparate", "bindBuffer", "bufferData", "bufferSubData", "createBuffer", "deleteBuffer", "getBufferParameter", "isBuffer", "bindFramebuffer", "checkFramebufferStatus", "createFramebuffer", "deleteFramebuffer", "framebufferRenderbuffer", "framebufferTexture2D", "getFramebufferAttachmentParameter", "isFramebuffer", "readPixels", "bindRenderbuffer", "createRenderbuffer", "deleteRenderbuffer", "getRenderbufferParameter", "isRenderbuffer", "renderbufferStorage", "bindTexture", "compressedTexImage2D", "compressedTexSubImage2D", "copyTexImage2D", "copyTexSubImage2D", "createTexture", "deleteTexture", "generateMipmap", "getTexParameter", "isTexture", "texImage2D", "texSubImage2D", "texParameterf", "texParameteri", "attachShader", "bindAttribLocation", "compileShader", "createProgram", "createShader", "deleteProgram", "deleteShader", "detachShader", "getAttachedShaders", "getProgramParameter", "getProgramInfoLog", "getShaderParameter", "getShaderPrecisionFormat", "getShaderInfoLog", "getShaderSource", "isProgram", "isShader", "linkProgram", "shaderSource", "useProgram", "validateProgram", "disableVertexAttribArray", "enableVertexAttribArray", "getActiveAttrib", "getActiveUniform", "getAttribLocation", "getUniform", "getUniformLocation", "getVertexAttrib", "getVertexAttribOffset", "uniform1f", "uniform1fv", "uniform1i", "uniform1iv", "uniform2f", "uniform2fv", "uniform2i", "uniform2iv", "uniform3f", "uniform3fv", "uniform3i", "uniform3iv", "uniform4f", "uniform4fv", "uniform4i", "uniform4iv", "uniformMatrix2fv", "uniformMatrix3fv", "uniformMatrix4fv", "vertexAttrib1f", "vertexAttrib2f", "vertexAttrib3f", "vertexAttrib4f", "vertexAttrib1fv", "vertexAttrib2fv", "vertexAttrib3fv", "vertexAttrib4fv", "vertexAttribPointer", "clear", "drawArrays", "drawElements", "finish", "flush", "getSupportedExtensions", "getExtension" ]; var implementedCounter = 0; for (var i = 0; i < functionPropertyNames.length; i++) { funcPropName = functionPropertyNames[i]; if (typeof gl[funcPropName] !== "undefined") { appendToTable("webGL1FuncsPropsTable", funcPropName, "gl" + "glFuncProp" + funcPropName, "Yes"); implementedCounter++; reportString += funcPropName + "1"; } else { appendToTable("webGL1FuncsPropsTable", funcPropName, "gl" + "glFuncProp" + funcPropName, "No"); reportString += funcPropName + "0"; } } //$("#glImplementedFuncs").html(implementedCounter + "/" + functionPropertyNames.length); } var fpWebGL = getWebGLFingerprint(); var fpWebGLHash = ""; var reportStringHash = ""; if (fpWebGL != null) { echoWebGLReport(); // Display report info reportStringHash = forge_sha256(reportString).slice(0, 32); // Fingeprint (hashed report string) return reportStringHash; } } //== FIN =============================== //======================================= //======================================= //== SOURCE BUSTER ===================== /** sourcebuster v1.1.1 **/ !function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var r;"undefined"!=typeof window?r=window:"undefined"!=typeof global?r=global:"undefined"!=typeof self&&(r=self),r.sbjs=e()}}(function(){return function e(r,t,s){function n(a,i){if(!t[a]){if(!r[a]){var c="function"==typeof require&&require;if(!i&&c)return c(a,!0);if(o)return o(a,!0);var u=new Error("Cannot find module '"+a+"'");throw u.code="MODULE_NOT_FOUND",u}var p=t[a]={exports:{}};r[a][0].call(p.exports,function(e){var t=r[a][1][e];return n(t?t:e)},p,p.exports,e,r,t,s)}return t[a].exports}for(var o="function"==typeof require&&require,a=0;a0))return x=a.getHost(e),!0;for(var r=0;r0)for(var o=0;o0)for(var a=0;a { sendYandexGoal("30sec"); }, 30000 ); } //60Sec setTimeout( () => { sendYandexGoal("time60"); }, 60000 ); // Scroll 50%, 100% let windowH = $(window).height(); let docH = $(document).height(); let flag50 = true; let flag70 = true; let flag100 = true; $(window).scroll(function() { let scrollTop = $(document).scrollTop(); //70% scroll if (flag70) { if (scrollTop+windowH/2 > docH*0.7) { sendYandexGoal("scroll70"); flag70 = false; } } if ( "1"=="1" ) { //50% scroll if (flag50) { if (scrollTop+windowH/2 > docH/2) { sendYandexGoal("scroll 50"); flag50 = false; } } } if ( "1"=="1" ) { //100% scroll if (flag100) { if (scrollTop+windowH >= docH) { sendYandexGoal("scroll 100"); flag100 = false; } } } }); } function initFingerData() { let finger = getFinger(); window.waf.siClientId = finger; if ( window.waf.isDebug==1 ) { console.log("@@WAF. fingerId="+finger); } let url = "data/waf.php?sinid="+finger; $.get(url, function () { }); } function isWafSend( vars, callback ) { if ( typeof(vars)=="undefined" || vars==null || !vars ) { vars = []; } if ( document.location.href.indexOf('_ssend=1')>0 || document.location.href.indexOf('_sdebug=1')>0 || "0"=="1" ) { if ( window.waf.isDebug==1 ) { console.log("@@WAF. Принудительная отправка. Параметр _ssend"); console.log("@@WAF. isSend=1"); } window.waf.isSend = true; if ( window.waf.isDebug==1 ) { console.log("@@WAF. isSend="+window.waf.isSend); } if ( typeof(callback)!="undefined" ) { let resp = JSON.stringify( { action:"success", text:"debug" } ); console.log("!!!!!!!!!!",resp); callback( window.waf.isSend, resp ); } }else { $.post("data/waf.php?issend", vars, function (resp) { let jsonResult = JSON.parse(resp); let isSend = ((jsonResult["action"] == "success") ? true : false); window.waf.isSend = isSend; if ( window.waf.isDebug==1 ) { console.log("@@WAF. isSend="+window.waf.isSend); } if ( typeof(callback)!="undefined" ) { console.log("!!!!!!!!!!",resp); callback( window.waf.isSend, resp ); } }); } } function wafSend( form, callbackSuccess, callbackError ) { //let serializedDataString = $(form).serialize(); let dataArray = $(form).serializeArray(); let formTitle = $("input[name='title']", form).val(); let formName = $("input[name=name]", form).val(); let formPhone = $("input[name=phone]", form).val(); //== IS WAF SEND? == if ( window.waf.isDebug==1 ) { console.log("@@WAF. sendForm; data=",dataArray); } isWafSend( dataArray, function(res) { if ( res!=false ) { //== Success == if ( window.waf.isDebug==1 ) { console.log("@@WAF. sendForm; response=success"); } //== Callback if ( typeof(callbackSuccess)!="undefined" ) { callbackSuccess( res ); } //== Calltouch == if ( "1"=="1" ) { if ( window.waf.isDebug==1 ) { console.log("@@WAF. Send calltouch data@@"); } sendCallTouchData({ "title": formTitle, "name": formName, "phone": formPhone }); } //== Comagic == if ( "0"=="1" ) { if ( typeof(Comagic)!="undefined" && typeof(Comagic.addOfflineRequest)!="undefined" ) { if ( window.waf.isDebug==1 ) { console.log("@@WAF. Send comagic data@@"); } Comagic.addOfflineRequest({phone: formPhone}); } } if ( "1"=="1" ) { sendYandexGoal("lead"); } }else { //== Error == if ( window.waf.isDebug==1 ) { console.log("@@WAF. sendForm; response=error"); } if ( typeof(callbackError)!="undefined" ) { callbackError( res ); } } //== MAIL == $.post("data/mail.php", dataArray, function (data) { $(form).trigger('reset'); $('input[name=files]', form).val(''); $('.uploader_text', form).css('display', 'inline-block'); $('.uploader_images_count', form).hide(); if ( window.waf.isDebug==1 ) { console.log("@@WAF. sendForm; mail.response", data); } }); }); } function initCheckPasteData() { $( document ).on( "paste", "input", function() { if ( window.waf.isDebug==1 ) { console.log("@@WAF. paste!"); } let url = "data/waf.php?ispaste=1"; $.get(url, function () { //console.log("yandexClient",yandexClientId); }); }); } //== WAF =============================== //======================================= //========================================================================================== //== CallTouch function sendCallTouchData(e_vars) { if (typeof (e_vars) == "undefined") e_vars = []; if (typeof (e_vars["name"]) == "undefined") e_vars["name"] = ""; if (typeof (e_vars["phone"]) == "undefined") e_vars["phone"] = ""; if (typeof (e_vars["title"]) == "undefined") e_vars["title"] = ""; if (typeof (e_vars["calltouch_route_key"]) == "undefined") e_vars["calltouch_route_key"] = ""; var l_result = {}; var l_phone = ""; var l_name = ""; var l_title = ""; l_calltouch_route_key = "undefined"; try { l_phone = e_vars["phone"]; l_name = e_vars["name"]; l_title = e_vars["title"]; l_calltouch_route_key = e_vars["calltouch_route_key"]; l_result.name = l_name; l_result.phone = l_phone; l_result.title = l_title; l_result.calltouch_route_key = l_calltouch_route_key; l_result.url = document.location.href; l_result.referrer = document.referrer; l_result.user_agent = window.navigator.userAgent; if ( window.waf.isDebug==1 ) { console.log("@@WAF. CallTouch send:", l_result); } l_result.ya = []; l_result.ga = []; clientId = ""; trackingId = ""; //Google if (typeof (ga) != "undefined" && typeof (ga) == "function") { try { ga(function (tracker) { if (typeof (ga.getAll) == "function") { //Ga list l_ga_list = ga.getAll(); if (typeof (l_ga_list) == "object" && l_ga_list.length > 0) { for (l_key in l_ga_list) { l_ga = l_ga_list[l_key]; clientId = l_ga.get('clientId'); trackingId = l_ga.get('trackingId'); //new ga push l_ga_find = 0; for (l_temp_ga_key in l_result.ga) { l_temp_ga_value = l_result.ga[l_temp_ga_key]; if (l_temp_ga_value["trackingId"] == trackingId) l_ga_find = 1; }//end_ for if (l_ga_find != 1) { l_result.ga.push({ "type": "list", "trackingId": trackingId, "clientId": clientId }); }//end_ if }//end_ for //!!OLD!! if (l_ga_list.length > 0) { clientId = l_ga_list[0].get('clientId'); trackingId = l_ga_list[0].get('trackingId'); }//end_ if }//end_ if }//end_ if //!!OLD!! //l_result.push( {"trackingId":trackingId, "clientId":clientId} ); }); } catch (err) { try { clientId = tracker.get('clientId'); trackingId = tracker.get('trackingId'); //new ga push l_result.ga.push({ "type": "single", "trackingId": trackingId, "clientId": clientId }); } catch (err) { } }//end_ try_ catch }//end_ if //Yandex if (typeof (Ya) != "undefined" && typeof (Ya) == "object" && typeof (Ya.Metrika) == "function" && typeof (Ya.Metrika.counters) == "function") { l_ya_counters = Ya.Metrika.counters(); if (typeof (l_ya_counters) == "object" && typeof (l_ya_counters.length) != "undefined" && l_ya_counters.length > 0) { for (var i = 0; i < l_ya_counters.length; i++) { l_ya_counter = l_ya_counters[i]; l_ya_counter_type = l_ya_counter.type; l_ya_counter_id = l_ya_counter.id; l_ya_client_id = window["yaCounter" + l_ya_counter_id].getClientID(); l_result.ya.push({ "type": l_ya_counter_type, "trackingId": l_ya_counter_id, "clientId": l_ya_client_id }); }//end_ for_ i }//end_ if }//end_ if } catch (err) { } //calltouch SessionId l_result.calltouchSessionId = ""; try { l_result.calltouchSessionId = window.ct('calltracking_params')[0].sessionId; } catch (e) { } //console.log( "[[[",l_result ); //console.log("[[[==", JSON.stringify(l_result)); $.post("data/calltouch.php", { "data": JSON.stringify(l_result) }, function (data) { if ( window.waf.isDebug==1 ) { console.log("@@WAF. CallTouch result:", data); } }); }//end_ func //== CallTouch //========================================================================================== //========================================================================================== //== yaCounter function sendYandexGoal( goalName ) { getYandexIds( function( ids ){ for( k in ids ) { let ymId = ids[k]; let yaCounter = window['yaCounter' + ymId]; if ( typeof(yaCounter)!="undefined" ) { if ( typeof(window.ym)!="undefined" ) { ym(ymId,'reachGoal', goalName ); if ( window.waf.isDebug==1 ) { console.log( "@@WAF. yaCounter" + ymId + "; goalName="+goalName+"; send" ); } } else { yaCounter.reachGoal( goalName ); if ( window.waf.isDebug==1 ) { console.log( "@@WAF. yaCounter" + ymId + "; goalName="+goalName+"; send" ); } } } } } ); } //== yaCounter //========================================================================================== //========================================================================================== //== typ (Не сделано) function initSbjs() { sbjs.init({ //lifetime: 3, //domain: 'domain.com', //lifetime: 3, //callback: function(result){ console.log(result.current.typ); } session_length: 1, callback: function(result){ let typ = sbjs.get.current.typ; window.waf.typ = typ; let url = "data/waf.php?typ="+typ; $.get(url, function () { }); if ( window.waf.isDebug==1 ) { console.log("@@WAF. typ="+typ); } } }); } //== typ //========================================================================================== function initWaf(){ window.waf = {}; window.waf.calltouchIsEnable = "1"; window.waf.comagicIsEnable = "0"; } function initIsDebug() { window.waf.isDebug = 0; if ( "0"=="1" ) { window.waf.isDebug = 1; console.log("@@WAF. Дебаг включен"); } } function initIsWebdriver() { window.waf.isWebdriver = (navigator.webdriver)?1:0; let url = "data/waf.php?iswebdriver="+window.waf.isWebdriver; $.get(url, function () { //console.log("yandexClient",yandexClientId); }); } $(function () { initWaf(); initIsDebug(); initIsWebdriver(); initYandexData(); initYandexGoal(); initGoogleData(); initFingerData(); initCheckPasteData(); initSbjs(); });