update
main
Fabian Schultz 6 years ago committed by GitHub
commit 9c32e6486e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -0,0 +1,2 @@
**/lib/*
node_modules

@ -0,0 +1,6 @@
module.exports = {
"extends": "airbnb-base",
"rules": {
"no-param-reassign": 0
}
};

4
.gitignore vendored

@ -4,6 +4,8 @@
/npm-debug.log
/npm-debug.log
package-lock.json
!.gitkeep
# Junk files
@ -13,3 +15,5 @@ Desktop.ini
._*
tags
tags.*
.idea
/nbproject/private/

@ -1,6 +1,6 @@
FROM alpine
MAINTAINER Elbert Alias <elbert@alias.io>
LABEL maintainer="elbert@alias.io"
ENV WAPPALYZER_DIR=/opt/wappalyzer
@ -8,7 +8,6 @@ RUN apk update && apk add --no-cache \
bash \
curl \
fontconfig \
nodejs \
nodejs-npm \
optipng \
zip
@ -17,14 +16,15 @@ RUN apk update && apk add --no-cache \
# https://github.com/dustinblackman/phantomized
RUN curl -Ls "https://github.com/dustinblackman/phantomized/releases/download/2.1.1a/dockerized-phantomjs.tar.gz" | tar xz -C /
RUN apk del \
curl
RUN apk del curl
RUN npm i -g \
RUN npm i -g n npm@latest
RUN n stable
RUN npm i --unsafe-perm --silent -g \
jsonlint-cli \
manifoldjs \
svg2png-many \
yarn
svg2png-many
RUN mkdir -p $WAPPALYZER_DIR

@ -1,4 +1,4 @@
# Wappalyzer [![Travis](https://img.shields.io/travis/AliasIO/Wappalyzer.svg)](https://travis-ci.org/AliasIO/Wappalyzer/) [![Scrutinizer](https://scrutinizer-ci.com/g/AliasIO/Wappalyzer/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/AliasIO/Wappalyzer/?branch=master)
# Wappalyzer [![Travis](https://travis-ci.org/AliasIO/Wappalyzer.svg?branch=master)](https://travis-ci.org/AliasIO/Wappalyzer/) [![Scrutinizer](https://scrutinizer-ci.com/g/AliasIO/Wappalyzer/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/AliasIO/Wappalyzer/?branch=master)
[Wappalyzer](https://www.wappalyzer.com/) is a
[cross-platform](https://github.com/AliasIO/Wappalyzer/wiki/Drivers) utility that uncovers the

@ -22,7 +22,7 @@ find . -name ".DS_Store" -exec rm {} \;
echo "Prettifying apps.json..."
jsonlint-cli -ist $'\t' src/apps.json
sed -e 's/\\\\/{{ESCAPE}}/g' src/apps.json | jsonlint-cli -ps | sed -e 's/{{ESCAPE}}/\\\\/g' > /tmp/apps.json && cat /tmp/apps.json > src/apps.json
echo "Converting SVG icons to PNG..."
@ -60,6 +60,7 @@ zip -qr ../../../build/wappalyzer_webextension.zip . \
-x \*.gitkeep \
-x \*.js.map \
-x \*.min.js \
-x \*.spec.js \
-x \*.yarn-integrity \
-x \*package.json \
-x \*LICENSE \

@ -6,7 +6,7 @@ set -eu
echo "Validating apps.json..."
jsonlint-cli -tps schema.json src/apps.json > /tmp/apps.json && mv /tmp/apps.json src/apps.json
jsonlint-cli -s schema.json src/apps.json
echo "Validating regular expressions..."
@ -15,3 +15,7 @@ echo "Validating regular expressions..."
echo "Validating icons..."
./bin/validate-icons
echo "Running tests..."
npm run test

1781
npm-shrinkwrap.json generated

File diff suppressed because it is too large Load Diff

284
package-lock.json generated

@ -1,284 +0,0 @@
{
"requires": true,
"lockfileVersion": 1,
"dependencies": {
"assertion-error": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
"integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
"dev": true
},
"balanced-match": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
"dev": true
},
"brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"dev": true,
"requires": {
"balanced-match": "1.0.0",
"concat-map": "0.0.1"
}
},
"browser-stdout": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
"integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
"dev": true
},
"chai": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz",
"integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=",
"dev": true,
"requires": {
"assertion-error": "1.1.0",
"check-error": "1.0.2",
"deep-eql": "3.0.1",
"get-func-name": "2.0.0",
"pathval": "1.1.0",
"type-detect": "4.0.8"
}
},
"check-error": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
"integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=",
"dev": true
},
"commander": {
"version": "2.11.0",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz",
"integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==",
"dev": true
},
"concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
"dev": true
},
"debug": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
"integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
"dev": true,
"requires": {
"ms": "2.0.0"
}
},
"deep-eql": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz",
"integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==",
"dev": true,
"requires": {
"type-detect": "4.0.8"
}
},
"diff": {
"version": "3.5.0",
"resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
"integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
"dev": true
},
"escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
"dev": true
},
"file-type": {
"version": "7.4.0",
"resolved": "https://registry.npmjs.org/file-type/-/file-type-7.4.0.tgz",
"integrity": "sha1-KnyU9ioAMBULt9m2xwz6HT51nIY="
},
"fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
"dev": true
},
"get-func-name": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz",
"integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=",
"dev": true
},
"glob": {
"version": "7.1.2",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
"integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
"dev": true,
"requires": {
"fs.realpath": "1.0.0",
"inflight": "1.0.6",
"inherits": "2.0.3",
"minimatch": "3.0.4",
"once": "1.4.0",
"path-is-absolute": "1.0.1"
}
},
"growl": {
"version": "1.10.3",
"resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz",
"integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==",
"dev": true
},
"has-flag": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz",
"integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=",
"dev": true
},
"he": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz",
"integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=",
"dev": true
},
"html-comment-regex": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.1.tgz",
"integrity": "sha1-ZouTd26q5V696POtRkswekljYl4="
},
"inflight": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
"dev": true,
"requires": {
"once": "1.4.0",
"wrappy": "1.0.2"
}
},
"inherits": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
"dev": true
},
"is-svg": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz",
"integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=",
"requires": {
"html-comment-regex": "1.1.1"
}
},
"minimatch": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
"dev": true,
"requires": {
"brace-expansion": "1.1.11"
}
},
"minimist": {
"version": "0.0.8",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
"integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
"dev": true
},
"mkdirp": {
"version": "0.5.1",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
"integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
"dev": true,
"requires": {
"minimist": "0.0.8"
}
},
"mocha": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/mocha/-/mocha-5.1.0.tgz",
"integrity": "sha512-d6RWgYPILd+AoWVOxiD0UwUqRicnE1inTxMr40CXOgqYve1MvnKntoLAtLIcxjEeVjEoYYTe5QAq3mUc6/ySjQ==",
"dev": true,
"requires": {
"browser-stdout": "1.3.1",
"commander": "2.11.0",
"debug": "3.1.0",
"diff": "3.5.0",
"escape-string-regexp": "1.0.5",
"glob": "7.1.2",
"growl": "1.10.3",
"he": "1.1.1",
"minimatch": "3.0.4",
"mkdirp": "0.5.1",
"supports-color": "4.4.0"
}
},
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
"dev": true
},
"once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
"dev": true,
"requires": {
"wrappy": "1.0.2"
}
},
"path-is-absolute": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
"dev": true
},
"pathval": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz",
"integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=",
"dev": true
},
"pify": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
"integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY="
},
"read-chunk": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-2.1.0.tgz",
"integrity": "sha1-agTAkoAF7Z1C4aasVgDhnLx/9lU=",
"requires": {
"pify": "3.0.0",
"safe-buffer": "5.1.1"
}
},
"safe-buffer": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
"integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg=="
},
"supports-color": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz",
"integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==",
"dev": true,
"requires": {
"has-flag": "2.0.0"
}
},
"type-detect": {
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
"integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
"dev": true
},
"wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
"dev": true
}
}
}

@ -6,9 +6,14 @@
},
"devDependencies": {
"chai": "^4.1.2",
"mocha": "^5.0.1"
"eslint": "^4.19.1",
"eslint-config-airbnb-base": "^13.0.0",
"eslint-plugin-import": "^2.13.0",
"mocha": "^5.2.0"
},
"scripts": {
"test": "mocha -R spec ./test"
"test": "mocha -R spec src",
"lint": "eslint src",
"lint:fix": "eslint src --fix"
}
}

@ -1,11 +1,11 @@
--- src/drivers/npm/node_modules/zombie/lib/document.js 2018-04-20 14:36:04.097829977 +1000
+++ src/drivers/npm/node_modules/zombie/lib/document.js 2018-04-20 14:34:25.699317000 +1000
@@ -281,7 +281,7 @@
// The current window, postMessage and window.close need this
--- src/drivers/npm/node_modules/zombie/lib/document.js
+++ src/drivers/npm/node_modules/zombie/lib/document.js
@@ -247,7 +247,7 @@ function setupWindow(window, args) {
browser._windowInScope = window;
var result = undefined;
- if (typeof code === 'string' || code instanceof String) result = VM.runInContext(code, window, { filename: filename });else if (code) result = code.call(window);
+ if (typeof code === 'string' || code instanceof String) result = VM.runInContext(code, window, { filename: filename, timeout: 1000 });else if (code) result = code.call(window);
let result;
if (typeof code == 'buffer' || code instanceof Buffer) code = code.toString();
- if (typeof code === 'string' || code instanceof String) result = VM.runInContext(code, context, { filename });else if (code) result = code.call(window);
+ if (typeof code === 'string' || code instanceof String) result = VM.runInContext(code, context, { filename, timeout: 1000 });else if (code) result = code.call(window);
browser.emit('evaluated', code, result, filename);
return result;
} catch (error) {

11
run

@ -10,7 +10,16 @@ fi
cmd="docker run --rm -v "$(pwd):/opt/wappalyzer" -it wappalyzer/dev"
$cmd sh -c "yarn install; cd src/drivers/webextension; yarn install"
$cmd sh -c "\
npm i; \
npm shrinkwrap; \
cd src/drivers/webextension; \
npm i; \
npm shrinkwrap; \
cd ../npm; \
npm i; \
npm shrinkwrap"
$cmd sh -c "cat patches/*.patch | patch -p0"
$cmd ./bin/run links

@ -38,6 +38,12 @@
},
"required": true
},
"cookies": {
"type": "object",
"additionalProperties": {
"type": "string"
}
},
"js": {
"type": "object",
"additionalProperties": {

File diff suppressed because it is too large Load Diff

@ -5,77 +5,78 @@
/** global: wappalyzer */
/** global: XMLHttpRequest */
(function() {
(function () {
wappalyzer.driver.document = document;
const container = document.getElementById('wappalyzer-container');
const url = wappalyzer.parseUrl(top.location.href);
const hasOwn = Object.prototype.hasOwnProperty;
const container = document.getElementById('wappalyzer-container');
const url = wappalyzer.parseUrl(window.top.location.href);
const hasOwn = Object.prototype.hasOwnProperty;
/**
* Log messages to console
*/
wappalyzer.driver.log = (message, source, type) => {
console.log('[wappalyzer ' + type + ']', '[' + source + ']', message);
console.log(`[wappalyzer ${type}]`, `[${source}]`, message);
};
function getPageContent() {
wappalyzer.log('func: getPageContent', 'driver');
var env = [];
for ( let i in window ) {
env.push(i);
}
var scripts = Array.prototype.slice
const scripts = Array.prototype.slice
.apply(document.scripts)
.filter(s => s.src)
.map(s => s.src);
let html = new window.XMLSerializer().serializeToString(document).split('\n');
html = html
.slice(0, 1000).concat(html.slice(html.length - 1000))
.map(line => line.substring(0, 1000))
.join('\n');
wappalyzer.analyze(url, {
html: document.documentElement.innerHTML,
env: env,
scripts: scripts
html,
scripts,
});
}
function getResponseHeaders() {
function getResponseHeaders() {
wappalyzer.log('func: getResponseHeaders', 'driver');
var xhr = new XMLHttpRequest();
const xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.onreadystatechange = () => {
if ( xhr.readyState === 4 && xhr.status ) {
var headers = xhr.getAllResponseHeaders().split("\n");
if (xhr.readyState === 4 && xhr.status) {
const headers = xhr.getAllResponseHeaders().split('\n');
if ( headers.length > 0 && headers[0] != '' ) {
wappalyzer.log('responseHeaders: ' + xhr.getAllResponseHeaders(), 'driver');
if (headers.length > 0 && headers[0] != '') {
wappalyzer.log(`responseHeaders: ${xhr.getAllResponseHeaders()}`, 'driver');
var responseHeaders = {};
const responseHeaders = {};
headers.forEach(line => {
var name, value;
headers.forEach((line) => {
let name,
value;
if ( line ) {
name = line.substring(0, line.indexOf(': '));
if (line) {
name = line.substring(0, line.indexOf(': '));
value = line.substring(line.indexOf(': ') + 2, line.length - 1);
if ( !responseHeaders[name.toLowerCase()] ){
responseHeaders[name.toLowerCase()] = []
if (!responseHeaders[name.toLowerCase()]) {
responseHeaders[name.toLowerCase()] = [];
}
responseHeaders[name.toLowerCase()].push(value);
}
});
wappalyzer.analyze(url, {
headers: responseHeaders
headers: responseHeaders,
});
}
}
}
};
xhr.send();
}
@ -83,46 +84,45 @@
/**
* Display apps
*/
wappalyzer.driver.displayApps = detected => {
wappalyzer.driver.displayApps = (detected) => {
wappalyzer.log('func: diplayApps', 'driver');
var first = true;
var app;
var category;
var html;
let first = true;
let app;
let category;
let html;
html =
'<a id="wappalyzer-close" href="javascript: document.body.removeChild(document.getElementById(\'wappalyzer-container\')); void(0);">' +
'Close' +
'</a>' +
'<div id="wappalyzer-apps">';
html = '<a id="wappalyzer-close" href="javascript: document.body.removeChild(document.getElementById(\'wappalyzer-container\')); void(0);">'
+ 'Close'
+ '</a>'
+ '<div id="wappalyzer-apps">';
if ( detected != null && Object.keys(detected).length ) {
for ( app in detected ) {
if ( !hasOwn.call(detected, app) ) {
if (detected != null && Object.keys(detected).length) {
for (app in detected) {
if (!hasOwn.call(detected, app)) {
continue;
}
var version = detected[app].version,
let version = detected[app].version,
confidence = detected[app].confidence;
html +=
'<div class="wappalyzer-app' + ( first ? ' wappalyzer-first' : '' ) + '">' +
'<a target="_blank" class="wappalyzer-application" href="' + wappalyzer.config.websiteURL + 'applications/' + app.toLowerCase().replace(/ /g, '-').replace(/[^a-z0-9-]/g, '') + '">' +
'<strong>' +
'<img src="' + wappalyzer.config.websiteURL + 'images/icons/' + (wappalyzer.apps[app].icon || 'default.svg') + '" width="16" height="16"/> ' + app +
'</strong>' +
( version ? ' ' + version : '' ) + ( confidence < 100 ? ' (' + confidence + '% sure)' : '' ) +
'</a>';
for ( let i in wappalyzer.apps[app].cats ) {
if ( !hasOwn.call(wappalyzer.apps[app].cats, i) ) {
html
+= `<div class="wappalyzer-app${first ? ' wappalyzer-first' : ''}">`
+ `<a target="_blank" class="wappalyzer-application" href="${wappalyzer.config.websiteURL}applications/${app.toLowerCase().replace(/ /g, '-').replace(/[^a-z0-9-]/g, '')}">`
+ '<strong>'
+ `<img src="${wappalyzer.config.websiteURL}images/icons/${wappalyzer.apps[app].icon || 'default.svg'}" width="16" height="16"/> ${app
}</strong>${
version ? ` ${version}` : ''}${confidence < 100 ? ` (${confidence}% sure)` : ''
}</a>`;
for (const i in wappalyzer.apps[app].cats) {
if (!hasOwn.call(wappalyzer.apps[app].cats, i)) {
continue;
}
category = wappalyzer.categories[wappalyzer.apps[app].cats[i]].name;
html += '<a target="_blank" class="wappalyzer-category" href="' + wappalyzer.config.websiteURL + 'categories/' + slugify(category) + '">' + category + '</a>';
html += `<a target="_blank" class="wappalyzer-category" href="${wappalyzer.config.websiteURL}categories/${slugify(category)}">${category}</a>`;
}
html += '</div>';
@ -143,7 +143,7 @@
*/
function openTab(args) {
open(args.url);
}
};
function slugify(string) {
return string.toLowerCase().replace(/[^a-z0-9-]/g, '-').replace(/--+/g, '-').replace(/(?:^-|-$)/, '');
@ -151,4 +151,4 @@
getPageContent();
getResponseHeaders();
})();
}());

@ -8,11 +8,14 @@ RUN apk update && apk add --no-cache \
nodejs \
nodejs-npm
RUN mkdir -p "$WAPPALYZER_ROOT"
RUN mkdir -p "$WAPPALYZER_ROOT/browsers"
WORKDIR "$WAPPALYZER_ROOT"
ADD apps.json .
ADD browser.js .
ADD browsers/zombie.js ./browsers
ADD cli.js .
ADD driver.js .
ADD index.js .
ADD package.json .
@ -20,4 +23,4 @@ ADD wappalyzer.js .
RUN npm i
ENTRYPOINT ["node", "index.js"]
ENTRYPOINT ["node", "cli.js"]

@ -14,35 +14,43 @@ technologies used on websites. It detects
## Installation
```shell
$ npm i wappalyzer
$ npm i -g wappalyzer # Globally
$ npm i wappalyzer --save # As a dependency
```
## Run from the command line
```
node index.js [url] [options]
wappalyzer [url] [options]
```
### Options
```
--chunk-size=num Process links in chunks.
--debug=0|1 Output debug messages.
--delay=ms Wait for ms milliseconds between requests.
--max-depth=num Don't analyse pages more than num levels deep.
--max-urls=num Exit when num URLs have been analysed.
--max-wait=ms Wait no more than ms milliseconds for page resources to load.
--recursive=0|1 Follow links on pages (crawler).
--user-agent=str Set the user agent string.
--html-max-cols=num Limit the number of HTML characters per line processed.
--html-max-rows=num Limit the number of HTML lines processed.
--password Password to be used for basic HTTP authentication
--proxy Proxy URL, e.g. 'http://user:pass@proxy:8080'
--username Username to be used for basic HTTP authentication
--chunk-size=num Process links in chunks.
--debug=0|1 Output debug messages.
--delay=ms Wait for ms milliseconds between requests.
--html-max-cols=num Limit the number of HTML characters per line processed.
--html-max-rows=num Limit the number of HTML lines processed.
--max-depth=num Don't analyse pages more than num levels deep.
--max-urls=num Exit when num URLs have been analysed.
--max-wait=ms Wait no more than ms milliseconds for page resources to load.
--recursive=0|1 Follow links on pages (crawler).
--user-agent=str Set the user agent string.
```
## Run from a script
```javascript
const Wappalyzer = require('wappalyzer');
const url = 'https://www.wappalyzer.com';
const options = {
debug: false,
delay: 500,
@ -55,16 +63,29 @@ const options = {
htmlMaxRows: 2000,
};
const wappalyzer = new Wappalyzer('https://www.wappalyzer.com', options);
const wappalyzer = new Wappalyzer(url, options);
// Optional: set the browser to use
// wappalyzer.browser = Wappalyzer.browsers.zombie;
// Optional: capture log output
// wappalyzer.on('log', params => {
// const { message, source, type } = params;
// });
// Optional: do something on page visit
// wappalyzer.on('visit', params => {
// const { browser, pageUrl } = params;
// });
wappalyzer.analyze()
.then(json => {
process.stdout.write(JSON.stringify(json, null, 2) + '\n')
process.stdout.write(`${JSON.stringify(json, null, 2)}\n`);
process.exit(0);
})
.catch(error => {
process.stderr.write(error + '\n')
process.stderr.write(`${error}\n`);
process.exit(1);
});

@ -0,0 +1,20 @@
class Browser {
constructor(options) {
this.options = options;
this.window = null;
this.document = null;
this.statusCode = null;
this.contentType = null;
this.headers = null;
this.statusCode = null;
this.contentType = null;
this.html = null;
this.js = null;
this.links = null;
this.scripts = null;
this.cookies = null;
}
}
module.exports = Browser;

@ -0,0 +1,121 @@
const Zombie = require('zombie');
const Browser = require('../browser');
class ZombieBrowser extends Browser {
constructor(options) {
super(options);
this.browser = new Zombie({
proxy: options.proxy,
silent: true,
strictSSL: false,
userAgent: options.userAgent,
waitDuration: options.maxWait,
});
this.browser.on('authenticate', (auth) => {
auth.username = this.options.username;
auth.password = this.options.password;
});
}
visit(url) {
return new Promise((resolve) => {
this.browser.visit(url, () => {
const resource = this.browser.resources.length
? this.browser.resources.filter(_resource => _resource.response).shift() : null;
this.window = this.browser.window;
this.document = this.browser.document;
this.headers = this.getHeaders();
this.statusCode = resource ? resource.response.status : 0;
this.contentType = this.headers['content-type'] ? this.headers['content-type'].shift() : null;
this.html = this.getHtml();
this.js = this.getJs();
this.links = this.getLinks();
this.scripts = this.getScripts();
this.cookies = this.getCookies();
resolve();
});
});
}
getHeaders() {
const headers = {};
const resource = this.browser.resources.length
? this.browser.resources.filter(_resource => _resource.response).shift() : null;
if (resource) {
// eslint-disable-next-line no-underscore-dangle
resource.response.headers._headers.forEach((header) => {
if (!headers[header[0]]) {
headers[header[0]] = [];
}
headers[header[0]].push(header[1]);
});
}
return headers;
}
getHtml() {
let html = '';
if (this.browser.document && this.browser.document.documentElement) {
try {
html = this.browser.html();
} catch (error) {
this.log(error.message, 'error');
}
}
return html;
}
getScripts() {
let scripts = [];
if (this.browser.document && this.browser.document.scripts) {
scripts = Array.prototype.slice
.apply(this.browser.document.scripts)
.filter(script => script.src)
.map(script => script.src);
}
return scripts;
}
getJs() {
return this.browser.window;
}
getLinks() {
let links = [];
if (this.browser.document) {
links = Array.from(this.browser.document.getElementsByTagName('a'));
}
return links;
}
getCookies() {
const cookies = [];
if (this.browser.cookies) {
this.browser.cookies.forEach(cookie => cookies.push({
name: cookie.key,
value: cookie.value,
domain: cookie.domain,
path: cookie.path,
}));
}
return cookies;
}
}
module.exports = ZombieBrowser;

@ -0,0 +1,45 @@
#!/usr/bin/env node
const Wappalyzer = require('./driver');
const Browser = require('./browsers/zombie');
const args = process.argv.slice(2);
const url = args.shift() || '';
if (!url) {
process.stderr.write('No URL specified\n');
process.exit(1);
}
const options = {};
let arg;
do {
arg = args.shift();
const matches = /--([^=]+)=(.+)/.exec(arg);
if (matches) {
const key = matches[1].replace(/-\w/g, _matches => _matches[1].toUpperCase());
const value = matches[2];
options[key] = value;
}
} while (arg);
const wappalyzer = new Wappalyzer(Browser, url, options);
wappalyzer.analyze()
.then((json) => {
process.stdout.write(`${JSON.stringify(json)}\n`);
process.exit(0);
})
.catch((error) => {
process.stderr.write(`${error}\n`);
process.exit(1);
});

@ -1,43 +1,103 @@
'use strict';
const Wappalyzer = require('./wappalyzer');
const request = require('request');
const url = require('url');
const fs = require('fs');
const Browser = require('zombie');
const path = require('path');
const Wappalyzer = require('./wappalyzer');
const json = JSON.parse(fs.readFileSync(__dirname + '/apps.json'));
const json = JSON.parse(fs.readFileSync(path.resolve(`${__dirname}/apps.json`)));
const extensions = /^([^.]+$|\.(asp|aspx|cgi|htm|html|jsp|php)$)/;
const errorTypes = {
RESPONSE_NOT_OK: 'Response was not ok',
NO_RESPONSE: 'No response from server',
NO_HTML_DOCUMENT: 'No HTML document',
};
function sleep(ms) {
return ms ? new Promise(resolve => setTimeout(resolve, ms)) : Promise.resolve();
}
function processJs(window, patterns) {
const js = {};
Object.keys(patterns).forEach((appName) => {
js[appName] = {};
Object.keys(patterns[appName]).forEach((chain) => {
js[appName][chain] = {};
patterns[appName][chain].forEach((pattern, index) => {
const properties = chain.split('.');
let value = properties
.reduce((parent, property) => (parent && parent[property]
? parent[property] : null), window);
value = typeof value === 'string' || typeof value === 'number' ? value : !!value;
if (value) {
js[appName][chain][index] = value;
}
});
});
});
return js;
}
function processHtml(html, maxCols, maxRows) {
if (maxCols || maxRows) {
const chunks = [];
const rows = html.length / maxCols;
let i;
for (i = 0; i < rows; i += 1) {
if (i < maxRows / 2 || i > rows - maxRows / 2) {
chunks.push(html.slice(i * maxCols, (i + 1) * maxCols));
}
}
html = chunks.join('\n');
}
return html;
}
class Driver {
constructor(pageUrl, options) {
constructor(Browser, pageUrl, options) {
this.options = Object.assign({}, {
password: '',
proxy: null,
username: '',
chunkSize: 5,
debug: false,
delay: 500,
htmlMaxCols: 2000,
htmlMaxRows: 3000,
maxDepth: 3,
maxUrls: 10,
maxWait: 5000,
recursive: false,
userAgent: 'Mozilla/5.0 (compatible; Wappalyzer)',
htmlMaxCols: 2000,
htmlMaxRows: 2000,
}, options || {});
this.options.debug = Boolean(this.options.debug);
this.options.debug = Boolean(+this.options.debug);
this.options.recursive = Boolean(+this.options.recursive);
this.options.delay = this.options.recursive ? parseInt(this.options.delay, 10) : 0;
this.options.maxDepth = parseInt(this.options.maxDepth, 10);
this.options.maxUrls = parseInt(this.options.maxUrls, 10);
this.options.maxWait = parseInt(this.options.maxWait, 10);
this.options.htmlMaxCols = parseInt(this.options.htmlMaxCols, 10);
this.options.htmlMaxRows = parseInt(this.options.htmlMaxRows, 10);
this.options.recursive = Boolean(this.options.recursive);
this.origPageUrl = url.parse(pageUrl);
this.analyzedPageUrls = [];
this.analyzedPageUrls = {};
this.apps = [];
this.meta = {};
this.listeners = {};
this.Browser = Browser;
this.wappalyzer = new Wappalyzer();
@ -47,48 +107,67 @@ class Driver {
this.wappalyzer.parseJsPatterns();
this.wappalyzer.driver.log = (message, source, type) => this.log(message, source, type);
this.wappalyzer.driver.displayApps = (detected, meta, context) => this.displayApps(detected, meta, context);
this.wappalyzer.driver
.displayApps = (detected, meta, context) => this.displayApps(detected, meta, context);
process.on('uncaughtException', e => this.wappalyzer.log(`Uncaught exception: ${e.message}`, 'driver', 'error'));
}
on(event, callback) {
if (!this.listeners[event]) {
this.listeners[event] = [];
}
this.listeners[event].push(callback);
}
process.on('uncaughtException', e => this.wappalyzer.log('Uncaught exception: ' + e.message, 'driver', 'error'));
emit(event, params) {
if (this.listeners[event]) {
this.listeners[event].forEach(listener => listener(params));
}
}
analyze() {
this.time = {
start: new Date().getTime(),
last: new Date().getTime(),
}
};
return this.crawl(this.origPageUrl);
}
log(message, source, type) {
this.options.debug && console.log('[wappalyzer ' + type + ']', '[' + source + ']', message);
if (this.options.debug) {
console.log(`[wappalyzer ${type}]`, `[${source}]`, message);
}
this.emit('log', { message, source, type });
}
displayApps(detected, meta) {
this.meta = meta;
Object.keys(detected).forEach(appName => {
Object.keys(detected).forEach((appName) => {
const app = detected[appName];
var categories = [];
const categories = [];
app.props.cats.forEach(id => {
var category = {};
app.props.cats.forEach((id) => {
const category = {};
category[id] = json.categories[id].name;
categories.push(category)
categories.push(category);
});
if ( !this.apps.some(detectedApp => detectedApp.name === app.name) ) {
if (!this.apps.some(detectedApp => detectedApp.name === app.name)) {
this.apps.push({
name: app.name,
confidence: app.confidenceTotal.toString(),
version: app.version,
version: app.version || null,
icon: app.props.icon || 'default.svg',
website: app.props.website,
categories
categories,
});
}
});
@ -96,249 +175,156 @@ class Driver {
fetch(pageUrl, index, depth) {
// Return when the URL is a duplicate or maxUrls has been reached
if ( this.analyzedPageUrls.indexOf(pageUrl.href) !== -1 || this.analyzedPageUrls.length >= this.options.maxUrls ) {
if (
this.analyzedPageUrls[pageUrl.href]
|| this.analyzedPageUrls.length >= this.options.maxUrls
) {
return Promise.resolve();
}
this.analyzedPageUrls.push(pageUrl.href);
this.analyzedPageUrls[pageUrl.href] = {
status: 0,
};
const timerScope = {
last: new Date().getTime()
last: new Date().getTime(),
};
this.timer('fetch; url: ' + pageUrl.href + '; depth: ' + depth + '; delay: ' + ( this.options.delay * index ) + 'ms', timerScope);
this.timer(`fetch; url: ${pageUrl.href}; depth: ${depth}; delay: ${this.options.delay * index}ms`, timerScope);
return new Promise(resolve => this.sleep(this.options.delay * index).then(() => this.visit(pageUrl, timerScope, resolve)));
}
return new Promise(async (resolve, reject) => {
await sleep(this.options.delay * index);
visit(pageUrl, timerScope, resolve) {
const browser = new Browser({
silent: true,
strictSSL: false,
userAgent: this.options.userAgent,
waitDuration: this.options.maxWait,
});
this.timer('browser.visit start; url: ' + pageUrl.href, timerScope);
browser.visit(pageUrl.href, () => {
this.timer('browser.visit end; url: ' + pageUrl.href, timerScope);
if ( !this.responseOk(browser, pageUrl) ) {
return resolve();
}
const headers = this.getHeaders(browser);
const html = this.getHtml(browser);
const scripts = this.getScripts(browser);
const js = this.getJs(browser);
const cookies = this.getCookies(browser);
this.wappalyzer.analyze(pageUrl, {
headers,
html,
scripts,
js,
cookies,
})
.then(() => {
const links = Array.prototype.reduce.call(
browser.document.getElementsByTagName('a'), (results, link) => {
if ( link.protocol.match(/https?:/) || link.hostname === this.origPageUrl.hostname || extensions.test(link.pathname) ) {
link.hash = '';
results.push(url.parse(link.href));
}
return results;
}, []
);
return resolve(links);
});
this.visit(pageUrl, timerScope, resolve, reject);
});
}
responseOk(browser, pageUrl) {
// Validate response
const resource = browser.resources.length ? browser.resources.filter(resource => resource.response).shift() : null;
async visit(pageUrl, timerScope, resolve, reject) {
const browser = new this.Browser(this.options);
if ( !resource ) {
this.wappalyzer.log('No response from server; url: ' + pageUrl.href, 'driver', 'error');
browser.log = (message, type) => this.wappalyzer.log(message, 'browser', type);
return false;
}
this.timer(`visit start; url: ${pageUrl.href}`, timerScope);
if ( resource.response.status !== 200 ) {
this.wappalyzer.log('Response was not OK; status: ' + resource.response.status + ' ' + resource.response.statusText + '; url: ' + pageUrl.href, 'driver', 'error');
await browser.visit(pageUrl.href);
return false;
}
const headers = this.getHeaders(browser);
// Validate content type
const contentType = headers.hasOwnProperty('content-type') ? headers['content-type'].shift() : null;
this.timer(`visit end; url: ${pageUrl.href}`, timerScope);
if ( !contentType || !/\btext\/html\b/.test(contentType) ) {
this.wappalyzer.log('Skipping; url: ' + pageUrl.href + '; content type: ' + contentType, 'driver');
this.analyzedPageUrls[pageUrl.href].status = browser.statusCode;
this.analyzedPageUrls.splice(this.analyzedPageUrls.indexOf(pageUrl.href), 1);
// Validate response
if (!browser.statusCode) {
return reject(new Error('NO_RESPONSE'));
}
return false;
if (browser.statusCode !== 200) {
return reject(new Error('RESPONSE_NOT_OK'));
}
// Validate document
if ( !browser.document || !browser.document.documentElement ) {
this.wappalyzer.log('No HTML document; url: ' + pageUrl.href, 'driver', 'error');
if (!browser.contentType || !/\btext\/html\b/.test(browser.contentType)) {
this.wappalyzer.log(`Skipping; url: ${pageUrl.href}; content type: ${browser.contentType}`, 'driver');
return false;
delete this.analyzedPageUrls[pageUrl.href];
}
return true;
}
const { cookies, headers, scripts } = browser;
getHeaders(browser) {
const headers = {};
const html = processHtml(browser.html, this.options.htmlMaxCols, this.options.htmlMaxRows);
const js = processJs(browser.js, this.wappalyzer.jsPatterns);
const resource = browser.resources.length ? browser.resources.filter(resource => resource.response).shift() : null;
await this.wappalyzer.analyze(pageUrl, {
cookies,
headers,
html,
js,
scripts,
});
if ( resource ) {
resource.response.headers._headers.forEach(header => {
if ( !headers[header[0]] ){
headers[header[0]] = [];
const reducedLinks = Array.prototype.reduce.call(
browser.links, (results, link) => {
if (
results
&& Object.prototype.hasOwnProperty.call(results, 'push')
&& link.protocol
&& link.protocol.match(/https?:/)
&& link.rel !== 'nofollow'
&& link.hostname === this.origPageUrl.hostname
&& extensions.test(link.pathname)
) {
link.hash = '';
results.push(url.parse(link.href));
}
headers[header[0]].push(header[1]);
});
}
return headers;
}
getHtml(browser) {
let html = '';
try {
html = browser.html()
.split('\n')
.slice(0, this.options.htmlMaxRows / 2).concat(html.slice(html.length - this.options.htmlMaxRows / 2))
.map(line => line.substring(0, this.options.htmlMaxCols))
.join('\n');
} catch ( error ) {
this.wappalyzer.log(error.message, 'browser', 'error');
}
return html;
}
getScripts(browser) {
if ( !browser.document || !browser.document.scripts ) {
return [];
}
return results;
}, [],
);
const scripts = Array.prototype.slice
.apply(browser.document.scripts)
.filter(script => script.src)
.map(script => script.src);
this.emit('visit', { browser, pageUrl });
return scripts;
return resolve(reducedLinks);
}
getJs(browser) {
const patterns = this.wappalyzer.jsPatterns;
const js = {};
crawl(pageUrl, index = 1, depth = 1) {
pageUrl.canonical = `${pageUrl.protocol}//${pageUrl.host}${pageUrl.pathname}`;
Object.keys(patterns).forEach(appName => {
js[appName] = {};
return new Promise(async (resolve) => {
let links;
Object.keys(patterns[appName]).forEach(chain => {
js[appName][chain] = {};
try {
links = await this.fetch(pageUrl, index, depth);
} catch (error) {
const type = error.message && errorTypes[error.message] ? error.message : 'UNKNOWN_ERROR';
const message = error.message && errorTypes[error.message] ? errorTypes[error.message] : 'Unknown error';
patterns[appName][chain].forEach((pattern, index) => {
const properties = chain.split('.');
this.analyzedPageUrls[pageUrl.href].error = {
type,
message,
};
let value = properties.reduce((parent, property) => {
return parent && parent.hasOwnProperty(property) ? parent[property] : null;
}, browser.window);
this.wappalyzer.log(`${message}; url: ${pageUrl.href}`, 'driver', 'error');
}
value = typeof value === 'string' || typeof value === 'number' ? value : !!value;
if (links && this.options.recursive && depth < this.options.maxDepth) {
await this.chunk(links.slice(0, this.options.maxUrls), depth + 1);
}
if ( value ) {
js[appName][chain][index] = value;
}
});
return resolve({
urls: this.analyzedPageUrls,
applications: this.apps,
meta: this.meta,
});
});
return js;
}
getCookies(browser) {
const cookies = [];
if ( browser.cookies ) {
browser.cookies.forEach(cookie => cookies.push({
name: cookie.key,
value: cookie.value,
domain: cookie.domain,
path: cookie.path,
}));
}
return cookies;
}
crawl(pageUrl, index = 1, depth = 1) {
pageUrl.canonical = pageUrl.protocol + '//' + pageUrl.host + pageUrl.pathname;
return new Promise(resolve => {
this.fetch(pageUrl, index, depth)
.catch(() => {})
.then(links => {
if ( links && Boolean(this.options.recursive) && depth < this.options.maxDepth ) {
return this.chunk(links.slice(0, this.options.maxUrls), depth + 1);
} else {
return Promise.resolve();
}
})
.then(() => {
resolve({
urls: this.analyzedPageUrls,
applications: this.apps,
meta: this.meta
});
});
});
}
chunk(links, depth, chunk = 0) {
if ( links.length === 0 ) {
if (links.length === 0) {
return Promise.resolve();
}
const chunked = links.splice(0, this.options.chunkSize);
return new Promise(resolve => {
Promise.all(chunked.map((link, index) => this.crawl(link, index, depth)))
.then(() => this.chunk(links, depth, chunk + 1))
.then(() => resolve());
});
}
return new Promise(async (resolve) => {
await Promise.all(chunked.map((link, index) => this.crawl(link, index, depth)));
await this.chunk(links, depth, chunk + 1);
sleep(ms) {
return ms ? new Promise(resolve => setTimeout(resolve, ms)) : Promise.resolve();
resolve();
});
}
timer(message, scope) {
const time = new Date().getTime();
const sinceStart = ( Math.round(( time - this.time.start ) / 10) / 100) + 's';
const sinceLast = ( Math.round(( time - scope.last ) / 10) / 100) + 's';
const sinceStart = `${Math.round((time - this.time.start) / 10) / 100}s`;
const sinceLast = `${Math.round((time - scope.last) / 10) / 100}s`;
this.wappalyzer.log('[timer] ' + message + '; lapsed: ' + sinceLast + ' / ' + sinceStart, 'driver');
this.wappalyzer.log(`[timer] ${message}; lapsed: ${sinceLast} / ${sinceStart}`, 'driver');
scope.last = time;
}
};
}
module.exports = Driver;
module.exports.processJs = processJs;
module.exports.processHtml = processHtml;

@ -1,47 +1,16 @@
'use strict';
const Driver = require('./driver');
const ZombieBrowser = require('./browsers/zombie');
const Wappalyzer = require('./driver');
class Wappalyzer {
constructor(pageUrl, options) {
this.browser = ZombieBrowser;
const args = process.argv.slice(2);
const url = args.shift() || '';
if ( !url ) {
process.stderr.write('No URL specified\n');
process.exit(1);
}
var options = {};
var arg;
while ( arg = args.shift() ) {
var matches = /--([^=]+)=(.+)/.exec(arg);
if ( matches ) {
var key = matches[1].replace(/-\w/g, matches => matches[1].toUpperCase());
var value = matches[2];
options[key] = value;
return new Driver(this.browser, pageUrl, options);
}
}
const wappalyzer = new Wappalyzer(url, options);
setTimeout(() => {
console.log('force quit');
process.exit(1);
}, 10000);
wappalyzer.analyze()
.then(json => {
process.stdout.write(JSON.stringify(json) + '\n')
process.exit(0);
})
.catch(error => {
process.stderr.write(error + '\n')
Wappalyzer.browsers = {
zombie: ZombieBrowser,
};
process.exit(1);
});
module.exports = Wappalyzer;

@ -1,25 +1,30 @@
{
"name": "wappalyzer",
"version": "5.4.13",
"version": "5.8.2",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"@types/node": {
"version": "10.5.7",
"resolved": "https://registry.npmjs.org/@types/node/-/node-10.5.7.tgz",
"integrity": "sha512-VkKcfuitP+Nc/TaTFH0B8qNmn+6NbI6crLkQonbedViVz7O2w8QV/GERPlkJ4bg42VGHiEWa31CoTOPs1q6z1w=="
},
"abab": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz",
"integrity": "sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4="
},
"acorn": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz",
"integrity": "sha1-q259nYhqrKiwhbwzEreaGYQz8Oc="
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.1.tgz",
"integrity": "sha512-d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ=="
},
"acorn-globals": {
"version": "1.0.9",
"resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-1.0.9.tgz",
"integrity": "sha1-VbtemGkVB7dFedBRNBMhfDgMVM8=",
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.1.0.tgz",
"integrity": "sha512-KjZwU26uG3u6eZcfGbTULzFcsoz6pegNKtHPksZPOUsiKo5bUmiBPa38FuHZ/Eun+XYh/JCCkS9AS3Lu4McQOQ==",
"requires": {
"acorn": "2.7.0"
"acorn": "^5.0.0"
}
},
"ajv": {
@ -27,12 +32,17 @@
"resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
"integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
"requires": {
"co": "4.6.0",
"fast-deep-equal": "1.1.0",
"fast-json-stable-stringify": "2.0.0",
"json-schema-traverse": "0.3.1"
"co": "^4.6.0",
"fast-deep-equal": "^1.0.0",
"fast-json-stable-stringify": "^2.0.0",
"json-schema-traverse": "^0.3.0"
}
},
"array-equal": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz",
"integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM="
},
"asn1": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz",
@ -43,6 +53,11 @@
"resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
"integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
},
"async-limiter": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz",
"integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg=="
},
"asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
@ -59,20 +74,21 @@
"integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w=="
},
"babel-runtime": {
"version": "5.8.29",
"resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-5.8.29.tgz",
"integrity": "sha1-SiBSy8/1MXiNOp1rA81/RIKF+CU=",
"version": "6.26.0",
"resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
"integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
"requires": {
"core-js": "1.2.7"
"core-js": "^2.4.0",
"regenerator-runtime": "^0.11.0"
}
},
"bcrypt-pbkdf": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz",
"integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=",
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
"integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
"optional": true,
"requires": {
"tweetnacl": "0.14.5"
"tweetnacl": "^0.14.3"
}
},
"bluebird": {
@ -80,13 +96,10 @@
"resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz",
"integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA=="
},
"boom": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz",
"integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=",
"requires": {
"hoek": "4.2.1"
}
"browser-process-hrtime": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz",
"integrity": "sha1-Ql1opY00R/AqBKqJQYf86K+Le44="
},
"caseless": {
"version": "0.12.0",
@ -103,48 +116,35 @@
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz",
"integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=",
"requires": {
"delayed-stream": "1.0.0"
"delayed-stream": "~1.0.0"
}
},
"content-type-parser": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/content-type-parser/-/content-type-parser-1.0.2.tgz",
"integrity": "sha512-lM4l4CnMEwOLHAHr/P6MEZwZFPJFtAAKgL6pogbXmVZggIqXhdB6RbBtPOTsw2FcXwYhehRGERJmRrjOiIB8pQ=="
},
"core-js": {
"version": "1.2.7",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz",
"integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY="
"version": "2.5.7",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz",
"integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw=="
},
"core-util-is": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
},
"cryptiles": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz",
"integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=",
"requires": {
"boom": "5.2.0"
},
"dependencies": {
"boom": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz",
"integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==",
"requires": {
"hoek": "4.2.1"
}
}
}
},
"cssom": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.2.tgz",
"integrity": "sha1-uANhcMefB6kP8vFuIihAJ6JDhIs="
"version": "0.3.3",
"resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.3.tgz",
"integrity": "sha512-pjE/I/NSp3iyeoxXN5QaoJpgzYUMj2dJHx9OSufoTliJLDx+kuOQaMCJW8OwvrKJswhXUHnHN6eUmUSETN0msg=="
},
"cssstyle": {
"version": "0.2.37",
"resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz",
"integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=",
"requires": {
"cssom": "0.3.2"
"cssom": "0.3.x"
}
},
"dashdash": {
@ -152,13 +152,13 @@
"resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
"integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
"requires": {
"assert-plus": "1.0.0"
"assert-plus": "^1.0.0"
}
},
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
"integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
"requires": {
"ms": "2.0.0"
},
@ -180,25 +180,33 @@
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
},
"domexception": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz",
"integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==",
"requires": {
"webidl-conversions": "^4.0.2"
}
},
"ecc-jsbn": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz",
"integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=",
"optional": true,
"requires": {
"jsbn": "0.1.1"
"jsbn": "~0.1.0"
}
},
"escodegen": {
"version": "1.9.1",
"resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz",
"integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==",
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.10.0.tgz",
"integrity": "sha512-fjUOf8johsv23WuIKdNQU4P9t9jhQ4Qzx6pC2uW890OloK3Zs1ZAoCNpg/2larNF501jLl3UNy0kIRcF6VI22g==",
"requires": {
"esprima": "3.1.3",
"estraverse": "4.2.0",
"esutils": "2.0.2",
"optionator": "0.8.2",
"source-map": "0.6.1"
"esprima": "^3.1.3",
"estraverse": "^4.2.0",
"esutils": "^2.0.2",
"optionator": "^0.8.1",
"source-map": "~0.6.1"
}
},
"esprima": {
@ -217,11 +225,11 @@
"integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs="
},
"eventsource": {
"version": "0.1.6",
"resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz",
"integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=",
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.5.tgz",
"integrity": "sha512-IzjLaND9GBK3+fBPhmvG/Yq3FhSDGHnucJCDWhNsneLlN+HX5jeaSpl3Folr2PipGmyUsd/T2Vrua+s6I2aTgQ==",
"requires": {
"original": "1.0.0"
"original": "^1.0.0"
}
},
"extend": {
@ -259,9 +267,9 @@
"resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz",
"integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=",
"requires": {
"asynckit": "0.4.0",
"asynckit": "^0.4.0",
"combined-stream": "1.0.6",
"mime-types": "2.1.18"
"mime-types": "^2.1.12"
}
},
"getpass": {
@ -269,7 +277,7 @@
"resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
"integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
"requires": {
"assert-plus": "1.0.0"
"assert-plus": "^1.0.0"
}
},
"har-schema": {
@ -282,42 +290,34 @@
"resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz",
"integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=",
"requires": {
"ajv": "5.5.2",
"har-schema": "2.0.0"
"ajv": "^5.1.0",
"har-schema": "^2.0.0"
}
},
"hawk": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz",
"integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==",
"html-encoding-sniffer": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz",
"integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==",
"requires": {
"boom": "4.3.1",
"cryptiles": "3.1.2",
"hoek": "4.2.1",
"sntp": "2.1.0"
"whatwg-encoding": "^1.0.1"
}
},
"hoek": {
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz",
"integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA=="
},
"http-signature": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
"integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
"requires": {
"assert-plus": "1.0.0",
"jsprim": "1.4.1",
"sshpk": "1.14.1"
"assert-plus": "^1.0.0",
"jsprim": "^1.2.2",
"sshpk": "^1.7.0"
}
},
"iconv-lite": {
"version": "0.4.21",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.21.tgz",
"integrity": "sha512-En5V9za5mBt2oUA03WGD3TwDv0MKAruqsuxstbMUZaj9W9k/m1CV/9py3l0L5kw9Bln8fdHQmzHSYtvpvTLpKw==",
"version": "0.4.23",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz",
"integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==",
"requires": {
"safer-buffer": "2.1.2"
"safer-buffer": ">= 2.1.2 < 3"
}
},
"is-typedarray": {
@ -337,25 +337,34 @@
"optional": true
},
"jsdom": {
"version": "7.2.2",
"resolved": "https://registry.npmjs.org/jsdom/-/jsdom-7.2.2.tgz",
"integrity": "sha1-QLQCdwwr2iNGkJa+6Rq2deOx/G4=",
"requires": {
"abab": "1.0.4",
"acorn": "2.7.0",
"acorn-globals": "1.0.9",
"cssom": "0.3.2",
"cssstyle": "0.2.37",
"escodegen": "1.9.1",
"nwmatcher": "1.4.4",
"parse5": "1.5.1",
"request": "2.85.0",
"sax": "1.2.4",
"symbol-tree": "3.2.2",
"tough-cookie": "2.3.4",
"webidl-conversions": "2.0.1",
"whatwg-url-compat": "0.6.5",
"xml-name-validator": "2.0.1"
"version": "11.5.1",
"resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.5.1.tgz",
"integrity": "sha512-89ztIZ03aYK9f1uUrLXLsZndRge/JnZjzjpaN+lrse3coqz+8PR/dX4WLHpbF5fIKTXhDjFODOJw2328lPJ90g==",
"requires": {
"abab": "^1.0.3",
"acorn": "^5.1.2",
"acorn-globals": "^4.0.0",
"array-equal": "^1.0.0",
"browser-process-hrtime": "^0.1.2",
"content-type-parser": "^1.0.1",
"cssom": ">= 0.3.2 < 0.4.0",
"cssstyle": ">= 0.2.37 < 0.3.0",
"domexception": "^1.0.0",
"escodegen": "^1.9.0",
"html-encoding-sniffer": "^1.0.1",
"left-pad": "^1.2.0",
"nwmatcher": "^1.4.3",
"parse5": "^3.0.2",
"pn": "^1.0.0",
"request": "^2.83.0",
"request-promise-native": "^1.0.3",
"sax": "^1.2.1",
"symbol-tree": "^3.2.1",
"tough-cookie": "^2.3.3",
"webidl-conversions": "^4.0.2",
"whatwg-encoding": "^1.0.1",
"whatwg-url": "^6.3.0",
"xml-name-validator": "^2.0.1"
}
},
"json-schema": {
@ -384,24 +393,34 @@
"verror": "1.10.0"
}
},
"left-pad": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz",
"integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA=="
},
"levn": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
"integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
"requires": {
"prelude-ls": "1.1.2",
"type-check": "0.3.2"
"prelude-ls": "~1.1.2",
"type-check": "~0.3.2"
}
},
"lodash": {
"version": "3.10.1",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
"integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y="
"version": "4.17.10",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz",
"integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg=="
},
"lodash.sortby": {
"version": "4.7.0",
"resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
"integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg="
},
"mime": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz",
"integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg=="
},
"mime-db": {
"version": "1.33.0",
@ -413,13 +432,13 @@
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz",
"integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==",
"requires": {
"mime-db": "1.33.0"
"mime-db": "~1.33.0"
}
},
"ms": {
"version": "0.7.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-0.7.3.tgz",
"integrity": "sha1-cIFVpeROM/X9D8U+gdDUCpG+H/8="
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
"integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
},
"nwmatcher": {
"version": "1.4.4",
@ -436,84 +455,123 @@
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
"integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
"requires": {
"deep-is": "0.1.3",
"fast-levenshtein": "2.0.6",
"levn": "0.3.0",
"prelude-ls": "1.1.2",
"type-check": "0.3.2",
"wordwrap": "1.0.0"
"deep-is": "~0.1.3",
"fast-levenshtein": "~2.0.4",
"levn": "~0.3.0",
"prelude-ls": "~1.1.2",
"type-check": "~0.3.2",
"wordwrap": "~1.0.0"
}
},
"options": {
"version": "0.0.6",
"resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz",
"integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8="
},
"original": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/original/-/original-1.0.0.tgz",
"integrity": "sha1-kUf5P6FpbQS+YeAb1QuurKZWvTs=",
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/original/-/original-1.0.1.tgz",
"integrity": "sha512-IEvtB5vM5ULvwnqMxWBLxkS13JIEXbakizMSo3yoPNPCIWzg8TG3Usn/UhXoZFM/m+FuEA20KdzPSFq/0rS+UA==",
"requires": {
"url-parse": "1.0.5"
"url-parse": "~1.4.0"
}
},
"parse5": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz",
"integrity": "sha1-m387DeMr543CQBsXVzzK8Pb1nZQ="
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz",
"integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==",
"requires": {
"@types/node": "*"
}
},
"performance-now": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
"integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
},
"pn": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz",
"integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA=="
},
"prelude-ls": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
"integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ="
},
"psl": {
"version": "1.1.28",
"resolved": "https://registry.npmjs.org/psl/-/psl-1.1.28.tgz",
"integrity": "sha512-+AqO1Ae+N/4r7Rvchrdm432afjT9hqJRyBN3DQv9At0tPz4hIFSGKbq64fN9dVoCow4oggIIax5/iONx0r9hZw=="
},
"punycode": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
"integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
},
"qs": {
"version": "6.5.1",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz",
"integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A=="
"version": "6.5.2",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
"integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
},
"querystringify": {
"version": "0.0.4",
"resolved": "https://registry.npmjs.org/querystringify/-/querystringify-0.0.4.tgz",
"integrity": "sha1-DPf4T5Rj/wrlHExLFC2VvjdyTZw="
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.0.0.tgz",
"integrity": "sha512-eTPo5t/4bgaMNZxyjWx6N2a6AuE0mq51KWvpc7nU/MAqixcI6v6KrGUKES0HaomdnolQBBXU/++X6/QQ9KL4tw=="
},
"regenerator-runtime": {
"version": "0.11.1",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
"integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
},
"request": {
"version": "2.85.0",
"resolved": "https://registry.npmjs.org/request/-/request-2.85.0.tgz",
"integrity": "sha512-8H7Ehijd4js+s6wuVPLjwORxD4zeuyjYugprdOXlPSqaApmL/QOy+EB/beICHVCHkGMKNh5rvihb5ov+IDw4mg==",
"version": "2.87.0",
"resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz",
"integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==",
"requires": {
"aws-sign2": "~0.7.0",
"aws4": "^1.6.0",
"caseless": "~0.12.0",
"combined-stream": "~1.0.5",
"extend": "~3.0.1",
"forever-agent": "~0.6.1",
"form-data": "~2.3.1",
"har-validator": "~5.0.3",
"http-signature": "~1.2.0",
"is-typedarray": "~1.0.0",
"isstream": "~0.1.2",
"json-stringify-safe": "~5.0.1",
"mime-types": "~2.1.17",
"oauth-sign": "~0.8.2",
"performance-now": "^2.1.0",
"qs": "~6.5.1",
"safe-buffer": "^5.1.1",
"tough-cookie": "~2.3.3",
"tunnel-agent": "^0.6.0",
"uuid": "^3.1.0"
},
"dependencies": {
"tough-cookie": {
"version": "2.3.4",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz",
"integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==",
"requires": {
"punycode": "^1.4.1"
}
}
}
},
"request-promise-core": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.1.tgz",
"integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=",
"requires": {
"aws-sign2": "0.7.0",
"aws4": "1.7.0",
"caseless": "0.12.0",
"combined-stream": "1.0.6",
"extend": "3.0.1",
"forever-agent": "0.6.1",
"form-data": "2.3.2",
"har-validator": "5.0.3",
"hawk": "6.0.2",
"http-signature": "1.2.0",
"is-typedarray": "1.0.0",
"isstream": "0.1.2",
"json-stringify-safe": "5.0.1",
"mime-types": "2.1.18",
"oauth-sign": "0.8.2",
"performance-now": "2.1.0",
"qs": "6.5.1",
"safe-buffer": "5.1.1",
"stringstream": "0.0.5",
"tough-cookie": "2.3.4",
"tunnel-agent": "0.6.0",
"uuid": "3.2.1"
"lodash": "^4.13.1"
}
},
"request-promise-native": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.5.tgz",
"integrity": "sha1-UoF3D2jgyXGeUWP9P6tIIhX0/aU=",
"requires": {
"request-promise-core": "1.1.1",
"stealthy-require": "^1.1.0",
"tough-cookie": ">=2.3.3"
}
},
"requires-port": {
@ -522,9 +580,9 @@
"integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8="
},
"safe-buffer": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
"integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg=="
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
},
"safer-buffer": {
"version": "2.1.2",
@ -536,14 +594,6 @@
"resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
"integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
},
"sntp": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz",
"integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==",
"requires": {
"hoek": "4.2.1"
}
},
"source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
@ -551,24 +601,25 @@
"optional": true
},
"sshpk": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz",
"integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=",
"requires": {
"asn1": "0.2.3",
"assert-plus": "1.0.0",
"bcrypt-pbkdf": "1.0.1",
"dashdash": "1.14.1",
"ecc-jsbn": "0.1.1",
"getpass": "0.1.7",
"jsbn": "0.1.1",
"tweetnacl": "0.14.5"
}
},
"stringstream": {
"version": "0.0.5",
"resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz",
"integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg="
"version": "1.14.2",
"resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz",
"integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=",
"requires": {
"asn1": "~0.2.3",
"assert-plus": "^1.0.0",
"bcrypt-pbkdf": "^1.0.0",
"dashdash": "^1.12.0",
"ecc-jsbn": "~0.1.1",
"getpass": "^0.1.1",
"jsbn": "~0.1.0",
"safer-buffer": "^2.0.2",
"tweetnacl": "~0.14.0"
}
},
"stealthy-require": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz",
"integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks="
},
"symbol-tree": {
"version": "3.2.2",
@ -576,24 +627,35 @@
"integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY="
},
"tough-cookie": {
"version": "2.3.4",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz",
"integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==",
"version": "2.4.3",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
"integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
"requires": {
"punycode": "1.4.1"
"psl": "^1.1.24",
"punycode": "^1.4.1"
}
},
"tr46": {
"version": "0.0.3",
"resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
"integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o="
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
"integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=",
"requires": {
"punycode": "^2.1.0"
},
"dependencies": {
"punycode": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
"integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
}
}
},
"tunnel-agent": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
"integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
"requires": {
"safe-buffer": "5.1.1"
"safe-buffer": "^5.0.1"
}
},
"tweetnacl": {
@ -607,49 +669,61 @@
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
"integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
"requires": {
"prelude-ls": "1.1.2"
"prelude-ls": "~1.1.2"
}
},
"ultron": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz",
"integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po="
},
"url-parse": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.0.5.tgz",
"integrity": "sha1-CFSGBCKv3P7+tsllxmLUgAFpkns=",
"version": "1.4.3",
"resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.3.tgz",
"integrity": "sha512-rh+KuAW36YKo0vClhQzLLveoj8FwPJNu65xLb7Mrt+eZht0IPT0IXgSv8gcMegZ6NvjJUALf6Mf25POlMwD1Fw==",
"requires": {
"querystringify": "0.0.4",
"requires-port": "1.0.0"
"querystringify": "^2.0.0",
"requires-port": "^1.0.0"
}
},
"uuid": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz",
"integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA=="
"version": "3.3.2",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
"integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA=="
},
"verror": {
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
"integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
"requires": {
"assert-plus": "1.0.0",
"assert-plus": "^1.0.0",
"core-util-is": "1.0.2",
"extsprintf": "1.3.0"
"extsprintf": "^1.2.0"
}
},
"webidl-conversions": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-2.0.1.tgz",
"integrity": "sha1-O/glj30xjHRDw28uFpQCoaZwNQY="
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
"integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg=="
},
"whatwg-encoding": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz",
"integrity": "sha512-jLBwwKUhi8WtBfsMQlL4bUUcT8sMkAtQinscJAe/M4KHCkHuUJAF6vuB0tueNIw4c8ziO6AkRmgY+jL3a0iiPw==",
"requires": {
"iconv-lite": "0.4.19"
},
"dependencies": {
"iconv-lite": {
"version": "0.4.19",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz",
"integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ=="
}
}
},
"whatwg-url-compat": {
"version": "0.6.5",
"resolved": "https://registry.npmjs.org/whatwg-url-compat/-/whatwg-url-compat-0.6.5.tgz",
"integrity": "sha1-AImBEa9om7CXVBzVpFymyHmERb8=",
"whatwg-url": {
"version": "6.5.0",
"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz",
"integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==",
"requires": {
"tr46": "0.0.3"
"lodash.sortby": "^4.7.0",
"tr46": "^1.0.1",
"webidl-conversions": "^4.0.2"
}
},
"wordwrap": {
@ -658,12 +732,11 @@
"integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus="
},
"ws": {
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz",
"integrity": "sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w==",
"version": "5.2.2",
"resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz",
"integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==",
"requires": {
"options": "0.0.6",
"ultron": "1.0.2"
"async-limiter": "~1.0.0"
}
},
"xml-name-validator": {
@ -672,22 +745,22 @@
"integrity": "sha1-TYuPHszTQZqjYgYb7O9RXh5VljU="
},
"zombie": {
"version": "5.0.8",
"resolved": "https://registry.npmjs.org/zombie/-/zombie-5.0.8.tgz",
"integrity": "sha512-b634oIFJ2SFHnWEdntljrBeEroF1piyTiPmZPqsZwwy2KC5MLazq97eHPw1Qz77VPujQTEnbhOUvMssjpak2WQ==",
"requires": {
"babel-runtime": "5.8.29",
"bluebird": "3.5.1",
"debug": "2.6.9",
"eventsource": "0.1.6",
"iconv-lite": "0.4.21",
"jsdom": "7.2.2",
"lodash": "3.10.1",
"mime": "1.6.0",
"ms": "0.7.3",
"request": "2.85.0",
"tough-cookie": "2.3.4",
"ws": "1.1.5"
"version": "6.1.2",
"resolved": "https://registry.npmjs.org/zombie/-/zombie-6.1.2.tgz",
"integrity": "sha512-p2KZ1ThrORbOUpEjf9zV4gpcyzwAu1zDrrKF7O2PmeYIsAdh7PjUoKaqJnxLj9FDOyUGPAPxZCrYf54pQM9y7w==",
"requires": {
"babel-runtime": "6.26.0",
"bluebird": "^3.5.1",
"debug": "^3.1.0",
"eventsource": "^1.0.5",
"iconv-lite": "^0.4.21",
"jsdom": "11.5.1",
"lodash": "^4.17.10",
"mime": "^2.3.1",
"ms": "^2.1.1",
"request": "^2.85.0",
"tough-cookie": "^2.3.4",
"ws": "^5.1.1"
}
}
}

@ -2,22 +2,27 @@
"name": "wappalyzer",
"description": "Uncovers the technologies used on websites",
"homepage": "https://github.com/AliasIO/Wappalyzer",
"version": "5.4.14",
"version": "5.8.3",
"author": "Elbert Alias",
"license": "GPL-3.0",
"repository": {
"type": "git",
"url": "https://github.com/AliasIO/Wappalyzer"
},
"main": "driver.js",
"main": "index.js",
"files": [
"apps.json",
"index.js",
"browser.js",
"browsers/zombie.js",
"cli.js",
"driver.js",
"index.js",
"wappalyzer.js"
],
"bin": {
"wappalyzer": "./cli.js"
},
"dependencies": {
"request": "^2.85.0",
"zombie": "^5.0.8"
"zombie": "^6.1.2"
}
}

@ -1,542 +0,0 @@
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
abab@^1.0.0:
version "1.0.4"
resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e"
acorn-globals@^1.0.4:
version "1.0.9"
resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-1.0.9.tgz#55bb5e98691507b74579d0513413217c380c54cf"
dependencies:
acorn "^2.1.0"
acorn@^2.1.0, acorn@^2.4.0:
version "2.7.0"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-2.7.0.tgz#ab6e7d9d886aaca8b085bc3312b79a198433f0e7"
ajv@^5.1.0:
version "5.3.0"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.3.0.tgz#4414ff74a50879c208ee5fdc826e32c303549eda"
dependencies:
co "^4.6.0"
fast-deep-equal "^1.0.0"
fast-json-stable-stringify "^2.0.0"
json-schema-traverse "^0.3.0"
asn1@~0.2.3:
version "0.2.3"
resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86"
assert-plus@1.0.0, assert-plus@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
asynckit@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
aws-sign2@~0.7.0:
version "0.7.0"
resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
aws4@^1.6.0:
version "1.6.0"
resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e"
babel-runtime@5.8.29:
version "5.8.29"
resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-5.8.29.tgz#4a2052cbcff531788d3a9d6b03cd7f448285f825"
dependencies:
core-js "^1.0.0"
bcrypt-pbkdf@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d"
dependencies:
tweetnacl "^0.14.3"
bluebird@^3.0:
version "3.5.1"
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9"
boom@4.x.x:
version "4.3.1"
resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31"
dependencies:
hoek "4.x.x"
boom@5.x.x:
version "5.2.0"
resolved "https://registry.yarnpkg.com/boom/-/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02"
dependencies:
hoek "4.x.x"
caseless@~0.12.0:
version "0.12.0"
resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
co@^4.6.0:
version "4.6.0"
resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
combined-stream@^1.0.5, combined-stream@~1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009"
dependencies:
delayed-stream "~1.0.0"
core-js@^1.0.0:
version "1.2.7"
resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636"
core-util-is@1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
cryptiles@3.x.x:
version "3.1.2"
resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe"
dependencies:
boom "5.x.x"
cssom@0.3.x, "cssom@>= 0.3.0 < 0.4.0":
version "0.3.2"
resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b"
"cssstyle@>= 0.2.29 < 0.3.0":
version "0.2.37"
resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54"
dependencies:
cssom "0.3.x"
dashdash@^1.12.0:
version "1.14.1"
resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
dependencies:
assert-plus "^1.0.0"
debug@^2.2:
version "2.6.9"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
dependencies:
ms "2.0.0"
deep-is@~0.1.3:
version "0.1.3"
resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
delayed-stream@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
ecc-jsbn@~0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505"
dependencies:
jsbn "~0.1.0"
escodegen@^1.6.1:
version "1.9.0"
resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.9.0.tgz#9811a2f265dc1cd3894420ee3717064b632b8852"
dependencies:
esprima "^3.1.3"
estraverse "^4.2.0"
esutils "^2.0.2"
optionator "^0.8.1"
optionalDependencies:
source-map "~0.5.6"
esprima@^3.1.3:
version "3.1.3"
resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633"
estraverse@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13"
esutils@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
eventsource@^0.1.6:
version "0.1.6"
resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-0.1.6.tgz#0acede849ed7dd1ccc32c811bb11b944d4f29232"
dependencies:
original ">=0.0.5"
extend@~3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444"
extsprintf@1.3.0, extsprintf@^1.2.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
fast-deep-equal@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff"
fast-json-stable-stringify@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
fast-levenshtein@~2.0.4:
version "2.0.6"
resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
forever-agent@~0.6.1:
version "0.6.1"
resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
form-data@~2.3.1:
version "2.3.1"
resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.1.tgz#6fb94fbd71885306d73d15cc497fe4cc4ecd44bf"
dependencies:
asynckit "^0.4.0"
combined-stream "^1.0.5"
mime-types "^2.1.12"
getpass@^0.1.1:
version "0.1.7"
resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
dependencies:
assert-plus "^1.0.0"
har-schema@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
har-validator@~5.0.3:
version "5.0.3"
resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd"
dependencies:
ajv "^5.1.0"
har-schema "^2.0.0"
hawk@~6.0.2:
version "6.0.2"
resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038"
dependencies:
boom "4.x.x"
cryptiles "3.x.x"
hoek "4.x.x"
sntp "2.x.x"
hoek@4.x.x:
version "4.2.0"
resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.0.tgz#72d9d0754f7fe25ca2d01ad8f8f9a9449a89526d"
http-signature@~1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
dependencies:
assert-plus "^1.0.0"
jsprim "^1.2.2"
sshpk "^1.7.0"
iconv-lite@^0.4.13:
version "0.4.19"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b"
is-typedarray@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
isstream@~0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
jsbn@~0.1.0:
version "0.1.1"
resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
jsdom@^7.2.2:
version "7.2.2"
resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-7.2.2.tgz#40b402770c2bda23469096bee91ab675e3b1fc6e"
dependencies:
abab "^1.0.0"
acorn "^2.4.0"
acorn-globals "^1.0.4"
cssom ">= 0.3.0 < 0.4.0"
cssstyle ">= 0.2.29 < 0.3.0"
escodegen "^1.6.1"
nwmatcher ">= 1.3.7 < 2.0.0"
parse5 "^1.5.1"
request "^2.55.0"
sax "^1.1.4"
symbol-tree ">= 3.1.0 < 4.0.0"
tough-cookie "^2.2.0"
webidl-conversions "^2.0.0"
whatwg-url-compat "~0.6.5"
xml-name-validator ">= 2.0.1 < 3.0.0"
json-schema-traverse@^0.3.0:
version "0.3.1"
resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340"
json-schema@0.2.3:
version "0.2.3"
resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
json-stringify-safe@~5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
jsprim@^1.2.2:
version "1.4.1"
resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
dependencies:
assert-plus "1.0.0"
extsprintf "1.3.0"
json-schema "0.2.3"
verror "1.10.0"
levn@~0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
dependencies:
prelude-ls "~1.1.2"
type-check "~0.3.2"
lodash@^3.10.1:
version "3.10.1"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6"
mime-db@~1.30.0:
version "1.30.0"
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01"
mime-types@^2.1.12, mime-types@~2.1.17:
version "2.1.17"
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a"
dependencies:
mime-db "~1.30.0"
mime@^1.3.4:
version "1.4.1"
resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6"
ms@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
ms@^0.7.1:
version "0.7.3"
resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.3.tgz#708155a5e44e33f5fd0fc53e81d0d40a91be1fff"
"nwmatcher@>= 1.3.7 < 2.0.0":
version "1.4.3"
resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.3.tgz#64348e3b3d80f035b40ac11563d278f8b72db89c"
oauth-sign@~0.8.2:
version "0.8.2"
resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43"
optionator@^0.8.1:
version "0.8.2"
resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64"
dependencies:
deep-is "~0.1.3"
fast-levenshtein "~2.0.4"
levn "~0.3.0"
prelude-ls "~1.1.2"
type-check "~0.3.2"
wordwrap "~1.0.0"
options@>=0.0.5:
version "0.0.6"
resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f"
original@>=0.0.5:
version "1.0.0"
resolved "https://registry.yarnpkg.com/original/-/original-1.0.0.tgz#9147f93fa1696d04be61e01bd50baeaca656bd3b"
dependencies:
url-parse "1.0.x"
parse5@^1.5.1:
version "1.5.1"
resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94"
performance-now@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
prelude-ls@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
punycode@^1.4.1:
version "1.4.1"
resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
qs@~6.5.1:
version "6.5.1"
resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8"
querystringify@0.0.x:
version "0.0.4"
resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-0.0.4.tgz#0cf7f84f9463ff0ae51c4c4b142d95be37724d9c"
request@^2.55.0, request@^2.65.0, request@^2.81.0:
version "2.83.0"
resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356"
dependencies:
aws-sign2 "~0.7.0"
aws4 "^1.6.0"
caseless "~0.12.0"
combined-stream "~1.0.5"
extend "~3.0.1"
forever-agent "~0.6.1"
form-data "~2.3.1"
har-validator "~5.0.3"
hawk "~6.0.2"
http-signature "~1.2.0"
is-typedarray "~1.0.0"
isstream "~0.1.2"
json-stringify-safe "~5.0.1"
mime-types "~2.1.17"
oauth-sign "~0.8.2"
performance-now "^2.1.0"
qs "~6.5.1"
safe-buffer "^5.1.1"
stringstream "~0.0.5"
tough-cookie "~2.3.3"
tunnel-agent "^0.6.0"
uuid "^3.1.0"
requires-port@1.0.x:
version "1.0.0"
resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
safe-buffer@^5.0.1, safe-buffer@^5.1.1:
version "5.1.1"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853"
sax@^1.1.4:
version "1.2.4"
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
sntp@2.x.x:
version "2.1.0"
resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8"
dependencies:
hoek "4.x.x"
source-map@~0.5.6:
version "0.5.7"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
sshpk@^1.7.0:
version "1.13.1"
resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3"
dependencies:
asn1 "~0.2.3"
assert-plus "^1.0.0"
dashdash "^1.12.0"
getpass "^0.1.1"
optionalDependencies:
bcrypt-pbkdf "^1.0.0"
ecc-jsbn "~0.1.1"
jsbn "~0.1.0"
tweetnacl "~0.14.0"
stringstream@~0.0.5:
version "0.0.5"
resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878"
"symbol-tree@>= 3.1.0 < 4.0.0":
version "3.2.2"
resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6"
tough-cookie@^2.2.0, tough-cookie@~2.3.3:
version "2.3.3"
resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561"
dependencies:
punycode "^1.4.1"
tr46@~0.0.1:
version "0.0.3"
resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
tunnel-agent@^0.6.0:
version "0.6.0"
resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
dependencies:
safe-buffer "^5.0.1"
tweetnacl@^0.14.3, tweetnacl@~0.14.0:
version "0.14.5"
resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
type-check@~0.3.2:
version "0.3.2"
resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
dependencies:
prelude-ls "~1.1.2"
ultron@1.0.x:
version "1.0.2"
resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa"
url-parse@1.0.x:
version "1.0.5"
resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.0.5.tgz#0854860422afdcfefeb6c965c662d4800169927b"
dependencies:
querystringify "0.0.x"
requires-port "1.0.x"
uuid@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04"
verror@1.10.0:
version "1.10.0"
resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
dependencies:
assert-plus "^1.0.0"
core-util-is "1.0.2"
extsprintf "^1.2.0"
webidl-conversions@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-2.0.1.tgz#3bf8258f7d318c7443c36f2e169402a1a6703506"
whatwg-url-compat@~0.6.5:
version "0.6.5"
resolved "https://registry.yarnpkg.com/whatwg-url-compat/-/whatwg-url-compat-0.6.5.tgz#00898111af689bb097541cd5a45ca6c8798445bf"
dependencies:
tr46 "~0.0.1"
wordwrap@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
ws@^1.0.1:
version "1.1.4"
resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.4.tgz#57f40d036832e5f5055662a397c4de76ed66bf61"
dependencies:
options ">=0.0.5"
ultron "1.0.x"
"xml-name-validator@>= 2.0.1 < 3.0.0":
version "2.0.1"
resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635"
zombie@^5.0.7:
version "5.0.7"
resolved "https://registry.yarnpkg.com/zombie/-/zombie-5.0.7.tgz#215ba90b4b97f75b796c935affcc63d68cbac772"
dependencies:
babel-runtime "5.8.29"
bluebird "^3.0"
debug "^2.2"
eventsource "^0.1.6"
iconv-lite "^0.4.13"
jsdom "^7.2.2"
lodash "^3.10.1"
mime "^1.3.4"
ms "^0.7.1"
request "^2.65.0"
tough-cookie "^2.2.0"
ws "^1.0.1"

@ -10,7 +10,9 @@
"optionTracking": { "message": "Anonyme Statistiken an wappalyzer.com übermitteln" },
"nothingToDo": { "message": "Nichts zu tun." },
"noAppsDetected": { "message": "Keine Applikation entdeckt." },
"categoryPin": { "message": "Always show icon" },
"categoryPin": { "message": "Immer Icon anzeigen" },
"termsAccept": { "message": "Accept" },
"termsContent": { "message": "This extension sends anonymous information about websites you visit, including domain name and identified technologies, to <a href='https://www.wappalyzer.com'>wappalyzer.com</a>. This can be disabled in the settings." },
"categoryName1": { "message": "CMS" },
"categoryName2": { "message": "Nachrichten Board" },
"categoryName3": { "message": "Datenbankverwaltung" },
@ -67,5 +69,13 @@
"categoryName54": { "message": "SEO" },
"categoryName55": { "message": "Buchhaltung" },
"categoryName56": { "message": "Cryptominer" },
"categoryName57": { "message": "Static Site Generator" }
"categoryName57": { "message": "Statischer Seitengenerator" },
"categoryName58": { "message": "Benutzer-Einbindung" },
"categoryName59": { "message": "JavaScript Bibliotheken" },
"categoryName60": { "message": "Containers" },
"categoryName61": { "message": "SaaS" },
"categoryName62": { "message": "PaaS" },
"categoryName63": { "message": "IaaS" },
"categoryName64": { "message": "Reverse Proxy" },
"categoryName65": { "message": "Load Balancer" }
}

@ -11,6 +11,8 @@
"nothingToDo": { "message": "Καμία ενέργεια." },
"noAppsDetected": { "message": "Δεν ανιχνεύθηκαν εφαρμογές." },
"categoryPin": { "message": "Always show icon" },
"termsAccept": { "message": "Accept" },
"termsContent": { "message": "This extension sends anonymous information about websites you visit, including domain name and identified technologies, to <a href='https://www.wappalyzer.com'>wappalyzer.com</a>. This can be disabled in the settings." },
"categoryName1": { "message": "CMS" },
"categoryName2": { "message": "Διαδικτυακό Φόρουμ" },
"categoryName3": { "message": "Διαχειριστής Βάσης Δεδομένων" },
@ -63,5 +65,13 @@
"categoryName54": { "message": "SEO" },
"categoryName55": { "message": "Accounting" },
"categoryName56": { "message": "Cryptominer" },
"categoryName57": { "message": "Static Site Generator" }
"categoryName57": { "message": "Static Site Generator" },
"categoryName58": { "message": "User Onboarding" },
"categoryName59": { "message": "JavaScript Libraries" },
"categoryName60": { "message": "Containers" },
"categoryName61": { "message": "SaaS" },
"categoryName62": { "message": "PaaS" },
"categoryName63": { "message": "IaaS" },
"categoryName64": { "message": "Reverse Proxy" },
"categoryName65": { "message": "Load Balancer" }
}

@ -11,6 +11,9 @@
"nothingToDo": { "message": "Nothing to do here." },
"noAppsDetected": { "message": "No technologies detected." },
"categoryPin": { "message": "Always show icon" },
"termsAccept": { "message": "Accept" },
"termsContent": { "message": "This extension sends anonymous information about websites you visit, including domain name and identified technologies, to <a href='https://www.wappalyzer.com'>wappalyzer.com</a>. This can be disabled in the settings." },
"privacyPolicy": { "message": "Privacy policy" },
"categoryName1": { "message": "CMS" },
"categoryName2": { "message": "Message Board" },
"categoryName3": { "message": "Database Manager" },
@ -67,5 +70,13 @@
"categoryName54": { "message": "SEO" },
"categoryName55": { "message": "Accounting" },
"categoryName56": { "message": "Cryptominer" },
"categoryName57": { "message": "Static Site Generator" }
"categoryName57": { "message": "Static Site Generator" },
"categoryName58": { "message": "User Onboarding" },
"categoryName59": { "message": "JavaScript Libraries" },
"categoryName60": { "message": "Containers" },
"categoryName61": { "message": "SaaS" },
"categoryName62": { "message": "PaaS" },
"categoryName63": { "message": "IaaS" },
"categoryName64": { "message": "Reverse Proxy" },
"categoryName65": { "message": "Load Balancer" }
}

@ -11,6 +11,8 @@
"nothingToDo": { "message": "Nada que hacer aquí." },
"noAppsDetected": { "message": "Aplicaciones no detectadas." },
"categoryPin": { "message": "Always show icon" },
"termsAccept": { "message": "Accept" },
"termsContent": { "message": "This extension sends anonymous information about websites you visit, including domain name and identified technologies, to <a href='https://www.wappalyzer.com'>wappalyzer.com</a>. This can be disabled in the settings." },
"categoryName1": { "message": "Gestor de Contenido" },
"categoryName2": { "message": "Foro" },
"categoryName3": { "message": "Gestor de Bases de Datos" },
@ -67,5 +69,13 @@
"categoryName54": { "message": "SEO" },
"categoryName55": { "message": "Accounting" },
"categoryName56": { "message": "Cryptominer" },
"categoryName57": { "message": "Static Site Generator" }
"categoryName57": { "message": "Static Site Generator" },
"categoryName58": { "message": "User Onboarding" },
"categoryName59": { "message": "JavaScript Libraries" },
"categoryName60": { "message": "Containers" },
"categoryName61": { "message": "SaaS" },
"categoryName62": { "message": "PaaS" },
"categoryName63": { "message": "IaaS" },
"categoryName64": { "message": "Reverse Proxy" },
"categoryName65": { "message": "Load Balancer" }
}

@ -0,0 +1,81 @@
{
"github": { "message": "چنگال زدن Wappalyzer در گیت‌هاب!" },
"twitter": { "message": "دنبال کردن Wappalyzer در توییتر" },
"website": { "message": "رفتن به wappalyzer.com" },
"options": { "message": "گزینه‌ها" },
"optionsSave": { "message": "ذخیره گزینه‌ها" },
"optionsSaved": { "message": "ذخیره شد" },
"optionUpgradeMessage": { "message": "درباره ارتقا به من بگویید" },
"optionDynamicIcon": { "message": "از نماد فن آوری به جای علامت Wappalyzer استفاده شود" },
"optionTracking": { "message": "ارسال فن آوری های شناسایی شده به صورت ناشناس به wappalyzer.com" },
"nothingToDo": { "message": "هیچ چیز برای انجام اینجا نیست." },
"noAppsDetected": { "message": "هیچ فن‌آوری شناسایی نشده است." },
"categoryPin": { "message": "همیشه نماد را نشان بده" },
"termsAccept": { "message": "قبول" },
"termsContent": { "message": "این افزونه اطلاعات وب‌سایت‌های بازدید شده توسط شما را به صورت ناشناس ارسال می‌کند، مانند آدرس سایت و تکنولوژی‌های استفاده شده در آن سایت را ارسال می‌کند. اطلاعات بیشتر در <a href='https://www.wappalyzer.com'>wappalyzer.com</a>. شما می‌توانید این افزونه را غیرفعال کنید." },
"categoryName1": { "message": "سیستم مدیریت محتوا" },
"categoryName2": { "message": "انجمن پیام" },
"categoryName3": { "message": "مدیر پایگاه‌داده" },
"categoryName4": { "message": "ابزار مستند سازی" },
"categoryName5": { "message": "ابزارک" },
"categoryName6": { "message": "تجارت الکترونیک" },
"categoryName7": { "message": "گالری تصویر" },
"categoryName8": { "message": "ویکی‌ها" },
"categoryName9": { "message": "پنل‌های میزبانی" },
"categoryName10": { "message": "تجزیه و تحلیل‌ها" },
"categoryName11": { "message": "بلاگ" },
"categoryName12": { "message": "چارچوب جاوا اسکریپت" },
"categoryName13": { "message": "ردیاب مشکل" },
"categoryName14": { "message": "پخش کننده ویدیویی" },
"categoryName15": { "message": "سیستم نظرسنجی" },
"categoryName16": { "message": "کپچا" },
"categoryName17": { "message": "اسکریپ فونت" },
"categoryName18": { "message": "چارچوب وب" },
"categoryName19": { "message": "متفرقه" },
"categoryName20": { "message": "ویرایشگر" },
"categoryName21": { "message": "سامانه مدیریت آموزشی" },
"categoryName22": { "message": "وب سرور" },
"categoryName23": { "message": "ابزار کش" },
"categoryName24": { "message": "ویرایشگر متن توانمند" },
"categoryName25": { "message": "گرافیک‌های جاوا اسکریپت" },
"categoryName26": { "message": "چارچوب موبایل" },
"categoryName27": { "message": "زبان برنامه نویسی" },
"categoryName28": { "message": "سیستم عامل" },
"categoryName29": { "message": "موتور جستجو" },
"categoryName30": { "message": "پست الکترونیکی تحت وب" },
"categoryName31": { "message": "شبکه تحویل محتوا" },
"categoryName32": { "message": "اتوماسیون بازاریابی" },
"categoryName33": { "message": "افزودنی وب‌سرور" },
"categoryName34": { "message": "پایگاه‌داده" },
"categoryName35": { "message": "نقشه" },
"categoryName36": { "message": "شبکه تبلیغاتی" },
"categoryName37": { "message": "خدمات شبکه" },
"categoryName38": { "message": "سرور رسانه" },
"categoryName39": { "message": "وب‌کم" },
"categoryName40": { "message": "پرینتر" },
"categoryName41": { "message": "پردازنده پرداخت" },
"categoryName42": { "message": "مدیر برچسب" },
"categoryName43": { "message": "Paywall" },
"categoryName44": { "message": "سیستم ساخت/CI" },
"categoryName45": { "message": "سیستم SCADA" },
"categoryName46": { "message": "دسترسی از راه دور" },
"categoryName47": { "message": "ابزار توسعه" },
"categoryName48": { "message": "ذخیره سازی شبکه" },
"categoryName49": { "message": "خوانندهای خوراک" },
"categoryName50": { "message": "سیستم مدیریت سند" },
"categoryName51": { "message": "سازنده صفحات Landing" },
"categoryName52": { "message": "گفتگوی زنده" },
"categoryName53": { "message": "مدیریت ارتباط با مشتری" },
"categoryName54": { "message": "بهینه سازی موتور جستجو" },
"categoryName55": { "message": "حسابداری" },
"categoryName56": { "message": "کریپتوماینر" },
"categoryName57": { "message": "تولید کننده سایت ایستا" },
"categoryName58": { "message": "آن بوردینگ کاربر" },
"categoryName59": { "message": "کتابخانه‌های جاوا اسکریپت" },
"categoryName60": { "message": "کانتینرها" },
"categoryName61": { "message": "SaaS" },
"categoryName62": { "message": "PaaS" },
"categoryName63": { "message": "IaaS" },
"categoryName64": { "message": "Reverse Proxy" },
"categoryName65": { "message": "Load Balancer" }
}

@ -11,6 +11,8 @@
"twitter": { "message": "Suivre Wappalyzer sur Twitter" },
"website": { "message": "Aller sur wappalyzer.com" },
"categoryPin": { "message": " Toujours afficher l'icône" },
"termsAccept": { "message": "Accept" },
"termsContent": { "message": "This extension sends anonymous information about websites you visit, including domain name and identified technologies, to <a href='https://www.wappalyzer.com'>wappalyzer.com</a>. This can be disabled in the settings." },
"categoryName1": { "message": "CMS" },
"categoryName2": { "message": "Forum" },
"categoryName3": { "message": "Gestionnaire de base de données" },
@ -67,5 +69,13 @@
"categoryName54": { "message": "SEO" },
"categoryName55": { "message": "Comptabilité" },
"categoryName56": { "message": "Crypto-mineur" },
"categoryName57": { "message": "Générateur de site statique" }
"categoryName57": { "message": "Générateur de site statique" },
"categoryName58": { "message": "User Onboarding" },
"categoryName59": { "message": "JavaScript Libraries" },
"categoryName60": { "message": "Containers" },
"categoryName61": { "message": "SaaS" },
"categoryName62": { "message": "PaaS" },
"categoryName63": { "message": "IaaS" },
"categoryName64": { "message": "Reverse Proxy" },
"categoryName65": { "message": "Load Balancer" }
}

@ -11,6 +11,8 @@
"nothingToDo": { "message": "Καμία ενέργεια." },
"noAppsDetected": { "message": "Δεν ανιχνεύθηκαν εφαρμογές." },
"categoryPin": { "message": "Always show icon" },
"termsAccept": { "message": "Accept" },
"termsContent": { "message": "This extension sends anonymous information about websites you visit, including domain name and identified technologies, to <a href='https://www.wappalyzer.com'>wappalyzer.com</a>. This can be disabled in the settings." },
"categoryName1": { "message": "CMS" },
"categoryName2": { "message": "Διαδικτυακό Φόρουμ" },
"categoryName3": { "message": "Διαχειριστής Βάσης Δεδομένων" },
@ -63,5 +65,13 @@
"categoryName54": { "message": "SEO" },
"categoryName55": { "message": "Accounting" },
"categoryName56": { "message": "Cryptominer" },
"categoryName57": { "message": "Static Site Generator" }
"categoryName57": { "message": "Static Site Generator" },
"categoryName58": { "message": "User Onboarding" },
"categoryName59": { "message": "JavaScript Libraries" },
"categoryName60": { "message": "Containers" },
"categoryName61": { "message": "SaaS" },
"categoryName62": { "message": "PaaS" },
"categoryName63": { "message": "IaaS" },
"categoryName64": { "message": "Reverse Proxy" },
"categoryName65": { "message": "Load Balancer" }
}

@ -11,6 +11,8 @@
"nothingToDo": { "message": "Tak ada yang dilakukan disini." },
"noAppsDetected": { "message": "Tidak ada aplikasi yang terdeteksi." },
"categoryPin": { "message": "Always show icon" },
"termsAccept": { "message": "Accept" },
"termsContent": { "message": "This extension sends anonymous information about websites you visit, including domain name and identified technologies, to <a href='https://www.wappalyzer.com'>wappalyzer.com</a>. This can be disabled in the settings." },
"categoryName1": { "message": "Sistem Pengelola Konten" },
"categoryName2": { "message": "Papan Pesan" },
"categoryName3": { "message": "Pengelola Basis Data" },
@ -67,5 +69,13 @@
"categoryName54": { "message": "SEO" },
"categoryName55": { "message": "Accounting" },
"categoryName56": { "message": "Cryptominer" },
"categoryName57": { "message": "Static Site Generator" }
"categoryName57": { "message": "Static Site Generator" },
"categoryName58": { "message": "User Onboarding" },
"categoryName59": { "message": "JavaScript Libraries" },
"categoryName60": { "message": "Containers" },
"categoryName61": { "message": "SaaS" },
"categoryName62": { "message": "PaaS" },
"categoryName63": { "message": "IaaS" },
"categoryName64": { "message": "Reverse Proxy" },
"categoryName65": { "message": "Load Balancer" }
}

@ -11,6 +11,8 @@
"nothingToDo": { "message": "Niente da fare qui." },
"noAppsDetected": { "message": "Nessuna applicazione rilevata." },
"categoryPin": { "message": "Always show icon" },
"termsAccept": { "message": "Accept" },
"termsContent": { "message": "This extension sends anonymous information about websites you visit, including domain name and identified technologies, to <a href='https://www.wappalyzer.com'>wappalyzer.com</a>. This can be disabled in the settings." },
"categoryName1": { "message": "CMS" },
"categoryName2": { "message": "Forum" },
"categoryName3": { "message": "Gestore di Database" },
@ -67,6 +69,13 @@
"categoryName54": { "message": "SEO" },
"categoryName55": { "message": "Accounting" },
"categoryName56": { "message": "Cryptominer" },
"categoryName57": { "message": "Static Site Generator" }
"categoryName57": { "message": "Static Site Generator" },
"categoryName58": { "message": "User Onboarding" },
"categoryName59": { "message": "JavaScript Libraries" },
"categoryName60": { "message": "Containers" },
"categoryName61": { "message": "SaaS" },
"categoryName62": { "message": "PaaS" },
"categoryName63": { "message": "IaaS" },
"categoryName64": { "message": "Reverse Proxy" },
"categoryName65": { "message": "Load Balancer" }
}

@ -11,6 +11,8 @@
"nothingToDo": { "message": "Nic tu nie ma." },
"noAppsDetected": { "message": "Nie wykryto żadnych aplikacji." },
"categoryPin": { "message": "Zawsze pokazuj tą ikonę" },
"termsAccept": { "message": "Accept" },
"termsContent": { "message": "This extension sends anonymous information about websites you visit, including domain name and identified technologies, to <a href='https://www.wappalyzer.com'>wappalyzer.com</a>. This can be disabled in the settings." },
"categoryName1": { "message": "System zarządzania treścią" },
"categoryName2": { "message": "Forum" },
"categoryName3": { "message": "Menedżer baz danych" },
@ -66,6 +68,14 @@
"categoryName53": { "message": "Zarządzanie relacjami z klientami" },
"categoryName54": { "message": "SEO" },
"categoryName55": { "message": "Księgowość" },
"categoryName56": { "message": "Cryptominer" },
"categoryName57": { "message": "Static Site Generator" }
"categoryName56": { "message": "Koparka kryptowalut" },
"categoryName57": { "message": "Generator stron statycznych" },
"categoryName58": { "message": "Wdrażanie użytkownika" },
"categoryName59": { "message": "Biblioteki JavaScript" },
"categoryName60": { "message": "Containers" },
"categoryName61": { "message": "SaaS" },
"categoryName62": { "message": "PaaS" },
"categoryName63": { "message": "IaaS" },
"categoryName64": { "message": "Reverse Proxy" },
"categoryName65": { "message": "Load Balancer" }
}

@ -1,71 +1,82 @@
{
"github": { "message": "Fork Wappalyzer no GitHub!" },
"noAppsDetected": { "message": "Não foi detetada nenhuma apliação." },
"nothingToDo": { "message": "Nada a fazer aqui." },
"optionTracking": { "message": "Enviar anonimamente relatorios sobre as apliações detetadas ao wappalyzer.com para investigação" },
"optionUpgradeMessage": { "message": "Atualizações automaticas" },
"optionDynamicIcon": { "message": "Utilizar o icone da aplicação em vez do logotido do Wappalyzer" },
"options": { "message": "Definições" },
"optionsSave": { "message": "Guardar as opções" },
"optionsSaved": { "message": "Guardado" },
"twitter": { "message": "Seguir o Wappalyzer no Twitter" },
"website": { "message": "Ir para wappalyzer.com" },
"categoryPin": { "message": "Always show icon" },
"categoryName1": { "message": "Sistema de gerenciamento de conteudo(CMS)" },
"categoryName2": { "message": "Forum" },
"categoryName3": { "message": "Gestor de base de dados" },
"categoryName4": { "message": "Ferramenta de documentação" },
"categoryName5": { "message": "Widget" },
"categoryName6": { "message": "Loja online" },
"categoryName7": { "message": "Galeria de fotografias" },
"categoryName8": { "message": "Wiki" },
"categoryName9": { "message": "Gestor de servidores" },
"categoryName10": { "message": "Ferramenta de estatisticas" },
"categoryName11": { "message": "Blog" },
"categoryName12": { "message": "Framework JavaScript" },
"categoryName13": { "message": "Ferramenta de seguimento de problemas" },
"categoryName14": { "message": "Leitor de videos" },
"categoryName15": { "message": "Sistemas de comentários" },
"categoryName16": { "message": "Captcha" },
"categoryName17": { "message": "Script de policia" },
"categoryName18": { "message": "Framework WEB" },
"categoryName19": { "message": "Diversos" },
"categoryName20": { "message": "Editor" },
"categoryName21": { "message": "Sistema de gestão de Aprendizagem(LMS)" },
"categoryName22": { "message": "Servidor WEB" },
"categoryName23": { "message": "Ferramenta de cache" },
"categoryName24": { "message": "Editor WYSIWYG" },
"categoryName25": { "message": "Grafismo JavaScript" },
"categoryName26": { "message": "Framework para dispositivos mobile" },
"categoryName27": { "message": "Linguagem de programação" },
"categoryName28": { "message": "Sistema Operativo" },
"categoryName29": { "message": "Motor de pesquisa" },
"categoryName30": { "message": "WebMail" },
"categoryName31": { "message": "Rede de distribuição de conteudo(CDN)" },
"categoryName32": { "message": "Sistema de vendas" },
"categoryName33": { "message": "Extensão do servidor WEB" },
"categoryName34": { "message": "Base de dados" },
"categoryName35": { "message": "Mapa" },
"categoryName36": { "message": "Rede de publicidade" },
"categoryName37": { "message": "Dispositivo de rede" },
"categoryName38": { "message": "Servidor multimédia" },
"categoryName39": { "message": "Webcam" },
"categoryName40": { "message": "Impressora" },
"categoryName41": { "message": "Serviço de pagamento" },
"categoryName42": { "message": "Gestor de Tags" },
"categoryName43": { "message": "Sistema de assinaturas paga(Paywall)" },
"categoryName44": { "message": "Sistema CI" },
"categoryName45": { "message": "Sistema SCADA" },
"categoryName46": { "message": "Acesso à distancia" },
"categoryName47": { "message": "Ferramenta de desenvolvimento" },
"categoryName48": { "message": "Rede de armazenamento" },
"categoryName49": { "message": "Leitor RSS" },
"categoryName50": { "message": "Sistema de gestão de documentos" },
"categoryName51": { "message": "Landing Page Builder" },
"categoryName52": { "message": "Chat em direto" },
"categoryName53": { "message": "Sistemas de relação com o cliente(CRM)" },
"categoryName54": { "message": "Otimização para motores de pesquisa(SEO)" },
"categoryName55": { "message": "Accounting" },
"categoryName56": { "message": "Cryptominer" },
"categoryName57": { "message": "Static Site Generator" }
"github": { "message": "Fork Wappalyzer no GitHub!" },
"noAppsDetected": { "message": "Não foi detectada nenhuma tecnologia." },
"nothingToDo": { "message": "Nada a fazer aqui." },
"optionDynamicIcon": { "message": "Utilizar o ícone da tecnologia em vez do logótipo do Wappalyzer" },
"optionTracking": { "message": "Envie anonimamente tecnologias identificadas para wappalyzer.com" },
"optionUpgradeMessage": { "message": "Fale-me sobre actualizações" },
"options": { "message": "Opções" },
"optionsSave": { "message": "Opções de Guardar" },
"optionsSaved": { "message": "Guardado" },
"twitter": { "message": "Seguir Wappalyzer no Twitter" },
"website": { "message": "Ir para wappalyzer.com" },
"categoryPin": { "message": "Mostrar sempre ícone" },
"termsAccept": { "message": "Aceitar" },
"termsContent": { "message": "Esta extensão envia informações anónimas sobre os sites que visitas, incluindo o nome de domínio e as tecnologias identificadas, para o <a href='https://www.wappalyzer.com'>wappalyzer.com</a>. Isso pode ser desativado nas configurações." },
"privacyPolicy": { "message": "Políticas de Privacidade" },
"categoryName1": { "message": "CMS" },
"categoryName2": { "message": "Fórum" },
"categoryName3": { "message": "Gestor de Base de Dados" },
"categoryName4": { "message": "Ferramenta de Documentação" },
"categoryName5": { "message": "Widget" },
"categoryName6": { "message": "Ecommerce" },
"categoryName7": { "message": "Galeria de Fotos" },
"categoryName8": { "message": "Wikis" },
"categoryName9": { "message": "Painéis de Hospedagem" },
"categoryName10": { "message": "Analítica" },
"categoryName11": { "message": "Blog" },
"categoryName12": { "message": "Framework JavaScript" },
"categoryName13": { "message": "Localizador de Problemas" },
"categoryName14": { "message": "Leitor Vídeo" },
"categoryName15": { "message": "Sistema de Comentários" },
"categoryName16": { "message": "Captcha" },
"categoryName17": { "message": "Tipos de Letra" },
"categoryName18": { "message": "Framework Web" },
"categoryName19": { "message": "Diversos" },
"categoryName20": { "message": "Editor" },
"categoryName21": { "message": "LMS" },
"categoryName22": { "message": "Servidor Web" },
"categoryName23": { "message": "Ferramenta de Cache" },
"categoryName24": { "message": "Editor WYSIWYG" },
"categoryName25": { "message": "Gráficos JavaScript" },
"categoryName26": { "message": "Framework Mobile" },
"categoryName27": { "message": "Linguagem de Programação" },
"categoryName28": { "message": "Sistema Operativo" },
"categoryName29": { "message": "Motor de Busca" },
"categoryName30": { "message": "WebMail" },
"categoryName31": { "message": "CDN" },
"categoryName32": { "message": "Automação de Marketing" },
"categoryName33": { "message": "Extensão de Servidor Web" },
"categoryName34": { "message": "Base de Dados" },
"categoryName35": { "message": "Mapa" },
"categoryName36": { "message": "Rede de Publicidade" },
"categoryName37": { "message": "Serviço de Rede" },
"categoryName38": { "message": "Servidor de Média" },
"categoryName39": { "message": "Webcam" },
"categoryName40": { "message": "Impressão" },
"categoryName41": { "message": "Processador de Pagamento" },
"categoryName42": { "message": "Gestor de Etiquetas" },
"categoryName43": { "message": "Sistema de Subscrição Paga" },
"categoryName44": { "message": "Sistema Build/CI" },
"categoryName45": { "message": "Sistema SCADA" },
"categoryName46": { "message": "Acesso Remoto" },
"categoryName47": { "message": "Ferramenta de Desenvolvimento" },
"categoryName48": { "message": "Rede de Armazenamento" },
"categoryName49": { "message": "Leitores de Feed" },
"categoryName50": { "message": "Sistema de Gestão de Documentos" },
"categoryName51": { "message": "Criador de Páginas de Destino" },
"categoryName52": { "message": "Chat ao Vivo" },
"categoryName53": { "message": "CRM" },
"categoryName54": { "message": "SEO" },
"categoryName55": { "message": "Contabilidade" },
"categoryName56": { "message": "Cryptominer" },
"categoryName57": { "message": "Gerador de Site Estático" },
"categoryName58": { "message": "User Onboarding" },
"categoryName59": { "message": "Bibliotecas de JavaScript" },
"categoryName60": { "message": "Containers" },
"categoryName61": { "message": "SaaS" },
"categoryName62": { "message": "PaaS" },
"categoryName63": { "message": "IaaS" },
"categoryName64": { "message": "Reverse Proxy" },
"categoryName65": { "message": "Load Balancer" }
}

@ -0,0 +1,81 @@
{
"github": { "message": "Fork Wappalyzer no GitHub!" },
"twitter": { "message": "Seguir o Wappalyzer no Twitter" },
"website": { "message": "Ir para wappalyzer.com" },
"options": { "message": "Configurações" },
"optionsSave": { "message": "Salvar configurações" },
"optionsSaved": { "message": "Salvo" },
"optionUpgradeMessage": { "message": "Atualizações automáticas" },
"optionDynamicIcon": { "message": "Utilizar o ícone da tecnologia ao invés da logo do Wappalyzer" },
"optionTracking": { "message": "Enviar relatórios anônimos para wappalyzer.com sobre tecnologias identificadas" },
"nothingToDo": { "message": "Nada a fazer aqui." },
"noAppsDetected": { "message": "Nenhuma tecnologia identificada." },
"categoryPin": { "message": "Sempre mostrar ícone" },
"termsAccept": { "message": "Accept" },
"termsContent": { "message": "This extension sends anonymous information about websites you visit, including domain name and identified technologies, to <a href='https://www.wappalyzer.com'>wappalyzer.com</a>. This can be disabled in the settings." },
"categoryName1": { "message": "CMS" },
"categoryName2": { "message": "Fórum" },
"categoryName3": { "message": "Gestão de banco de dados" },
"categoryName4": { "message": "Ferramenta de documentação" },
"categoryName5": { "message": "Widget" },
"categoryName6": { "message": "Ecommerce" },
"categoryName7": { "message": "Galeria de fotografias" },
"categoryName8": { "message": "Wiki" },
"categoryName9": { "message": "Gestão de servidores" },
"categoryName10": { "message": "Ferramenta estatística" },
"categoryName11": { "message": "Blog" },
"categoryName12": { "message": "Framework JavaScript" },
"categoryName13": { "message": "Rastreamento de problemas" },
"categoryName14": { "message": "Reprodutor de vídeo" },
"categoryName15": { "message": "Sistema de comentários" },
"categoryName16": { "message": "Captcha" },
"categoryName17": { "message": "Script de fonte" },
"categoryName18": { "message": "Framework web" },
"categoryName19": { "message": "Diversos" },
"categoryName20": { "message": "Editor" },
"categoryName21": { "message": "LMS" },
"categoryName22": { "message": "Servidor web" },
"categoryName23": { "message": "Ferramenta de cache" },
"categoryName24": { "message": "Editor WYSIWYG" },
"categoryName25": { "message": "Gráfico JavaScript" },
"categoryName26": { "message": "Framework mobile" },
"categoryName27": { "message": "Linguagem de programação" },
"categoryName28": { "message": "Sistema Operacional" },
"categoryName29": { "message": "Motor de pesquisa" },
"categoryName30": { "message": "Web Mail" },
"categoryName31": { "message": "CDN" },
"categoryName32": { "message": "Automação de marketing" },
"categoryName33": { "message": "Extensão de servidor web" },
"categoryName34": { "message": "Banco de dados" },
"categoryName35": { "message": "Mapa" },
"categoryName36": { "message": "Rede de publicidade" },
"categoryName37": { "message": "Serviço de rede" },
"categoryName38": { "message": "Servidor de mídia" },
"categoryName39": { "message": "Webcam" },
"categoryName40": { "message": "Impressora" },
"categoryName41": { "message": "Serviço de pagamento" },
"categoryName42": { "message": "Gestor de Tags" },
"categoryName43": { "message": "Paywall" },
"categoryName44": { "message": "Sistema de Build/CI" },
"categoryName45": { "message": "Sistema SCADA" },
"categoryName46": { "message": "Acesso remoto" },
"categoryName47": { "message": "Ferramenta de desenvolvimento" },
"categoryName48": { "message": "Armazenamento na rede" },
"categoryName49": { "message": "Leitor de feed" },
"categoryName50": { "message": "Sistema de gestão de documentos" },
"categoryName51": { "message": "Landing Page Builder" },
"categoryName52": { "message": "Chat direto" },
"categoryName53": { "message": "CRM" },
"categoryName54": { "message": "SEO" },
"categoryName55": { "message": "Contabilidade" },
"categoryName56": { "message": "Minerador de cryptomoedas" },
"categoryName57": { "message": "Gerador de sites estáticos" },
"categoryName58": { "message": "Integração com usuário" },
"categoryName59": { "message": "Biblioteca JavaScript" },
"categoryName60": { "message": "Containers" },
"categoryName61": { "message": "SaaS" },
"categoryName62": { "message": "PaaS" },
"categoryName63": { "message": "IaaS" },
"categoryName64": { "message": "Reverse Proxy" },
"categoryName65": { "message": "Load Balancer" }
}

@ -11,6 +11,8 @@
"nothingToDo": { "message": "Nimic de făcut pe pagina curentă." },
"noAppsDetected": { "message": "Nici o aplicație detectată." },
"categoryPin": { "message": "Afișează icon tot timpul" },
"termsAccept": { "message": "Accept" },
"termsContent": { "message": "This extension sends anonymous information about websites you visit, including domain name and identified technologies, to <a href='https://www.wappalyzer.com'>wappalyzer.com</a>. This can be disabled in the settings." },
"categoryName1": { "message": "CMS" },
"categoryName2": { "message": "Forum de discuții" },
"categoryName3": { "message": "Manager baze de date" },
@ -63,5 +65,13 @@
"categoryName54": { "message": "SEO" },
"categoryName55": { "message": "Accounting" },
"categoryName56": { "message": "Cryptominer" },
"categoryName57": { "message": "Static Site Generator" }
"categoryName57": { "message": "Static Site Generator" },
"categoryName58": { "message": "User Onboarding" },
"categoryName59": { "message": "JavaScript Libraries" },
"categoryName60": { "message": "Containers" },
"categoryName61": { "message": "SaaS" },
"categoryName62": { "message": "PaaS" },
"categoryName63": { "message": "IaaS" },
"categoryName64": { "message": "Reverse Proxy" },
"categoryName65": { "message": "Load Balancer" }
}

@ -1,71 +1,81 @@
{
"categoryName1" : { "message" : "CMS" },
"categoryName2" : { "message" : "Форум" },
"categoryName3" : { "message" : "Менеджер БД" },
"categoryName4" : { "message" : "Документация" },
"categoryName5" : { "message" : "Виджет" },
"categoryName6" : { "message" : "Электронная коммерция" },
"categoryName7" : { "message" : "Фотогалерея" },
"categoryName8" : { "message" : "Вики" },
"categoryName9" : { "message" : "Панель управления хостингом" },
"categoryName10" : { "message" : "Аналитика" },
"categoryName11" : { "message" : "Блог" },
"categoryName12" : { "message" : "JS фреймворк" },
"categoryName13" : { "message" : "Баг трекер" },
"categoryName14" : { "message" : "Видео плеер" },
"categoryName15" : { "message" : "Система комментариев" },
"categoryName16" : { "message" : "Капча" },
"categoryName17" : { "message" : "Шрифт" },
"categoryName18" : { "message" : "Веб фреймворк" },
"categoryName19" : { "message" : "Прочее" },
"categoryName20" : { "message" : "HTML редактор" },
"categoryName21" : { "message" : "LMS" },
"categoryName22" : { "message" : "Веб сервер" },
"categoryName23" : { "message" : "Кеширование" },
"categoryName24" : { "message" : "WYSIWYG редактор" },
"categoryName25" : { "message" : "JS графика" },
"categoryName26" : { "message" : "Мобильный фреймворк" },
"categoryName27" : { "message" : "Язык программирования" },
"categoryName28" : { "message" : "Операционная система" },
"categoryName29" : { "message" : "Поисковый движок" },
"categoryName30" : { "message" : "Веб почта" },
"categoryName31" : { "message" : "CDN" },
"categoryName32" : { "message" : "Управление маркетингом" },
"categoryName33" : { "message" : "Расширение Веб сервера" },
"categoryName34" : { "message" : "База данных" },
"categoryName35" : { "message" : "Карта" },
"categoryName36" : { "message" : "Рекламная сеть" },
"categoryName37" : { "message" : "Сетевая служба" },
"categoryName38" : { "message" : "Медиа сервер" },
"categoryName39" : { "message" : "Вебкамера" },
"categoryName40" : { "message" : "Принтер" },
"categoryName41" : { "message" : "Платёжная система" },
"categoryName42" : { "message" : "Менеджер тэгов" },
"categoryName43" : { "message" : "Paywall" },
"categoryName44" : { "message" : "Система непрерывной интеграции" },
"categoryName45" : { "message" : "Система SCADA" },
"categoryName46" : { "message" : "Удаленное управление" },
"categoryName47" : { "message" : "Утилита для разработчиков" },
"categoryName48" : { "message" : "Сетевое хранилище" },
"categoryName49" : { "message" : "Граббер контента" },
"categoryName50" : { "message" : "Управление документами" },
"categoryName51" : { "message": "Генератор лендингов" },
"categoryName52" : { "message": "Live Chat" },
"categoryName53" : { "message": "CRM" },
"github" : { "message" : "Форкнуть на GitHub!" },
"noAppsDetected" : { "message" : "Нет данных о сайте" },
"nothingToDo" : { "message" : "Тут нечего искать" },
"optionTracking" : { "message" : "Анонимно отправлять статистику распознанных данных на сервер (для исследований)" },
"optionDynamicIcon" : { "message": "Использовать значок приложения вместо логотипа Wappalyzer" },
"optionUpgradeMessage" : { "message" : "Оповещать меня об обновлениях" },
"options" : { "message" : "Настройки" },
"optionsSave" : { "message" : "Сохранить" },
"optionsSaved" : { "message" : "Успешно сохранено!" },
"twitter" : { "message" : "Следите за новостями в Твиттере" },
"website" : { "message" : "Перейти на Wappalyzer.com" },
"categoryPin": { "message": "Always show icon" },
"categoryName1": { "message": "CMS" },
"categoryName2": { "message": "Форум" },
"categoryName3": { "message": "Менеджер БД" },
"categoryName4": { "message": "Документация" },
"categoryName5": { "message": "Виджет" },
"categoryName6": { "message": "Электронная коммерция" },
"categoryName7": { "message": "Фотогалерея" },
"categoryName8": { "message": "Вики" },
"categoryName9": { "message": "Панель управления хостингом" },
"categoryName10": { "message": "Аналитика" },
"categoryName11": { "message": "Блог" },
"categoryName12": { "message": "JS фреймворк" },
"categoryName13": { "message": "Баг трекер" },
"categoryName14": { "message": "Видео плеер" },
"categoryName15": { "message": "Система комментариев" },
"categoryName16": { "message": "Капча" },
"categoryName17": { "message": "Шрифт" },
"categoryName18": { "message": "Веб фреймворк" },
"categoryName19": { "message": "Прочее" },
"categoryName20": { "message": "HTML редактор" },
"categoryName21": { "message": "LMS" },
"categoryName22": { "message": "Веб сервер" },
"categoryName23": { "message": "Кеширование" },
"categoryName24": { "message": "WYSIWYG редактор" },
"categoryName25": { "message": "JS графика" },
"categoryName26": { "message": "Мобильный фреймворк" },
"categoryName27": { "message": "Язык программирования" },
"categoryName28": { "message": "Операционная система" },
"categoryName29": { "message": "Поисковый движок" },
"categoryName30": { "message": "Веб почта" },
"categoryName31": { "message": "CDN" },
"categoryName32": { "message": "Управление маркетингом" },
"categoryName33": { "message": "Расширение Веб сервера" },
"categoryName34": { "message": "База данных" },
"categoryName35": { "message": "Карта" },
"categoryName36": { "message": "Рекламная сеть" },
"categoryName37": { "message": "Сетевая служба" },
"categoryName38": { "message": "Медиа сервер" },
"categoryName39": { "message": "Вебкамера" },
"categoryName40": { "message": "Принтер" },
"categoryName41": { "message": "Платёжная система" },
"categoryName42": { "message": "Менеджер тэгов" },
"categoryName43": { "message": "Paywall" },
"categoryName44": { "message": "Система непрерывной интеграции" },
"categoryName45": { "message": "Система SCADA" },
"categoryName46": { "message": "Удаленное управление" },
"categoryName47": { "message": "Утилита для разработчиков" },
"categoryName48": { "message": "Сетевое хранилище" },
"categoryName49": { "message": "Граббер контента" },
"categoryName50": { "message": "Управление документами" },
"categoryName51": { "message": "Генератор лендингов" },
"categoryName52": { "message": "Live Chat" },
"categoryName53": { "message": "CRM" },
"github": { "message": "Форкнуть на GitHub!" },
"noAppsDetected": { "message": "Нет данных о сайте" },
"nothingToDo": { "message": "Тут нечего искать" },
"optionTracking": { "message": "Анонимно отправлять статистику распознанных данных на сервер (для исследований)" },
"optionDynamicIcon": { "message": "Использовать значок приложения вместо логотипа Wappalyzer" },
"optionUpgradeMessage": { "message": "Оповещать меня об обновлениях" },
"options": { "message": "Настройки" },
"optionsSave": { "message": "Сохранить" },
"optionsSaved": { "message": "Успешно сохранено!" },
"twitter": { "message": "Следите за новостями в Твиттере" },
"website": { "message": "Перейти на Wappalyzer.com" },
"categoryPin": { "message": "Always show icon" },
"termsAccept": { "message": "Accept" },
"termsContent": { "message": "This extension sends anonymous information about websites you visit, including domain name and identified technologies, to <a href='https://www.wappalyzer.com'>wappalyzer.com</a>. This can be disabled in the settings." },
"categoryName54": { "message": "SEO" },
"categoryName55": { "message": "Бухгалтерский учёт" },
"categoryName56": { "message": "Криптомайнер" },
"categoryName57": { "message": "Генератор статических сайтов" }
"categoryName57": { "message": "Генератор статических сайтов" },
"categoryName58": { "message": "User Onboarding" },
"categoryName59": { "message": "JavaScript Libraries" },
"categoryName60": { "message": "Containers" },
"categoryName61": { "message": "SaaS" },
"categoryName62": { "message": "PaaS" },
"categoryName63": { "message": "IaaS" },
"categoryName64": { "message": "Reverse Proxy" },
"categoryName65": { "message": "Load Balancer" }
}

@ -11,6 +11,8 @@
"nothingToDo": { "message": "Nie je tu čo robiť." },
"noAppsDetected": { "message": "Žiadne aplikácie neboli zistené." },
"categoryPin": { "message": "Always show icon" },
"termsAccept": { "message": "Accept" },
"termsContent": { "message": "This extension sends anonymous information about websites you visit, including domain name and identified technologies, to <a href='https://www.wappalyzer.com'>wappalyzer.com</a>. This can be disabled in the settings." },
"categoryName1": { "message": "CMS" },
"categoryName2": { "message": "Message Board" },
"categoryName3": { "message": "Správca databáz" },
@ -67,5 +69,13 @@
"categoryName54": { "message": "SEO" },
"categoryName55": { "message": "Accounting" },
"categoryName56": { "message": "Cryptominer" },
"categoryName57": { "message": "Static Site Generator" }
"categoryName57": { "message": "Static Site Generator" },
"categoryName58": { "message": "User Onboarding" },
"categoryName59": { "message": "JavaScript Libraries" },
"categoryName60": { "message": "Containers" },
"categoryName61": { "message": "SaaS" },
"categoryName62": { "message": "PaaS" },
"categoryName63": { "message": "IaaS" },
"categoryName64": { "message": "Reverse Proxy" },
"categoryName65": { "message": "Load Balancer" }
}

@ -11,6 +11,8 @@
"nothingToDo": { "message": "Burada yapacak birşey yok." },
"noAppsDetected": { "message": "Uygulamalar tespit edilemedi." },
"categoryPin": { "message": "Always show icon" },
"termsAccept": { "message": "Accept" },
"termsContent": { "message": "This extension sends anonymous information about websites you visit, including domain name and identified technologies, to <a href='https://www.wappalyzer.com'>wappalyzer.com</a>. This can be disabled in the settings." },
"categoryName1": { "message": "CMS" },
"categoryName2": { "message": "Mesaj Tahtası" },
"categoryName3": { "message": "Veritabanı Yöneticisi" },
@ -67,5 +69,13 @@
"categoryName54": { "message": "SEO" },
"categoryName55": { "message": "Muhasebe" },
"categoryName56": { "message": "Cryptominer" },
"categoryName57": { "message": "Static Site Generator" }
"categoryName57": { "message": "Static Site Generator" },
"categoryName58": { "message": "User Onboarding" },
"categoryName59": { "message": "JavaScript Libraries" },
"categoryName60": { "message": "Containers" },
"categoryName61": { "message": "SaaS" },
"categoryName62": { "message": "PaaS" },
"categoryName63": { "message": "IaaS" },
"categoryName64": { "message": "Reverse Proxy" },
"categoryName65": { "message": "Load Balancer" }
}

@ -11,6 +11,8 @@
"nothingToDo": { "message": "Тут нічого робити." },
"noAppsDetected": { "message": "Нічого не знайдено." },
"categoryPin": { "message": "Always show icon" },
"termsAccept": { "message": "Accept" },
"termsContent": { "message": "This extension sends anonymous information about websites you visit, including domain name and identified technologies, to <a href='https://www.wappalyzer.com'>wappalyzer.com</a>. This can be disabled in the settings." },
"categoryName1": { "message": "CMS" },
"categoryName2": { "message": "Форум" },
"categoryName3": { "message": "Менеджер БД" },
@ -67,5 +69,13 @@
"categoryName54": { "message": "SEO" },
"categoryName55": { "message": "Accounting" },
"categoryName56": { "message": "Cryptominer" },
"categoryName57": { "message": "Static Site Generator" }
"categoryName57": { "message": "Static Site Generator" },
"categoryName58": { "message": "User Onboarding" },
"categoryName59": { "message": "JavaScript Libraries" },
"categoryName60": { "message": "Containers" },
"categoryName61": { "message": "SaaS" },
"categoryName62": { "message": "PaaS" },
"categoryName63": { "message": "IaaS" },
"categoryName64": { "message": "Reverse Proxy" },
"categoryName65": { "message": "Load Balancer" }
}

@ -11,6 +11,8 @@
"nothingToDo": { "message": "Bu yerda tekshirib bolmaydi." },
"noAppsDetected": { "message": "Hech qanday dastur aniqlanmadi." },
"categoryPin": { "message": "Always show icon" },
"termsAccept": { "message": "Accept" },
"termsContent": { "message": "This extension sends anonymous information about websites you visit, including domain name and identified technologies, to <a href='https://www.wappalyzer.com'>wappalyzer.com</a>. This can be disabled in the settings." },
"categoryName1": { "message": "CMS (KBT)" },
"categoryName2": { "message": "Forum" },
"categoryName3": { "message": "MB boshqaruvi" },
@ -67,5 +69,13 @@
"categoryName54": { "message": "SEO" },
"categoryName55": { "message": "Accounting" },
"categoryName56": { "message": "Cryptominer" },
"categoryName57": { "message": "Static Site Generator" }
"categoryName57": { "message": "Static Site Generator" },
"categoryName58": { "message": "User Onboarding" },
"categoryName59": { "message": "JavaScript Libraries" },
"categoryName60": { "message": "Containers" },
"categoryName61": { "message": "SaaS" },
"categoryName62": { "message": "PaaS" },
"categoryName63": { "message": "IaaS" },
"categoryName64": { "message": "Reverse Proxy" },
"categoryName65": { "message": "Load Balancer" }
}

@ -11,6 +11,8 @@
"nothingToDo": { "message": "这儿啥也没有。" },
"noAppsDetected": { "message": "未检测到任何应用。" },
"categoryPin": { "message": "Always show icon" },
"termsAccept": { "message": "Accept" },
"termsContent": { "message": "This extension sends anonymous information about websites you visit, including domain name and identified technologies, to <a href='https://www.wappalyzer.com'>wappalyzer.com</a>. This can be disabled in the settings." },
"categoryName1": { "message": "内容管理系统CMS" },
"categoryName2": { "message": "消息板" },
"categoryName3": { "message": "数据库管理器" },
@ -66,6 +68,14 @@
"categoryName53": { "message": "客户关系管理CRM" },
"categoryName54": { "message": "搜索引擎优化SEO" },
"categoryName55": { "message": "财务" },
"categoryName56": { "message": "Cryptominer" },
"categoryName57": { "message": "Static Site Generator" }
"categoryName56": { "message": "加密货币挖矿器" },
"categoryName57": { "message": "静态网站生成器" },
"categoryName58": { "message": "用户引导" },
"categoryName59": { "message": "JavaScript 库" },
"categoryName60": { "message": "Containers" },
"categoryName61": { "message": "SaaS" },
"categoryName62": { "message": "PaaS" },
"categoryName63": { "message": "IaaS" },
"categoryName64": { "message": "Reverse Proxy" },
"categoryName65": { "message": "Load Balancer" }
}

@ -1,16 +1,18 @@
{
"github": { "message": "在 GitHub 上 fork Wappalyzer" },
"twitter": { "message": "追隨 Wappalyzer 的 Twitter" },
"twitter": { "message": "在 Twitter 上追隨 Wappalyzer" },
"website": { "message": "前往 wappalyzer.com" },
"options": { "message": "選項" },
"optionsSave": { "message": "保存選項" },
"optionsSaved": { "message": "選項已保存" },
"optionUpgradeMessage": { "message": "通知我更新內容" },
"optionDynamicIcon": { "message": "使用應用程式圖示取代 Wappalyzer 的 logo" },
"optionTracking": { "message": "匿名傳送應用程式偵測報告至 wappalyzer.com 作為研究用途" },
"optionDynamicIcon": { "message": "使用網頁中使用技術的圖示取代 Wappalyzer 的標誌" },
"optionTracking": { "message": "匿名傳送已識別的技術至 wappalyzer.com" },
"nothingToDo": { "message": "這裡什麼也沒有。" },
"noAppsDetected": { "message": "未偵測到應用程式。" },
"categoryPin": { "message": "Always show icon" },
"noAppsDetected": { "message": "未識別到技術。" },
"categoryPin": { "message": "永遠顯示圖示" },
"termsAccept": { "message": "接受" },
"termsContent": { "message": "這個擴充功能將你所造訪網站的網域名稱和識別到的技術等資訊,匿名傳送至 <a href='https://www.wappalyzer.com'>wappalyzer.com</a>。你可以在選項中停用。" },
"categoryName1": { "message": "內容管理系統CMS" },
"categoryName2": { "message": "留言板/討論區" },
"categoryName3": { "message": "資料庫管理" },
@ -23,8 +25,8 @@
"categoryName10": { "message": "分析" },
"categoryName11": { "message": "部落格" },
"categoryName12": { "message": "JavaScript 框架" },
"categoryName13": { "message": "Issue 追蹤" },
"categoryName14": { "message": "影音放器" },
"categoryName13": { "message": "問題追蹤" },
"categoryName14": { "message": "影音放器" },
"categoryName15": { "message": "評論系統" },
"categoryName16": { "message": "驗證碼" },
"categoryName17": { "message": "字型" },
@ -65,7 +67,15 @@
"categoryName52": { "message": "線上聊天" },
"categoryName53": { "message": "客戶關係管理系統CRM" },
"categoryName54": { "message": "SEO" },
"categoryName55": { "message": "Accounting" },
"categoryName56": { "message": "Cryptominer" },
"categoryName57": { "message": "Static Site Generator" }
"categoryName55": { "message": "帳務" },
"categoryName56": { "message": "加密貨幣礦工" },
"categoryName57": { "message": "靜態網站產生器" },
"categoryName58": { "message": "使用者指引" },
"categoryName59": { "message": "JavaScript 函式庫" },
"categoryName60": { "message": "容器" },
"categoryName61": { "message": "軟體即服務SaaS" },
"categoryName62": { "message": "平台即服務PaaS" },
"categoryName63": { "message": "基礎設施即服務IaaS" },
"categoryName64": { "message": "反向代理伺服器" },
"categoryName65": { "message": "負載平衡器" }
}

@ -155,3 +155,48 @@ body {
.empty__text {
}
.terms {
align-items: center;
display: flex;
flex-direction: column;
justify-content: center;
height: 100%;
width: 100%;
}
.terms__wrapper {
display: none;
height: 100%;
width: 100%;
}
.terms__wrapper--active {
display: block;
}
.terms__content {
font-size: .9rem;
line-height: 150%;
text-align: center;
margin-bottom: 1rem;
width: 80%;
}
.terms__accept {
background-color: #4608ad;
border: none;
border-radius: 3px;
color: white;
cursor: pointer;
font-size: .9rem;
padding: .8rem 3rem;
}
.terms__accept:hover {
background-color: #4107a1;
}
.terms__privacy {
margin-top: 1rem;
}

@ -7,7 +7,7 @@
<script src="../node_modules/webextension-polyfill/dist/browser-polyfill.js"></script>
<script src="../js/wappalyzer.js"></script>
<script src="../js/driver.js"></script>
<script src="../js/network.js"></script>
<script src="../js/lib/network.js"></script>
</head>
<body>
</body>

@ -7,7 +7,7 @@
<link rel="stylesheet" href="../css/popup.css">
<script src="../node_modules/webextension-polyfill/dist/browser-polyfill.js"></script>
<script src="../js/jsontodom.js"></script>
<script src="../js/lib/jsontodom.js"></script>
<script src="../js/popup.js"></script>
</head>
<body>
@ -17,6 +17,16 @@
</a>
</div>
<div class="container"></div>
<div class="container">
<div class="terms__wrapper">
<div class="terms">
<div class="terms__content" data-i18n="termsContent"></div>
<button class="terms__accept" data-i18n="termsAccept"></button>
<a class="terms__privacy" href="https://www.wappalyzer.com/privacy" data-i18n="privacyPolicy"></a>
</div>
</div>
</div>
</body>
</html>

@ -1,17 +1,34 @@
/** global: browser */
/** global: XMLSerializer */
if ( typeof browser !== 'undefined' && typeof document.body !== 'undefined' ) {
/* global browser */
/* eslint-env browser */
const port = browser.runtime.connect({
name: 'content.js',
});
if (typeof browser !== 'undefined' && typeof document.body !== 'undefined') {
try {
sendMessage('init', {});
port.postMessage({ id: 'init' });
// HTML
var html = new XMLSerializer().serializeToString(document).split('\n');
let html = new XMLSerializer().serializeToString(document);
const chunks = [];
const maxCols = 2000;
const maxRows = 3000;
const rows = html.length / maxCols;
let i;
html = html
.slice(0, 1000).concat(html.slice(html.length - 1000))
.map(line => line.substring(0, 1000))
.join('\n');
for (i = 0; i < rows; i += 1) {
if (i < maxRows / 2 || i > rows - maxRows / 2) {
chunks.push(html.slice(i * maxCols, (i + 1) * maxCols));
}
}
html = chunks.join('\n');
// Scripts
const scripts = Array.prototype.slice
@ -20,52 +37,51 @@ if ( typeof browser !== 'undefined' && typeof document.body !== 'undefined' ) {
.map(script => script.src)
.filter(script => script.indexOf('data:text/javascript;') !== 0);
sendMessage('analyze', { html, scripts });
port.postMessage({ id: 'analyze', subject: { html, scripts } });
// JavaScript variables
const script = document.createElement('script');
script.onload = () => {
const onMessage = event => {
if ( event.data.id !== 'js' ) {
const onMessage = (event) => {
if (event.data.id !== 'js') {
return;
}
removeEventListener('message', onMessage);
window.removeEventListener('message', onMessage);
sendMessage('analyze', { js: event.data.js });
port.postMessage({ id: 'analyze', subject: { js: event.data.js } });
script.remove();
};
addEventListener('message', onMessage);
window.addEventListener('message', onMessage);
sendMessage('get_js_patterns', {}, response => {
if ( response ) {
postMessage({
id: 'patterns',
patterns: response.patterns
}, '*');
}
});
port.postMessage({ id: 'get_js_patterns' });
};
script.setAttribute('src', browser.extension.getURL('js/inject.js'));
document.body.appendChild(script);
} catch (e) {
sendMessage('log', e);
} catch (error) {
port.postMessage({ id: 'log', subject: error });
}
}
function sendMessage(id, subject, callback) {
( chrome || browser ).runtime.sendMessage({
id,
subject,
source: 'content.js'
}, callback || ( () => {} ));
}
port.onMessage.addListener((message) => {
switch (message.id) {
case 'get_js_patterns':
postMessage({
id: 'patterns',
patterns: message.response.patterns,
}, window.location.href);
break;
default:
// Do nothing
}
});
// https://stackoverflow.com/a/44774834
// https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/tabs/executeScript#Return_value
undefined;
undefined; // eslint-disable-line no-unused-expressions

@ -2,34 +2,61 @@
* WebExtension driver
*/
/* eslint-env browser */
/* global browser, chrome, fetch, Wappalyzer */
/** global: browser */
/** global: chrome */
/** global: fetch */
/** global: Wappalyzer */
const wappalyzer = new Wappalyzer();
var tabCache = {};
var categoryOrder = [];
var options = {};
var robotsTxtQueue = {};
const tabCache = {};
const robotsTxtQueue = {};
let categoryOrder = [];
browser.tabs.onRemoved.addListener(tabId => {
browser.tabs.onRemoved.addListener((tabId) => {
tabCache[tabId] = null;
});
function userAgent() {
const url = chrome.extension.getURL('/');
if (url.match(/^chrome-/)) {
return 'chrome';
}
if (url.match(/^moz-/)) {
return 'firefox';
}
if (url.match(/^ms-browser-/)) {
return 'edge';
}
}
/**
* Get a value from localStorage
*/
function getOption(name, defaultValue = null) {
return new Promise((resolve, reject) => {
const callback = item => {
options[name] = item.hasOwnProperty(name) ? item[name] : defaultValue;
return new Promise(async (resolve, reject) => {
let value = defaultValue;
try {
const option = await browser.storage.local.get(name);
if (option[name] !== undefined) {
value = option[name];
}
} catch (error) {
wappalyzer.log(error.message, 'driver', 'error');
resolve(options[name]);
};
return reject(error.message);
}
browser.storage.local.get(name)
.then(callback)
.catch(error => wappalyzer.log(error, 'driver', 'error'));
return resolve(value);
});
}
@ -37,13 +64,17 @@ function getOption(name, defaultValue = null) {
* Set a value in localStorage
*/
function setOption(name, value) {
var option = {};
option[name] = value;
return new Promise(async (resolve, reject) => {
try {
await browser.storage.local.set({ [name]: value });
} catch (error) {
wappalyzer.log(error.message, 'driver', 'error');
browser.storage.local.set(option);
return reject(error.message);
}
options[name] = value;
return resolve();
});
}
/**
@ -52,135 +83,88 @@ function setOption(name, value) {
function openTab(args) {
browser.tabs.create({
url: args.url,
active: args.background === undefined || !args.background
active: args.background === undefined || !args.background,
});
}
/**
* Make a POST request
*/
function post(url, body) {
fetch(url, {
method: 'POST',
body: JSON.stringify(body)
})
.then(response => {
wappalyzer.log('POST ' + url + ': ' + response.status, 'driver');
})
.catch(error => {
wappalyzer.log('POST ' + url + ': ' + error, 'driver', 'error');
async function post(url, body) {
try {
const response = await fetch(url, {
method: 'POST',
body: JSON.stringify(body),
});
}
fetch('../apps.json')
.then(response => {
return response.json();
})
.then(json => {
wappalyzer.apps = json.apps;
wappalyzer.categories = json.categories;
wappalyzer.log(`POST ${url}: ${response.status}`, 'driver');
} catch (error) {
wappalyzer.log(`POST ${url}: ${error}`, 'driver', 'error');
}
}
wappalyzer.parseJsPatterns();
// Capture response headers
browser.webRequest.onCompleted.addListener(async (request) => {
const headers = {};
categoryOrder = Object.keys(wappalyzer.categories)
.map(categoryId => parseInt(categoryId, 10))
.sort((a, b) => wappalyzer.categories[a].priority - wappalyzer.categories[b].priority);
})
.catch(error => {
wappalyzer.log('GET apps.json: ' + error, 'driver', 'error');
});
if (request.responseHeaders) {
const url = wappalyzer.parseUrl(request.url);
// Version check
var version = browser.runtime.getManifest().version;
let tab;
getOption('version')
.then(previousVersion => {
if ( previousVersion === null ) {
openTab({
url: wappalyzer.config.websiteURL + 'installed'
});
} else if ( version !== previousVersion ) {
getOption('upgradeMessage', true)
.then(upgradeMessage => {
if ( upgradeMessage ) {
openTab({
url: wappalyzer.config.websiteURL + 'upgraded?v' + version,
background: true
});
}
});
try {
[tab] = await browser.tabs.query({ url: [url.href] });
} catch (error) {
wappalyzer.log(error, 'driver', 'error');
}
setOption('version', version);
});
if (tab) {
request.responseHeaders.forEach((header) => {
const name = header.name.toLowerCase();
getOption('dynamicIcon', true);
getOption('pinnedCategory');
headers[name] = headers[name] || [];
// Run content script on all tabs
browser.tabs.query({ url: [ 'http://*/*', 'https://*/*' ] })
.then(tabs => {
tabs.forEach(tab => {
browser.tabs.executeScript(tab.id, {
file: '../js/content.js'
headers[name].push((header.value || header.binaryValue || '').toString());
});
})
})
.catch(error => wappalyzer.log(error, 'driver', 'error'));
// Capture response headers
browser.webRequest.onCompleted.addListener(request => {
const headers = {};
if ( request.responseHeaders ) {
const url = wappalyzer.parseUrl(request.url);
browser.tabs.query({ url: [ url.href ] })
.then(tabs => {
const tab = tabs[0] || null;
if (headers['content-type'] && /\/x?html/.test(headers['content-type'][0])) {
wappalyzer.analyze(url, { headers }, { tab });
}
}
}
}, { urls: ['http://*/*', 'https://*/*'], types: ['main_frame'] }, ['responseHeaders']);
console.log({ url: url.canonical, tab });
browser.runtime.onConnect.addListener((port) => {
port.onMessage.addListener(async (message) => {
if (message.id === undefined) {
return;
}
if ( tab ) {
request.responseHeaders.forEach(header => {
const name = header.name.toLowerCase();
if (message.id !== 'log') {
wappalyzer.log(`Message from ${port.name}: ${message.id}`, 'driver');
}
headers[name] = headers[name] || [];
const pinnedCategory = await getOption('pinnedCategory');
headers[name].push(header.value || header.binaryValue.toString());
});
const url = wappalyzer.parseUrl(port.sender.tab ? port.sender.tab.url : '');
if ( headers['content-type'] && /\/x?html/.test(headers['content-type'][0]) ) {
wappalyzer.analyze(url, { headers }, { tab });
}
}
})
.catch(error => wappalyzer.log(error, 'driver', 'error'));
}
}, { urls: [ 'http://*/*', 'https://*/*' ], types: [ 'main_frame' ] }, [ 'responseHeaders' ]);
const cookies = await browser.cookies.getAll({ domain: `.${url.hostname}` });
// Listen for messages
( chrome || browser ).runtime.onMessage.addListener((message, sender, sendResponse) => {
if ( typeof message.id != 'undefined' ) {
if ( message.id !== 'log' ) {
wappalyzer.log('Message' + ( message.source ? ' from ' + message.source : '' ) + ': ' + message.id, 'driver');
}
let response;
var url = wappalyzer.parseUrl(sender.tab ? sender.tab.url : '');
var response;
switch ( message.id ) {
switch (message.id) {
case 'log':
wappalyzer.log(message.subject, message.source);
break;
case 'init':
browser.cookies.getAll({ domain: '.' + url.hostname })
.then(cookies => wappalyzer.analyze(url, { cookies }, { tab: sender.tab }));
wappalyzer.analyze(url, { cookies }, { tab: port.sender.tab });
break;
case 'analyze':
wappalyzer.analyze(url, message.subject, { tab: sender.tab });
wappalyzer.analyze(url, message.subject, { tab: port.sender.tab });
await setOption('hostnameCache', wappalyzer.hostnameCache);
break;
case 'ad_log':
@ -192,27 +176,32 @@ browser.webRequest.onCompleted.addListener(request => {
tabCache: tabCache[message.tab.id],
apps: wappalyzer.apps,
categories: wappalyzer.categories,
pinnedCategory: options.pinnedCategory,
pinnedCategory,
termsAccepted: userAgent() === 'chrome' || await getOption('termsAccepted', false),
};
break;
case 'set_option':
setOption(message.key, message.value);
await setOption(message.key, message.value);
break;
case 'get_js_patterns':
response = {
patterns: wappalyzer.jsPatterns
patterns: wappalyzer.jsPatterns,
};
break;
default:
// Do nothing
}
sendResponse(response);
}
return true;
if (response) {
port.postMessage({
id: message.id,
response,
});
}
});
});
wappalyzer.driver.document = document;
@ -221,50 +210,51 @@ wappalyzer.driver.document = document;
* Log messages to console
*/
wappalyzer.driver.log = (message, source, type) => {
console.log('[wappalyzer ' + type + ']', '[' + source + ']', message);
const log = ['warn', 'error'].indexOf(type) !== -1 ? type : 'log';
console[log](`[wappalyzer ${type}]`, `[${source}]`, message); // eslint-disable-line no-console
};
/**
* Display apps
*/
wappalyzer.driver.displayApps = (detected, meta, context) => {
var tab = context.tab;
wappalyzer.driver.displayApps = async (detected, meta, context) => {
const { tab } = context;
if ( tab === undefined ) {
if (tab === undefined) {
return;
}
tabCache[tab.id] = tabCache[tab.id] || {
detected: []
detected: [],
};
tabCache[tab.id].detected = detected;
var appName, found = false;
const pinnedCategory = await getOption('pinnedCategory');
const dynamicIcon = await getOption('dynamicIcon', true);
// Find the main application to display
[ options.pinnedCategory ].concat(categoryOrder).forEach(match => {
Object.keys(detected).forEach(appName => {
var app = detected[appName];
let found = false;
app.props.cats.forEach(category => {
if ( category === match && !found ) {
var icon = app.props.icon || 'default.svg';
// Find the main application to display
[pinnedCategory].concat(categoryOrder).forEach((match) => {
Object.keys(detected).forEach((appName) => {
const app = detected[appName];
if ( !options.dynamicIcon ) {
icon = 'default.svg';
}
app.props.cats.forEach((category) => {
if (category === match && !found) {
let icon = app.props.icon && dynamicIcon ? app.props.icon : 'default.svg';
if ( /\.svg$/i.test(icon) ) {
icon = 'converted/' + icon.replace(/\.svg$/, '.png');
if (/\.svg$/i.test(icon)) {
icon = `converted/${icon.replace(/\.svg$/, '.png')}`;
}
try {
browser.pageAction.setIcon({
tabId: tab.id,
path: '../images/icons/' + icon
path: `../images/icons/${icon}`,
});
} catch(e) {
} catch (e) {
// Firefox for Android does not support setIcon see https://bugzilla.mozilla.org/show_bug.cgi?id=1331746
}
@ -274,57 +264,53 @@ wappalyzer.driver.displayApps = (detected, meta, context) => {
});
});
if ( typeof chrome !== 'undefined' ) {
// Browser polyfill doesn't seem to work here
chrome.pageAction.show(tab.id);
} else {
browser.pageAction.show(tab.id);
}
browser.pageAction.show(tab.id);
};
/**
* Fetch and cache robots.txt for host
*/
wappalyzer.driver.getRobotsTxt = (host, secure = false) => {
if ( robotsTxtQueue.hasOwnProperty(host) ) {
wappalyzer.driver.getRobotsTxt = async (host, secure = false) => {
if (robotsTxtQueue[host]) {
return robotsTxtQueue[host];
}
robotsTxtQueue[host] = new Promise((resolve, reject) => {
getOption('tracking', true)
.then(tracking => {
if ( !tracking ) {
return resolve([]);
}
const tracking = await getOption('tracking', true);
const robotsTxtCache = await getOption('robotsTxtCache', {});
robotsTxtQueue[host] = new Promise(async (resolve) => {
if (!tracking) {
return resolve([]);
}
if (host in robotsTxtCache) {
return resolve(robotsTxtCache[host]);
}
getOption('robotsTxtCache')
.then(robotsTxtCache => {
robotsTxtCache = robotsTxtCache || {};
const timeout = setTimeout(() => resolve([]), 3000);
if ( host in robotsTxtCache ) {
return resolve(robotsTxtCache[host]);
}
let response;
const timeout = setTimeout(() => resolve([]), 3000);
try {
response = await fetch(`http${secure ? 's' : ''}://${host}/robots.txt`, { redirect: 'follow' });
} catch (error) {
wappalyzer.log(error, 'driver', 'error');
fetch('http' + ( secure ? 's' : '' ) + '://' + host + '/robots.txt', { redirect: 'follow' })
.then(response => {
clearTimeout(timeout);
return resolve([]);
}
return response.ok ? response.text() : '';
})
.then(robotsTxt => {
robotsTxtCache[host] = wappalyzer.parseRobotsTxt(robotsTxt);
clearTimeout(timeout);
setOption('robotsTxtCache', robotsTxtCache);
const robotsTxt = response.ok ? await response.text() : '';
resolve(robotsTxtCache[host]);
})
.catch(err => resolve([]));
});
});
})
.finally(() => delete robotsTxtQueue[host]);
robotsTxtCache[host] = Wappalyzer.parseRobotsTxt(robotsTxt);
await setOption('robotsTxtCache', robotsTxtCache);
delete robotsTxtQueue[host];
return resolve(robotsTxtCache[host]);
});
return robotsTxtQueue[host];
};
@ -332,19 +318,77 @@ wappalyzer.driver.getRobotsTxt = (host, secure = false) => {
/**
* Anonymously track detected applications for research purposes
*/
wappalyzer.driver.ping = (hostnameCache, adCache) => {
getOption('tracking', true)
.then(tracking => {
if ( tracking ) {
if ( Object.keys(hostnameCache).length ) {
post('https://api.wappalyzer.com/ping/v1/', hostnameCache);
}
wappalyzer.driver.ping = async (hostnameCache = {}, adCache = []) => {
const tracking = await getOption('tracking', true);
const termsAccepted = userAgent() === 'chrome' || await getOption('termsAccepted', false);
if ( adCache.length ) {
post('https://ad.wappalyzer.com/log/wp/', adCache);
}
if (tracking && termsAccepted) {
if (Object.keys(hostnameCache).length) {
post('https://api.wappalyzer.com/ping/v1/', hostnameCache);
}
setOption('robotsTxtCache', {});
if (adCache.length) {
post('https://ad.wappalyzer.com/log/wp/', adCache);
}
await setOption('robotsTxtCache', {});
}
};
// Init
(async () => {
// Technologies
try {
const response = await fetch('../apps.json');
const json = await response.json();
wappalyzer.apps = json.apps;
wappalyzer.categories = json.categories;
} catch (error) {
wappalyzer.log(`GET apps.json: ${error.message}`, 'driver', 'error');
}
wappalyzer.parseJsPatterns();
categoryOrder = Object.keys(wappalyzer.categories)
.map(categoryId => parseInt(categoryId, 10))
.sort((a, b) => wappalyzer.categories[a].priority - wappalyzer.categories[b].priority);
// Version check
const { version } = browser.runtime.getManifest();
const previousVersion = await getOption('version');
const upgradeMessage = await getOption('upgradeMessage', true);
if (previousVersion === null) {
openTab({
url: `${wappalyzer.config.websiteURL}installed`,
});
} else if (version !== previousVersion && upgradeMessage) {
openTab({
url: `${wappalyzer.config.websiteURL}upgraded?v${version}`,
background: true,
});
}
await setOption('version', version);
// Hostname cache
wappalyzer.hostnameCache = await getOption('hostnameCache', {});
// Run content script on all tabs
try {
const tabs = await browser.tabs.query({ url: ['http://*/*', 'https://*/*'] });
tabs.forEach(async (tab) => {
try {
await browser.tabs.executeScript(tab.id, {
file: '../js/content.js',
});
} catch (error) {
//
}
});
};
} catch (error) {
wappalyzer.log(error, 'driver', 'error');
}
})();

@ -1,9 +1,29 @@
/* eslint-env browser */
(() => {
try {
addEventListener('message', onMessage);
try {
const detectJs = (chain) => {
const properties = chain.split('.');
let value = properties.length ? window : null;
for (let i = 0; i < properties.length; i++) {
const property = properties[i];
if (value && value.hasOwnProperty(property)) {
value = value[property];
} else {
value = null;
break;
}
}
return typeof value === 'string' || typeof value === 'number' ? value : !!value;
};
function onMessage(event) {
if ( event.data.id !== 'patterns' ) {
const onMessage = (event) => {
if (event.data.id !== 'patterns') {
return;
}
@ -13,18 +33,18 @@
const js = {};
for ( let appName in patterns ) {
if ( patterns.hasOwnProperty(appName) ) {
for (const appName in patterns) {
if (patterns.hasOwnProperty(appName)) {
js[appName] = {};
for ( let chain in patterns[appName] ) {
if ( patterns[appName].hasOwnProperty(chain) ) {
for (const chain in patterns[appName]) {
if (patterns[appName].hasOwnProperty(chain)) {
js[appName][chain] = {};
for ( let index in patterns[appName][chain] ) {
for (const index in patterns[appName][chain]) {
const value = detectJs(chain);
if ( value && patterns[appName][chain].hasOwnProperty(index) ) {
if (value && patterns[appName][chain].hasOwnProperty(index)) {
js[appName][chain][index] = value;
}
}
@ -33,29 +53,11 @@
}
}
postMessage({ id: 'js', js }, '*');
}
postMessage({ id: 'js', js }, window.location.href);
};
function detectJs(chain) {
const properties = chain.split('.');
var value = properties.length ? window : null;
for ( let i = 0; i < properties.length; i ++ ) {
var property = properties[i];
if ( value && value.hasOwnProperty(property) ) {
value = value[property];
} else {
value = null;
break;
}
}
return typeof value === 'string' || typeof value === 'number' ? value : !!value;
}
} catch(e) {
addEventListener('message', onMessage);
} catch (e) {
// Fail quietly
}
})();

@ -1,63 +0,0 @@
jsonToDOM.namespaces = {
html: "http://www.w3.org/1999/xhtml",
xul: "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
};
jsonToDOM.defaultNamespace = jsonToDOM.namespaces.html;
function jsonToDOM(jsonTemplate, doc, nodes) {
function namespace(name) {
var reElemNameParts = /^(?:(.*):)?(.*)$/.exec(name);
return { namespace: jsonToDOM.namespaces[reElemNameParts[1]], shortName: reElemNameParts[2] };
}
// Note that 'elemNameOrArray' is: either the full element name (eg. [html:]div) or an array of elements in JSON notation
function tag(elemNameOrArray, elemAttr) {
// Array of elements? Parse each one...
if (Array.isArray(elemNameOrArray)) {
var frag = doc.createDocumentFragment();
Array.prototype.forEach.call(arguments, function(thisElem) {
frag.appendChild(tag.apply(null, thisElem));
});
return frag;
}
// Single element? Parse element namespace prefix (if none exists, default to defaultNamespace), and create element
var elemNs = namespace(elemNameOrArray);
var elem = doc.createElementNS(elemNs.namespace || jsonToDOM.defaultNamespace, elemNs.shortName);
// Set element's attributes and/or callback functions (eg. onclick)
for (var key in elemAttr) {
var val = elemAttr[key];
if (nodes && key == "key") {
nodes[val] = elem;
continue;
}
var attrNs = namespace(key);
if (typeof val == "function") {
// Special case for function attributes; don't just add them as 'on...' attributes, but as events, using addEventListener
elem.addEventListener(key.replace(/^on/, ""), val, false);
}
else {
// Note that the default namespace for XML attributes is, and should be, blank (ie. they're not in any namespace)
elem.setAttributeNS(attrNs.namespace || "", attrNs.shortName, val);
}
}
// Create and append this element's children
var childElems = Array.prototype.slice.call(arguments, 2);
childElems.forEach(function(childElem) {
if (childElem != null) {
elem.appendChild(
childElem instanceof doc.defaultView.Node ? childElem :
Array.isArray(childElem) ? tag.apply(null, childElem) :
doc.createTextNode(childElem));
}
});
return elem;
}
return tag.apply(null, jsonTemplate);
}

@ -6,6 +6,7 @@ var exports = {};
(function(exports) {
var port = browser.runtime.connect({name:"adparser"});
var utils = {
normalizeUrl: function(url) {
@ -119,12 +120,9 @@ var exports = {};
}
return dict;
},
sendToBackground: function(message, event, responseMessage, onResponse) {
if ( typeof browser !== 'undefined' ) {
var response = browser.runtime.sendMessage(message);
response.then(onResponse);
} else if ( typeof chrome !== 'undefined' ) {
chrome.runtime.sendMessage(message, onResponse);
sendToBackground: function(message, event, responseMessage) {
if ( typeof browser !== 'undefined' || typeof chrome !== 'undefined' ) {
port.postMessage(message);
} else if ( window.self.port ) {
window.self.port.on(responseMessage, onResponse);
window.self.port.emit(event, message);
@ -132,25 +130,28 @@ var exports = {};
},
askIfTrackingEnabled: function(callback, elseCallback) {
utilCallback = callback;
utilElseCallback = elseCallback;
this.sendToBackground(
'is_tracking_enabled',
'',
'tracking_enabled_response',
function(message) {
if ( message && message.tracking_enabled ) {
callback();
} else {
elseCallback();
}
}
'tracking_enabled_response'
);
}
};
port.onMessage.addListener((message) => {
if ( message && message.tracking_enabled ) {
utilCallback();
} else {
utilElseCallback();
}
});
utils.SCRIPT_IN_FRIENDLY_IFRAME = !utils.SCRIPT_IN_WINDOW_TOP && utils.isFriendlyWindow(window.parent);
utils.SCRIPT_IN_HOSTILE_IFRAME = !utils.SCRIPT_IN_WINDOW_TOP && !utils.SCRIPT_IN_FRIENDLY_IFRAME;
@ -181,7 +182,7 @@ var exports = {};
video_assets: opt_video_assets,
assets: opt_assets,
version: '3',
mrev: '4aeaa5a-c',
mrev: '15a9f21-d',
msgNum: this.msgNum,
timestamp: new Date().getTime(),
pageVis: document.visibilityState,
@ -195,6 +196,8 @@ var exports = {};
utils.LogGenerator = LogGenerator;
let utilCallback, utilElseCallback;
exports.utils = utils;
})(exports);
@ -890,7 +893,7 @@ var exports = {};
var _pageTags;
var INIT_MS_BW_SEARCHES = 2000;
var PAGE_TAG_RE = new RegExp('gpt|oascentral');
var POST_MSG_ID = '1519242200-10756-12873-1462-13403';
var POST_MSG_ID = '1554456894-8541-12665-19466-15909';
var AD_SERVER_RE = new RegExp('^(google_ads_iframe|oas_frame|atwAdFrame)');
function getPageTags(doc) {
@ -1028,13 +1031,17 @@ var exports = {};
myWin = window.document.defaultView,
ifrTag;
try {
if ( typeof event.data === "string" && event.data.indexOf(POST_MSG_ID) != -1 ) {
try {
adData = JSON.parse(event.data);
} catch(e) {
adData = JSON.parse(event.data);
} catch (e) {
return;
return;
}
}
else
return;
if ( adData.postMessageId === POST_MSG_ID ) {
@ -1080,19 +1087,14 @@ var exports = {};
}
function addBackgroundListener(event, callback) {
if ( typeof browser !== 'undefined' ) {
if ( typeof browser !== 'undefined' || typeof chrome !== 'undefined' ) {
browser.runtime.onMessage.addListener(function(msg) {
if ( msg.event === event ) {
callback(msg);
}
});
} else if ( typeof chrome !== 'undefined' ) {
chrome.runtime.onMessage.addListener(function(msg) {
if ( msg.event === event ) {
callback(msg);
}
});
} else if ( window.self.port ) {
}
else if (window.self.port) {
window.self.port.on(event, callback);
}
}

@ -0,0 +1,63 @@
jsonToDOM.namespaces = {
html: 'http://www.w3.org/1999/xhtml',
xul: 'http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul',
};
jsonToDOM.defaultNamespace = jsonToDOM.namespaces.html;
function jsonToDOM(jsonTemplate, doc, nodes) {
function namespace(name) {
const reElemNameParts = /^(?:(.*):)?(.*)$/.exec(name);
return { namespace: jsonToDOM.namespaces[reElemNameParts[1]], shortName: reElemNameParts[2] };
}
// Note that 'elemNameOrArray' is: either the full element name (eg. [html:]div) or an array of elements in JSON notation
function tag(elemNameOrArray, elemAttr) {
// Array of elements? Parse each one...
if (Array.isArray(elemNameOrArray)) {
const frag = doc.createDocumentFragment();
Array.prototype.forEach.call(arguments, (thisElem) => {
frag.appendChild(tag(...thisElem));
});
return frag;
}
// Single element? Parse element namespace prefix (if none exists, default to defaultNamespace), and create element
const elemNs = namespace(elemNameOrArray);
const elem = doc.createElementNS(elemNs.namespace || jsonToDOM.defaultNamespace, elemNs.shortName);
// Set element's attributes and/or callback functions (eg. onclick)
for (const key in elemAttr) {
const val = elemAttr[key];
if (nodes && key == 'key') {
nodes[val] = elem;
continue;
}
const attrNs = namespace(key);
if (typeof val === 'function') {
// Special case for function attributes; don't just add them as 'on...' attributes, but as events, using addEventListener
elem.addEventListener(key.replace(/^on/, ''), val, false);
} else {
// Note that the default namespace for XML attributes is, and should be, blank (ie. they're not in any namespace)
elem.setAttributeNS(attrNs.namespace || '', attrNs.shortName, val);
}
}
// Create and append this element's children
const childElems = Array.prototype.slice.call(arguments, 2);
childElems.forEach((childElem) => {
if (childElem != null) {
elem.appendChild(
childElem instanceof doc.defaultView.Node ? childElem
: Array.isArray(childElem) ? tag(...childElem)
: doc.createTextNode(childElem),
);
}
});
return elem;
}
return tag(...jsonTemplate);
}

@ -1,3 +1,4 @@
(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
'use strict';
(function() {
@ -6,21 +7,15 @@
window.navigator.userAgent.match(/Chrom(?:e|ium)\/([0-9\.]+)/));
}
var browserProxy;
if ( isChrome() ) {
browserProxy = chrome;
} else {
browserProxy = browser;
}
var requiredBrowserApis = [
browser.webNavigation,
browser.tabs,
browser.webRequest,
browser.runtime
];
var MIN_FF_MAJOR_VERSION = 51;
var requiredBrowserApis = [
browserProxy.webNavigation,
browserProxy.tabs,
browserProxy.webRequest,
browserProxy.runtime
];
var areListenersRegistered = false;
var secBefore = 2000;
var secAfter = 5000;
@ -81,12 +76,8 @@
}
function getFrame(getFrameDetails, callback) {
if ( typeof chrome !== 'undefined' ) {
chrome.webNavigation.getFrame(getFrameDetails, callback);
} else if ( typeof browser !== 'undefined' ) {
var gettingFrame = browser.webNavigation.getFrame(getFrameDetails);
gettingFrame.then(callback);
}
var gettingFrame = browser.webNavigation.getFrame(getFrameDetails);
gettingFrame.then(callback);
}
function ifBrowserValid(callback, elseCallback) {
@ -277,7 +268,7 @@
PageNetworkTrafficCollector.prototype.sendLogMessageToTabConsole = function() {
var logMessage = Array.from(arguments).join(' ');
var message = {message: logMessage, event: 'console-log-message'};
browserProxy.tabs.sendMessage(this.tabId, message);
browser.tabs.sendMessage(this.tabId, message);
};
PageNetworkTrafficCollector.prototype.sendToTab = function(assetReq, reqs, curPageUrl, adTrackingEvent) {
@ -307,7 +298,7 @@
msg.origUrl = curPageUrl;
msg.displayAdFound = this.displayAdFound;
browserProxy.tabs.sendMessage(this.tabId, msg);
browser.tabs.sendMessage(this.tabId, msg);
};
PageNetworkTrafficCollector.prototype.getRedirKey = function(url, frameId) {
@ -624,7 +615,9 @@
var _this = this,
origPageUrl, msgAssetReq;
msgAssetReq = this.msgsBeingSent[msgKey];
browserProxy.tabs.get(this.tabId, function(tab) {origPageUrl = tab.url;});
browser.tabs.get(this.tabId).then(function(tab) {
origPageUrl = tab.url;
});
setTimeout(function() {
var rawRequests = [];
@ -704,71 +697,70 @@
function registerListeners() {
browserProxy.webRequest.onBeforeRequest.addListener(
browser.webRequest.onBeforeRequest.addListener(
onBeforeRequestListener,
{urls: ['http://*/*', 'https://*/*']},
[]
);
browserProxy.webRequest.onSendHeaders.addListener(
browser.webRequest.onSendHeaders.addListener(
onSendHeadersListener,
{urls: ['http://*/*', 'https://*/*']},
['requestHeaders']
);
browserProxy.webRequest.onHeadersReceived.addListener(
browser.webRequest.onHeadersReceived.addListener(
onHeadersReceivedListener,
{urls: ['http://*/*', 'https://*/*']},
['responseHeaders']
);
browserProxy.webRequest.onBeforeRedirect.addListener(
browser.webRequest.onBeforeRedirect.addListener(
onBeforeRedirectListener,
{urls: ['http://*/*', 'https://*/*']},
[]
);
browserProxy.webRequest.onResponseStarted.addListener(
browser.webRequest.onResponseStarted.addListener(
onResponseStartedListener,
{urls: ['http://*/*', 'https://*/*']},
['responseHeaders']
);
browserProxy.webNavigation.onCommitted.addListener(onCommittedListener);
browserProxy.webNavigation.onCompleted.addListener(onCompletedListener);
browserProxy.tabs.onRemoved.addListener(onRemovedListener);
browserProxy.runtime.onMessage.addListener(onMessageListener);
browser.webNavigation.onCommitted.addListener(onCommittedListener);
browser.webNavigation.onCompleted.addListener(onCompletedListener);
browser.tabs.onRemoved.addListener(onRemovedListener);
browser.runtime.onMessage.addListener(onMessageListener);
areListenersRegistered = true;
}
function unregisterListeners() {
browserProxy.webRequest.onBeforeRequest.removeListener(
browser.webRequest.onBeforeRequest.removeListener(
onBeforeRequestListener
);
browserProxy.webRequest.onSendHeaders.removeListener(
browser.webRequest.onSendHeaders.removeListener(
onSendHeadersListener
);
browserProxy.webRequest.onHeadersReceived.removeListener(
browser.webRequest.onHeadersReceived.removeListener(
onHeadersReceivedListener
);
browserProxy.webRequest.onBeforeRedirect.removeListener(
browser.webRequest.onBeforeRedirect.removeListener(
onBeforeRedirectListener
);
browserProxy.webRequest.onResponseStarted.removeListener(
browser.webRequest.onResponseStarted.removeListener(
onResponseStartedListener
);
browserProxy.webNavigation.onCommitted.removeListener(onCommittedListener);
browserProxy.webNavigation.onCompleted.removeListener(onCompletedListener);
browserProxy.tabs.onRemoved.removeListener(onRemovedListener);
browserProxy.runtime.onMessage.removeListener(onMessageListener);
browser.webNavigation.onCommitted.removeListener(onCommittedListener);
browser.webNavigation.onCompleted.removeListener(onCompletedListener);
browser.tabs.onRemoved.removeListener(onRemovedListener);
browser.runtime.onMessage.removeListener(onMessageListener);
areListenersRegistered = false;
}
@ -781,7 +773,7 @@
if ( areRequiredBrowserApisAvailable() ) {
ifBrowserValid(
function() {
browserProxy.webNavigation.onBeforeNavigate.addListener(
browser.webNavigation.onBeforeNavigate.addListener(
function(details) {
if ( details.frameId === 0 ) {
globalPageContainer.onNewNavigation(details);
@ -797,28 +789,34 @@
);
}
browserProxy.runtime.onMessage.addListener(function(request, sender, sendResponse) {
if ( request === 'is_browser_valid' ) {
ifBrowserValid(
sendResponse({'browser_valid': true}),
sendResponse({'browser_valid': false})
);
}
browser.runtime.onConnect.addListener((port) => {
port.onMessage.addListener((message) => {
if ( message === 'is_browser_valid' ) {
ifBrowserValid(
port.postMessage({'browser_valid': true}),
port.postMessage({'browser_valid': false})
);
}
});
});
browserProxy.runtime.onMessage.addListener(function(request, sender, sendResponse) {
if ( request === 'is_tracking_enabled' ) {
ifTrackingEnabled(
sender.tab,
function() {
try {sendResponse({'tracking_enabled': true});}
catch(err) {} },
function() {
try {sendResponse({'tracking_enabled': false});}
catch(err) {}}
);
}
return true;
browser.runtime.onConnect.addListener((port) => {
port.onMessage.addListener((message) => {
if ( message === 'is_tracking_enabled' ) {
ifTrackingEnabled(
port.sender.tab,
function() {
try {port.postMessage({'tracking_enabled': true});}
catch(err) {} },
function() {
try {port.postMessage({'tracking_enabled': false});}
catch(err) {} }
);
}
return true;
});
});
})();
},{}]},{},[1]);

@ -1,69 +1,96 @@
/** global: browser */
/** global: Wappalyzer */
/* globals browser Wappalyzer */
/* eslint-env browser */
const wappalyzer = new Wappalyzer();
function getOption(name, defaultValue, callback) {
browser.storage.local.get(name)
.then(item => {
callback(item.hasOwnProperty(name) ? item[name] : defaultValue);
});
/**
* Get a value from localStorage
*/
function getOption(name, defaultValue = null) {
return new Promise(async (resolve, reject) => {
let value = defaultValue;
try {
const option = await browser.storage.local.get(name);
if (option[name] !== undefined) {
value = option[name];
}
} catch (error) {
wappalyzer.log(error.message, 'driver', 'error');
return reject(error.message);
}
return resolve(value);
});
}
/**
* Set a value in localStorage
*/
function setOption(name, value) {
var option = {};
return new Promise(async (resolve, reject) => {
try {
await browser.storage.local.set({ [name]: value });
} catch (error) {
wappalyzer.log(error.message, 'driver', 'error');
option[name] = value;
return reject(error.message);
}
browser.storage.local.set(option);
return resolve();
});
}
document.addEventListener('DOMContentLoaded', () => {
var nodes = document.querySelectorAll('[data-i18n]');
document.addEventListener('DOMContentLoaded', async () => {
const nodes = document.querySelectorAll('[data-i18n]');
Array.prototype.forEach.call(nodes, node => {
Array.prototype.forEach.call(nodes, (node) => {
node.childNodes[0].nodeValue = browser.i18n.getMessage(node.dataset.i18n);
});
document.querySelector('#github').addEventListener('click', () => {
open(wappalyzer.config.githubURL);
window.open(wappalyzer.config.githubURL);
});
document.querySelector('#twitter').addEventListener('click', () => {
open(wappalyzer.config.twitterURL);
window.open(wappalyzer.config.twitterURL);
});
document.querySelector('#wappalyzer').addEventListener('click', () => {
open(wappalyzer.config.websiteURL);
window.open(wappalyzer.config.websiteURL);
});
getOption('upgradeMessage', true, value => {
const el = document.querySelector('#option-upgrade-message');
let el;
let value;
el.checked = value;
// Upgrade message
value = await getOption('upgradeMessage', true);
el.addEventListener('change', () => {
setOption('upgradeMessage', el.checked);
});
});
el = document.querySelector('#option-upgrade-message');
getOption('dynamicIcon', true, value => {
const el = document.querySelector('#option-dynamic-icon');
el.checked = value;
el.checked = value;
el.addEventListener('change', e => setOption('upgradeMessage', e.target.checked));
el.addEventListener('change', () => {
setOption('dynamicIcon', el.checked);
});
});
// Dynamic icon
value = await getOption('dynamicIcon', true);
getOption('tracking', true, value => {
const el = document.querySelector('#option-tracking');
el = document.querySelector('#option-dynamic-icon');
el.checked = value;
el.checked = value;
el.addEventListener('change', () => {
setOption('tracking', el.checked);
});
});
el.addEventListener('change', e => setOption('dynamicIcon', e.target.checked));
// Tracking
value = await getOption('tracking', true);
el = document.querySelector('#option-tracking');
el.checked = value;
el.addEventListener('change', e => setOption('tracking', e.target.checked));
});

@ -1,61 +1,51 @@
/** global: chrome */
/* eslint-env browser */
/* global browser, jsonToDOM */
/** global: browser */
/** global: jsonToDOM */
var pinnedCategory = null;
let pinnedCategory = null;
let termsAccepted = false;
var func = tabs => {
( chrome || browser ).runtime.sendMessage({
id: 'get_apps',
tab: tabs[0],
source: 'popup.js'
}, response => {
pinnedCategory = response.pinnedCategory;
const port = browser.runtime.connect({
name: 'popup.js',
});
replaceDomWhenReady(appsToDomTemplate(response));
});
};
function slugify(string) {
return string.toLowerCase().replace(/[^a-z0-9-]/g, '-').replace(/--+/g, '-').replace(/(?:^-|-$)/, '');
}
browser.tabs.query({ active: true, currentWindow: true })
.then(func)
.catch(console.error);
function i18n() {
const nodes = document.querySelectorAll('[data-i18n]');
function replaceDomWhenReady(dom) {
if ( /complete|interactive|loaded/.test(document.readyState) ) {
replaceDom(dom);
} else {
document.addEventListener('DOMContentLoaded', () => {
replaceDom(dom);
});
}
Array.prototype.forEach.call(nodes, (node) => {
node.innerHTML = browser.i18n.getMessage(node.dataset.i18n);
});
}
function replaceDom(domTemplate) {
var container = document.getElementsByClassName('container')[0];
const container = document.getElementsByClassName('container')[0];
while ( container.firstChild ) {
while (container.firstChild) {
container.removeChild(container.firstChild);
}
container.appendChild(jsonToDOM(domTemplate, document, {}));
var nodes = document.querySelectorAll('[data-i18n]');
Array.prototype.forEach.call(nodes, node => {
node.childNodes[0].nodeValue = browser.i18n.getMessage(node.dataset.i18n);
});
i18n();
Array.from(document.querySelectorAll('.detected__category-pin-wrapper')).forEach(pin => {
pin.addEventListener('click', event => {
Array.from(document.querySelectorAll('.detected__category-pin-wrapper')).forEach((pin) => {
pin.addEventListener('click', () => {
const categoryId = parseInt(pin.dataset.categoryId, 10);
if ( categoryId === pinnedCategory ) {
if (categoryId === pinnedCategory) {
pin.className = 'detected__category-pin-wrapper';
pinnedCategory = null;
} else {
const active = document.querySelector('.detected__category-pin-wrapper--active');
if ( active ) {
if (active) {
active.className = 'detected__category-pin-wrapper';
}
@ -64,7 +54,7 @@ function replaceDom(domTemplate) {
pinnedCategory = categoryId;
}
( chrome || browser ).runtime.sendMessage({
port.postMessage({
id: 'set_option',
key: 'pinnedCategory',
value: pinnedCategory,
@ -73,118 +63,125 @@ function replaceDom(domTemplate) {
});
}
function replaceDomWhenReady(dom) {
if (/complete|interactive|loaded/.test(document.readyState)) {
replaceDom(dom);
} else {
document.addEventListener('DOMContentLoaded', () => {
replaceDom(dom);
});
}
}
function appsToDomTemplate(response) {
var
appName, confidence, version, categories,
template = [];
let template = [];
if ( response.tabCache && Object.keys(response.tabCache.detected).length > 0 ) {
if (response.tabCache && Object.keys(response.tabCache.detected).length > 0) {
const categories = {};
// Group apps by category
for ( appName in response.tabCache.detected ) {
response.apps[appName].cats.forEach(cat => {
for (const appName in response.tabCache.detected) {
response.apps[appName].cats.forEach((cat) => {
categories[cat] = categories[cat] || { apps: [] };
categories[cat].apps[appName] = appName;
});
}
for ( cat in categories ) {
for (const cat in categories) {
const apps = [];
for ( appName in categories[cat].apps ) {
confidence = response.tabCache.detected[appName].confidenceTotal;
version = response.tabCache.detected[appName].version;
for (const appName in categories[cat].apps) {
const { confidence, version } = response.tabCache.detected[appName];
apps.push(
[
'a', {
class: 'detected__app',
target: '_blank',
href: 'https://www.wappalyzer.com/technologies/' + slugify(appName)
href: `https://www.wappalyzer.com/technologies/${slugify(appName)}`,
}, [
'img', {
class: 'detected__app-icon',
src: '../images/icons/' + ( response.apps[appName].icon || 'default.svg' )
src: `../images/icons/${response.apps[appName].icon || 'default.svg'}`,
},
], [
'span', {
class: 'detected__app-name'
class: 'detected__app-name',
},
appName,
], version ? [
'span', {
class: 'detected__app-version'
class: 'detected__app-version',
},
version
version,
] : null, confidence < 100 ? [
'span', {
class: 'detected__app-confidence'
class: 'detected__app-confidence',
},
confidence + '% sure'
] : null
]
`${confidence}% sure`,
] : null,
],
);
}
template.push(
[
'div', {
class: 'detected__category'
class: 'detected__category',
}, [
'div', {
class: 'detected__category-name'
class: 'detected__category-name',
}, [
'a', {
class: 'detected__category-link',
target: '_blank',
href: 'https://www.wappalyzer.com/categories/' + slugify(response.categories[cat].name)
href: `https://www.wappalyzer.com/categories/${slugify(response.categories[cat].name)}`,
},
browser.i18n.getMessage('categoryName' + cat),
browser.i18n.getMessage(`categoryName${cat}`),
], [
'span', {
class: 'detected__category-pin-wrapper' + ( pinnedCategory == cat ? ' detected__category-pin-wrapper--active' : '' ),
class: `detected__category-pin-wrapper${pinnedCategory == cat ? ' detected__category-pin-wrapper--active' : ''}`,
'data-category-id': cat,
'title': browser.i18n.getMessage('categoryPin'),
title: browser.i18n.getMessage('categoryPin'),
}, [
'img', {
class: 'detected__category-pin detected__category-pin--active',
src: '../images/pin-active.svg'
src: '../images/pin-active.svg',
},
], [
'img', {
class: 'detected__category-pin detected__category-pin--inactive',
src: '../images/pin.svg'
}
]
]
src: '../images/pin.svg',
},
],
],
], [
'div', {
class: 'detected__apps'
class: 'detected__apps',
},
apps
]
]
apps,
],
],
);
}
template = [
'div', {
class: 'detected'
class: 'detected',
},
template
template,
];
} else {
template = [
'div', {
class: 'empty'
class: 'empty',
},
[
'span', {
class: 'empty__text'
class: 'empty__text',
},
browser.i18n.getMessage('noAppsDetected')
browser.i18n.getMessage('noAppsDetected'),
],
];
}
@ -192,6 +189,58 @@ function appsToDomTemplate(response) {
return template;
}
function slugify(string) {
return string.toLowerCase().replace(/[^a-z0-9-]/g, '-').replace(/--+/g, '-').replace(/(?:^-|-$)/, '');
async function getApps() {
try {
const tabs = await browser.tabs.query({
active: true,
currentWindow: true,
});
port.postMessage({
id: 'get_apps',
tab: tabs[0],
});
} catch (error) {
console.error(error); // eslint-disable-line no-console
}
}
function displayApps(response) {
pinnedCategory = response.pinnedCategory; // eslint-disable-line prefer-destructuring
termsAccepted = response.termsAccepted; // eslint-disable-line prefer-destructuring
if (termsAccepted) {
replaceDomWhenReady(appsToDomTemplate(response));
} else {
i18n();
const wrapper = document.querySelector('.terms__wrapper');
document.querySelector('.terms__accept').addEventListener('click', () => {
port.postMessage({
id: 'set_option',
key: 'termsAccepted',
value: true,
});
wrapper.classList.remove('terms__wrapper--active');
getApps();
});
wrapper.classList.add('terms__wrapper--active');
}
}
port.onMessage.addListener((message) => {
switch (message.id) {
case 'get_apps':
displayApps(message.response);
break;
default:
// Do nothing
}
});
getApps();

@ -1,74 +1,84 @@
{
"name": "Wappalyzer",
"short_name": "Wappalyzer",
"author": "Elbert Alias",
"homepage_url": "https://www.wappalyzer.com",
"description": "Identify web technologies",
"version": "5.4.14",
"default_locale": "en",
"manifest_version": 2,
"icons": {
"16": "images/icon_16.png",
"19": "images/icon_19.png",
"32": "images/icon_32.png",
"38": "images/icon_38.png",
"128": "images/icon_128.png"
},
"page_action": {
"default_icon": {
"16": "images/icon_16.png",
"19": "images/icon_19.png",
"32": "images/icon_32.png",
"38": "images/icon_38.png",
"128": "images/icon_128.png"
},
"default_title": "Wappalyzer",
"default_popup": "html/popup.html"
},
"background": {
"page": "html/background.html"
"name": "Wappalyzer",
"short_name": "Wappalyzer",
"author": "Elbert Alias",
"homepage_url": "https://www.wappalyzer.com",
"description": "Identify web technologies",
"version": "5.8.3",
"default_locale": "en",
"manifest_version": 2,
"icons": {
"16": "images/icon_16.png",
"19": "images/icon_19.png",
"32": "images/icon_32.png",
"38": "images/icon_38.png",
"128": "images/icon_128.png"
},
"page_action": {
"default_icon": {
"16": "images/icon_16.png",
"19": "images/icon_19.png",
"32": "images/icon_32.png",
"38": "images/icon_38.png",
"128": "images/icon_128.png"
},
"default_title": "Wappalyzer",
"default_popup": "html/popup.html"
},
"background": {
"page": "html/background.html"
},
"content_scripts": [
{
"matches": [
"http://*/*",
"https://*/*"
],
"js": [
"node_modules/webextension-polyfill/dist/browser-polyfill.js",
"js/content.js"
],
"run_at": "document_idle"
},
{
"matches": [
},
"content_scripts": [
{
"matches": [
"http://*/*",
"https://*/*"
],
"js": [
"js/iframe.js"
],
"run_at": "document_start",
"all_frames": true
}
],
"web_accessible_resources": [
"js/inject.js"
],
"options_page": "html/options.html",
"options_ui": {
"page": "html/options.html",
"open_in_tab": false
},
"permissions": [
"https://*/*"
],
"js": [
"node_modules/webextension-polyfill/dist/browser-polyfill.js",
"js/content.js"
],
"run_at": "document_idle"
},
{
"matches": [
"http://*/*",
"https://*/*"
],
"exclude_matches": [
"https://*.modirum.com/*",
"https://www.alphaecommerce.gr/*"
],
"js": [
"node_modules/webextension-polyfill/dist/browser-polyfill.js",
"js/lib/iframe.js"
],
"run_at": "document_start",
"all_frames": true
}
],
"web_accessible_resources": [
"js/inject.js"
],
"options_ui": {
"page": "html/options.html",
"open_in_tab": false
},
"permissions": [
"cookies",
"storage",
"tabs",
"webRequest",
"webNavigation",
"http://*/*",
"https://*/*"
],
"content_security_policy": "script-src 'self'; object-src 'self'"
"storage",
"tabs",
"webRequest",
"webNavigation",
"http://*/*",
"https://*/*"
],
"content_security_policy": "script-src 'self'; object-src 'self'",
"applications": {
"gecko": {
"id": "wappalyzer@crunchlabz.com",
"strict_min_version": "60.0"
}
}
}

@ -0,0 +1,11 @@
{
"requires": true,
"lockfileVersion": 1,
"dependencies": {
"webextension-polyfill": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/webextension-polyfill/-/webextension-polyfill-0.4.0.tgz",
"integrity": "sha512-oreMp+EoAo1pzRMigx4jB5jInIpx6NTCySPSjGyLLee/dCIPiRqowCEfbFP8o20wz9SOtNwSsfkaJ9D/tRgpag=="
}
}
}

@ -1,5 +1,5 @@
{
"dependencies": {
"webextension-polyfill": "^0.2.1"
"webextension-polyfill": "^0.4.0"
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 369 B

After

Width:  |  Height:  |  Size: 3.2 KiB

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 719.58002 655.81" height="655.81" width="719.58"><g transform="translate(48.361 -198.743)"><rect width="708.66" height="644.89" ry=".153" x="-42.901" y="204.203" fill="#002276" stroke="#fff" stroke-width="10.92" stroke-linecap="square"/><path d="M64.408 392.813v42.42h42.42v234.58h54.9v-277h-97.32zm354.36 0v42.42h44.92v234.58h54.9v-277h-99.82zm-130.54-5.91c-45.86 1.05-83 46.73-54.12 95.75l.03.03 19.72 26.4c-33.67 18.57-58.1 42.49-56.53 83.38 4.04 61.15 48.1 80.06 96.65 82.34 25.16-1.46 50.09-3.41 68.16-20.72l11.72 15.72h54.91c-11.18-14.9-22.68-30.27-34.22-45.72 23.1-25.95 22.49-62.49 21.72-96.5h-44.91c-.81 19.03 2.25 53.15-6.28 57.07a38974.36 38974.36 0 0 0-47.28-63.13c22.32-17.68 41.96-37.01 41.09-68.81 3.12-45.42-23.83-63.09-63.84-65.63-2.29-.17-4.56-.24-6.82-.18zm5.75 42.09c7.95.26 22.07-.75 22.47 21.22-1.59 16.95-12.89 26.19-24.43 37.06-3.75-4.97-7.53-9.99-11.16-14.78-3.01-3.97-6.38-7.7-8.94-11.72-.99-3.94-.79-7.13-.84-11.03-.17-3.97 4.19-18.89 22.9-20.75zm-13 116.44l52.5 70.28c-5.53 9.06-19.45 14.34-39.5 15.28-17.22-.4-44.37-5.61-47.4-36.03-.25-21.34 19.47-39.27 34.4-49.53z" fill="#fff"/></g></svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 529 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 631 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 631 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 779 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 644 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 682 B

@ -0,0 +1 @@
<svg width="204px" height="204px" viewBox="0 0 204 204" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"><g><circle fill="#235FD3" cx="102" cy="102" r="102"></circle><g transform="translate(83.000000, 38.000000)" fill="#FFFFFF" fill-rule="nonzero"><path d="M88.5,51.3 L88.5,51.3 C90.8,51.3 92.6,49.5 92.6,47.2 L92.6,31.1 C92.6,28.8 90.8,27 88.5,27 L88.5,27 C86.2,27 84.4,28.8 84.4,31.1 L84.4,47.3 C84.4,49.5 86.2,51.3 88.5,51.3 Z"></path><path d="M67.5,51.3 L67.5,51.3 C69.8,51.3 71.6,49.5 71.6,47.2 L71.6,15.6 C71.6,13.3 69.8,11.5 67.5,11.5 L67.5,11.5 C65.2,11.5 63.4,13.3 63.4,15.6 L63.4,47.2 C63.4,49.5 65.2,51.3 67.5,51.3 Z"></path><path d="M46.5,51.3 L46.5,51.3 C48.8,51.3 50.6,49.5 50.6,47.2 L50.6,4.5 C50.6,2.2 48.8,0.4 46.5,0.4 L46.5,0.4 C44.2,0.4 42.4,2.2 42.4,4.5 L42.4,47.3 C42.4,49.5 44.3,51.3 46.5,51.3 Z"></path><path d="M25.5,51.3 L25.5,51.3 C27.8,51.3 29.6,49.5 29.6,47.2 L29.6,31.1 C29.6,28.8 27.8,27 25.5,27 L25.5,27 C23.2,27 21.4,28.8 21.4,31.1 L21.4,47.3 C21.4,49.5 23.3,51.3 25.5,51.3 Z"></path><path d="M4.5,51.3 L4.5,51.3 C6.8,51.3 8.6,49.5 8.6,47.2 L8.6,20.6 C8.6,18.3 6.8,16.5 4.5,16.5 L4.5,16.5 C2.2,16.5 0.4,18.3 0.4,20.6 L0.4,47.2 C0.4,49.5 2.3,51.3 4.5,51.3 Z"></path></g><g transform="translate(29.000000, 40.000000)" fill="#FFFFFF" fill-rule="nonzero"><path d="M2.6,39.7 C0.2,33.3 -0.6,26.2 0.6,19 C1.8,11.8 4.9,5.5 9.2,0.3 C11.7,6.7 12.5,13.7 11.3,21 C10.1,28.2 7,34.5 2.6,39.7 Z"></path><path d="M2.7,39.7 C5.5,33.5 9.9,27.9 15.8,23.6 C21.7,19.4 28.4,17.1 35.1,16.5 C32.4,22.8 28,28.4 22,32.6 C16.1,36.8 9.4,39.2 2.7,39.7 Z"></path></g><path d="M116.6,122.6 L122.1,119.8 L116.7,117.1 C117.7,115.5 119.4,114.4 121.5,114.4 C124.6,114.4 127.1,116.9 127.1,120 C127.1,123.1 124.6,125.6 121.5,125.6 C119.4,125.6 117.6,124.3 116.6,122.6 Z" fill="#FFFFFF" fill-rule="nonzero"></path><path d="M179.6,93.4 L195.5,93.4 C195.5,139.4 158.2,176.7 112.2,176.7 C109.5,176.7 106.9,176.6 104.3,176.3 C146.6,172.3 179.6,136.7 179.6,93.4 Z" fill="#FFFFFF" fill-rule="nonzero" opacity="0.32"></path><path d="M163.8,93.4 L179.7,93.4 C179.7,136.7 146.6,172.3 104.4,176.3 C101.7,176 99.1,175.7 96.5,175.2 C134.8,167.8 163.8,134 163.8,93.4 Z" fill="#FFFFFF" fill-rule="nonzero" opacity="0.56"></path><path d="M147.9,93.4 L163.8,93.4 C163.8,134 134.8,167.8 96.4,175.2 C93.7,174.7 91.1,174 88.5,173.3 C122.8,163 147.9,131.1 147.9,93.4 Z" fill="#FFFFFF" fill-rule="nonzero" opacity="0.8"></path><path d="M94.4,93.4 L65.9,93.4 C51.4,93.4 38.6,86 31.1,74.7 C29.8,80.7 29,87 29,93.4 L29,93.4 C29,114.9 37.1,134.5 50.5,149.2 L33.6,170.6 C43.2,174.5 53.7,176.6 64.7,176.6 C73,176.6 81,175.4 88.5,173.1 C122.9,162.9 148,131 148,93.3 L94.4,93.3 L94.4,93.4 Z M118.5,130 C112.8,130 108.2,125.4 108.2,119.7 C108.2,114 112.8,109.4 118.5,109.4 C124.2,109.4 128.8,114 128.8,119.7 C128.8,125.4 124.2,130 118.5,130 Z" fill="#FFFFFF" fill-rule="nonzero"></path></g></g></svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="213px" height="213px" viewBox="0 0 213 213" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 47.1 (45422) - http://www.bohemiancoding.com/sketch -->
<title>Group</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="Group">
<rect id="Rectangle" fill="#FFFFFF" x="0" y="0" width="213" height="213"></rect>
<path d="M174.043015,18.98918 C174.865266,17.9533389 176.532105,18.5340801 176.532105,19.8574997 L176.532105,193.145888 C176.532105,193.917884 175.908088,194.541901 175.136093,194.541901 L150.012062,194.541901 C149.054397,194.541901 148.162345,194.050504 147.651405,193.239423 L127.728915,161.67419 L99.1343972,116.365218 C98.5006076,115.361486 98.5704083,114.067382 99.3075028,113.139034 L174.043015,18.98918 Z M82.3247353,134.859448 C83.1469864,133.823607 84.815221,134.405744 84.815221,135.727768 L84.815221,193.14575 C84.815221,193.917744 84.1898074,194.541761 83.4192087,194.541761 L37.865935,194.541761 C36.6988688,194.541761 36.0469311,193.193213 36.7728573,192.278825 L82.3247353,134.859448 Z" id="Mark" fill="#EF4546" fill-rule="nonzero"></path>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 384 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 623 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 950 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

@ -1,6 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 612 612">
<g sodipodi:docname="twitter_bootstrap_logo.svg" inkscape:version="0.48.1 r9760" xmlns:svg="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape">
<path fill="#563D7C" d="M612 510c0 56.1-45.9 102-102 102H102C45.9 612 0 566.1 0 510V102C0 45.9 45.9 0 102 0h408c56.1 0 102 45.9 102 102v408z"/>
<path fill="#FFF" d="M166.3 133h173.5c32 0 57.7 7.3 77 22s29 36.8 29 66.5c0 18-4.4 33.4-13.2 46.2-8.8 12.8-21.4 22.8-37.8 29.8v1c22 4.7 38.7 15.1 50 31.2 11.3 16.2 17 36.4 17 60.8 0 14-2.5 27.1-7.5 39.2-5 12.2-12.8 22.7-23.5 31.5s-24.3 15.8-41 21-36.5 7.8-59.5 7.8h-164V133zm62.5 149.5h102c15 0 27.5-4.2 37.5-12.8s15-20.8 15-36.8c0-18-4.5-30.7-13.5-38s-22-11-39-11h-102v98.6zm0 156.5h110.5c19 0 33.8-4.9 44.2-14.8 10.5-9.8 15.8-23.8 15.8-41.8 0-17.7-5.2-31.2-15.8-40.8s-25.2-14.2-44.2-14.2H228.8V439z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="39px" height="40px" viewBox="0 0 39 40" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="Brightspot-Logo" transform="translate(-239.000000, -2.000000)" fill="#EE2C42" fill-rule="nonzero">
<path d="M258.7,8.3 C266.3,8.3 272.5,14.5 272.5,22.1 C272.5,29.7 266.3,35.9 258.7,35.9 C251.1,35.9 244.9,29.7 244.9,22.1 C244.9,14.5 251.1,8.3 258.7,8.3 Z M258.7,2.8 C248,2.8 239.4,11.4 239.4,22.1 C239.4,32.8 248,41.4 258.7,41.4 C269.4,41.4 278,32.8 278,22.1 C278,11.5 269.4,2.8 258.7,2.8 Z" id="Shape"></path>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 732 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 210 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 274 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 743 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 642 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 706 B

After

Width:  |  Height:  |  Size: 763 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 678 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 678 B

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 714 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Before

Width:  |  Height:  |  Size: 100 B

After

Width:  |  Height:  |  Size: 100 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 270 B

@ -0,0 +1 @@
<svg id="svg" version="1.1" width="400" height="400" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" ><g id="svgg"><path id="path0" d="M23.636 166.547 L 23.636 170.455 37.614 170.462 C 56.645 170.473,60.741 171.473,67.440 177.739 C 79.681 189.190,77.786 215.757,64.102 224.538 C 58.998 227.813,56.092 228.360,43.636 228.386 L 32.500 228.409 32.382 204.886 L 32.265 181.364 27.950 181.364 L 23.636 181.364 23.636 208.907 L 23.636 236.451 39.659 236.252 C 57.898 236.026,59.627 235.766,66.818 232.173 C 91.113 220.032,90.405 178.681,65.695 166.566 C 59.147 163.355,57.081 163.062,39.432 162.839 L 23.636 162.639 23.636 166.547 M119.761 176.932 C 101.953 220.460,96.313 234.362,96.075 235.310 C 95.813 236.356,95.842 236.364,100.068 236.364 L 104.326 236.364 116.800 204.432 C 128.195 175.265,132.727 163.452,132.727 162.924 C 132.727 162.816,131.117 162.727,129.150 162.727 L 125.572 162.727 119.761 176.932 M165.909 162.958 C 165.909 163.102,169.036 168.479,172.858 174.906 C 176.680 181.333,181.633 189.695,183.866 193.488 C 186.099 197.282,188.069 200.297,188.244 200.189 C 188.770 199.864,192.275 193.598,192.249 193.028 C 192.236 192.738,188.394 185.852,183.711 177.727 L 175.196 162.955 170.553 162.825 C 167.999 162.754,165.909 162.814,165.909 162.958 M212.045 177.552 C 207.295 185.691,201.213 196.169,198.528 200.835 L 193.647 209.318 193.642 222.841 L 193.636 236.364 197.955 236.364 L 202.273 236.364 202.273 222.896 L 202.273 209.429 216.355 186.078 L 230.437 162.727 225.559 162.740 L 220.682 162.752 212.045 177.552 M292.592 163.014 C 292.416 163.190,292.267 173.271,292.260 185.417 C 292.242 218.638,291.095 224.471,283.864 228.132 C 279.387 230.398,268.901 229.902,264.147 227.199 C 263.303 226.719,262.564 226.386,262.504 226.459 C 262.445 226.531,261.933 228.002,261.366 229.726 L 260.336 232.861 261.418 233.698 C 268.560 239.222,285.856 238.426,292.872 232.250 C 299.716 226.226,300.682 220.722,300.682 187.727 L 300.682 162.955 296.797 162.825 C 294.660 162.753,292.768 162.838,292.592 163.014 M339.871 163.663 C 328.552 166.445,322.955 173.121,322.955 183.840 C 322.955 195.205,327.009 198.524,347.500 203.931 C 364.158 208.327,368.715 212.471,366.331 221.055 C 363.402 231.603,340.332 232.131,326.800 221.960 C 325.287 220.822,323.986 219.967,323.909 220.059 C 323.833 220.152,322.895 221.740,321.826 223.590 L 319.882 226.952 320.964 227.808 C 340.724 243.430,373.115 238.752,376.054 219.850 C 378.081 206.808,371.838 201.037,349.663 195.454 C 334.781 191.707,331.847 189.576,331.833 182.500 C 331.807 169.658,351.643 165.701,366.296 175.626 C 367.633 176.531,368.786 177.273,368.858 177.273 C 369.023 177.273,372.727 171.048,372.727 170.769 C 372.727 170.272,366.627 166.650,363.790 165.464 C 357.059 162.649,347.060 161.896,339.871 163.663 M136.038 177.095 C 133.217 184.514,132.974 182.398,138.146 195.455 C 140.671 201.830,142.639 207.301,142.519 207.614 C 142.355 208.042,140.068 208.182,133.229 208.182 L 124.156 208.182 123.254 210.568 C 122.757 211.881,122.209 213.313,122.036 213.750 C 121.741 214.495,122.447 214.545,133.123 214.545 C 144.456 214.545,144.528 214.552,145.158 215.568 C 145.507 216.131,147.592 221.040,149.793 226.477 L 153.793 236.364 158.313 236.364 C 162.401 236.364,162.812 236.288,162.608 235.568 C 162.484 235.131,157.113 221.886,150.672 206.136 C 144.232 190.386,138.611 176.602,138.182 175.504 L 137.401 173.508 136.038 177.095 M237.273 230.909 L 237.273 236.364 240.909 236.364 L 244.545 236.364 244.545 230.909 L 244.545 225.455 240.909 225.455 L 237.273 225.455 237.273 230.909 " stroke="none" fill="#ff5f4c" fill-rule="evenodd"></path></g></svg>

After

Width:  |  Height:  |  Size: 3.5 KiB

@ -1,4 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg height="72" version="1.1" width="72" xmlns="http://www.w3.org/2000/svg">
<path d="m33.479 27.059-8.942 6.879c-0.917-3.44-3.899-5.963-7.568-5.963h-6.4199v15.822h6.4199c3.6688 0 6.8785-2.5234 7.5664-5.9629l8.9434 6.8789 8.9434-6.8789v5.9629h10.088v-3.2109h-6.6484v-12.611h-3.6699v5.9609l-8.4844 6.8809-1.835-1.606 4.129-3.211 4.3555-3.4395-2.5215-2.0625-8.4844 6.6484-1.834-1.6055 8.4844-6.4199-2.5234-2.0625zm-19.49 4.125h2.752c0.57325 0 1.1325 0.13072 1.6484 0.36719 0.51592 0.23647 0.9874 0.57983 1.3887 1.0098 0.40128 0.42994 0.73164 0.94498 0.96094 1.5254s0.35742 1.2262 0.35742 1.9141c0 0.63058-0.11479 1.2467-0.32617 1.8164-0.21139 0.56967-0.51931 1.0928-0.90625 1.5371-0.38694 0.44427-0.85223 0.81007-1.3789 1.0645-0.52667 0.25438-1.1136 0.39648-1.7441 0.39648h-2.752v-9.6309zm49.987 9.4031v3.2102h-10.089v-15.822h3.6688v12.611h6.4204zm-27.976-40.587c-19.72 0-36 16.28-36 36s16.051 36 36 36 36-16.051 36-36-16.28-36-36-36zm0 3.6699c2.2356-0.000025 4.4168 0.22437 6.5234 0.6543 2.1067 0.42993 4.1395 1.064 6.0742 1.8809 1.9347 0.81688 3.7725 1.8177 5.4922 2.9785s3.3214 2.4816 4.7832 3.9434 2.7825 3.0635 3.9434 4.7832c1.1608 1.7197 2.1616 3.5575 2.9785 5.4922 0.81688 1.9347 1.4509 3.9676 1.8809 6.0742 0.42994 2.1067 0.6543 4.2878 0.6543 6.5234s-0.22436 4.4168-0.6543 6.5234c-0.42994 2.1067-1.064 4.1395-1.8809 6.0742-0.81688 1.9347-1.8177 3.7725-2.9785 5.4922s-2.4816 3.3214-3.9434 4.7832-3.0635 2.7825-4.7832 3.9434c-1.7197 1.1608-3.5575 2.1616-5.4922 2.9785-1.9347 0.81688-3.9676 1.4509-6.0742 1.8809-2.1067 0.42994-4.2878 0.6543-6.5234 0.6543s-4.4168-0.22436-6.5234-0.6543c-2.107-0.427-4.14-1.061-6.075-1.878-1.934-0.817-3.772-1.818-5.492-2.979-1.72-1.16-3.321-2.481-4.783-3.943s-2.783-3.063-3.9434-4.783c-1.1608-1.72-2.1616-3.558-2.9785-5.492-0.8169-1.935-1.4509-3.968-1.8809-6.075-0.4299-2.106-0.6543-4.287-0.6543-6.523s0.2244-4.417 0.6543-6.523c0.4299-2.107 1.064-4.14 1.8809-6.075 0.8169-1.934 1.8177-3.772 2.9785-5.492 1.1604-1.72 2.4814-3.321 3.9434-4.783s3.063-2.783 4.783-3.9434c1.72-1.1608 3.558-2.1616 5.492-2.9785 1.935-0.8169 3.968-1.4509 6.075-1.8809 2.106-0.4299 4.287-0.6543 6.523-0.6543z" fill="#007db8" />
</svg>

Before

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 765 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

@ -0,0 +1,18 @@
<svg width="2491" height="1415" viewBox="0 0 2491 1415" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M1435.43 446.797V451.68H1440.31H1658.73V675.068V679.951H1663.61H1776.51C1829.22 679.951 1883.37 670.568 1933.23 653.677L1933.23 653.677C1957.71 645.37 1985.28 633.792 2009.61 619.154L2014.29 616.338L2010.97 612.001C1980.15 571.768 1964.28 520.759 1959.61 470.186L1959.61 470.185C1953.22 401.14 1967.29 312.037 2013.21 258.936L2033.6 235.351L2057.9 254.889L2057.9 254.891C2127.76 311.016 2185.96 389.028 2196.19 477.408L2196.86 483.166L2202.42 481.53C2286.19 456.892 2384.32 462.819 2457.7 505.167L2460.14 500.938L2457.7 505.167L2484.34 520.541L2470.32 547.911C2408.38 668.793 2278.67 706.796 2150.35 700.075L2146.87 699.892L2145.57 703.132C1953.12 1182.47 1534.27 1409.57 1025.52 1409.57C763.051 1409.57 523.044 1311.52 386.405 1079.49L386.398 1079.47L384.24 1075.83L364.29 1035.23C318.142 933.144 302.775 821.231 313.192 709.281L315.932 679.951H502.441H507.324V675.068V451.68H725.732H730.615V446.797V228.379H1172.34H1177.23V223.496V5.07812H1435.43V446.797Z" fill="#364548" stroke="black" stroke-width="9.76562"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M2163.77 531.25C2178.74 414.883 2091.66 323.486 2037.66 280.088C1975.42 352.041 1965.75 540.615 2063.39 620.01C2008.9 668.408 1894.08 712.275 1776.51 712.275H345.41C333.984 835 355.527 948.018 404.736 1044.75L421.016 1074.53C431.323 1092.01 442.587 1108.91 454.756 1125.16C513.594 1128.94 567.842 1130.23 617.471 1129.14H617.49C715.019 1126.99 794.6 1115.47 854.912 1094.57C859.176 1093.24 863.788 1093.63 867.774 1095.64C871.76 1097.65 874.806 1101.14 876.269 1105.36C877.731 1109.58 877.495 1114.2 875.611 1118.25C873.727 1122.3 870.342 1125.45 866.172 1127.05C858.144 1129.84 849.785 1132.44 841.152 1134.91H841.123C793.633 1148.48 742.705 1157.6 677.002 1161.65C680.908 1161.72 672.939 1162.24 672.92 1162.24C670.684 1162.38 667.871 1162.71 665.625 1162.82C639.766 1164.28 611.855 1164.58 583.32 1164.58C552.109 1164.58 521.377 1163.99 487.012 1162.24L486.133 1162.82C605.371 1296.85 791.816 1377.23 1025.53 1377.23C1520.14 1377.23 1939.67 1157.97 2125.45 665.732C2257.25 679.258 2383.92 645.645 2441.53 533.164C2349.76 480.205 2231.73 497.09 2163.77 531.25" fill="#22A0C8"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M2163.77 531.25C2178.74 414.883 2091.66 323.486 2037.66 280.088C1975.42 352.041 1965.75 540.615 2063.39 620.01C2008.9 668.408 1894.08 712.275 1776.51 712.275H430.156C424.316 900.225 494.063 1042.89 617.461 1129.14H617.49C715.02 1126.99 794.6 1115.47 854.912 1094.57C859.176 1093.24 863.788 1093.63 867.774 1095.64C871.76 1097.65 874.806 1101.14 876.269 1105.36C877.731 1109.58 877.495 1114.2 875.611 1118.25C873.727 1122.3 870.342 1125.45 866.172 1127.05C858.145 1129.84 849.785 1132.44 841.152 1134.91H841.123C793.633 1148.48 738.33 1158.77 672.627 1162.82C672.607 1162.82 671.035 1161.31 671.016 1161.31C839.346 1247.66 1083.42 1247.34 1363.25 1139.85C1677.02 1019.31 1969 789.658 2172.72 526.992C2169.66 528.379 2166.67 529.795 2163.77 531.25" fill="#37B1D9"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M348.096 861.387C356.982 927.129 376.221 988.682 404.736 1044.75L421.016 1074.53C431.322 1092.01 442.586 1108.92 454.756 1125.16C513.604 1128.94 567.852 1130.23 617.49 1129.14C715.02 1126.99 794.6 1115.47 854.912 1094.57C859.176 1093.24 863.788 1093.63 867.774 1095.64C871.76 1097.65 874.806 1101.14 876.269 1105.36C877.731 1109.58 877.495 1114.2 875.611 1118.25C873.727 1122.3 870.342 1125.45 866.172 1127.05C858.145 1129.84 849.785 1132.44 841.152 1134.91H841.123C793.633 1148.48 738.623 1158.18 672.92 1162.25C670.664 1162.38 666.729 1162.41 664.453 1162.54C638.613 1163.98 610.986 1164.87 582.441 1164.87C551.24 1164.87 519.326 1164.28 484.98 1162.53C604.219 1296.55 791.816 1377.23 1025.53 1377.23C1448.96 1377.23 1817.36 1216.5 2031.18 861.387H348.096Z" fill="#1B81A5"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M443.037 861.387C468.35 976.816 529.18 1067.43 617.49 1129.14C715.02 1126.99 794.6 1115.47 854.912 1094.57C859.176 1093.24 863.788 1093.63 867.774 1095.64C871.76 1097.65 874.806 1101.14 876.269 1105.36C877.731 1109.58 877.495 1114.2 875.611 1118.25C873.727 1122.3 870.342 1125.45 866.172 1127.05C858.145 1129.84 849.785 1132.44 841.152 1134.91H841.123C793.633 1148.48 737.461 1158.18 671.748 1162.25C840.068 1248.57 1083.44 1247.33 1363.25 1139.85C1532.53 1074.81 1695.45 977.998 1841.61 861.387H443.037Z" fill="#1D91B4"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M539.648 484.014H733.184V677.549H539.648V484.014ZM555.771 500.146H571.045V661.426H555.771V500.146ZM584.482 500.146H600.371V661.426H584.492V500.146H584.482ZM613.799 500.146H629.688V661.426H613.799V500.146ZM643.135 500.146H659.014V661.426H643.135V500.146ZM672.461 500.146H688.34V661.426H672.461V500.146ZM701.777 500.146H717.061V661.426H701.777V500.146ZM762.949 260.713H956.494V454.238H762.939V260.713H762.949ZM779.082 276.846H794.346V438.115H779.082V276.846ZM807.793 276.846H823.672V438.115H807.803V276.846H807.793ZM837.109 276.846H852.988V438.115H837.109V276.846ZM866.436 276.846H882.314V438.115H866.436V276.846ZM895.762 276.846H911.65V438.115H895.762V276.846ZM925.078 276.846H940.371V438.115H925.078V276.846Z" fill="#23A3C2"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M762.949 486.014H956.494V679.549H762.939V486.014H762.949ZM779.082 502.146H794.346V663.426H779.082V502.146ZM807.793 502.146H823.672V663.426H807.803V502.146H807.793ZM837.109 502.146H852.988V663.426H837.109V502.146ZM866.436 502.146H882.314V663.426H866.436V502.146ZM895.762 502.146H911.65V663.426H895.762V502.146ZM925.078 502.146H940.371V663.426H925.078V502.146Z" fill="#34BBDE"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M986.26 484.014H1179.79V677.549H986.26V484.014ZM1002.38 500.146H1017.65V661.426H1002.38V500.146ZM1031.09 500.146H1046.97V661.426H1031.09V500.146ZM1060.42 500.146H1076.3V661.426H1060.42V500.146ZM1089.75 500.146H1105.63V661.426H1089.75V500.146ZM1119.06 500.146H1134.96V661.426H1119.06V500.146ZM1148.39 500.146H1163.66V661.426H1148.39V500.146V500.146Z" fill="#23A3C2"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M986.26 260.713H1179.79V454.238H986.26V260.713ZM1002.38 276.846H1017.65V438.115H1002.38V276.846ZM1031.09 276.846H1046.97V438.115H1031.09V276.846ZM1060.42 276.846H1076.3V438.115H1060.42V276.846ZM1089.75 276.846H1105.63V438.115H1089.75V276.846ZM1119.06 276.846H1134.96V438.115H1119.06V276.846ZM1148.39 276.846H1163.66V438.115H1148.39V276.846V276.846ZM1209.56 484.014H1403.1V677.549H1209.56V484.014ZM1225.69 500.146H1240.96V661.426H1225.69V500.146ZM1254.4 500.146H1270.28V661.426H1254.4V500.146ZM1283.72 500.146H1299.6V661.426H1283.72V500.146ZM1313.05 500.146H1328.94V661.426H1313.05V500.146ZM1342.37 500.146H1358.26V661.426H1342.37V500.146ZM1371.7 500.146H1386.97V661.426H1371.7V500.146Z" fill="#34BBDE"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M1209.56 260.713H1403.1V454.238H1209.56V260.713ZM1225.69 276.846H1240.96V438.115H1225.69V276.846ZM1254.4 276.846H1270.28V438.115H1254.4V276.846ZM1283.72 276.846H1299.6V438.115H1283.72V276.846ZM1313.05 276.846H1328.94V438.115H1313.05V276.846ZM1342.37 276.846H1358.26V438.115H1342.37V276.846ZM1371.7 276.846H1386.97V438.115H1371.7V276.846Z" fill="#23A3C2"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M1209.56 37.4023H1403.1V230.957H1209.56V37.4023ZM1225.69 53.5254H1240.96V214.814H1225.69V53.5156V53.5254ZM1254.4 53.5254H1270.28V214.814H1254.4V53.5156V53.5254ZM1283.72 53.5254H1299.6V214.814H1283.72V53.5156V53.5254ZM1313.05 53.5254H1328.94V214.814H1313.05V53.5156V53.5254ZM1342.37 53.5254H1358.26V214.814H1342.37V53.5156V53.5254ZM1371.7 53.5254H1386.97V214.814H1371.7V53.5156V53.5254Z" fill="#34BBDE"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M1432.86 484.014H1626.4V677.549H1432.86V484.014ZM1448.97 500.146H1464.26V661.426H1448.98V500.146H1448.97ZM1477.69 500.146H1493.57V661.426H1477.7V500.146H1477.69ZM1507.02 500.146H1522.91V661.426H1507.02V500.146ZM1536.34 500.146H1552.23V661.426H1536.34V500.146ZM1565.67 500.146H1581.55V661.426H1565.67V500.146ZM1594.99 500.146H1610.26V661.426H1594.99V500.146Z" fill="#23A3C2"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M944.375 991.328C951.448 991.234 958.468 992.545 965.03 995.187C971.591 997.829 977.562 1001.75 982.597 1006.72C987.631 1011.68 991.628 1017.6 994.355 1024.13C997.083 1030.66 998.487 1037.66 998.486 1044.73C998.484 1051.8 997.078 1058.81 994.348 1065.33C991.618 1071.86 987.619 1077.77 982.583 1082.74C977.546 1087.71 971.574 1091.62 965.012 1094.26C958.449 1096.9 951.428 1098.21 944.356 1098.12C930.32 1097.92 916.924 1092.21 907.068 1082.22C897.211 1072.22 891.686 1058.75 891.689 1044.71C891.691 1030.67 897.221 1017.2 907.081 1007.21C916.942 997.222 930.339 991.515 944.375 991.328Z" fill="#D3ECEC"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M944.375 1006.47C949.258 1006.47 953.916 1007.39 958.213 1009.06C955.248 1010.78 952.932 1013.43 951.624 1016.6C950.315 1019.77 950.087 1023.28 950.973 1026.6C951.86 1029.91 953.813 1032.83 956.53 1034.93C959.247 1037.02 962.577 1038.15 966.006 1038.16C971.914 1038.16 977.041 1034.89 979.697 1030.05C982.842 1037.62 983.467 1046.01 981.48 1053.97C979.492 1061.93 974.998 1069.04 968.66 1074.25C962.323 1079.45 954.478 1082.48 946.285 1082.89C938.092 1083.3 929.986 1081.06 923.163 1076.51C916.34 1071.95 911.162 1065.33 908.395 1057.6C905.628 1049.88 905.418 1041.47 907.796 1033.62C910.174 1025.77 915.013 1018.9 921.6 1014.01C928.187 1009.12 936.172 1006.48 944.375 1006.47V1006.47ZM0 880.684H2483.66C2429.59 866.973 2312.57 848.437 2331.87 777.559C2233.53 891.348 1996.39 857.393 1936.53 801.289C1869.89 897.949 1481.9 861.201 1454.84 785.898C1371.29 883.955 1112.39 883.955 1028.84 785.898C1001.76 861.201 613.779 897.949 547.129 801.279C487.285 857.393 250.156 891.348 151.816 777.568C171.113 848.437 54.0918 866.973 0 880.693" fill="#364548"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M1086.3 1376.07C954.072 1313.33 881.504 1228.03 841.123 1134.92C792.002 1148.94 732.969 1157.9 664.365 1161.75C638.525 1163.19 611.338 1163.94 582.822 1163.94C549.932 1163.94 515.273 1162.96 478.887 1161.04C600.146 1282.23 749.316 1375.53 1025.53 1377.23C1045.92 1377.23 1066.15 1376.84 1086.3 1376.07" fill="#BDD9D7"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M890.234 1220.84C871.943 1196.01 854.199 1164.79 841.152 1134.9C792.031 1148.94 732.979 1157.9 664.365 1161.76C711.494 1187.33 778.887 1211.04 890.244 1220.84" fill="#D3ECEC"/>
</svg>

After

Width:  |  Height:  |  Size: 10 KiB

Some files were not shown because too many files have changed in this diff Show More