Added support for self-supplied keys (e.g. vanity addresses). Embedded fonts for more reliable printing.
The "Print Front" tab now includes a link to disable random address generation so you supply your own key or vanity address. An ubuntu font is now embedded. All cryptographic javascript functions were re-copied over from bitaddress.org to make doing a "diff" easier, since bitaddress recently overhauled its code formatting.
This commit is contained in:
parent
4e5b4133ef
commit
0ac0aed874
8 changed files with 5019 additions and 4555 deletions
61
README
61
README
|
@ -3,27 +3,66 @@ If you're on already at https://github.com/cantonbecker/bitcoinpaperwallet
|
||||||
Then just look for the button that says "Download ZIP". Look to your right -->
|
Then just look for the button that says "Download ZIP". Look to your right -->
|
||||||
*******************************************************************************
|
*******************************************************************************
|
||||||
|
|
||||||
|
|
||||||
*** bitcoinpaperwallet ***
|
*** bitcoinpaperwallet ***
|
||||||
|
|
||||||
is a fork of bitaddress.org, the JavaScript Client-Side Bitcoin Wallet Generator
|
This project is a fork of bitaddress.org, the original trustworthy
|
||||||
|
JavaScript powered offline bitcoin address generator.
|
||||||
|
|
||||||
This removes much of the (albeit excellent) functionality from
|
Here's how this project differs:
|
||||||
bitaddress.org to create a streamined step-by-step 2 sided tri-fold
|
|
||||||
paper wallet printer for novices. (Tamper-resistant features abound.)
|
|
||||||
Includes a tool to help users "calibrate" their printer
|
|
||||||
for more consistent output between different browsers. Renamed main
|
|
||||||
.html file to avoid confusion with bitaddress.org. Moved images into
|
|
||||||
their own directory since they are quite large and might not do
|
|
||||||
well encoded into the JS anymore.
|
|
||||||
|
|
||||||
|
1) This generator is ONLY for printing paper wallets. Use bitaddress.org if
|
||||||
|
you need to bulk-generate addresses, etc.
|
||||||
|
|
||||||
|
2) This attractive paper wallet design is two-sided and folds up to
|
||||||
|
hide the private key. Optional tamper-evident hologram tape can be purchased
|
||||||
|
to provide extra security against snooping.
|
||||||
|
|
||||||
|
3) A tool is included to help calibrate the printer output for proper
|
||||||
|
sizing and two-sided alignment.
|
||||||
|
|
||||||
|
4) Images and resources have been moved out of the .html file (where they were
|
||||||
|
base-64 encoded) and into an images directory to make the code easier to review.
|
||||||
|
|
||||||
|
All cryptographic functions are verifiably identical to those in bitaddress.org.
|
||||||
|
(Run a "diff" between this project and bitaddress.org if you want to be sure.)
|
||||||
|
|
||||||
|
You can also bypass the random key generator and supply your own keys or so-called
|
||||||
|
"vanity addresses".
|
||||||
|
|
||||||
|
*** HOW TO USE THIS GENERATOR ***
|
||||||
|
|
||||||
|
1) Extract the ZIP file
|
||||||
|
2) Open up the 'generate-wallet.html' file with your web browser.
|
||||||
|
|
||||||
|
Rendering and printing seems to work best using:
|
||||||
|
|
||||||
|
OS X: Safari or Chrome or Firefox
|
||||||
|
Windows: Chrome or Firefox
|
||||||
|
Linux: Firefox
|
||||||
|
|
||||||
|
*** HOW TO VERIFY THE AUTHENTICITY OF THIS DOWNLOAD ***
|
||||||
|
|
||||||
|
After downloading the ZIP package for this generator, you should find a file
|
||||||
|
named generate-wallet.html.sig which you can use to:
|
||||||
|
|
||||||
|
* Verify that generate-wallet.html hasn't been tampered with, and
|
||||||
|
* Get proof that it really was authored by Canton Becker (canton@gmail.com)
|
||||||
|
whose GPG public key and fingerprint can be confirmed at http://cantonbecker.com
|
||||||
|
|
||||||
|
For example, if you have GPG installed, you can type:
|
||||||
|
gpg --verify --with-fingerprint generate-wallet.html.sig generate-wallet.html
|
||||||
|
|
||||||
|
And then verify the signature's fingerprint against Canton Becker's published signatures.
|
||||||
|
|
||||||
- Canton Becker
|
- Canton Becker
|
||||||
http://cantonbecker.com
|
http://cantonbecker.com
|
||||||
canton@gmail.com
|
canton@gmail.com
|
||||||
|
|
||||||
--- original bitaddress.org README continues below ---
|
|
||||||
|
|
||||||
|
----------------------------------------------------------
|
||||||
|
--- The original bitaddress.org README continues below ---
|
||||||
|
----------------------------------------------------------
|
||||||
|
|
||||||
Now Bitcoin addresses and their corresponding private key can be conveniently
|
Now Bitcoin addresses and their corresponding private key can be conveniently
|
||||||
generated in a web browser.
|
generated in a web browser.
|
||||||
|
|
|
@ -9,7 +9,9 @@
|
||||||
Contact: Canton Becker / canton@gmail.com
|
Contact: Canton Becker / canton@gmail.com
|
||||||
|
|
||||||
generate-wallet.html is always distributed with a PGP signature "generate-wallet.html.sig" which you
|
generate-wallet.html is always distributed with a PGP signature "generate-wallet.html.sig" which you
|
||||||
can use to validate the integrity and authorship of this file.
|
can use to validate the integrity and authorship of this file like so:
|
||||||
|
|
||||||
|
gpg --verify --with-fingerprint generate-wallet.html.sig generate-wallet.html
|
||||||
|
|
||||||
Wallet design and portions of this code are ©Copyright 2013 Canton Becker and bitaddress.org
|
Wallet design and portions of this code are ©Copyright 2013 Canton Becker and bitaddress.org
|
||||||
Other portions of this code are copyrighted by their respective authors - see below.
|
Other portions of this code are copyrighted by their respective authors - see below.
|
||||||
|
@ -46,6 +48,7 @@
|
||||||
window.BigInteger BSD License
|
window.BigInteger BSD License
|
||||||
window.QRCode MIT License
|
window.QRCode MIT License
|
||||||
window.Bitcoin MIT License
|
window.Bitcoin MIT License
|
||||||
|
window.Crypto_scrypt MIT License
|
||||||
ninja.(*) MIT License // lots of code from bitaddress.org
|
ninja.(*) MIT License // lots of code from bitaddress.org
|
||||||
parser.setUA GPLv2 & MIT // UAParser.js
|
parser.setUA GPLv2 & MIT // UAParser.js
|
||||||
|
|
||||||
|
@ -71,6 +74,7 @@
|
||||||
|
|
||||||
<title>Bitcoin Paper Wallet Generator</title>
|
<title>Bitcoin Paper Wallet Generator</title>
|
||||||
|
|
||||||
|
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
// Array.prototype.map function is in the public domain.
|
// Array.prototype.map function is in the public domain.
|
||||||
// Production steps of ECMA-262, Edition 5, 15.4.4.19
|
// Production steps of ECMA-262, Edition 5, 15.4.4.19
|
||||||
|
@ -130,7 +134,6 @@
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
/*!
|
/*!
|
||||||
* Crypto-JS v2.5.4 Crypto.js
|
* Crypto-JS v2.5.4 Crypto.js
|
||||||
|
@ -282,7 +285,6 @@
|
||||||
})();
|
})();
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
/*!
|
/*!
|
||||||
* Crypto-JS v2.5.4 SHA256.js
|
* Crypto-JS v2.5.4 SHA256.js
|
||||||
|
@ -420,7 +422,6 @@
|
||||||
|
|
||||||
})();
|
})();
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
/*!
|
/*!
|
||||||
* Crypto-JS v2.5.4 PBKDF2.js
|
* Crypto-JS v2.5.4 PBKDF2.js
|
||||||
|
@ -477,7 +478,6 @@
|
||||||
|
|
||||||
})();
|
})();
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
/*!
|
/*!
|
||||||
* Crypto-JS v2.5.4 HMAC.js
|
* Crypto-JS v2.5.4 HMAC.js
|
||||||
|
@ -523,7 +523,6 @@
|
||||||
|
|
||||||
})();
|
})();
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
/*!
|
/*!
|
||||||
* Crypto-JS v2.5.4 AES.js
|
* Crypto-JS v2.5.4 AES.js
|
||||||
|
@ -933,7 +932,6 @@
|
||||||
|
|
||||||
})();
|
})();
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
/*!
|
/*!
|
||||||
* Crypto-JS 2.5.4 BlockModes.js
|
* Crypto-JS 2.5.4 BlockModes.js
|
||||||
|
@ -1346,7 +1344,6 @@
|
||||||
|
|
||||||
})(Crypto);
|
})(Crypto);
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
/*!
|
/*!
|
||||||
* Crypto-JS v2.0.0 RIPEMD-160
|
* Crypto-JS v2.0.0 RIPEMD-160
|
||||||
|
@ -1513,7 +1510,6 @@
|
||||||
}
|
}
|
||||||
})();
|
})();
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
/*!
|
/*!
|
||||||
* Random number generator with ArcFour PRNG
|
* Random number generator with ArcFour PRNG
|
||||||
|
@ -1627,7 +1623,7 @@
|
||||||
sr.pool = new Array();
|
sr.pool = new Array();
|
||||||
sr.pptr = 0;
|
sr.pptr = 0;
|
||||||
var t;
|
var t;
|
||||||
// Use webcrypto if available;
|
// Use webcrypto if available; -- Thanks to Gavin Andresen for this contribution
|
||||||
// see http://www.w3.org/2012/webcrypto/WebCryptoAPI/#Crypto-method-getRandomValues
|
// see http://www.w3.org/2012/webcrypto/WebCryptoAPI/#Crypto-method-getRandomValues
|
||||||
if (window.crypto && window.crypto.getRandomValues) {
|
if (window.crypto && window.crypto.getRandomValues) {
|
||||||
sr.pool = new Uint8Array(sr.poolSize);
|
sr.pool = new Uint8Array(sr.poolSize);
|
||||||
|
@ -1653,7 +1649,6 @@
|
||||||
}
|
}
|
||||||
})();
|
})();
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
//https://raw.github.com/bitcoinjs/bitcoinjs-lib/faa10f0f6a1fff0b9a99fffb9bc30cee33b17212/src/ecdsa.js
|
//https://raw.github.com/bitcoinjs/bitcoinjs-lib/faa10f0f6a1fff0b9a99fffb9bc30cee33b17212/src/ecdsa.js
|
||||||
/*!
|
/*!
|
||||||
|
@ -2300,7 +2295,6 @@
|
||||||
}
|
}
|
||||||
})();
|
})();
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
/*!
|
/*!
|
||||||
* Basic JavaScript BN library - subset useful for RSA encryption. v1.3
|
* Basic JavaScript BN library - subset useful for RSA encryption. v1.3
|
||||||
|
@ -3574,7 +3568,6 @@
|
||||||
|
|
||||||
})();
|
})();
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
//---------------------------------------------------------------------
|
//---------------------------------------------------------------------
|
||||||
// QRCode for JavaScript
|
// QRCode for JavaScript
|
||||||
|
@ -4611,7 +4604,6 @@
|
||||||
};
|
};
|
||||||
})();
|
})();
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
/*
|
/*
|
||||||
Copyright (c) 2011 Stefan Thomas
|
Copyright (c) 2011 Stefan Thomas
|
||||||
|
@ -4630,7 +4622,6 @@
|
||||||
'object' === typeof module ? module.exports : (window.Bitcoin = {})
|
'object' === typeof module ? module.exports : (window.Bitcoin = {})
|
||||||
);
|
);
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
//https://raw.github.com/bitcoinjs/bitcoinjs-lib/c952aaeb3ee472e3776655b8ea07299ebed702c7/src/base58.js
|
//https://raw.github.com/bitcoinjs/bitcoinjs-lib/c952aaeb3ee472e3776655b8ea07299ebed702c7/src/base58.js
|
||||||
(function (Bitcoin) {
|
(function (Bitcoin) {
|
||||||
|
@ -4705,7 +4696,6 @@
|
||||||
'undefined' != typeof Bitcoin ? Bitcoin : module.exports
|
'undefined' != typeof Bitcoin ? Bitcoin : module.exports
|
||||||
);
|
);
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
//https://raw.github.com/bitcoinjs/bitcoinjs-lib/09e8c6e184d6501a0c2c59d73ca64db5c0d3eb95/src/address.js
|
//https://raw.github.com/bitcoinjs/bitcoinjs-lib/09e8c6e184d6501a0c2c59d73ca64db5c0d3eb95/src/address.js
|
||||||
Bitcoin.Address = function (bytes) {
|
Bitcoin.Address = function (bytes) {
|
||||||
|
@ -4762,7 +4752,6 @@
|
||||||
return hash;
|
return hash;
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
//https://raw.github.com/bitcoinjs/bitcoinjs-lib/e90780d3d3b8fc0d027d2bcb38b80479902f223e/src/ecdsa.js
|
//https://raw.github.com/bitcoinjs/bitcoinjs-lib/e90780d3d3b8fc0d027d2bcb38b80479902f223e/src/ecdsa.js
|
||||||
Bitcoin.ECDSA = (function () {
|
Bitcoin.ECDSA = (function () {
|
||||||
|
@ -5048,7 +5037,6 @@
|
||||||
return ECDSA;
|
return ECDSA;
|
||||||
})();
|
})();
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
//https://raw.github.com/pointbiz/bitcoinjs-lib/9b2f94a028a7bc9bed94e0722563e9ff1d8e8db8/src/eckey.js
|
//https://raw.github.com/pointbiz/bitcoinjs-lib/9b2f94a028a7bc9bed94e0722563e9ff1d8e8db8/src/eckey.js
|
||||||
Bitcoin.ECKey = (function () {
|
Bitcoin.ECKey = (function () {
|
||||||
|
@ -5106,6 +5094,7 @@
|
||||||
ECKey.prototype.setCompressed = function (v) {
|
ECKey.prototype.setCompressed = function (v) {
|
||||||
this.compressed = !!v;
|
this.compressed = !!v;
|
||||||
if (this.pubPoint) this.pubPoint.compressed = this.compressed;
|
if (this.pubPoint) this.pubPoint.compressed = this.compressed;
|
||||||
|
return this;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -5175,6 +5164,7 @@
|
||||||
var ecPoint = ecparams.getCurve().decodePointHex(pub);
|
var ecPoint = ecparams.getCurve().decodePointHex(pub);
|
||||||
this.setCompressed(ecPoint.compressed);
|
this.setCompressed(ecPoint.compressed);
|
||||||
this.pubPoint = ecPoint;
|
this.pubPoint = ecPoint;
|
||||||
|
return this;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Sipa Private Key Wallet Import Format
|
// Sipa Private Key Wallet Import Format
|
||||||
|
@ -5311,7 +5301,6 @@
|
||||||
return ECKey;
|
return ECKey;
|
||||||
})();
|
})();
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
//https://raw.github.com/bitcoinjs/bitcoinjs-lib/09e8c6e184d6501a0c2c59d73ca64db5c0d3eb95/src/util.js
|
//https://raw.github.com/bitcoinjs/bitcoinjs-lib/09e8c6e184d6501a0c2c59d73ca64db5c0d3eb95/src/util.js
|
||||||
// Bitcoin utility functions
|
// Bitcoin utility functions
|
||||||
|
@ -5412,9 +5401,310 @@
|
||||||
*/
|
*/
|
||||||
sha256ripe160: function (data) {
|
sha256ripe160: function (data) {
|
||||||
return Crypto.RIPEMD160(Crypto.SHA256(data, { asBytes: true }), { asBytes: true });
|
return Crypto.RIPEMD160(Crypto.SHA256(data, { asBytes: true }), { asBytes: true });
|
||||||
|
},
|
||||||
|
// double sha256
|
||||||
|
dsha256: function (data) {
|
||||||
|
return Crypto.SHA256(Crypto.SHA256(data, { asBytes: true }), { asBytes: true });
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
<script type="text/javascript">
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2010-2011 Intalio Pte, All Rights Reserved
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
// https://github.com/cheongwy/node-scrypt-js
|
||||||
|
(function () {
|
||||||
|
|
||||||
|
var MAX_VALUE = 2147483647;
|
||||||
|
var workerUrl = null;
|
||||||
|
|
||||||
|
//function scrypt(byte[] passwd, byte[] salt, int N, int r, int p, int dkLen)
|
||||||
|
/*
|
||||||
|
* N = Cpu cost
|
||||||
|
* r = Memory cost
|
||||||
|
* p = parallelization cost
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
window.Crypto_scrypt = function (passwd, salt, N, r, p, dkLen, callback) {
|
||||||
|
if (N == 0 || (N & (N - 1)) != 0) throw Error("N must be > 0 and a power of 2");
|
||||||
|
|
||||||
|
if (N > MAX_VALUE / 128 / r) throw Error("Parameter N is too large");
|
||||||
|
if (r > MAX_VALUE / 128 / p) throw Error("Parameter r is too large");
|
||||||
|
|
||||||
|
var PBKDF2_opts = { iterations: 1, hasher: Crypto.SHA256, asBytes: true };
|
||||||
|
|
||||||
|
var B = Crypto.PBKDF2(passwd, salt, p * 128 * r, PBKDF2_opts);
|
||||||
|
|
||||||
|
try {
|
||||||
|
var i = 0;
|
||||||
|
var worksDone = 0;
|
||||||
|
var makeWorker = function () {
|
||||||
|
if (!workerUrl) {
|
||||||
|
var code = '(' + scryptCore.toString() + ')()';
|
||||||
|
var blob;
|
||||||
|
try {
|
||||||
|
blob = new Blob([code], { type: "text/javascript" });
|
||||||
|
} catch (e) {
|
||||||
|
window.BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder;
|
||||||
|
blob = new BlobBuilder();
|
||||||
|
blob.append(code);
|
||||||
|
blob = blob.getBlob("text/javascript");
|
||||||
|
}
|
||||||
|
workerUrl = URL.createObjectURL(blob);
|
||||||
|
}
|
||||||
|
var worker = new Worker(workerUrl);
|
||||||
|
worker.onmessage = function (event) {
|
||||||
|
var Bi = event.data[0], Bslice = event.data[1];
|
||||||
|
worksDone++;
|
||||||
|
|
||||||
|
if (i < p) {
|
||||||
|
worker.postMessage([N, r, p, B, i++]);
|
||||||
|
}
|
||||||
|
|
||||||
|
var length = Bslice.length, destPos = Bi * 128 * r, srcPos = 0;
|
||||||
|
while (length--) {
|
||||||
|
B[destPos++] = Bslice[srcPos++];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (worksDone == p) {
|
||||||
|
callback(Crypto.PBKDF2(passwd, B, dkLen, PBKDF2_opts));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
return worker;
|
||||||
|
};
|
||||||
|
var workers = [makeWorker(), makeWorker()];
|
||||||
|
workers[0].postMessage([N, r, p, B, i++]);
|
||||||
|
if (p > 1) {
|
||||||
|
workers[1].postMessage([N, r, p, B, i++]);
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
window.setTimeout(function () {
|
||||||
|
scryptCore();
|
||||||
|
callback(Crypto.PBKDF2(passwd, B, dkLen, PBKDF2_opts));
|
||||||
|
}, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// using this function to enclose everything needed to create a worker (but also invokable directly for synchronous use)
|
||||||
|
function scryptCore() {
|
||||||
|
var XY = [], V = [];
|
||||||
|
|
||||||
|
if (typeof B === 'undefined') {
|
||||||
|
onmessage = function (event) {
|
||||||
|
var data = event.data;
|
||||||
|
var N = data[0], r = data[1], p = data[2], B = data[3], i = data[4];
|
||||||
|
|
||||||
|
var Bslice = [];
|
||||||
|
arraycopy32(B, i * 128 * r, Bslice, 0, 128 * r);
|
||||||
|
smix(Bslice, 0, r, N, V, XY);
|
||||||
|
|
||||||
|
postMessage([i, Bslice]);
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
for (var i = 0; i < p; i++) {
|
||||||
|
smix(B, i * 128 * r, r, N, V, XY);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function smix(B, Bi, r, N, V, XY) {
|
||||||
|
var Xi = 0;
|
||||||
|
var Yi = 128 * r;
|
||||||
|
var i;
|
||||||
|
|
||||||
|
arraycopy32(B, Bi, XY, Xi, Yi);
|
||||||
|
|
||||||
|
for (i = 0; i < N; i++) {
|
||||||
|
arraycopy32(XY, Xi, V, i * Yi, Yi);
|
||||||
|
blockmix_salsa8(XY, Xi, Yi, r);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < N; i++) {
|
||||||
|
var j = integerify(XY, Xi, r) & (N - 1);
|
||||||
|
blockxor(V, j * Yi, XY, Xi, Yi);
|
||||||
|
blockmix_salsa8(XY, Xi, Yi, r);
|
||||||
|
}
|
||||||
|
|
||||||
|
arraycopy32(XY, Xi, B, Bi, Yi);
|
||||||
|
}
|
||||||
|
|
||||||
|
function blockmix_salsa8(BY, Bi, Yi, r) {
|
||||||
|
var X = [];
|
||||||
|
var i;
|
||||||
|
|
||||||
|
arraycopy32(BY, Bi + (2 * r - 1) * 64, X, 0, 64);
|
||||||
|
|
||||||
|
for (i = 0; i < 2 * r; i++) {
|
||||||
|
blockxor(BY, i * 64, X, 0, 64);
|
||||||
|
salsa20_8(X);
|
||||||
|
arraycopy32(X, 0, BY, Yi + (i * 64), 64);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < r; i++) {
|
||||||
|
arraycopy32(BY, Yi + (i * 2) * 64, BY, Bi + (i * 64), 64);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < r; i++) {
|
||||||
|
arraycopy32(BY, Yi + (i * 2 + 1) * 64, BY, Bi + (i + r) * 64, 64);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function R(a, b) {
|
||||||
|
return (a << b) | (a >>> (32 - b));
|
||||||
|
}
|
||||||
|
|
||||||
|
function salsa20_8(B) {
|
||||||
|
var B32 = new Array(32);
|
||||||
|
var x = new Array(32);
|
||||||
|
var i;
|
||||||
|
|
||||||
|
for (i = 0; i < 16; i++) {
|
||||||
|
B32[i] = (B[i * 4 + 0] & 0xff) << 0;
|
||||||
|
B32[i] |= (B[i * 4 + 1] & 0xff) << 8;
|
||||||
|
B32[i] |= (B[i * 4 + 2] & 0xff) << 16;
|
||||||
|
B32[i] |= (B[i * 4 + 3] & 0xff) << 24;
|
||||||
|
}
|
||||||
|
|
||||||
|
arraycopy(B32, 0, x, 0, 16);
|
||||||
|
|
||||||
|
for (i = 8; i > 0; i -= 2) {
|
||||||
|
x[4] ^= R(x[0] + x[12], 7); x[8] ^= R(x[4] + x[0], 9);
|
||||||
|
x[12] ^= R(x[8] + x[4], 13); x[0] ^= R(x[12] + x[8], 18);
|
||||||
|
x[9] ^= R(x[5] + x[1], 7); x[13] ^= R(x[9] + x[5], 9);
|
||||||
|
x[1] ^= R(x[13] + x[9], 13); x[5] ^= R(x[1] + x[13], 18);
|
||||||
|
x[14] ^= R(x[10] + x[6], 7); x[2] ^= R(x[14] + x[10], 9);
|
||||||
|
x[6] ^= R(x[2] + x[14], 13); x[10] ^= R(x[6] + x[2], 18);
|
||||||
|
x[3] ^= R(x[15] + x[11], 7); x[7] ^= R(x[3] + x[15], 9);
|
||||||
|
x[11] ^= R(x[7] + x[3], 13); x[15] ^= R(x[11] + x[7], 18);
|
||||||
|
x[1] ^= R(x[0] + x[3], 7); x[2] ^= R(x[1] + x[0], 9);
|
||||||
|
x[3] ^= R(x[2] + x[1], 13); x[0] ^= R(x[3] + x[2], 18);
|
||||||
|
x[6] ^= R(x[5] + x[4], 7); x[7] ^= R(x[6] + x[5], 9);
|
||||||
|
x[4] ^= R(x[7] + x[6], 13); x[5] ^= R(x[4] + x[7], 18);
|
||||||
|
x[11] ^= R(x[10] + x[9], 7); x[8] ^= R(x[11] + x[10], 9);
|
||||||
|
x[9] ^= R(x[8] + x[11], 13); x[10] ^= R(x[9] + x[8], 18);
|
||||||
|
x[12] ^= R(x[15] + x[14], 7); x[13] ^= R(x[12] + x[15], 9);
|
||||||
|
x[14] ^= R(x[13] + x[12], 13); x[15] ^= R(x[14] + x[13], 18);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < 16; ++i) B32[i] = x[i] + B32[i];
|
||||||
|
|
||||||
|
for (i = 0; i < 16; i++) {
|
||||||
|
var bi = i * 4;
|
||||||
|
B[bi + 0] = (B32[i] >> 0 & 0xff);
|
||||||
|
B[bi + 1] = (B32[i] >> 8 & 0xff);
|
||||||
|
B[bi + 2] = (B32[i] >> 16 & 0xff);
|
||||||
|
B[bi + 3] = (B32[i] >> 24 & 0xff);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function blockxor(S, Si, D, Di, len) {
|
||||||
|
var i = len >> 6;
|
||||||
|
while (i--) {
|
||||||
|
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||||||
|
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||||||
|
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||||||
|
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||||||
|
|
||||||
|
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||||||
|
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||||||
|
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||||||
|
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||||||
|
|
||||||
|
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||||||
|
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||||||
|
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||||||
|
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||||||
|
|
||||||
|
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||||||
|
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||||||
|
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||||||
|
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||||||
|
|
||||||
|
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||||||
|
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||||||
|
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||||||
|
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||||||
|
|
||||||
|
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||||||
|
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||||||
|
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||||||
|
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||||||
|
|
||||||
|
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||||||
|
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||||||
|
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||||||
|
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||||||
|
|
||||||
|
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||||||
|
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||||||
|
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||||||
|
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function integerify(B, bi, r) {
|
||||||
|
var n;
|
||||||
|
|
||||||
|
bi += (2 * r - 1) * 64;
|
||||||
|
|
||||||
|
n = (B[bi + 0] & 0xff) << 0;
|
||||||
|
n |= (B[bi + 1] & 0xff) << 8;
|
||||||
|
n |= (B[bi + 2] & 0xff) << 16;
|
||||||
|
n |= (B[bi + 3] & 0xff) << 24;
|
||||||
|
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
function arraycopy(src, srcPos, dest, destPos, length) {
|
||||||
|
while (length--) {
|
||||||
|
dest[destPos++] = src[srcPos++];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function arraycopy32(src, srcPos, dest, destPos, length) {
|
||||||
|
var i = length >> 5;
|
||||||
|
while (i--) {
|
||||||
|
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
|
||||||
|
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
|
||||||
|
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
|
||||||
|
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
|
||||||
|
|
||||||
|
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
|
||||||
|
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
|
||||||
|
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
|
||||||
|
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
|
||||||
|
|
||||||
|
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
|
||||||
|
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
|
||||||
|
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
|
||||||
|
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
|
||||||
|
|
||||||
|
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
|
||||||
|
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
|
||||||
|
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
|
||||||
|
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} // scryptCore
|
||||||
|
}; // window.Crypto_scrypt
|
||||||
|
})();
|
||||||
|
</script>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -5969,10 +6259,20 @@
|
||||||
|
|
||||||
|
|
||||||
<style type="text/css">
|
<style type="text/css">
|
||||||
.more { background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAYAAAA7bUf6AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNXG14zYAAAAWdEVYdENyZWF0aW9uIFRpbWUAMDEvMDIvMTLltnQyAAAB1UlEQVQ4jYWTS04bQRCGv3q0x8gMYJCwknCGLDgLVwiH4grhLFaUXdhkQ0A8pBg/FOLpnmbhMYzxRKlNS1Vdf/31V5XknGnb+eXJCBjzbzu9OLu+azu845Opysej4wHmshF4uJ2TUrb3CV0gIBAKRboC5C2vdkDE9fdty6/xDegvXz+NgDbFUejZ+PjDgExmtpxS9vYwMe5u5iyX8RRoa5Ic+C4qx9KUN1MGu4E618yqJ5axAp44KA7ZL3eYzp/HKdVIw7WK8d6BuDvcod9TQlBEIOXEdPlElSoUJabIIs4Z7h9yNDwgqOMayLXw7epHVIBggrsgspZPUBQyiCgugRQji7TAVDF1XB2TlQoOYCqovkmpopS9fcoiM3ue0rOCYf8IU8NklWxiiOQ3EPXtWagIqo6KYWYEc4IGvMViA6RrnCJKVS9B8ypRHG1YKNa0Ur+C+MPt/I2BKWVZUO4FgvQ47PcptEDF+T2Z8TiZUMWIyGtpd+Bze5VTSqP57O/4YG+AN/RXbSiPkwmL5z/be/L+mM4vT2JKeUW7EXD1erMz/Lo4u77f0K9DDhdA1XG11jh9vWBb99Z9gAg5QZ2hzpmUa0RSW4f/gqSY0s3Vz+tufEjvHS8Tg6BXC7qVbQAAAABJRU5ErkJggg==)
|
|
||||||
no-repeat left center; width: 17px; height: 17px; display: inline-block; float: right; }
|
/* import ubuntu mono bold as our font for display public & private keys.
|
||||||
.less { background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAYAAAA7bUf6AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAK6wAACusBgosNWgAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNXG14zYAAAAWdEVYdENyZWF0aW9uIFRpbWUAMDEvMDIvMTLltnQyAAABuklEQVQ4ja2US25TQRBFT336OSEY5ESyBfEakNiLt0AW5S2QvQQxAiZIYBwSz/yByH7dxcB2bPMME+hJS/W5fetWVUtE8K/HfzdcXfdfqsr4onuGuRz4Jrdzcg6Gg9HfQYAxAqmlSMMlQJO5/oliE4AtQLcR++btZQ+wPVsvVXbTfXFGEMyWU9rVM0yMu/Gc5bJ+DdztxWcH3otKVzbPmyq5LnwfzSgEBMxlhqJEBFWVKKUgG66rur53oH7aOeWkUlJSRCBHZracssorlLXttHpCpzonaYukjmsiivDu08daAZIJ7oLIVg9BUQgQUVwSua5Z5AWmiqnj6pisVXAAU0F1J6WK0q6e024Fs4cplbXonFxgapisk00MkdiBqDd7oSKoOiqGmZHMSZrwPRYHIMfaKaKsyhI01oni6IaFYptSyiOIT27nOwaq5FyQrUAIC/nBhK+UErRSos55z4878CrneJyTnHOvquymf3mOb+hvy/jw+QuLh5/NORkORvsGrq77dc6xpr0RcH07y3oF8G04GN0f6HdEDhdA1XG1vXb6dsAa+3Z8AREiQwkoEeQoiBzocHDkf/wnvwC5IpRVsUDNUgAAAABJRU5ErkJggg==)
|
NOTE: This font has been stripped down such that it only includes characters A-Z, a-Z, and 0-9 */
|
||||||
no-repeat left center; width: 17px; height: 17px; display: inline-block; float: right; }
|
@font-face {
|
||||||
|
font-family: 'ubuntu_mono_bold';
|
||||||
|
src: url('images/ubuntumono-b-webfont.eot');
|
||||||
|
src: url('images/ubuntumono-b-webfont.eot?#iefix') format('embedded-opentype'),
|
||||||
|
url('images/ubuntumono-b-webfont.woff') format('woff'),
|
||||||
|
url('images/ubuntumono-b-webfont.ttf') format('truetype'),
|
||||||
|
url('images/ubuntumono-b-webfont.svg#ubuntu_monobold') format('svg');
|
||||||
|
font-weight: bold;
|
||||||
|
font-style: normal;
|
||||||
|
}
|
||||||
|
|
||||||
.right { text-align: right; }
|
.right { text-align: right; }
|
||||||
.walletarea { display: none; border-top: 2px solid #f7931a; }
|
.walletarea { display: none; border-top: 2px solid #f7931a; }
|
||||||
.keyarea { font-family: Courier New; height: 110px; text-align: left; position: relative; padding: 5px; }
|
.keyarea { font-family: Courier New; height: 110px; text-align: left; position: relative; padding: 5px; }
|
||||||
|
@ -5996,7 +6296,7 @@
|
||||||
|
|
||||||
#main { position: relative; margin: 0px auto; width: 1010px; color: #444; } /* removed text-align: center; */
|
#main { position: relative; margin: 0px auto; width: 1010px; color: #444; } /* removed text-align: center; */
|
||||||
#logoback { background-image:url(images/logo.png); background-position: top left; background-repeat: no-repeat; }
|
#logoback { background-image:url(images/logo.png); background-position: top left; background-repeat: no-repeat; }
|
||||||
#generate { font-family: Courier New; height: 158px; text-align: left; position: relative; padding: 5px; border: 2px solid #f7931a; }
|
#generate { font-family: Courier New; height: 158px; text-align: left; position: relative; padding: 5px; border: none; }
|
||||||
#generate span { padding: 5px 5px 0 5px; }
|
#generate span { padding: 5px 5px 0 5px; }
|
||||||
#menu { visibility: hidden; font-size: 90%; padding: 0 12px;}
|
#menu { visibility: hidden; font-size: 90%; padding: 0 12px;}
|
||||||
|
|
||||||
|
@ -6019,7 +6319,10 @@
|
||||||
|
|
||||||
#paperarea { min-height: 120px; display: none; }
|
#paperarea { min-height: 120px; display: none; }
|
||||||
#paperarea .keyarea { border: 2px solid #f7931a; border-top: 0; }
|
#paperarea .keyarea { border: 2px solid #f7931a; border-top: 0; }
|
||||||
#paperarea .keyarea.art { display: block; height: auto; border: 0; font-family: Ubuntu, Arial; padding: 0; margin: 0; }
|
|
||||||
|
/* alphanum for public-private keys*/
|
||||||
|
#paperarea .keyarea.art { display: block; height: auto; border: 0; font-family: ubuntu_mono_bold, Arial, Helvetica, sans-serif; padding: 0; margin: 0; font-size: 13px;}
|
||||||
|
|
||||||
#paperarea .artwallet .papersvg { width: 1010px; height: 331px; border: 0; margin: 0; padding: 0; left: 0; }
|
#paperarea .artwallet .papersvg { width: 1010px; height: 331px; border: 0; margin: 0; padding: 0; left: 0; }
|
||||||
#paperarea .artwallet .qrcode_public { top: 120px; left: 41px; z-index: 100; margin: 0; float: none; display: block; position: absolute; background-color: #FFFFFF;
|
#paperarea .artwallet .qrcode_public { top: 120px; left: 41px; z-index: 100; margin: 0; float: none; display: block; position: absolute; background-color: #FFFFFF;
|
||||||
padding: 5px 5px 2px 5px; }
|
padding: 5px 5px 2px 5px; }
|
||||||
|
@ -6027,8 +6330,8 @@
|
||||||
padding: 5px 5px 2px 5px; }
|
padding: 5px 5px 2px 5px; }
|
||||||
#paperarea .artwallet .btcaddress
|
#paperarea .artwallet .btcaddress
|
||||||
{
|
{
|
||||||
position: absolute; top: 275px; left: 40px; z-index: 100; font-size: 11px; background-color: transparent;
|
position: absolute; top: 275px; left: 40px; z-index: 100; background-color: transparent;
|
||||||
font-weight:bold; color: #1739ad; margin: 0;
|
color: #1739ad; margin: 0;
|
||||||
-webkit-transform-origin:top left;
|
-webkit-transform-origin:top left;
|
||||||
/* -webkit-transform:rotate(-90deg); */
|
/* -webkit-transform:rotate(-90deg); */
|
||||||
-moz-transform-origin:top left;
|
-moz-transform-origin:top left;
|
||||||
|
@ -6043,8 +6346,8 @@
|
||||||
|
|
||||||
#paperarea .artwallet .dupbtcaddress
|
#paperarea .artwallet .dupbtcaddress
|
||||||
{
|
{
|
||||||
position: absolute; top: 45px; left: 40px; z-index: 100; font-size: 11px; background-color: transparent;
|
position: absolute; top: 45px; left: 40px; z-index: 100; background-color: transparent;
|
||||||
font-weight:bold; color: #1739ad; margin: 0;
|
color: #1739ad; margin: 0;
|
||||||
/* -webkit-transform-origin:top left; */
|
/* -webkit-transform-origin:top left; */
|
||||||
-webkit-transform:rotate(-180deg);
|
-webkit-transform:rotate(-180deg);
|
||||||
/* -moz-transform-origin:top left; */
|
/* -moz-transform-origin:top left; */
|
||||||
|
@ -6059,8 +6362,8 @@
|
||||||
|
|
||||||
#paperarea .artwallet .btcprivwif
|
#paperarea .artwallet .btcprivwif
|
||||||
{
|
{
|
||||||
position: absolute; top: 245px; left: 610px; z-index: 100; font-size: 11px; background-color: transparent;
|
position: absolute; top: 245px; left: 610px; z-index: 100; background-color: transparent;
|
||||||
font-weight:bold; color: #000000; margin: 0;
|
color: #000000; margin: 0;
|
||||||
-webkit-transform-origin:top left;
|
-webkit-transform-origin:top left;
|
||||||
/*-webkit-transform:rotate(-90deg);*/
|
/*-webkit-transform:rotate(-90deg);*/
|
||||||
-moz-transform-origin:top left;
|
-moz-transform-origin:top left;
|
||||||
|
@ -6075,8 +6378,8 @@
|
||||||
|
|
||||||
#paperarea .artwallet .dupbtcprivwif
|
#paperarea .artwallet .dupbtcprivwif
|
||||||
{
|
{
|
||||||
position: absolute; top: 75px; left: 610px; z-index: 100; font-size: 11px; background-color: transparent;
|
position: absolute; top: 75px; left: 610px; z-index: 100; background-color: transparent;
|
||||||
font-weight:bold; color: #000000; margin: 0;
|
color: #000000; margin: 0;
|
||||||
/* -webkit-transform-origin:top left; */
|
/* -webkit-transform-origin:top left; */
|
||||||
-webkit-transform:rotate(-180deg);
|
-webkit-transform:rotate(-180deg);
|
||||||
/* -moz-transform-origin:top left; */
|
/* -moz-transform-origin:top left; */
|
||||||
|
@ -6089,46 +6392,47 @@
|
||||||
transform:rotate(-180deg);
|
transform:rotate(-180deg);
|
||||||
}
|
}
|
||||||
|
|
||||||
.nicerButton {
|
.nicerButton { /* thanks http://www.cssbuttongenerator.com */
|
||||||
-moz-box-shadow:inset 0px 1px 0px 0px #fce2c1;
|
-moz-box-shadow:inset 0px 1px 0px 0px #c1ed9c;
|
||||||
-webkit-box-shadow:inset 0px 1px 0px 0px #fce2c1;
|
-webkit-box-shadow:inset 0px 1px 0px 0px #c1ed9c;
|
||||||
box-shadow:inset 0px 1px 0px 0px #fce2c1;
|
box-shadow:inset 0px 1px 0px 0px #c1ed9c;
|
||||||
background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #ffc477), color-stop(1, #fb9e25) );
|
background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #9dce2c), color-stop(1, #8cb82b) );
|
||||||
background:-moz-linear-gradient( center top, #ffc477 5%, #fb9e25 100% );
|
background:-moz-linear-gradient( center top, #9dce2c 5%, #8cb82b 100% );
|
||||||
filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffc477', endColorstr='#fb9e25');
|
filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#9dce2c', endColorstr='#8cb82b');
|
||||||
background-color:#ffc477;
|
background-color:#9dce2c;
|
||||||
-webkit-border-top-left-radius:20px;
|
-webkit-border-top-left-radius:12px;
|
||||||
-moz-border-radius-topleft:20px;
|
-moz-border-radius-topleft:12px;
|
||||||
border-top-left-radius:20px;
|
border-top-left-radius:12px;
|
||||||
-webkit-border-top-right-radius:20px;
|
-webkit-border-top-right-radius:12px;
|
||||||
-moz-border-radius-topright:20px;
|
-moz-border-radius-topright:12px;
|
||||||
border-top-right-radius:20px;
|
border-top-right-radius:12px;
|
||||||
-webkit-border-bottom-right-radius:20px;
|
-webkit-border-bottom-right-radius:12px;
|
||||||
-moz-border-radius-bottomright:20px;
|
-moz-border-radius-bottomright:12px;
|
||||||
border-bottom-right-radius:20px;
|
border-bottom-right-radius:12px;
|
||||||
-webkit-border-bottom-left-radius:20px;
|
-webkit-border-bottom-left-radius:12px;
|
||||||
-moz-border-radius-bottomleft:20px;
|
-moz-border-radius-bottomleft:12px;
|
||||||
border-bottom-left-radius:20px;
|
border-bottom-left-radius:12px;
|
||||||
text-indent:0;
|
text-indent:0;
|
||||||
border:1px solid #eeb44f;
|
border:1px solid #83c41a;
|
||||||
display:inline-block;
|
display:inline-block;
|
||||||
color:#ffffff !important;
|
color:#ffffff !important;
|
||||||
font-family:Arial;
|
font-family:Arial;
|
||||||
font-size:13px;
|
font-size:14px;
|
||||||
font-weight:bold;
|
font-weight:bold;
|
||||||
font-style:normal;
|
font-style:normal;
|
||||||
height:40px;
|
height:35px;
|
||||||
line-height:40px;
|
line-height:35px;
|
||||||
width:200px;
|
width:189px;
|
||||||
text-decoration:none !important;
|
text-decoration:none;
|
||||||
text-align:center;
|
text-align:center;
|
||||||
text-shadow:1px 1px 0px #cc9f52;
|
text-shadow:1px 1px 0px #689324;
|
||||||
}
|
}
|
||||||
.nicerButton:hover {
|
.nicerButton:hover {
|
||||||
background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #fb9e25), color-stop(1, #ffc477) );
|
background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #8cb82b), color-stop(1, #9dce2c) );
|
||||||
background:-moz-linear-gradient( center top, #fb9e25 5%, #ffc477 100% );
|
background:-moz-linear-gradient( center top, #8cb82b 5%, #9dce2c 100% );
|
||||||
filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fb9e25', endColorstr='#ffc477');
|
filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#8cb82b', endColorstr='#9dce2c');
|
||||||
background-color:#fb9e25;
|
background-color:#8cb82b;
|
||||||
|
text-decoration: none;
|
||||||
}.nicerButton:active {
|
}.nicerButton:active {
|
||||||
position:relative;
|
position:relative;
|
||||||
top:1px;
|
top:1px;
|
||||||
|
@ -6157,7 +6461,7 @@
|
||||||
-webkit-animation: blink 0.5s infinite linear alternate;
|
-webkit-animation: blink 0.5s infinite linear alternate;
|
||||||
-webkit-font-smoothing: antialiased;
|
-webkit-font-smoothing: antialiased;
|
||||||
}
|
}
|
||||||
#generatelabelmovemouse { margin: 30px 150px; padding: 30px; font-weight: bold; background-color: #EBFDBF; text-align: center; }
|
#generatelabelmovemouse { margin: 30px 150px; padding: 30px; font-weight: bold; text-align: center; -webkit-border-radius: 8px;-moz-border-radius: 8px;border-radius: 8px;background-color:#F0FED0;-webkit-box-shadow: #B3B3B3 1px 1px 1px;-moz-box-shadow: #B3B3B3 1px 1px 1px; box-shadow: #B3B3B3 1px 1px 1px; }
|
||||||
#generatelabelbitcoinaddress { text-align: center;}
|
#generatelabelbitcoinaddress { text-align: center;}
|
||||||
|
|
||||||
@media screen
|
@media screen
|
||||||
|
@ -6207,9 +6511,11 @@
|
||||||
.footer .copyright { font-size: 75%; clear: both; padding: 5px 0; }
|
.footer .copyright { font-size: 75%; clear: both; padding: 5px 0; }
|
||||||
.footer .copyright span { padding: 10px 10px; }
|
.footer .copyright span { padding: 10px 10px; }
|
||||||
|
|
||||||
#siginfo { margin: 10px 200px; border: 1px solid #666; padding: 10px; background-color: #999; color: #FFF;}
|
#siginfo { margin: 10px 200px; border: 1px solid #666; padding: 10px; background-color: #999; color: #FFF; z-index: 10000;}
|
||||||
#siginfo a, #siginfo a:visited { color: #EFFED3;}
|
#siginfo a, #siginfo a:visited { color: #EFFED3;}
|
||||||
#siginfo .closeme { float: right; padding: 0 0 30px 20px; margin: 0;}
|
#siginfo .closeme { float: right; padding: 0 0 30px 20px; margin: 0;}
|
||||||
|
|
||||||
|
#supplyKeys { float: left; background-color: #EEFED0; border: 1px solid #CCCCCC; padding: 8px; }
|
||||||
}
|
}
|
||||||
|
|
||||||
@media print
|
@media print
|
||||||
|
@ -6238,8 +6544,8 @@
|
||||||
<span><a href="?culture=fr" id="culturefr">Français</a></span> -->
|
<span><a href="?culture=fr" id="culturefr">Français</a></span> -->
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<div id="tagline">Open Source Client-Side JavaScript Bitcoin Wallet Generator <span>Updated September 5, 2013</span></div>
|
<div id="tagline">Open Source JavaScript Bitcoin Wallet Generator <span>Updated October 1, 2013</span></div>
|
||||||
<div id="tagsite">For help & security tips, visit <a href="https://bitcoinpaperwallet.com">bitcoinpaperwallet.com</a></div>
|
<div id="tagsite">For help, security tips, or wallet supplies visit <a href="https://bitcoinpaperwallet.com">bitcoinpaperwallet.com</a></div>
|
||||||
<div id="tagwarning"></div>
|
<div id="tagwarning"></div>
|
||||||
|
|
||||||
<div class="menu" id="menu">
|
<div class="menu" id="menu">
|
||||||
|
@ -6281,6 +6587,8 @@
|
||||||
<span id="instructions1"><em>Here's an overview of what will happen, step by step.</em></span>
|
<span id="instructions1"><em>Here's an overview of what will happen, step by step.</em></span>
|
||||||
<br /><br />
|
<br /><br />
|
||||||
|
|
||||||
|
<img src="images/finished-sample-sealed.jpg" width="400" height="203" alt="Sealed Wallet" style="float: right; margin: 0 0 20px 20px;">
|
||||||
|
|
||||||
<span id="instructions3"><b>Step 1: Calibrate Printer</b><br />
|
<span id="instructions3"><b>Step 1: Calibrate Printer</b><br />
|
||||||
Before printing out a wallet you'll need to "calibrate" your printer for <b>zoom</b> and <b>horizontal shift</b> to accommodate your particular browser / printer combination. Without proper callibration, your wallet will end up the wrong size or with a misaligned reverse side.</span>
|
Before printing out a wallet you'll need to "calibrate" your printer for <b>zoom</b> and <b>horizontal shift</b> to accommodate your particular browser / printer combination. Without proper callibration, your wallet will end up the wrong size or with a misaligned reverse side.</span>
|
||||||
<br /><br />
|
<br /><br />
|
||||||
|
@ -6291,7 +6599,7 @@
|
||||||
Then you will put the same page back in your printer (but upside down) to print out the back side of your wallet. This isn't just for good looks: the back side design includes additional tamper-resistant safeguards.</span>
|
Then you will put the same page back in your printer (but upside down) to print out the back side of your wallet. This isn't just for good looks: the back side design includes additional tamper-resistant safeguards.</span>
|
||||||
<br /><br />
|
<br /><br />
|
||||||
<span id="instructions6"><b>Step 4: Cut, Fold, Seal & Fund</b><br />
|
<span id="instructions6"><b>Step 4: Cut, Fold, Seal & Fund</b><br />
|
||||||
Find your scissors! Time to cut out your wallet, fold it, and seal it with opaque (light-blocking) tape—or better yet <a href="https://bitcoinpaperwallet.com/#purchase" target="_blank">tamper-evident holographic tape</a>.) Now you're ready to transfer bitcoins from your online holdings to your new wallet.</span>
|
Find your scissors! Time to cut out your wallet, fold it, and seal it with opaque (light-blocking) tape—or better yet <a href="https://bitcoinpaperwallet.com/#purchase" target="_blank"><strong>tamper-evident holographic tape with serial numbers</strong></a>.) Now you're ready to transfer bitcoins from your online holdings to your new wallet.</span>
|
||||||
<br /><br />
|
<br /><br />
|
||||||
<span id="instructions2"><a href="http://www.youtube.com/watch?v=a47rrYBWjWQ" target="_blank" class="nicerButton" style="width: 400px;">90 second video demonstration on YouTube »</a></span>
|
<span id="instructions2"><a href="http://www.youtube.com/watch?v=a47rrYBWjWQ" target="_blank" class="nicerButton" style="width: 400px;">90 second video demonstration on YouTube »</a></span>
|
||||||
|
|
||||||
|
@ -6343,7 +6651,20 @@
|
||||||
<span><label id="paperlabeladdressesperpage">Addresses per page:</label> <input type="text" id="paperlimitperpage" /></span>
|
<span><label id="paperlabeladdressesperpage">Addresses per page:</label> <input type="text" id="paperlimitperpage" /></span>
|
||||||
<span><label id="paperlabeladdressestogenerate">Addresses to generate:</label> <input type="text" id="paperlimit" /></span>
|
<span><label id="paperlabeladdressestogenerate">Addresses to generate:</label> <input type="text" id="paperlimit" /></span>
|
||||||
</div>
|
</div>
|
||||||
<span><input type="button" id="papergenerate" value="Generate a new wallet" onClick="ninja.wallets.paperwallet.build(document.getElementById('paperlimit').value * 1, document.getElementById('paperlimitperpage').value * 1, !document.getElementById('paperart').checked); printCounter=0;" /></span>
|
|
||||||
|
<div id="keyButtons" style="display: block; float: left;">
|
||||||
|
<input type="button" id="papergenerate" value="Random-generate new keys" onClick="ninja.wallets.paperwallet.build(document.getElementById('paperlimit').value * 1, document.getElementById('paperlimitperpage').value * 1, !document.getElementById('paperart').checked); printCounter=0;" />
|
||||||
|
|
||||||
|
<input type="button" id="papergenerate" value="Supply my own key or vanity address..." onClick="document.getElementById('keyButtons').style.display='none'; document.getElementById('supplyKeys').style.display='block';" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="supplyKeys" style="display: none;">
|
||||||
|
<p style="padding: 0; margin: 0;"><input placeholder="Paste your PRIVATE key here" id="suppliedPrivateKey" name="suppliedPrivateKey" size="75" spellcheck="false" style="font-family: ubuntu_mono_bold, 'Courier New', Courier, monospace;" /> <input type="button" id="papergenerate" value="Test & Apply »" onClick="testAndApplyVanityKey();" />
|
||||||
|
</p>
|
||||||
|
<p style="margin: 0; padding:0;"><a href="#" style="font-size: 11px;" onClick="document.getElementById('keyButtons').style.display='block'; document.getElementById('supplyKeys').style.display='none';">« Back</a></p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<span class="print">
|
<span class="print">
|
||||||
<a href="#" class="nicerButton" onClick="doPrint('generate');">Print Wallet Front</a>
|
<a href="#" class="nicerButton" onClick="doPrint('generate');">Print Wallet Front</a>
|
||||||
</span>
|
</span>
|
||||||
|
@ -6432,6 +6753,21 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="authorpgp">
|
<div class="authorpgp">
|
||||||
|
|
||||||
|
<div id="siginfo" style="display: none; position: absolute; top: -300px;">
|
||||||
|
<p class="closeme"><a href="#" onClick="document.getElementById('siginfo').style.display='none'; return(false);">X</a></p>
|
||||||
|
|
||||||
|
After downloading the <a href="https://github.com/cantonbecker/bitcoinpaperwallet" target="_blank">ZIP package</a> for this generator, you should find a file named <b>generate-wallet.html.sig</b>
|
||||||
|
which you can use to:
|
||||||
|
<ol><li> verify that <strong>generate-wallet.html</strong> hasn't been tampered with, and</li>
|
||||||
|
<li>get proof that it really was authored by Canton Becker (canton@gmail.com) whose public key and fingerprint can be confirmed at <a href="http://cantonbecker.com">cantonbecker.com</a>, bitcointalk.org, etc.</li>
|
||||||
|
</ol>
|
||||||
|
For example, if you have GPG installed, just open the terminal, change directory (cd) to where this file lives, and type:<br />
|
||||||
|
<code>gpg --verify --with-fingerprint generate-wallet.html.sig generate-wallet.html</code>
|
||||||
|
<br /><br />And then verify the signature's fingerprint against Canton Becker's <a href="http://cantonbecker.com">published PGP/GPG fingerprint</a>.<br /><br />
|
||||||
|
<a href="http://www.google.com/search?q=how+to+verify+PGP+%22.sig%22+signature+on+file">Learn how to verify a PGP-signed file »</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
<span class="item"><b>Security Details</b></span>
|
<span class="item"><b>Security Details</b></span>
|
||||||
<span class="item" style="font-size: 75%;"><a href="https://bitcoinpaperwallet.com/#security" target="_blank">For extra security</a>, do not run this generator directly from the bitcoinpaperwallet.com website.<br />
|
<span class="item" style="font-size: 75%;"><a href="https://bitcoinpaperwallet.com/#security" target="_blank">For extra security</a>, do not run this generator directly from the bitcoinpaperwallet.com website.<br />
|
||||||
Download the generator and run the HTML as a local file in your browser instead.</span>
|
Download the generator and run the HTML as a local file in your browser instead.</span>
|
||||||
|
@ -6441,21 +6777,6 @@
|
||||||
|
|
||||||
<span class="item" id="footerlabelsig" style="font-size: 75%;"><a href="#" onClick="document.getElementById('siginfo').style.display='block'; return(false);">Validate PGP/GPG signature</a></span>
|
<span class="item" id="footerlabelsig" style="font-size: 75%;"><a href="#" onClick="document.getElementById('siginfo').style.display='block'; return(false);">Validate PGP/GPG signature</a></span>
|
||||||
|
|
||||||
<div id="siginfo" style="display: none;">
|
|
||||||
<p class="closeme"><a href="#" onClick="document.getElementById('siginfo').style.display='none'; return(false);">X</a></p>
|
|
||||||
|
|
||||||
After downloading the ZIP package for this generator, you should find a file named <b>generate-wallet.html.sig</b>
|
|
||||||
which you can use to:
|
|
||||||
<ol><li> verify that <strong>generate-wallet.html</strong> hasn't been tampered with, and</li>
|
|
||||||
<li>get proof that it really was authored by Canton Becker (canton@gmail.com) whose public key was published in May 2013.</li>
|
|
||||||
</ol>
|
|
||||||
For example, if you have GPG installed, you can type:<br />
|
|
||||||
<code>gpg --verify generate-wallet.html.sig generate-wallet.html</code>
|
|
||||||
<br /><br />
|
|
||||||
<a href="http://www.google.com/search?q=how+to+verify+PGP+%22.sig%22+signature+on+file">Learn how to verify a PGP-signed file »</a>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<div class="copyright">
|
<div class="copyright">
|
||||||
<span id="footerlabelcopyright1">© Copyright 2013 Canton Becker (<a href="mailto:canton@gmail.com">canton@gmail.com</a>) and Pointbiz/bitaddress.org</span>
|
<span id="footerlabelcopyright1">© Copyright 2013 Canton Becker (<a href="mailto:canton@gmail.com">canton@gmail.com</a>) and Pointbiz/bitaddress.org</span>
|
||||||
|
@ -7555,9 +7876,9 @@
|
||||||
|
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
|
|
||||||
/****************************************************
|
/********************************************************
|
||||||
Brand new JS functions added for bitcionpaperwallet
|
Brand new JS functions added for bitcoinpaperwallet.com
|
||||||
****************************************************/
|
********************************************************/
|
||||||
|
|
||||||
var inlineMediaStyle = null;
|
var inlineMediaStyle = null;
|
||||||
|
|
||||||
|
@ -7609,12 +7930,25 @@
|
||||||
if (myContext == 'generate') {
|
if (myContext == 'generate') {
|
||||||
window.printCounter ++;
|
window.printCounter ++;
|
||||||
if (window.printCounter == 2) {
|
if (window.printCounter == 2) {
|
||||||
alert (" *** WARNING *** WARNING *** WARNING *** \n\nYou are about to print a second wallet with the same set of keys. \n\nUnless you intended to make a backup wallet, cancel this print job and click the 'Generate a new wallet' button first.");
|
alert (" *** WARNING *** WARNING *** WARNING *** \n\nYou are about to print a second wallet with the same set of keys. \n\nUnless you intended to make a backup wallet, cancel this print job and generate a fresh set of keys.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
window.print();
|
window.print();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function testAndApplyVanityKey() { /* Verify that a self-entered key is valid, and compute the corresponding public address, render the wallet. */
|
||||||
|
var suppliedKey = document.getElementById('suppliedPrivateKey').value;
|
||||||
|
suppliedKey = suppliedKey.trim(); // in case any spaces or whitespace got pasted in
|
||||||
|
document.getElementById('suppliedPrivateKey').value = suppliedKey;
|
||||||
|
if (!ninja.privateKey.isPrivateKey(suppliedKey)) {
|
||||||
|
alert ('*** INVALID KEY! ***\r\rThis should be the private "WIF" Wallet Import Format key -- not the public key (or "Vanity Key") itself. These always start with the number 5 and look something like this:\r\r5HuzK5hG43U7v53R7REt4Eu33BsVfhm86PA3Q6iANs13kwqUgSx');
|
||||||
|
} else {
|
||||||
|
var computedPublicAddress = new Bitcoin.ECKey(suppliedKey).getBitcoinAddress();
|
||||||
|
alert ('OK! This is a valid private key whose public address is:\r\r'+computedPublicAddress);
|
||||||
|
ninja.wallets.paperwallet.showArtisticWallet(1, computedPublicAddress, suppliedKey);
|
||||||
|
window.printCounter = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
-----BEGIN PGP SIGNATURE-----
|
-----BEGIN PGP SIGNATURE-----
|
||||||
Comment: GPGTools - http://gpgtools.org
|
Comment: GPGTools - http://gpgtools.org
|
||||||
|
|
||||||
iQEcBAABAgAGBQJSKMgdAAoJEJJ3rXE24dm2oKoH/Rq+RgpDtbZWLdZVKAzPbxlt
|
iQEcBAABAgAGBQJSUbAUAAoJEJJ3rXE24dm2TA4H/1uWo42AgJWbcPGfuoh/gd2E
|
||||||
K8x3scTqgbZKHEA4iT7n/bFN8XMm9MD4pCoJ6Jb32NoCFnOLuPvAhvC+ETS2vpQ1
|
d/O2jmbw1lA3D+OHLyqVQFAs+PSIT3u/DS2q/sOMbuoNJKwEU8PE9miyEI0X3yhc
|
||||||
3w5r+lkbgNsJ7rM5+tgXUjoniClmJ4sLTnAUT3T2dt3elwnG7bjgMiww1OESCKtw
|
FuAhJiO6KBtpA2Yp6xqgzPrboZ/wLmdhnzxsZojIfVh+XQh5cTDrMMjq5p2UaZUj
|
||||||
9Gpgc/15GuKhKfx3KdeSULNW+XtUFYVOtepQfW2F1cEXtG89/XrSkUy+VJABsQLK
|
2HUk41zJ/HrmrlG+eIlHm8vZL1iTgWurR+/zHu0ieDx+3NcEdOHyjsPXhlTLmv7y
|
||||||
E3FJoTAzQ7zcCvq1FS0BOM/lG5R1ECBQBl7AXtnMVBKAEH38Em98ybPHAzjUsEPw
|
sxk+mYFOebMcuT2lWqwAcO4fMmpQW1aQ15/HsqA5CEbr0uS56u/jRfOj6avWDiSu
|
||||||
G9tMV1d+MW2HPK3JnceMJRfEPBEUJGTw7D1WmiisHLf7GTJ81EUDVZwVSb4rNZc=
|
GKZqjqdWHikDqWz5jXHdE2pNJ2HJuphHE0MVyseL6FYOWVAkyPAgOeyKNZG3ktY=
|
||||||
=LxBv
|
=PeD6
|
||||||
-----END PGP SIGNATURE-----
|
-----END PGP SIGNATURE-----
|
||||||
|
|
BIN
images/logo.png
BIN
images/logo.png
Binary file not shown.
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 32 KiB |
BIN
images/ubuntumono-b-webfont.eot
Executable file
BIN
images/ubuntumono-b-webfont.eot
Executable file
Binary file not shown.
91
images/ubuntumono-b-webfont.svg
Executable file
91
images/ubuntumono-b-webfont.svg
Executable file
|
@ -0,0 +1,91 @@
|
||||||
|
<?xml version="1.0" standalone="no"?>
|
||||||
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<metadata></metadata>
|
||||||
|
<defs>
|
||||||
|
<font id="ubuntu_monobold" horiz-adv-x="1024" >
|
||||||
|
<font-face units-per-em="2048" ascent="1638" descent="-410" />
|
||||||
|
<missing-glyph horiz-adv-x="500" />
|
||||||
|
<glyph unicode="
" />
|
||||||
|
<glyph />
|
||||||
|
<glyph />
|
||||||
|
<glyph unicode=" " />
|
||||||
|
<glyph unicode="0" d="M72 637q0 332 114.5 495.5t325.5 163.5q215 0 327.5 -162.5t112.5 -496.5q0 -336 -112.5 -500t-327.5 -164t-327.5 164t-112.5 500zM299 637q0 -219 55.5 -333t157.5 -114q104 0 158.5 114t54.5 333q0 217 -54.5 330.5t-158.5 113.5q-102 0 -157.5 -113.5t-55.5 -330.5z M399 657q0 55 31 96.5t84 41.5q49 0 81 -41.5t32 -96.5t-32 -95t-81 -40q-53 0 -84 40t-31 95z" />
|
||||||
|
<glyph unicode="1" d="M98 1004q49 18 106.5 46.5t115 63.5t108.5 74t88 80h172v-1059h252v-209h-770v209h266v709q-57 -41 -131 -73t-125 -50z" />
|
||||||
|
<glyph unicode="2" d="M88 1128q82 86 189.5 127t214.5 41q78 0 149.5 -22.5t126.5 -67.5t88 -113.5t33 -158.5q0 -66 -24.5 -126t-65.5 -117.5t-92.5 -111t-104.5 -102.5q-27 -25 -61.5 -58.5t-65.5 -69.5t-52.5 -72.5t-21.5 -67.5h545v-209h-827q-6 20 -5 51t1 43q0 102 37.5 188.5t96 159 t125 135t125 120t96.5 110.5t38 108q0 78 -47 120t-119 42q-59 0 -125 -28.5t-129 -96.5z" />
|
||||||
|
<glyph unicode="3" d="M84 43l49 211q47 -20 122 -43t179 -23q129 0 181.5 55.5t52.5 137.5q0 100 -80 140t-203 40h-78v209h94q39 0 78 8t70 26.5t50 49.5t19 78q0 70 -41.5 109.5t-115.5 39.5q-72 0 -142.5 -23.5t-121.5 -58.5l-91 185q55 37 146.5 74.5t206.5 37.5q106 0 185 -26.5 t130 -74.5t75.5 -113.5t24.5 -141.5t-43 -145.5t-114 -106.5q98 -41 152.5 -121t54.5 -190q0 -88 -29 -162t-88 -128t-151.5 -84t-219.5 -30q-47 0 -99 7.5t-100.5 17.5t-89.5 22.5t-63 22.5z" />
|
||||||
|
<glyph unicode="4" d="M55 299v184q39 80 100.5 181.5t135.5 208t155.5 210t163.5 185.5h226v-762h137v-207h-137v-299h-252v299h-529zM297 506h287v446q-37 -47 -76 -100t-77 -111.5t-72.5 -118t-61.5 -116.5z" />
|
||||||
|
<glyph unicode="5" d="M72 39l51 209q45 -23 114.5 -41.5t174.5 -18.5q74 0 122 16.5t75.5 42t37.5 58.5t10 68q0 53 -17 97t-69.5 76t-148.5 49t-252 17q20 172 32.5 337t18.5 319h647v-209h-436q-4 -66 -10 -137.5t-10 -116.5q254 -16 378.5 -123t124.5 -299q0 -88 -30.5 -163t-94 -130 t-157.5 -86t-219 -31q-49 0 -100.5 6.5t-98.5 15.5t-85 21.5t-58 22.5z" />
|
||||||
|
<glyph unicode="6" d="M94 518q0 184 54.5 325.5t154.5 238t241.5 145.5t313.5 49l14 -215q-82 -2 -159.5 -16.5t-143 -48t-113.5 -87t-71 -133.5q39 16 75.5 25.5t65.5 9.5q111 0 188 -33t126 -88t70.5 -129t21.5 -155q0 -74 -23.5 -150t-73 -139.5t-125 -103.5t-180.5 -40 q-213 0 -324.5 132.5t-111.5 412.5zM342 496q0 -59 8 -113.5t28.5 -97.5t56.5 -69t89 -26q43 0 74 20.5t50.5 51.5t28.5 68t9 71q0 96 -43 148.5t-149 52.5q-39 0 -80 -8t-68 -23q-2 -18 -3 -36.5t-1 -38.5z" />
|
||||||
|
<glyph unicode="7" d="M100 1059v209h828v-191q-55 -63 -121 -178t-124 -260t-102 -310t-55 -329h-256q6 131 43 277.5t89.5 290t114 271.5t116.5 220h-533z" />
|
||||||
|
<glyph unicode="8" d="M78 317q0 96 45 181.5t141 150.5q-90 61 -122.5 131t-32.5 148q0 61 21.5 127.5t68.5 120t124.5 88t192.5 34.5q182 0 289.5 -89.5t107.5 -241.5q0 -88 -43 -173t-135 -143q117 -68 165 -147.5t48 -175.5q0 -61 -23.5 -125t-75.5 -114t-136 -83t-207 -33q-96 0 -175 23.5 t-135.5 68t-87 109t-30.5 143.5zM313 348q0 -82 58.5 -124t138.5 -42q92 0 146.5 44.5t54.5 105.5q0 41 -15.5 71.5t-49.5 56t-87 51.5t-127 54q-57 -47 -88 -105.5t-31 -111.5zM346 944q0 -72 47 -117t166 -94q63 47 90 103.5t27 109.5q0 72 -48 108t-116 36 q-66 0 -116 -37t-50 -109z" />
|
||||||
|
<glyph unicode="9" d="M92 868q0 74 25.5 151t76 139.5t126 102t178.5 39.5q213 0 325.5 -143t112.5 -399q0 -184 -53.5 -326.5t-152.5 -239t-239.5 -146.5t-312.5 -50l-8 217q164 2 293 70.5t182 216.5q-80 -35 -143 -35q-111 0 -188.5 31.5t-127 87t-72 128t-22.5 156.5zM338 872 q0 -96 45.5 -147t151.5 -51q39 0 81.5 8t69.5 23q2 16 3 39.5t1 46.5q0 51 -9 103t-30.5 95t-57.5 69.5t-89 26.5q-45 0 -77 -17t-51.5 -46t-28.5 -68t-9 -82z" />
|
||||||
|
<glyph unicode="A" d="M18 0q90 375 182.5 683t178.5 585h274q90 -279 179.5 -591t173.5 -677h-271l-59 293h-338l-57 -293h-263zM385 502h248q-12 68 -24.5 131t-28 125.5t-33 127t-37.5 136.5q-20 -72 -37.5 -136.5t-33 -127t-29 -126t-25.5 -130.5z" />
|
||||||
|
<glyph unicode="B" d="M111 20v1231q72 12 157.5 21.5t169.5 9.5q143 0 233.5 -29.5t141.5 -78t69.5 -107.5t18.5 -119q0 -90 -44 -159.5t-118 -110.5q129 -47 175.5 -127t46.5 -168q0 -115 -39 -191.5t-105.5 -122.5t-158 -65.5t-195.5 -19.5q-84 0 -174 9t-178 27zM362 211q27 -4 59 -6t62 -2 q43 0 84 7t73 26.5t52.5 55.5t20.5 91q0 92 -58.5 132t-156.5 40h-136v-344zM362 764h99q96 0 145 42t49 116q0 45 -14 72.5t-38.5 43t-57.5 20.5t-68 5q-29 0 -59.5 -2t-55.5 -6v-291z" />
|
||||||
|
<glyph unicode="C" d="M55 635q0 158 43 280.5t120 207.5t182.5 129t230.5 44q68 0 122 -11t95 -25.5t68.5 -31t41.5 -24.5l-65 -200q-47 31 -113.5 52t-152.5 21q-59 0 -115.5 -21.5t-100.5 -71.5t-72 -134t-28 -209q0 -217 75 -332.5t245 -115.5q98 0 162.5 22.5t103.5 44.5l64 -199 q-53 -33 -144.5 -60.5t-210.5 -27.5q-268 0 -409.5 172t-141.5 490z" />
|
||||||
|
<glyph unicode="D" d="M111 14v1237q86 18 161.5 24.5t141.5 6.5q125 0 228 -37t175 -115.5t112 -200.5t40 -294q0 -176 -44 -300t-122 -202t-185.5 -113.5t-236.5 -35.5q-68 0 -132.5 7t-137.5 23zM362 205q10 -2 22.5 -2h23.5q86 0 144 32.5t94 90t51.5 136.5t15.5 173q0 82 -12.5 159.5 t-43 137t-84 95.5t-137.5 36q-16 0 -36.5 -1t-37.5 -5v-852z" />
|
||||||
|
<glyph unicode="E" d="M129 0v1268h768v-209h-516v-285h448v-209h-448v-356h561v-209h-813z" />
|
||||||
|
<glyph unicode="F" d="M129 0v1268h776v-209h-524v-307h459v-209h-459v-543h-252z" />
|
||||||
|
<glyph unicode="G" d="M55 635q0 162 43 285.5t117 207.5t174 126t215 42q74 0 132.5 -11t101.5 -25.5t70.5 -31t41.5 -24.5l-65 -200q-45 29 -110.5 51t-135.5 22q-90 0 -151.5 -32.5t-101.5 -91t-57.5 -139.5t-17.5 -179q0 -227 72 -334.5t211 -107.5q23 0 49.5 2t48.5 6v463h252v-633 q-45 -16 -140 -37t-231 -21q-119 0 -214 42t-162.5 125t-104.5 207t-37 288z" />
|
||||||
|
<glyph unicode="H" d="M92 0v1268h252v-500h336v500h252v-1268h-252v559h-336v-559h-252z" />
|
||||||
|
<glyph unicode="I" d="M111 0v209h276v850h-276v209h804v-209h-274v-850h274v-209h-804z" />
|
||||||
|
<glyph unicode="J" d="M86 86l96 201q51 -33 113.5 -63.5t128.5 -30.5q98 0 158.5 52t60.5 193v621h-424v209h678v-844q0 -92 -23.5 -174t-78 -143.5t-140.5 -97.5t-209 -36q-129 0 -215 33t-145 80z" />
|
||||||
|
<glyph unicode="K" d="M92 0v1268h252v-527q45 57 94 127t93 139.5t81 137t62 123.5h284q-29 -55 -68.5 -126t-90.5 -147.5t-109.5 -156.5t-122.5 -154q63 -61 129 -141t124.5 -171t105.5 -186.5t75 -185.5h-284q-23 72 -65 155t-93 161.5t-107.5 147t-107.5 116.5v-580h-252z" />
|
||||||
|
<glyph unicode="L" d="M145 0v1268h254v-1059h543v-209h-797z" />
|
||||||
|
<glyph unicode="M" d="M47 0q6 156 13.5 324t15.5 333.5t19 321.5t26 289h209q14 -43 35.5 -110.5t46 -145.5t49 -158t47.5 -147q25 76 51.5 156.5t51 155.5t45 140.5t36.5 108.5h209q14 -166 27.5 -324t23 -312.5t15.5 -311t10 -320.5h-232l13 985l-156 -536h-184l-150 536l11 -985h-232z" />
|
||||||
|
<glyph unicode="N" d="M94 0v1268h203q57 -90 114.5 -195.5t112 -210t100.5 -203t78 -172.5v781h228v-1268h-203q-86 211 -187.5 421t-217.5 421v-842h-228z" />
|
||||||
|
<glyph unicode="O" d="M55 635q0 328 121 494.5t336 166.5q223 0 340 -166.5t117 -494.5t-119 -495t-336 -167q-223 0 -341 167t-118 495zM311 635q0 -92 7.5 -173t29 -140.5t60 -94t104.5 -34.5q63 0 103 34.5t61.5 95t29 140.5t7.5 172t-7.5 173t-29 140.5t-60 94t-104.5 34.5t-104.5 -34.5 t-60 -95t-29 -140.5t-7.5 -172z" />
|
||||||
|
<glyph unicode="P" d="M111 0v1251q37 8 83 14.5t93 9.5t92 5t80 2q242 0 375 -99.5t133 -324.5q0 -227 -134.5 -328.5t-379.5 -101.5h-91v-428h-251zM362 647h103q121 0 182.5 48t61.5 165q0 111 -61 157t-161 46q-23 0 -62.5 -1t-62.5 -5v-410z" />
|
||||||
|
<glyph unicode="Q" d="M55 629q0 328 121 494.5t336 166.5q223 0 340 -167t117 -494q0 -287 -92.5 -452t-266.5 -200q23 -51 110 -84.5t238 -60.5l-53 -180q-240 33 -361.5 109.5t-144.5 220.5q-166 41 -255 203.5t-89 443.5zM311 629q0 -92 7.5 -172t29 -140.5t60 -95.5t104.5 -35q63 0 103 35 t61.5 95.5t29 140.5t7.5 172t-7.5 173t-29 140t-60 94t-104.5 35t-104.5 -35t-60 -95t-29 -140t-7.5 -172z" />
|
||||||
|
<glyph unicode="R" d="M111 0v1249q37 8 81 15.5t89 10.5t85.5 5t71.5 2q109 0 197 -24.5t151.5 -76t97.5 -130t34 -185.5q0 -111 -45.5 -201t-149.5 -137q35 -53 74 -117.5t75.5 -135t70.5 -141.5t58 -134h-264q-47 123 -109.5 236.5t-133.5 230.5h-132v-467h-251zM362 676h56q129 0 186.5 50 t57.5 142q0 100 -61.5 147.5t-162.5 47.5q-14 0 -34.5 -1t-41.5 -5v-381z" />
|
||||||
|
<glyph unicode="S" d="M82 70l74 204q55 -33 131.5 -61.5t187.5 -28.5q63 0 105.5 13.5t67 37t33.5 53t9 60.5q0 39 -22.5 70t-57.5 54.5t-78 43t-86 35.5q-57 20 -118.5 47t-111.5 68t-83 101t-33 151q0 178 116 278t319 100q117 0 203.5 -26.5t146.5 -59.5l-74 -194q-51 29 -113.5 49 t-144.5 20q-201 0 -201 -145q0 -37 20.5 -64.5t52.5 -49t72 -38t78 -30.5q59 -23 124 -50.5t119 -73.5t89 -114.5t35 -173.5q0 -178 -115.5 -275.5t-351.5 -97.5q-158 0 -252 34t-141 63z" />
|
||||||
|
<glyph unicode="T" d="M51 1059v209h922v-209h-334v-1059h-254v1059h-334z" />
|
||||||
|
<glyph unicode="U" d="M80 459v809h254v-793q0 -80 8 -134t27.5 -87t54.5 -47t88 -14t88 14t55.5 48t28.5 88t8 134v791h252v-809q0 -111 -20.5 -201t-71.5 -153.5t-135 -97.5t-209 -34q-123 0 -206 34t-132 97.5t-69.5 153.5t-20.5 201z" />
|
||||||
|
<glyph unicode="V" d="M27 1268h266q12 -98 36.5 -228.5t54.5 -268.5t63.5 -272t66.5 -241q33 104 65.5 238.5t61.5 272.5t53.5 269t40.5 230h264q-25 -123 -60.5 -274.5t-81.5 -318.5t-101.5 -340t-114.5 -335h-260q-49 141 -104.5 319.5t-104.5 355.5t-88 334.5t-57 258.5z" />
|
||||||
|
<glyph unicode="W" d="M47 1268h234q-2 -121 -4.5 -250t-4.5 -257t-4 -250t-2 -228q18 66 42 143.5t45.5 153t40 139t28.5 100.5h184q8 -39 24.5 -96t36 -127t43 -149.5t46.5 -163.5q0 106 -2 228t-4 249t-4.5 257t-2.5 251h234q-6 -156 -12.5 -321t-14.5 -327.5t-19 -320.5t-26 -299h-209 q-45 129 -90 277.5t-90 283.5q-45 -129 -94 -280.5t-90 -280.5h-209q-16 141 -28.5 300t-22 321.5t-15.5 327.5t-10 319z" />
|
||||||
|
<glyph unicode="X" d="M23 0q20 55 60 133t88 168t101.5 185.5t102.5 183.5l-332 598h272l201 -406l211 406h254l-324 -592q55 -88 108.5 -184.5t99.5 -187.5t81 -170t55 -134h-272q-39 104 -95 231t-118 254q-59 -121 -118.5 -251t-102.5 -234h-272z" />
|
||||||
|
<glyph unicode="Y" d="M27 1268h270q47 -147 104.5 -300t118.5 -280q23 47 52.5 119t59.5 151.5t57.5 161.5t49.5 148h260q-39 -104 -77.5 -202.5t-81.5 -195t-92.5 -191.5t-106.5 -196v-483h-254v481q-113 199 -198 388.5t-162 398.5z" />
|
||||||
|
<glyph unicode="Z" d="M94 0v145q45 88 96.5 185.5t115 208t138 239.5t164.5 281h-487v209h790v-176q-88 -135 -161.5 -254t-137 -226.5t-120 -207t-107.5 -195.5h545v-209h-836z" />
|
||||||
|
<glyph unicode="a" d="M90 295q0 84 33 141.5t88 92t127 50t149 15.5q98 0 175 -16v30q0 72 -45.5 120t-155.5 48q-72 0 -138.5 -10t-107.5 -25l-35 203q47 16 133.5 29.5t178.5 13.5q119 0 197.5 -27.5t125.5 -78t67.5 -123t20.5 -162.5v-573q-55 -12 -163.5 -29t-243.5 -17q-92 0 -167 16.5 t-128.5 54.5t-82 98.5t-28.5 148.5zM338 301q0 -66 49 -93.5t127 -27.5q41 0 80 1t68 5v222q-25 4 -60 7t-63 3q-39 0 -76 -5t-64.5 -17.5t-44 -35t-16.5 -59.5z" />
|
||||||
|
<glyph unicode="b" d="M127 29v1349l252 43v-481q53 25 102 34t99 9q94 0 165.5 -36t119.5 -102.5t73 -158.5t25 -205q0 -115 -31 -208t-90.5 -158.5t-145.5 -101.5t-196 -36q-98 0 -200.5 14.5t-172.5 37.5zM379 205q29 -6 60.5 -8t54.5 -2q98 0 155.5 66t57.5 226q0 135 -44.5 207t-134.5 72 q-41 0 -80.5 -11.5t-68.5 -27.5v-522z" />
|
||||||
|
<glyph unicode="c" d="M90 481q0 104 33 196.5t100.5 161t171 108.5t246.5 40q86 0 155.5 -12t141.5 -41l-55 -203q-41 14 -91.5 25.5t-127.5 11.5q-90 0 -150.5 -21.5t-97.5 -59.5t-53.5 -91t-16.5 -115q0 -133 75 -208.5t255 -75.5q59 0 123.5 8t118.5 26l36 -206q-53 -20 -128.5 -34 t-178.5 -14q-147 0 -252.5 39t-173 106.5t-99.5 160t-32 198.5z" />
|
||||||
|
<glyph unicode="d" d="M57 475q0 236 97.5 372t287.5 136q51 0 100.5 -11t86.5 -32v438l252 43v-1392q-70 -23 -170.5 -37.5t-196.5 -14.5q-225 0 -341 133.5t-116 364.5zM313 487q0 -129 48.5 -210.5t154.5 -81.5q31 0 57.5 2t55.5 6v524q-29 16 -66 27.5t-78 11.5q-90 0 -131 -72t-41 -207z " />
|
||||||
|
<glyph unicode="e" d="M63 473q0 127 39 223.5t102.5 161t145.5 97t168 32.5q213 0 323.5 -126t110.5 -367q0 -25 -1 -51.5t-3 -43.5h-624q0 -94 77.5 -148t200.5 -54q76 0 144.5 16t115.5 33l35 -215q-66 -23 -139.5 -38.5t-165.5 -15.5q-123 0 -220.5 32t-166 94.5t-105.5 154.5t-37 215z M324 573h385q0 39 -10.5 75t-33 64.5t-57.5 46t-86 17.5q-49 0 -85 -16.5t-59.5 -45t-36.5 -65.5t-17 -76z" />
|
||||||
|
<glyph unicode="f" d="M74 754v209h211v55q0 117 33.5 193.5t91 122.5t131 65.5t151.5 19.5q80 0 164 -14t152 -47l-43 -205q-47 16 -118 33.5t-134 17.5q-35 0 -67 -6t-55.5 -26.5t-37.5 -58.5t-14 -99v-51h395v-209h-395v-754h-254v754h-211z" />
|
||||||
|
<glyph unicode="g" d="M68 512q0 238 131 354.5t356 116.5q158 0 342 -51v-815q0 -236 -113.5 -348.5t-365.5 -112.5q-90 0 -173 18.5t-159 42.5l47 213q59 -23 125 -42t164 -19q66 0 108.5 15.5t67.5 42t35 62.5t10 77v38q-53 -20 -97 -30.5t-95 -10.5q-188 0 -285.5 119t-97.5 330zM324 512 q0 -119 43 -181.5t135 -62.5q41 0 76.5 10.5t64.5 26.5v463q-29 6 -51.5 8t-46.5 2q-221 0 -221 -266z" />
|
||||||
|
<glyph unicode="h" d="M129 0v1378l252 43v-467q31 10 74 19.5t75 9.5q106 0 178 -31.5t115 -90t61.5 -139.5t18.5 -179v-543h-252v510q0 135 -30.5 194.5t-116.5 59.5q-35 0 -69 -8t-54 -15v-741h-252z" />
|
||||||
|
<glyph unicode="i" d="M74 754v209h518v-596q0 -86 31.5 -128t105.5 -42q35 0 84 9t111 38l32 -203q-78 -37 -146.5 -50.5t-125.5 -13.5q-98 0 -164.5 29t-106.5 83t-56.5 132t-16.5 178v355h-266zM264 1239q0 76 46 119t112 43t113 -43t47 -119q0 -74 -47.5 -117t-112.5 -43q-66 0 -112 43 t-46 117z" />
|
||||||
|
<glyph unicode="j" d="M100 -260l78 213q51 -29 124 -54.5t132 -25.5q63 0 98 38t35 140v703h-389v209h641v-900q0 -117 -28.5 -195.5t-78.5 -126.5t-119 -68.5t-149 -20.5q-98 0 -182 24.5t-162 63.5zM471 1239q0 76 46 119t112 43t112.5 -43t46.5 -119q0 -74 -47 -117t-112 -43q-66 0 -112 43 t-46 117z" />
|
||||||
|
<glyph unicode="k" d="M129 0v1378l254 43v-839q37 43 75 91t73.5 99t68.5 99.5t57 91.5h304q-37 -47 -84.5 -102.5t-97.5 -113t-100 -110.5t-91 -98q51 -49 110.5 -118t116.5 -142.5t105.5 -147.5t76.5 -131h-288q-25 51 -65 115.5t-85 127t-91 119t-85 93.5v-455h-254z" />
|
||||||
|
<glyph unicode="l" d="M74 1200v209h518v-1044q0 -98 39 -133t98 -35q76 0 127 20.5t68 26.5l32 -203q-6 -4 -27.5 -14.5t-56 -21.5t-85 -19.5t-113.5 -8.5q-174 0 -254 103.5t-80 302.5v817h-266z" />
|
||||||
|
<glyph unicode="m" d="M59 0v926q80 23 158 35t137 12q53 0 95.5 -13.5t72.5 -44.5q35 23 82 40.5t98 17.5q80 0 131.5 -24.5t81 -74t40 -124t10.5 -175.5v-575h-205v588q0 57 -7.5 92t-18.5 53.5t-26.5 24.5t-31.5 6q-18 0 -39 -3t-37 -11q6 -39 10 -86.5t4 -104.5v-192h-204v221 q0 98 -19.5 137t-62.5 39q-12 0 -29.5 -2t-34.5 -6v-756h-205z" />
|
||||||
|
<glyph unicode="n" d="M129 0v932q68 18 167 34.5t216 16.5q115 0 190.5 -31.5t119.5 -90t62.5 -139.5t18.5 -179v-543h-252v510q0 135 -30.5 194.5t-124.5 59.5q-29 0 -56.5 -2t-58.5 -6v-756h-252z" />
|
||||||
|
<glyph unicode="o" d="M59 483q0 113 34 206t94.5 159.5t144.5 102.5t182 36q100 0 183 -36t143.5 -102.5t93.5 -159.5t33 -206q0 -115 -33 -208t-92.5 -160.5t-142.5 -104.5t-185 -37t-185 37t-143.5 104.5t-93.5 161t-33 207.5zM315 481q0 -129 46.5 -208.5t148.5 -79.5q98 0 148.5 79.5 t50.5 208.5t-46.5 208t-148.5 79q-98 0 -148.5 -79t-50.5 -208z" />
|
||||||
|
<glyph unicode="p" d="M129 -338v1270q70 23 171 37t200 14q223 0 342 -135.5t119 -366.5q0 -111 -25 -204t-72 -159.5t-118.5 -103.5t-165.5 -37q-96 0 -199 48v-363h-252zM381 231q25 -16 65.5 -26t81.5 -10q90 0 133.5 72.5t43.5 205.5q0 129 -51.5 212t-155.5 83q-29 0 -62 -3l-55 -5v-529z " />
|
||||||
|
<glyph unicode="q" d="M63 481q0 111 31 204t89.5 158.5t145.5 102.5t197 37q47 0 99.5 -4t101.5 -11t93 -16.5t77 -19.5v-1270h-252v365q-47 -23 -99 -36.5t-100 -13.5q-94 0 -165.5 36t-119.5 101.5t-73 158.5t-25 208zM319 473q0 -133 44.5 -205.5t134.5 -72.5q43 0 80.5 10t66.5 26v529 q-18 2 -50 5t-67 3q-104 0 -156.5 -83t-52.5 -212z" />
|
||||||
|
<glyph unicode="r" d="M182 0v899q100 37 206 59.5t247 22.5q20 0 58 -2t81 -7t87 -12.5t79 -19.5l-45 -233q-25 6 -58.5 12t-68.5 11t-67.5 7t-55.5 2q-53 0 -104.5 -5t-104.5 -19v-715h-254z" />
|
||||||
|
<glyph unicode="s" d="M111 57l39 211q72 -29 152.5 -53.5t164.5 -24.5q92 0 141 13.5t49 54.5q0 27 -15 45.5t-43 31.5t-63.5 25.5t-74.5 24.5q-55 16 -112.5 37.5t-104.5 54.5t-78 83t-31 126q0 61 23.5 115.5t74 96.5t128 65.5t186.5 23.5q94 0 175 -14.5t140 -40.5l-39 -213 q-35 10 -108.5 33.5t-165.5 23.5q-96 0 -130 -23.5t-34 -50.5q0 -23 15.5 -40t41 -31.5t59.5 -27.5t72 -25q55 -18 115 -41t108 -57t78.5 -86t30.5 -128q0 -59 -22.5 -112.5t-74.5 -92t-136 -61.5t-207 -23q-125 0 -213 29t-141 51z" />
|
||||||
|
<glyph unicode="t" d="M74 754v209h219v241l252 41v-282h403v-209h-403v-389q0 -53 10 -86t28.5 -51.5t45 -24.5t59.5 -6q35 0 64.5 2t57.5 7t57.5 15t64.5 27l35 -217q-70 -29 -151 -41.5t-157 -12.5q-88 0 -155.5 14.5t-114.5 55.5t-71.5 116t-24.5 195v396h-219z" />
|
||||||
|
<glyph unicode="u" d="M121 426v537h252v-504q0 -133 31.5 -197.5t123.5 -64.5q57 0 115 10v756h254v-930q-70 -18 -169 -37t-216 -19q-119 0 -194.5 33t-119.5 93.5t-60.5 142.5t-16.5 180z" />
|
||||||
|
<glyph unicode="v" d="M29 963h264q18 -78 43.5 -166t54.5 -177.5t58.5 -173.5t56.5 -153q27 70 59.5 153.5t64.5 173t61.5 177.5t47.5 166h256q-86 -291 -190.5 -536t-196.5 -427h-211q-92 182 -187 427t-181 536z" />
|
||||||
|
<glyph unicode="w" d="M23 963h215q8 -178 17 -348.5t34 -350.5q27 78 46 144.5t34.5 127t29 117t27.5 115.5h182q12 -59 25.5 -115.5t29 -117t33 -127t41.5 -144.5q12 94 20.5 180t13.5 171t8 170t7 178h215q-23 -281 -62.5 -529t-88.5 -434h-191q-23 63 -42 116.5t-36.5 103.5t-35 104.5 t-35.5 119.5q-20 -66 -36.5 -118t-34 -103t-36 -104t-45.5 -119h-190q-25 90 -46.5 199.5t-40 233.5t-32.5 257t-26 273z" />
|
||||||
|
<glyph unicode="x" d="M41 0q31 57 71 119.5t84 127t92 128t93 121.5l-338 467h264l213 -301l197 301h256l-311 -463q49 -59 96 -126t90 -134.5t78 -129t59 -110.5h-262q-55 104 -110.5 186t-104.5 148q-61 -82 -110.5 -160t-100.5 -174h-256z" />
|
||||||
|
<glyph unicode="y" d="M41 -307l47 211q41 -18 73 -25.5t68 -7.5q74 0 119 49t72 117q-90 180 -180 412.5t-164 513.5h262q18 -76 41.5 -162t50.5 -172t56.5 -169t60.5 -155q20 72 42.5 155t43 168t40 171t36.5 164h258q-39 -135 -75 -265.5t-75 -254.5t-83 -242.5t-95 -231.5q-39 -82 -77 -141 t-84 -97t-102.5 -56.5t-131.5 -18.5q-63 0 -115.5 10t-87.5 27z" />
|
||||||
|
<glyph unicode="z" d="M137 0v154q47 78 102.5 159.5t111 160.5t108.5 150.5t96 129.5h-397v209h714v-185q-29 -33 -82 -97.5t-115.5 -144t-125 -166.5t-111.5 -161h455v-209h-756z" />
|
||||||
|
<glyph unicode=" " />
|
||||||
|
<glyph unicode=" " horiz-adv-x="710" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="1421" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="710" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="1421" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="473" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="355" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="236" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="236" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="177" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="284" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="78" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="284" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="355" />
|
||||||
|
<glyph unicode="" horiz-adv-x="962" d="M0 0v963h963v-963h-963z" />
|
||||||
|
</font>
|
||||||
|
</defs></svg>
|
After Width: | Height: | Size: 18 KiB |
BIN
images/ubuntumono-b-webfont.ttf
Executable file
BIN
images/ubuntumono-b-webfont.ttf
Executable file
Binary file not shown.
BIN
images/ubuntumono-b-webfont.woff
Executable file
BIN
images/ubuntumono-b-webfont.woff
Executable file
Binary file not shown.
Loading…
Add table
Reference in a new issue