├── .drone.sec ├── .drone.yml ├── .gitignore ├── LICENSE ├── README.md ├── bower.json ├── dist └── client.min.js ├── gulpfile.js ├── justrelease.yml ├── karma ├── aircover.conf.js ├── drone.conf.js └── local.conf.js ├── logo.jpg ├── package.json ├── releasenotes.md ├── scripts ├── build.sh ├── install.js ├── sauce-sample.json └── test.js ├── specs └── ClientJSpec.js └── src ├── client.js └── vendor ├── deployJava.js ├── fontdetect.js ├── murmurhash3.js ├── swfobject.js └── ua-parser.js /.drone.sec: -------------------------------------------------------------------------------- 1 | eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkExMjhHQ00ifQ.naZ1ZlMpAFxwzNOaGvEKoeNhE3SQOUTvFOYZMVhdGTf1EJc3BwPh4Chs4FtG0jEyZppCP1UkYfVnONWKWVhjcvJ2APLNSX1vFuq6nDv8WM9AnGqB475v9f58Rcl8u6Eqq0NvvPD3M67Bgk3bv5NLwCnYAkhMwl4gmtbL4f_eC2W7YIzsojRPvj4bdoLnmy8KK-D10dsXEpA81ZI9h0fzn9FXc9gEo0vOX40DMiv1TdUJBlItReSVST_2B9F5lSomFZN7DYLsPVHJ7o1FM4DGC4A8qQpUYz5wQme6GhlsXOKXNfmuAbStm3eoUzTGv6CIyf7uUys81y48Stz1FfQkQw.RGma1N7Gg6_suZhs.IgCP4YFRx-Cx6xWw8OunxeVo35MnQ8TI2JJEM0eIPSZH7F8XGte4qQCS7ZyKK81DIIaD_H6W2w8yxSkKhDgyRgss1W7camoy4kZmw3NmWymcfV96vziTRWhZ5bUNnUlDyaShkrD-yJnX5uwYjVlj2-YN2zQpDeUW5N9NZ1v08kq5absuQrI2OBWFouEEC_U6_3BJPnNYIGDMn4Ftm7Px1JwyPyFPJl3JjVMszY-mROu6dcuwl4wsqV0oJges73wyi2-lqW0eBal5MBnCdNsVMHBKmSusxm5LxZyjNgMwgDOYLeNj6A.FwC4gtJGBAXAHBeIzX919w -------------------------------------------------------------------------------- /.drone.yml: -------------------------------------------------------------------------------- 1 | build: 2 | image: node:latest 3 | environment: 4 | - SAUCE_USERNAME=$$SAUCE_USERNAME 5 | - SAUCE_ACCESS_KEY=$$SAUCE_ACCESS_KEY 6 | commands: 7 | - export BUILD_NUMBER=$DRONE_BUILD_NUMBER 8 | - npm install --quiet 9 | - npm install --quiet -g karma-cli 10 | - npm test 11 | 12 | publish: 13 | coverage: 14 | token: $$GITHUB_TOKEN 15 | include: jackspirou/clientjs/coverage/lcov.info 16 | when: 17 | branch: master 18 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ## 2 | # DRONE 3 | ## 4 | .secrets.yml 5 | sauce.json 6 | 7 | ## 8 | # NODE 9 | ## 10 | 11 | # Logs 12 | logs 13 | *.log 14 | npm-debug.log* 15 | 16 | # Runtime data 17 | pids 18 | *.pid 19 | *.seed 20 | 21 | # Directory for instrumented libs generated by jscoverage/JSCover 22 | lib-cov 23 | 24 | # Coverage directory used by tools like istanbul 25 | coverage 26 | 27 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 28 | .grunt 29 | 30 | # node-waf configuration 31 | .lock-wscript 32 | 33 | # Compiled binary addons (http://nodejs.org/api/addons.html) 34 | build/Release 35 | 36 | # Dependency directory 37 | node_modules 38 | 39 | # Optional npm cache directory 40 | .npm 41 | 42 | # Optional REPL history 43 | .node_repl_history 44 | 45 | ## 46 | # MAC OSX 47 | ## 48 | 49 | .DS_Store 50 | .AppleDouble 51 | .LSOverride 52 | 53 | # Icon must end with two \r 54 | Icon 55 | 56 | 57 | # Thumbnails 58 | ._* 59 | 60 | # Files that might appear in the root of a volume 61 | .DocumentRevisions-V100 62 | .fseventsd 63 | .Spotlight-V100 64 | .TemporaryItems 65 | .Trashes 66 | .VolumeIcon.icns 67 | 68 | # Directories potentially created on remote AFP share 69 | .AppleDB 70 | .AppleDesktop 71 | Network Trash Folder 72 | Temporary Items 73 | .apdisk 74 | 75 | ## 76 | # WINDOWS OS 77 | ## 78 | 79 | # Windows image file caches 80 | Thumbs.db 81 | ehthumbs.db 82 | 83 | # Folder config file 84 | Desktop.ini 85 | 86 | # Recycle Bin used on file shares 87 | $RECYCLE.BIN/ 88 | 89 | # Windows Installer files 90 | *.cab 91 | *.msi 92 | *.msm 93 | *.msp 94 | 95 | # Windows shortcuts 96 | *.lnk 97 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "{}" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright {yyyy} {name of copyright owner} 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![Sauce Test Status](logo.jpg) 2 | 3 | **Device information and digital fingerprinting written in _pure_ JavaScript.** 4 | 5 | [![Sauce Test Status](https://saucelabs.com/buildstatus/clientjs)](https://saucelabs.com/u/clientjs) [![Build Status](http://beta.drone.io/api/badges/jackspirou/clientjs/status.svg)](http://beta.drone.io/jackspirou/clientjs) [![Aircover Coverage](https://aircover.co/badges/jackspirou/clientjs/coverage.svg)](https://aircover.co/jackspirou/clientjs) [![Kanban board for ClientJS issues at https://huboard.com/jackspirou/clientjs](https://img.shields.io/badge/Hu-Board-7965cc.svg)](https://huboard.com/jackspirou/clientjs) [![Join the chat at https://gitter.im/jackspirou/clientjs](https://badges.gitter.im/jackspirou/clientjs.svg)](https://gitter.im/jackspirou/clientjs?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) 6 | 7 | [![Sauce Test Status](https://saucelabs.com/browser-matrix/clientjs.svg)](https://saucelabs.com/u/clientjs) 8 | 9 | ClientJS is a JavaScript library that makes digital fingerprinting easy, while also exposing all the browser data-points used in generating fingerprints. 10 | 11 | If you want to fingerprint browsers, you are **_probably_** also interested in other client-based information, such as screen resolution, operating system, browser type, device type, and much more. 12 | 13 | Below are some features that make ClientJS different from other fingerprinting libraries: 14 | - It's pure native JavaScript 15 | - It's decently lightweight at ~45 KB 16 | - All user data points are available by design, not just the 32bit integer fingerprint 17 | 18 | ## Documentation and Demos 19 | You can find more documentation and demos on each method at [clientjs.org](https://clientjs.org/). 20 | 21 | ## Installation 22 | To use ClientJS, simply include `dist/client.min.js`. 23 | 24 | ClientJS is available for download via [bower](http://bower.io/search/?q=clientjs) and [npm](https://www.npmjs.com/package/clientjs). 25 | 26 | ### npm 27 | 28 | ```shell 29 | npm install clientjs 30 | ``` 31 | 32 | ### Bower 33 | 34 | ```shell 35 | bower install clientjs 36 | ``` 37 | 38 | ## Fingerprinting 39 | Digital fingerprints are based on device/browser settings. 40 | They allow you to make an "educated guess" about the identify of a new or returning visitor. 41 | By taking multiple data points, combining them, and representing them as a number, you can be surprisingly accurate at recognizing not only browsers and devices, but also individual users. 42 | 43 | This is useful for identifying users or devices without cookies or sessions. 44 | It is not a full proof technique, but it has been shown to be statistically significant at accurately identifying devices. 45 | 46 | Simply create a new ClientJS object. 47 | Then call the `getFingerprint()` method which will return the browser/device fingerprint as a 32bit integer hash ID. 48 | 49 | Below is an example of how to generate and display a fingerprint: 50 | 51 | ```javascript 52 | // Create a new ClientJS object 53 | var client = new ClientJS(); 54 | 55 | // Get the client's fingerprint id 56 | var fingerprint = client.getFingerprint(); 57 | 58 | // Print the 32bit hash id to the console 59 | console.log(fingerprint); 60 | ``` 61 | 62 | The current data-points that used to generate fingerprint 32bit integer hash ID is listed below: 63 | - user agent 64 | - screen print 65 | - color depth 66 | - current resolution 67 | - available resolution 68 | - device XDPI 69 | - device YDPI 70 | - plugin list 71 | - font list 72 | - local storage 73 | - session storage 74 | - timezone 75 | - language 76 | - system language 77 | - cookies 78 | - canvas print 79 | 80 | ## Available Methods 81 | Below is the current list of available methods to find information on a users browser/device. 82 | 83 | You can find documentation on each method at [clientjs.org](https://clientjs.org/). 84 | 85 | ``` 86 | var client = new ClientJS(); 87 | 88 | client.getBrowserData(); 89 | client.getFingerprint(); 90 | client.getCustomFingerprint(...); 91 | 92 | client.getUserAgent(); 93 | client.getUserAgentLowerCase(); 94 | 95 | client.getBrowser(); 96 | client.getBrowserVersion(); 97 | client.getBrowserMajorVersion(); 98 | client.isIE(); 99 | client.isChrome(); 100 | client.isFirefox(); 101 | client.isSafari(); 102 | client.isOpera(); 103 | 104 | client.getEngine(); 105 | client.getEngineVersion(); 106 | 107 | client.getOS(); 108 | client.getOSVersion(); 109 | client.isWindows(); 110 | client.isMac(); 111 | client.isLinux(); 112 | client.isUbuntu(); 113 | client.isSolaris(); 114 | 115 | client.getDevice(); 116 | client.getDeviceType(); 117 | client.getDeviceVendor(); 118 | 119 | client.getCPU(); 120 | 121 | client.isMobile(); 122 | client.isMobileMajor(); 123 | client.isMobileAndroid(); 124 | client.isMobileOpera(); 125 | client.isMobileWindows(); 126 | client.isMobileBlackBerry(); 127 | 128 | client.isMobileIOS(); 129 | client.isIphone(); 130 | client.isIpad(); 131 | client.isIpod(); 132 | 133 | client.getScreenPrint(); 134 | client.getColorDepth(); 135 | client.getCurrentResolution(); 136 | client.getAvailableResolution(); 137 | client.getDeviceXDPI(); 138 | client.getDeviceYDPI(); 139 | 140 | client.getPlugins(); 141 | client.isJava(); 142 | client.getJavaVersion(); 143 | client.isFlash(); 144 | client.getFlashVersion(); 145 | client.isSilverlight(); 146 | client.getSilverlightVersion(); 147 | 148 | client.getMimeTypes(); 149 | client.isMimeTypes(); 150 | 151 | client.isFont(); 152 | client.getFonts(); 153 | 154 | client.isLocalStorage(); 155 | client.isSessionStorage(); 156 | client.isCookie(); 157 | 158 | client.getTimeZone(); 159 | 160 | client.getLanguage(); 161 | client.getSystemLanguage(); 162 | 163 | client.isCanvas(); 164 | client.getCanvasPrint(); 165 | ``` 166 | 167 | ## Shoulders of Giants 168 | It is important to note this project owes much to other pieces great works. 169 | We had the advantage of observing how others had approached this problem. 170 | 171 | Built Upon: 172 | - https:github.com/Valve/fingerprintjs 173 | - http:darkwavetech.com/device_fingerprint.html 174 | - detectmobilebrowsers.com 175 | 176 | ## Vendor Code 177 | All dependencies are included into `client.min.js` when the `build.sh` bash file minifies the project. Vendored dependencies should not be included separately. 178 | 179 | Dependencies Include: 180 | - ua-parser.js 181 | - fontdetect.js 182 | - swfobject.js 183 | - murmurhash3.js 184 | 185 | ## Contributing 186 | Collaborate by [forking](https://help.github.com/articles/fork-a-repo/) this project and sending a Pull Request this way. 187 | 188 | Once cloned, install all dependencies. ClientJS uses [Karma](https://karma-runner.github.io/0.13/index.html) as its testing environment. 189 | 190 | ```shell 191 | # Install dependencies 192 | $ npm install 193 | 194 | # If you want tu run karma from the command line 195 | $ npm install -g karma-cli 196 | ``` 197 | 198 | Run Karma and enjoy coding! 199 | 200 | ```shell 201 | $ karma start 202 | ``` 203 | 204 | Thanks for contributing to ClientJS! Please report any bug [here](https://github.com/jackspirou/clientjs/issues). 205 | 206 | ## LICENSE 207 | This project is using the Apache LICENSE Version 2.0. It is included in the project source code. 208 | -------------------------------------------------------------------------------- /bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "clientjs", 3 | "version": "0.1.11", 4 | "main": ["dist/client.min.js"], 5 | "ignore": [ 6 | ".travis.yml", 7 | ".gitignore", 8 | "build", 9 | "grunt.js", 10 | "LICENSE", 11 | "node_modules", 12 | "package.json" 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /dist/client.min.js: -------------------------------------------------------------------------------- 1 | (function(f){var d,e,p=function(){d=(new (window.UAParser||exports.UAParser)).getResult();e=new Detector;return this};p.prototype={getSoftwareVersion:function(){return"0.1.11"},getBrowserData:function(){return d},getFingerprint:function(){var b=d.ua,c=this.getScreenPrint(),a=this.getPlugins(),g=this.getFonts(),n=this.isLocalStorage(),f=this.isSessionStorage(),h=this.getTimeZone(),u=this.getLanguage(),m=this.getSystemLanguage(),e=this.isCookie(),C=this.getCanvasPrint();return murmurhash3_32_gc(b+"|"+ 2 | c+"|"+a+"|"+g+"|"+n+"|"+f+"|"+h+"|"+u+"|"+m+"|"+e+"|"+C,256)},getCustomFingerprint:function(){for(var b="",c=0;c 1.0",2,15);c.fillStyle="rgba(102, 204, 0, 0.7)";c.fillText("ClientJS,org 1.0",4,17);return b.toDataURL()}};"object"=== 13 | typeof module&&"undefined"!==typeof exports&&(module.exports=p);f.ClientJS=p})(window);var deployJava=function(){function f(a){c.debug&&(console.log?console.log(a):alert(a))}function d(a){if(null==a||0==a.length)return"http://java.com/dt-redirect";"&"==a.charAt(0)&&(a=a.substring(1,a.length));return"http://java.com/dt-redirect?"+a}var e=["id","class","title","style"];"classid codebase codetype data type archive declare standby height width usemap name tabindex align border hspace vspace".split(" ").concat(e,["lang","dir"],"onclick ondblclick onmousedown onmouseup onmouseover onmousemove onmouseout onkeypress onkeydown onkeyup".split(" ")); 14 | var p="codebase code name archive object width height alt align hspace vspace".split(" ").concat(e),b;try{b=-1!=document.location.protocol.indexOf("http")?"//java.com/js/webstart.png":"http://java.com/js/webstart.png"}catch(a){b="http://java.com/js/webstart.png"}var c={debug:null,version:"20120801",firefoxJavaVersion:null,myInterval:null,preInstallJREList:null,returnPage:null,brand:null,locale:null,installType:null,EAInstallEnabled:!1,EarlyAccessURL:null,oldMimeType:"application/npruntime-scriptable-plugin;DeploymentToolkit", 15 | mimeType:"application/java-deployment-toolkit",launchButtonPNG:b,browserName:null,browserName2:null,getJREs:function(){var a=[];if(this.isPluginInstalled())for(var g=this.getPlugin().jvms,b=0;b'}d||(c+='');h&&(b+=' code="dummy"');document.write(b+">\n"+c+"\n")},versionCheck:function(a){var g=0,b=a.match("^(\\d+)(?:\\.(\\d+)(?:\\.(\\d+)(?:_(\\d+))?)?)?(\\*|\\+)?$");if(null!=b){for(var c=a=!1,h=[],d=1;dh.length&&(c=!1,a=!0);g=this.getJREs();for(d=0;d':"Netscape Family"==c&&(d='');"undefined"==document.body||null==document.body? 26 | (document.write(d),document.location=b):(a=document.createElement("div"),a.id="div1",a.style.position="relative",a.style.left="-10000px",a.style.margin="0px auto",a.className="dynamicDiv",a.innerHTML=d,document.body.appendChild(a))},createWebStartLaunchButtonEx:function(a,b){null==this.returnPage&&(this.returnPage=a);document.write('')}, 27 | createWebStartLaunchButton:function(a,b){null==this.returnPage&&(this.returnPage=a);document.write('')},launch:function(a){document.location=a;return!0},isPluginInstalled:function(){var a= 28 | this.getPlugin();return a&&a.jvms?!0:!1},isAutoUpdateEnabled:function(){return this.isPluginInstalled()?this.getPlugin().isAutoUpdateEnabled():!1},setAutoUpdateEnabled:function(){return this.isPluginInstalled()?this.getPlugin().setAutoUpdateEnabled():!1},setInstallerType:function(a){this.installType=a;return this.isPluginInstalled()?this.getPlugin().setInstallerType(a):!1},setAdditionalPackages:function(a){return this.isPluginInstalled()?this.getPlugin().setAdditionalPackages(a):!1},setEarlyAccess:function(a){this.EAInstallEnabled= 29 | a},isPlugin2:function(){if(this.isPluginInstalled()&&this.versionCheck("1.6.0_10+"))try{return this.getPlugin().isPlugin2()}catch(a){}return!1},allowPlugin:function(){this.getBrowser();return"Safari"!=this.browserName2&&"Opera"!=this.browserName2},getPlugin:function(){this.refresh();var a=null;this.allowPlugin()&&(a=document.getElementById("deployJavaPlugin"));return a},compareVersionToPattern:function(a,b,c,d){if(void 0==a||void 0==b)return!1;var h=a.match("^(\\d+)(?:\\.(\\d+)(?:\\.(\\d+)(?:_(\\d+))?)?)?$"); 30 | if(null!=h){var f=0;a=[];for(var m=1;mb[m])break}return!0}for(m=0;m "+a);-1!=a.indexOf("msie")&&-1==a.indexOf("opera")?this.browserName2=this.browserName= 31 | "MSIE":-1!=a.indexOf("iphone")?(this.browserName="Netscape Family",this.browserName2="iPhone"):-1!=a.indexOf("firefox")&&-1==a.indexOf("opera")?(this.browserName="Netscape Family",this.browserName2="Firefox"):-1!=a.indexOf("chrome")?(this.browserName="Netscape Family",this.browserName2="Chrome"):-1!=a.indexOf("safari")?(this.browserName="Netscape Family",this.browserName2="Safari"):-1!=a.indexOf("mozilla")&&-1==a.indexOf("opera")?(this.browserName="Netscape Family",this.browserName2="Other"):-1!= 32 | a.indexOf("opera")?(this.browserName="Netscape Family",this.browserName2="Opera"):(this.browserName="?",this.browserName2="unknown");f("[getBrowser()] Detected browser name:"+this.browserName+", "+this.browserName2)}return this.browserName},testUsingActiveX:function(a){a="JavaWebStart.isInstalled."+a+".0";if("undefined"==typeof ActiveXObject||!ActiveXObject)return f("[testUsingActiveX()] Browser claims to be IE, but no ActiveXObject object?"),!1;try{return null!=new ActiveXObject(a)}catch(b){return!1}}, 33 | testForMSVM:function(){if("undefined"!=typeof oClientCaps){var a=oClientCaps.getComponentVersion("{08B0E5C0-4FCB-11CF-AAA5-00401C608500}","ComponentID");return""==a||"5,0,5000,0"==a?!1:!0}return!1},testUsingMimeTypes:function(a){if(!navigator.mimeTypes)return f("[testUsingMimeTypes()] Browser claims to be Netscape family, but no mimeTypes[] array?"),!1;for(var b=0;bd[0]?!0:c[0]d[1]?!0:c[1]d[2]?!0:c[2]'):"Netscape Family"==a&&this.allowPlugin()&&this.writeEmbedTag()},refresh:function(){navigator.plugins.refresh(!1);"Netscape Family"==this.getBrowser()&&this.allowPlugin()&&null== 38 | document.getElementById("deployJavaPlugin")&&this.writeEmbedTag()},writeEmbedTag:function(){var a=!1;if(null!=navigator.mimeTypes){for(var b=0;b