--- /dev/null
+"use strict";\r
+\r
+/**\r
+ * A minimal base64 implementation for number arrays.\r
+ * @memberof util\r
+ * @namespace\r
+ */\r
+var base64 = exports;\r
+\r
+/**\r
+ * Calculates the byte length of a base64 encoded string.\r
+ * @param {string} string Base64 encoded string\r
+ * @returns {number} Byte length\r
+ */\r
+base64.length = function length(string) {\r
+ var p = string.length;\r
+ if (!p)\r
+ return 0;\r
+ var n = 0;\r
+ while (--p % 4 > 1 && string.charAt(p) === "=")\r
+ ++n;\r
+ return Math.ceil(string.length * 3) / 4 - n;\r
+};\r
+\r
+// Base64 encoding table\r
+var b64 = new Array(64);\r
+\r
+// Base64 decoding table\r
+var s64 = new Array(123);\r
+\r
+// 65..90, 97..122, 48..57, 43, 47\r
+for (var i = 0; i < 64;)\r
+ s64[b64[i] = i < 26 ? i + 65 : i < 52 ? i + 71 : i < 62 ? i - 4 : i - 59 | 43] = i++;\r
+\r
+/**\r
+ * Encodes a buffer to a base64 encoded string.\r
+ * @param {Uint8Array} buffer Source buffer\r
+ * @param {number} start Source start\r
+ * @param {number} end Source end\r
+ * @returns {string} Base64 encoded string\r
+ */\r
+base64.encode = function encode(buffer, start, end) {\r
+ var parts = null,\r
+ chunk = [];\r
+ var i = 0, // output index\r
+ j = 0, // goto index\r
+ t; // temporary\r
+ while (start < end) {\r
+ var b = buffer[start++];\r
+ switch (j) {\r
+ case 0:\r
+ chunk[i++] = b64[b >> 2];\r
+ t = (b & 3) << 4;\r
+ j = 1;\r
+ break;\r
+ case 1:\r
+ chunk[i++] = b64[t | b >> 4];\r
+ t = (b & 15) << 2;\r
+ j = 2;\r
+ break;\r
+ case 2:\r
+ chunk[i++] = b64[t | b >> 6];\r
+ chunk[i++] = b64[b & 63];\r
+ j = 0;\r
+ break;\r
+ }\r
+ if (i > 8191) {\r
+ (parts || (parts = [])).push(String.fromCharCode.apply(String, chunk));\r
+ i = 0;\r
+ }\r
+ }\r
+ if (j) {\r
+ chunk[i++] = b64[t];\r
+ chunk[i++] = 61;\r
+ if (j === 1)\r
+ chunk[i++] = 61;\r
+ }\r
+ if (parts) {\r
+ if (i)\r
+ parts.push(String.fromCharCode.apply(String, chunk.slice(0, i)));\r
+ return parts.join("");\r
+ }\r
+ return String.fromCharCode.apply(String, chunk.slice(0, i));\r
+};\r
+\r
+var invalidEncoding = "invalid encoding";\r
+\r
+/**\r
+ * Decodes a base64 encoded string to a buffer.\r
+ * @param {string} string Source string\r
+ * @param {Uint8Array} buffer Destination buffer\r
+ * @param {number} offset Destination offset\r
+ * @returns {number} Number of bytes written\r
+ * @throws {Error} If encoding is invalid\r
+ */\r
+base64.decode = function decode(string, buffer, offset) {\r
+ var start = offset;\r
+ var j = 0, // goto index\r
+ t; // temporary\r
+ for (var i = 0; i < string.length;) {\r
+ var c = string.charCodeAt(i++);\r
+ if (c === 61 && j > 1)\r
+ break;\r
+ if ((c = s64[c]) === undefined)\r
+ throw Error(invalidEncoding);\r
+ switch (j) {\r
+ case 0:\r
+ t = c;\r
+ j = 1;\r
+ break;\r
+ case 1:\r
+ buffer[offset++] = t << 2 | (c & 48) >> 4;\r
+ t = c;\r
+ j = 2;\r
+ break;\r
+ case 2:\r
+ buffer[offset++] = (t & 15) << 4 | (c & 60) >> 2;\r
+ t = c;\r
+ j = 3;\r
+ break;\r
+ case 3:\r
+ buffer[offset++] = (t & 3) << 6 | c;\r
+ j = 0;\r
+ break;\r
+ }\r
+ }\r
+ if (j === 1)\r
+ throw Error(invalidEncoding);\r
+ return offset - start;\r
+};\r
+\r
+/**\r
+ * Tests if the specified string appears to be base64 encoded.\r
+ * @param {string} string String to test\r
+ * @returns {boolean} `true` if probably base64 encoded, otherwise false\r
+ */\r
+base64.test = function test(string) {\r
+ return /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(string);\r
+};\r